<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jleyva</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jleyva"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Jleyva"/>
	<updated>2026-04-23T16:03:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Translation&amp;diff=63791</id>
		<title>Moodle App Translation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Translation&amp;diff=63791"/>
		<updated>2023-01-12T17:27:06Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is now located in the user docs: [[:en:Translating the Moodle App|Translating the Moodle app]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Translation&amp;diff=63790</id>
		<title>Moodle App Translation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Translation&amp;diff=63790"/>
		<updated>2023-01-12T17:25:29Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is now located in the user docs: [[:en:Translating the Moodle App|Translating the Moodle App]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Translation&amp;diff=63789</id>
		<title>Moodle App Translation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Translation&amp;diff=63789"/>
		<updated>2023-01-12T17:24:53Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is now located in the user docs: [[:en:Translating the Moodle App|Translating the Moodle app]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.1_release_notes&amp;diff=63121</id>
		<title>Moodle App 4.0.1 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.1_release_notes&amp;diff=63121"/>
		<updated>2022-05-26T08:03:53Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle App Release Notes|Moodle App release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 26 May 2022&lt;br /&gt;
&lt;br /&gt;
This is a maintenance release, only with minor improvements and bug fixes indicated below.&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-4060 - Moodle Mobile 4.0.0 External URL Android Portrait visibility issue&lt;br /&gt;
* MOBILE-4079 - Handling urls with create site does not wait the site to login&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-4067 - Avoid empty Dashboard or My courses when no blocks are returned because of an exception&lt;br /&gt;
* MOBILE-4080 - Improve development settings usage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.1_release_notes&amp;diff=63120</id>
		<title>Moodle App 4.0.1 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.1_release_notes&amp;diff=63120"/>
		<updated>2022-05-26T07:57:49Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: Created page with &amp;quot;Moodle App release notes &amp;gt; {{FULLPAGENAME}}  Release date: 26 May 2022  This is a maintenance release, only with minor improvements and bug fixes...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle App Release Notes|Moodle App release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 26 May 2022&lt;br /&gt;
&lt;br /&gt;
This is a maintenance release, only with minor improvements and bug fixes indicated below.&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=63119</id>
		<title>Moodle App Release Notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=63119"/>
		<updated>2022-05-26T07:55:45Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Moodle App */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Moodle App ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
!Moodle App 4.0.1&lt;br /&gt;
|26 May 2022&lt;br /&gt;
|40100&lt;br /&gt;
|[[Moodle App 4.0.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
!Moodle App 4.0.0&lt;br /&gt;
|22 April 2022&lt;br /&gt;
|40000&lt;br /&gt;
|[[Moodle App 4.0.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.5&lt;br /&gt;
| 27 August 2021&lt;br /&gt;
| 39500&lt;br /&gt;
| [[Moodle Mobile 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.4&lt;br /&gt;
| 28 December 2020&lt;br /&gt;
| 39400&lt;br /&gt;
|[[Moodle Mobile 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.3&lt;br /&gt;
| 30 November 2020&lt;br /&gt;
| 39300&lt;br /&gt;
| [[Moodle Mobile 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.2&lt;br /&gt;
| 16 July 2020&lt;br /&gt;
| 39200&lt;br /&gt;
| [[Moodle Mobile 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.1&lt;br /&gt;
| 3 July 2020&lt;br /&gt;
| 39100&lt;br /&gt;
| [[Moodle Mobile 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.0&lt;br /&gt;
| 26 June 2020&lt;br /&gt;
| 39000&lt;br /&gt;
| [[Moodle Mobile 3.9.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.8.2&lt;br /&gt;
| 2 April 2020&lt;br /&gt;
| 38200&lt;br /&gt;
| [[Moodle Mobile 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.8.1&lt;br /&gt;
| 25 March 2020&lt;br /&gt;
| 38100&lt;br /&gt;
| [[Moodle Mobile 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.8.0&lt;br /&gt;
| 20 December 2019&lt;br /&gt;
| 38000&lt;br /&gt;
| [[Moodle Mobile 3.8.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.7.2&lt;br /&gt;
| 20 September 2019&lt;br /&gt;
| 37200&lt;br /&gt;
| [[Moodle Mobile 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.7.1&lt;br /&gt;
| 30 August 2019&lt;br /&gt;
| 37100&lt;br /&gt;
| [[Moodle Mobile 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.7.0&lt;br /&gt;
| 7 June 2019&lt;br /&gt;
| 37000&lt;br /&gt;
| [[Moodle Mobile 3.7.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.6.1&lt;br /&gt;
| 29 March 2019&lt;br /&gt;
| 36100&lt;br /&gt;
| [[Moodle Mobile 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.6.0&lt;br /&gt;
| 11 January 2019&lt;br /&gt;
| 36000&lt;br /&gt;
| [[Moodle Mobile 3.6.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.5.2&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 35200&lt;br /&gt;
| [[Moodle Mobile 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.5.1&lt;br /&gt;
| 6 July 2018&lt;br /&gt;
| 35100&lt;br /&gt;
| [[Moodle Mobile 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.5.0&lt;br /&gt;
| 25 June 2018&lt;br /&gt;
| 35000&lt;br /&gt;
| [[Moodle Mobile 3.5.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Moodle Mobile ==&lt;br /&gt;
Versions with support or 3.0 and previous versions, based on Ionic 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.2&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 20230&lt;br /&gt;
| [[Moodle Mobile 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.1&lt;br /&gt;
| 28 February 2018&lt;br /&gt;
| 20220&lt;br /&gt;
| [[Moodle Mobile 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.0&lt;br /&gt;
| 30 November 2017&lt;br /&gt;
| 20210&lt;br /&gt;
| [[Moodle Mobile 3.4.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.2&lt;br /&gt;
| 29 September 2017&lt;br /&gt;
| 20200&lt;br /&gt;
| [[Moodle Mobile 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.1&lt;br /&gt;
| 28 July 2017&lt;br /&gt;
| 20190&lt;br /&gt;
| [[Moodle Mobile 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.0&lt;br /&gt;
| 26 May 2017&lt;br /&gt;
| 20180&lt;br /&gt;
| [[Moodle Mobile 3.3.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.1&lt;br /&gt;
| 28 February 2017&lt;br /&gt;
| 20170&lt;br /&gt;
| [[Moodle Mobile 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.0&lt;br /&gt;
| 12 December 2016&lt;br /&gt;
| 20160&lt;br /&gt;
| [[Moodle Mobile 3.2.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.3&lt;br /&gt;
| 19 October 2016&lt;br /&gt;
| 20150&lt;br /&gt;
| [[Moodle Mobile 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.2&lt;br /&gt;
| 27 July 2016&lt;br /&gt;
| 2014&lt;br /&gt;
| [[Moodle Mobile 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.1&lt;br /&gt;
| 14 June 2016&lt;br /&gt;
| 2013&lt;br /&gt;
| [[Moodle Mobile 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.0&lt;br /&gt;
| 23 May 2016&lt;br /&gt;
| 2012&lt;br /&gt;
| [[Moodle Mobile 3.1.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.0.0&lt;br /&gt;
| 15 April 2016&lt;br /&gt;
| 2011&lt;br /&gt;
| [[Moodle Mobile 3.0.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.9&lt;br /&gt;
| 29 February 2016&lt;br /&gt;
| 2010&lt;br /&gt;
| [[Moodle Mobile 2.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.8&lt;br /&gt;
| 22 January 2016&lt;br /&gt;
| 2009&lt;br /&gt;
| [[Moodle Mobile 2.8 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.7&lt;br /&gt;
| 29 December 2015&lt;br /&gt;
| 2008&lt;br /&gt;
| [[Moodle Mobile 2.7 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.6&lt;br /&gt;
| 27 November 2015&lt;br /&gt;
| 2007&lt;br /&gt;
| [[Moodle Mobile 2.6 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.5&lt;br /&gt;
| 6 November 2015&lt;br /&gt;
| 2006&lt;br /&gt;
| [[Moodle Mobile 2.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.4&lt;br /&gt;
| 21 October 2015&lt;br /&gt;
| 2005&lt;br /&gt;
| [[Moodle Mobile 2.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.3&lt;br /&gt;
| 8 October 2015&lt;br /&gt;
| 2004&lt;br /&gt;
| [[Moodle Mobile 2.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.2&lt;br /&gt;
| 10 September 2015&lt;br /&gt;
| 2003&lt;br /&gt;
| [[Moodle Mobile 2.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.1&lt;br /&gt;
| 28 August 2015&lt;br /&gt;
| 2002&lt;br /&gt;
| [[Moodle Mobile 2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.0&lt;br /&gt;
| 31 July 2015&lt;br /&gt;
| 2000&lt;br /&gt;
| [[Moodle Mobile 2.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
== Moodle Mobile 1 ==&lt;br /&gt;
See [[Moodle Mobile 1 release notes]]&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Moodle Desktop release notes]]&lt;br /&gt;
* [[Moodle Mobile Roadmap]]&lt;br /&gt;
[[Category: Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=62199</id>
		<title>Moodle App Release Process</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=62199"/>
		<updated>2022-05-02T15:08:05Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* The following days */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Migrated|newDocId=/docs/guides/moodleapp/development/release-process}}&lt;br /&gt;
== Two weeks before (Code freeze) ==&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Create an issue in the tracker for the release, like: MOBILE-1248&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Force an update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as release candidate) with new strings in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Ask someone from sites or community team to review the new English strings. &lt;br /&gt;
| Community or Sites team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Announce in the moodletranslation forums the new strings available: https://lang.moodle.org/mod/forum/view.php?id=5. This will allow translators to add the new strings during the days prior to the release.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Add the release notes in the release issue created (search for the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20%3D%20release_notes release_notes tag]). Ask someone from the documentation team or Martin to review the release notes.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Contact the marketing team announcing the new release and highlights.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Add new QA tests to the “Testing cases” document. New QA tests should be labeled with [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20resolution%20in%20(Unresolved%2C%20Fixed)%20AND%20labels%20%3D%20qa_test_required%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC qa_test_required]. Remove that label once are added to the document.&lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Run npm audit to ensure all the dependencies are OK.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Freeze Cordova plugins and Javascript libraries versions (node modules) in the integration branch.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 10.&lt;br /&gt;
| &#039;&#039;&#039;Start testing&#039;&#039;&#039;&lt;br /&gt;
| Tester&lt;br /&gt;
|}&lt;br /&gt;
== The release day ==&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1. &lt;br /&gt;
| Fix the version name in integration/config.xml, integration/package.json and integration:src/config.json (remove the -dev).&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Integrate the [https://github.com/moodlehq/moodleapp/compare/master...integration integration branch onto the master one]. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Do some testing with the production builds before sending the application to the stores (overall testing to see that nothing is broken because of the branch merge done in step 2):&lt;br /&gt;
* Correct definitive version name displayed (and commit)&lt;br /&gt;
* AOT compiling worked&lt;br /&gt;
* Language strings synchronised from lang.moodle.net&lt;br /&gt;
* New language packs added&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Send the applications to the stores for review. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Create a TAG/Release in github ([https://github.com/moodlehq/moodleapp/releases moodlehq/moodleapp]) with the version number.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Mark the issue and the [https://tracker.moodle.org/projects/MOBILE?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page version] as released in the tracker.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Update release notes [[Moodle_Mobile_Release_Notes]] .&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|}&lt;br /&gt;
== The following days ==&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Social media announcements (Forum and Twitter).&lt;br /&gt;
| All the team &amp;amp; Marketing team &lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Post in moodle.org/news.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Review the users and developers documentation (check that everything is in order). Review the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20in%20%28docs_required%2C%20dev_docs_required%29 docs_required and dev_docs_required_tags]. Review the [https://docs.moodle.org/en/Moodle_Mobile_features Mobile features wiki documentation].&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Delete the integration and desktop branches and create it again based on master.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Bump version numbers in the following files in the integration branch: config.xml (version), package.json (version), moodle.config.json (versionname) appending a -dev to indicate that is a development version).&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Unfreeze Cordova plugins and Javascript libraries versions (node modules).&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Check that the [https://cloud.docker.com/u/moodlehq/repository/docker/moodlehq/moodleapp/general Docker image] for the new version was successfully built.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as final release) in moodle.org/plugins.&lt;br /&gt;
| Developer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Moodle App Release Notes]]&lt;br /&gt;
[[Category:Processes]]&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
{{DISPLAYTITLE:Moodle app release process}}&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62198</id>
		<title>Moodle App 4.0.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62198"/>
		<updated>2022-05-02T13:16:10Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Complete list of issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle App Release Notes|Moodle App release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 22 April 2022&lt;br /&gt;
&lt;br /&gt;
Please notice this new version will only connect Moodle sites version &amp;gt;= 3.5 and that it won&#039;t work if your site is using the deprecated local_mobile (Mobile app additional features) plugin.&lt;br /&gt;
==New features and improvements==&lt;br /&gt;
* Support Moodle 4.0 LMS new &amp;quot;My courses&amp;quot; page&lt;br /&gt;
* User profile repositioned to match LMS&lt;br /&gt;
* Design updated to Material design 3 matching overall Moodle style&lt;br /&gt;
* Some pages now support swipe (participants, book module, grades, forum discussions,...)&lt;br /&gt;
* Resuming a course or a book is now easier&lt;br /&gt;
* Course main page additional options menu redesigned&lt;br /&gt;
* Navigation between sections and activities improved&lt;br /&gt;
* SCORM, H5P automatic full-screen mode&lt;br /&gt;
* Thumbnails for videos are automatically generated&lt;br /&gt;
* Content and activities pages with fewer distractions for users so they can focus on learning&lt;br /&gt;
* General performance improvements&lt;br /&gt;
* New notifications page (capturing all the notifications received by the user)&lt;br /&gt;
* The enrolment fee plugin is now supported (launched in a browser outside the app to complete the process)&lt;br /&gt;
* New 4.0 assignment time-limited submissions supported&lt;br /&gt;
* Teachers can now see H5P attempt reports&lt;br /&gt;
&lt;br /&gt;
Moodle.com announcement: https://moodle.com/news/moodle-app-4-0/&lt;br /&gt;
&lt;br /&gt;
[[File:MoodleApp40Store.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
* MOBILE-3688 - Create index&amp;amp;list link handlers for mod site plugins&lt;br /&gt;
* MOBILE-3799 - Let teachers view attempts in H5P activity&lt;br /&gt;
* MOBILE-3800 - Log report_viewed when viewing H5P activity report&lt;br /&gt;
* MOBILE-3873 - Support BigBlueButton (bigbluebuttonbn) activity in the app&lt;br /&gt;
* MOBILE-3889 - Add development settings page&lt;br /&gt;
* MOBILE-3919 - Support time-limited submission assignments (LMS 4.0)&lt;br /&gt;
* MOBILE-4022 - Support new tool_mobile_autologinmintimebetweenreq setting for auto-login requests&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-2848 - Language handling improvements for the mobile app&lt;br /&gt;
* MOBILE-3306 - Show the titles of blocks as if they had icons&lt;br /&gt;
* MOBILE-3316 - Handle user suspended use-case&lt;br /&gt;
* MOBILE-3729 - Let plugins refresh the course page method data of a single module&lt;br /&gt;
* MOBILE-3779 - Wiki: clicking a link to a wiki index page doesn&#039;t select the right subwiki or page&lt;br /&gt;
* MOBILE-3782 - Change the string &#039;Download course&#039; once the course is downloaded&lt;br /&gt;
* MOBILE-3786 - Add a new setting to enable display the Course and Courses (Dashboard) download options&lt;br /&gt;
* MOBILE-3792 - Use npm v7 to allow audit fix work&lt;br /&gt;
* MOBILE-3793 - Forum reply/edit reply: make it more consistent&lt;br /&gt;
* MOBILE-3831 - Publish cordova plugin forks in npm&lt;br /&gt;
* MOBILE-3846 - Logout user if site URL is no longer one of the allowed URLs&lt;br /&gt;
* MOBILE-3847 - Detect if resources are no longer accessible when offline use is disabled&lt;br /&gt;
* MOBILE-3848 - Recent accessed courses block doesn&#039;t display guest access courses&lt;br /&gt;
* MOBILE-3859 - Improve error message for invalid certificates&lt;br /&gt;
* MOBILE-3860 - Remove calls to login/token.php just to check if site exists&lt;br /&gt;
* MOBILE-3863 - Make CSP less strict to match behaviour in native devices&lt;br /&gt;
* MOBILE-3881 - Timeline block improvements for 4.0&lt;br /&gt;
* MOBILE-3897 - Links (&amp;lt;a&amp;gt;) to files: first time opened in browser&lt;br /&gt;
* MOBILE-3898 - Remove overly generic Behat transformers&lt;br /&gt;
* MOBILE-3901 - Support insights action URL&lt;br /&gt;
* MOBILE-3910 - Change text to accept site policy&lt;br /&gt;
* MOBILE-3913 - Add search box to timeline block&lt;br /&gt;
* MOBILE-3916 - Ionic5 - header to have same color than system bar&lt;br /&gt;
* MOBILE-3917 - Display a better error if a dependency isn&#039;t found when deploying an H5P package&lt;br /&gt;
* MOBILE-3922 - Check userhomepage setting to show default landing page&lt;br /&gt;
* MOBILE-3935 - Allow changing the InAppBrowser toolbar colors&lt;br /&gt;
* MOBILE-3940 - Use new webservice on My courses page&lt;br /&gt;
* MOBILE-3941 - Don&#039;t open browser automatically if URL is set and displayqroncredentialscreen is true&lt;br /&gt;
* MOBILE-3950 - Restore Ionic1 Image viewer with zoom&lt;br /&gt;
* MOBILE-3951 - Always handle scheduling notifications in service instead of pages&lt;br /&gt;
* MOBILE-3954 - Move prefetch module and section options to storage manager&lt;br /&gt;
* MOBILE-3959 - Update cordova-android to 10.1.1&lt;br /&gt;
* MOBILE-3960 - New config.json setting to skip the Sites page&lt;br /&gt;
* MOBILE-3961 - Include the app version number in the user agent&lt;br /&gt;
* MOBILE-3962 - Support the course_list block&lt;br /&gt;
* MOBILE-3966 - Adapt disabled features to changes in 4.0&lt;br /&gt;
* MOBILE-3967 - Add setting to show legacy completion&lt;br /&gt;
* MOBILE-3968 - Ignore fake course overview block&lt;br /&gt;
* MOBILE-3971 - Optimize database usage for reading the config DB table&lt;br /&gt;
* MOBILE-3975 - Move the default notification time for calendar events to config.json&lt;br /&gt;
* MOBILE-3976 - Remove online-offline options on notifications&lt;br /&gt;
* MOBILE-3977 - Cache database tables with different strategies&lt;br /&gt;
* MOBILE-3980 - New index page for book module&lt;br /&gt;
* MOBILE-3981 - Use optimized database adapter for tables used during startup&lt;br /&gt;
* MOBILE-3990 - Add missing handler for notification preferences, for example: /message/notificationpreferences.php?userid=6&lt;br /&gt;
* MOBILE-3993 - Identify with a class or ID all the elements displaying group info&lt;br /&gt;
* MOBILE-3996 - Fix navigation bar positioning&lt;br /&gt;
* MOBILE-3998 - Create a new IMSCP index/contents page to avoid having 2 nav bars&lt;br /&gt;
* MOBILE-4002 - Support new option to enable/disable the Dashboard in LMS&lt;br /&gt;
* MOBILE-4008 - Timeline block views should display consistent information (mobile app)&lt;br /&gt;
* MOBILE-4012 - Support enrol_fee on the app&lt;br /&gt;
* MOBILE-4015 - Support fallbacks for javascript click actions on the app via data-app-url&lt;br /&gt;
* MOBILE-4017 - Unit tests and lint should work correctly on Windows&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
* MOBILE-3802 - Moodle App navigation improvements for 4.0&lt;br /&gt;
* MOBILE-3803 - Moodle App performance improvements for 4.0&lt;br /&gt;
* MOBILE-3804 - Moodle App User Interface (UI) improvements for 4.0&lt;br /&gt;
* MOBILE-3805 - Moodle App notifications improvements for 4.0&lt;br /&gt;
* MOBILE-3865 - Add link to the &amp;quot;Accessibility Statement for Moodle App&amp;quot;&lt;br /&gt;
* MOBILE-3883 - Force ITSAppUsesNonExemptEncryption to NO (false) for iOS&lt;br /&gt;
* MOBILE-3926 - Add swipe navigation to pages using split view&lt;br /&gt;
* MOBILE-3927 - Add swipe navigation to non-split view pages&lt;br /&gt;
* MOBILE-3934 - Refactor pages with nested split views&lt;br /&gt;
* MOBILE-3939 - Refactor feedback respondents navigation&lt;br /&gt;
* MOBILE-3974 - Disable Paypal in the app&lt;br /&gt;
* MOBILE-4010 - In-app Moodle app survey should be available only for logged-in users&lt;br /&gt;
&lt;br /&gt;
=== Sub-task ===&lt;br /&gt;
* MOBILE-2282 - App takes a lot to start if site is down or unreachable&lt;br /&gt;
* MOBILE-2748 - Improve how activity icons are supported now&lt;br /&gt;
* MOBILE-3099 - Navigation within courses in the mobile app&lt;br /&gt;
* MOBILE-3103 - SCORM full screen. Full screen button to remove top and bottom bar&lt;br /&gt;
* MOBILE-3148 - Switch user account should not logout until new account is selected&lt;br /&gt;
* MOBILE-3149 - Main activity action should be stuck at the bottom&lt;br /&gt;
* MOBILE-3153 - Support User tours in app (onboarding in screens)&lt;br /&gt;
* MOBILE-3415 - Support finger/swipe gestures for browsing course contents and activities with multiple pages&lt;br /&gt;
* MOBILE-3726 - Display page before opening links in the browser&lt;br /&gt;
* MOBILE-3773 - Automatically display thumbnail using Media Fragments for videos without poster&lt;br /&gt;
* MOBILE-3794 - Accept site policy: iframe height is too small&lt;br /&gt;
* MOBILE-3798 - Duplicated &amp;quot;My learning plans&amp;quot; in &amp;quot;More&amp;quot; menu and the user profile&lt;br /&gt;
* MOBILE-3806 - &amp;quot;My courses&amp;quot; option in the app&lt;br /&gt;
* MOBILE-3807 - New &amp;quot;User profile&amp;quot; menu&lt;br /&gt;
* MOBILE-3808 - Navigation between courses sections&lt;br /&gt;
* MOBILE-3810 - Main activity/resource content visualisation&lt;br /&gt;
* MOBILE-3811 - Update icons to use Moodle 4.0&lt;br /&gt;
* MOBILE-3814 - Update apps design to match 4.0 overal styling and components&lt;br /&gt;
* MOBILE-3819 - Moodle 3.1 and local_mobile deprecation&lt;br /&gt;
* MOBILE-3821 - Review offline app&lt;br /&gt;
* MOBILE-3823 - Ensure H5P, SCORM and similar packages (IMSCP) do not display the description box in lanscape mode (mobile)&lt;br /&gt;
* MOBILE-3828 - Evaluate if we could display the HTML version of popup notifications in the app&lt;br /&gt;
* MOBILE-3829 - Default fallback for Push Notifications should also display the nofitication message&lt;br /&gt;
* MOBILE-3875 - Integrate performance tests in CI&lt;br /&gt;
* MOBILE-3876 - Improve production bundles optimization&lt;br /&gt;
* MOBILE-3887 - Use core_message_get_messages to display list of notifications&lt;br /&gt;
* MOBILE-3899 - Only show main menu when navigation is at level 1&lt;br /&gt;
* MOBILE-3902 - In-app notification for site admins when Push Notifications are not enabled for a site&lt;br /&gt;
* MOBILE-3905 - Add swipe navigation to course participants&lt;br /&gt;
* MOBILE-3909 - Allow users to set the reminder at the same time the event is created&lt;br /&gt;
* MOBILE-3914 - Support new block drawer&lt;br /&gt;
* MOBILE-3915 - New course index menu and fab button&lt;br /&gt;
* MOBILE-3930 - Start and Resume course &lt;br /&gt;
* MOBILE-3931 - Re-think the activity contextual menu&lt;br /&gt;
* MOBILE-3932 - File resource should display the file media type, size and other useful information in their own page&lt;br /&gt;
* MOBILE-3965 - Change &amp;quot;Logout&amp;quot; and &amp;quot;Switch account&amp;quot; behaviour&lt;br /&gt;
* MOBILE-3970 - Open course information on a lateral menu&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3060 - Group image isn&#039;t seen in push notifications in Android 9&lt;br /&gt;
* MOBILE-3289 - H5P fullscreen does not work for Mobile App&lt;br /&gt;
* MOBILE-3552 - H5P ignores TEX-Formulas in App but not in Browser&lt;br /&gt;
* MOBILE-3667 - &amp;quot;Last accessed&amp;quot; sort choice on the module dashboard doesn&#039;t work unless refresh the page&lt;br /&gt;
* MOBILE-3676 - QR reader button should not be displayed in the credentials screen for sites that disabled it&lt;br /&gt;
* MOBILE-3686 - Long lists in &amp;quot;Available Courses&amp;quot; can crash app.&lt;br /&gt;
* MOBILE-3695 - Delete a site: cannot unregister device if site is configured to logout&lt;br /&gt;
* MOBILE-3711 - Access rules error messages should include as part of the string (variable) the access rule name (instead concatenating it hardcoded)&lt;br /&gt;
* MOBILE-3715 - Launch external app from InAppBrowser: ERR_FILE_NOT_FOUND&lt;br /&gt;
* MOBILE-3763 - H5P embedded directly (using embed code) have height=0 in the app&lt;br /&gt;
* MOBILE-3775 - PTR on a page doesn&#039;t update the page contents&lt;br /&gt;
* MOBILE-3780 - Max size of attachment is not correctly detected (Forum and Assignment)&lt;br /&gt;
* MOBILE-3785 - Assignment - visible groups: teachers on browser can select &#039;All participants&#039; whereas on the app they need to select a specific group&lt;br /&gt;
* MOBILE-3787 - Assignment - Submission in group status are not correct&lt;br /&gt;
* MOBILE-3822 - Disable click in links in MathJax&lt;br /&gt;
* MOBILE-3825 - npm run dev:ios fails with Unknown option: &#039;--platform&#039;&lt;br /&gt;
* MOBILE-3844 - Download mp3 file outside of app&#039;s folder&lt;br /&gt;
* MOBILE-3849 - Revise kebab icon being shown when loading app and show download options on site home&lt;br /&gt;
* MOBILE-3855 - Manual completion cannot be changed when accessing activity via recent accessed items&lt;br /&gt;
* MOBILE-3857 - Course overview selector not displayed in old Moodle sites&lt;br /&gt;
* MOBILE-3868 - Badges are empty when navigating to own user profile from online users block&lt;br /&gt;
* MOBILE-3877 - Revise Quiz offline - when user finishes they see the summary instead of the review&lt;br /&gt;
* MOBILE-3886 - Android app can no longer connect to HTTP sites&lt;br /&gt;
* MOBILE-3895 - Long MathJax equations cut off in quiz feedback and no way to scroll&lt;br /&gt;
* MOBILE-3896 - Links to tokenpluginfile are opened in browser&lt;br /&gt;
* MOBILE-3900 - Course overview block does not honour &amp;quot;coursegraceperiodbefore&amp;quot; and &amp;quot;coursegraceperiodafter&amp;quot;&lt;br /&gt;
* MOBILE-3903 - Link to a course with self enrol doesn&#039;t work&lt;br /&gt;
* MOBILE-3906 - App laggs after accepting policy&lt;br /&gt;
* MOBILE-3912 - Remove needs help from login error modal&lt;br /&gt;
* MOBILE-3918 - Some H5P packages display &amp;quot;undefined&amp;quot; instead of title&lt;br /&gt;
* MOBILE-3923 - Courses are not correctly sorted on Starred courses block&lt;br /&gt;
* MOBILE-3924 - Revise license.json generation&lt;br /&gt;
* MOBILE-3944 - User interests in the user profile is not linking to tags&lt;br /&gt;
* MOBILE-3946 - Automatic completion of H5P activity isn&#039;t automatically detected by the app&lt;br /&gt;
* MOBILE-3948 - H5P: Apply MDL code to fix issue when users have same email address&lt;br /&gt;
* MOBILE-3949 - Fix Zip Path Traversal vulnerability in Android&lt;br /&gt;
* MOBILE-3952 - Kebab icon should be hidden if options menu is empty&lt;br /&gt;
* MOBILE-3953 - Site plugins: override handler properties isn&#039;t working as expected&lt;br /&gt;
* MOBILE-3956 - URL to Feedback on mainpage and courseid returns &amp;quot;module not found&amp;quot;&lt;br /&gt;
* MOBILE-3958 - Support gradeformatted with icons in the app&lt;br /&gt;
* MOBILE-3982 - Follow-up with Collapsible header issues&lt;br /&gt;
* MOBILE-3997 - Revise message when links with autologin&lt;br /&gt;
* MOBILE-4001 - Quiz Result percentage shown in the app should apply the same rounding as the other grades&lt;br /&gt;
* MOBILE-4005 - Support domain restricted Vimeo videos new security hash parameters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62185</id>
		<title>Moodle App 4.0.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62185"/>
		<updated>2022-04-29T12:14:38Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* New features and improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle App Release Notes|Moodle App release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 22 April 2022&lt;br /&gt;
&lt;br /&gt;
Please notice this new version will only connect Moodle sites version &amp;gt;= 3.5 and that it won&#039;t work if your site is using the deprecated local_mobile (Mobile app additional features) plugin.&lt;br /&gt;
==New features and improvements==&lt;br /&gt;
* Support Moodle 4.0 LMS new &amp;quot;My courses&amp;quot; page&lt;br /&gt;
* User profile repositioned to match LMS&lt;br /&gt;
* Design updated to Material design 3 matching overall Moodle style&lt;br /&gt;
* Some pages now support swipe (participants, book module, grades, forum discussions,...)&lt;br /&gt;
* Resuming a course or a book is now easier&lt;br /&gt;
* Course main page additional options menu redesigned&lt;br /&gt;
* Navigation between sections and activities improved&lt;br /&gt;
* SCORM, H5P automatic full-screen mode&lt;br /&gt;
* Thumbnails for videos are automatically generated&lt;br /&gt;
* Content and activities pages with fewer distractions for users so they can focus on learning&lt;br /&gt;
* General performance improvements&lt;br /&gt;
* New notifications page (capturing all the notifications received by the user)&lt;br /&gt;
* The enrolment fee plugin is now supported (launched in a browser outside the app to complete the process)&lt;br /&gt;
* New 4.0 assignment time-limited submissions supported&lt;br /&gt;
* Teachers can now see H5P attempt reports&lt;br /&gt;
&lt;br /&gt;
Moodle.com announcement: https://moodle.com/news/moodle-app-4-0/&lt;br /&gt;
&lt;br /&gt;
[[File:MoodleApp40Store.png|800px]]&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sub-task ===&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62184</id>
		<title>Moodle App 4.0.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62184"/>
		<updated>2022-04-29T12:13:05Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* New features and improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle App Release Notes|Moodle App release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 22 April 2022&lt;br /&gt;
&lt;br /&gt;
Please notice this new version will only connect Moodle sites version &amp;gt;= 3.5 and that it won&#039;t work if your site is using the deprecated local_mobile (Mobile app additional features) plugin.&lt;br /&gt;
==New features and improvements==&lt;br /&gt;
* Support Moodle 4.0 LMS new &amp;quot;My courses&amp;quot; page&lt;br /&gt;
* User profile repositioned to match LMS&lt;br /&gt;
* Design updated to Material design 3 matching overall Moodle style&lt;br /&gt;
* Some pages now support swipe (participants, book module, grades, forum discussions,...)&lt;br /&gt;
* Resuming a course or a book is now easier&lt;br /&gt;
* Course main page additional options menu redesigned&lt;br /&gt;
* Navigation between sections and activities improved&lt;br /&gt;
* SCORM, H5P automatic full-screen mode&lt;br /&gt;
* Thumbnails for videos are automatically generated&lt;br /&gt;
* Content and activities pages with fewer distractions for users so they can focus on learning&lt;br /&gt;
* General performance improvements&lt;br /&gt;
* New notifications page (capturing all the notifications received by the user)&lt;br /&gt;
* The enrolment fee plugin is now supported (launched in a browser outside the app to complete the process)&lt;br /&gt;
* New 4.0 assignment time-limited submissions supported&lt;br /&gt;
* Teachers can now see H5P attempt reports&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Moodle.com announcement: https://moodle.com/news/moodle-app-4-0/&lt;br /&gt;
[[File:MoodleApp40Store.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sub-task ===&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=File:MoodleApp40Store.png&amp;diff=62183</id>
		<title>File:MoodleApp40Store.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=File:MoodleApp40Store.png&amp;diff=62183"/>
		<updated>2022-04-29T12:12:32Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Moodle App 4.0 screenshots&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62182</id>
		<title>Moodle App 4.0.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_4.0.0_release_notes&amp;diff=62182"/>
		<updated>2022-04-29T12:10:02Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle App Release Notes|Moodle App release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 22 April 2022&lt;br /&gt;
&lt;br /&gt;
Please notice this new version will only connect Moodle sites version &amp;gt;= 3.5 and that it won&#039;t work if your site is using the deprecated local_mobile (Mobile app additional features) plugin.&lt;br /&gt;
==New features and improvements==&lt;br /&gt;
* Support Moodle 4.0 LMS new &amp;quot;My courses&amp;quot; page&lt;br /&gt;
* User profile repositioned to match LMS&lt;br /&gt;
* Design updated to Material design 3 matching overall Moodle style&lt;br /&gt;
* Some pages now support swipe (participants, book module, grades, forum discussions,...)&lt;br /&gt;
* Resuming a course or a book is now easier&lt;br /&gt;
* Course main page additional options menu redesigned&lt;br /&gt;
* Navigation between sections and activities improved&lt;br /&gt;
* SCORM, H5P automatic full-screen mode&lt;br /&gt;
* Thumbnails for videos are automatically generated&lt;br /&gt;
* Content and activities pages with fewer distractions for users so they can focus on learning&lt;br /&gt;
* General performance improvements&lt;br /&gt;
* New notifications page (capturing all the notifications received by the user)&lt;br /&gt;
* The enrolment fee plugin is now supported (launched in a browser outside the app to complete the process)&lt;br /&gt;
* New 4.0 assignment time-limited submissions supported&lt;br /&gt;
* Teachers can now see H5P attempt reports&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Moodle.com announcement: https://moodle.com/news/moodle-app-4-0/&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Sub-task ===&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=62181</id>
		<title>Moodle App Release Notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=62181"/>
		<updated>2022-04-29T12:08:51Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Moodle App ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
!Moodle App 4.0.0&lt;br /&gt;
|22 April 2022&lt;br /&gt;
|40000&lt;br /&gt;
|[[Moodle App 4.0.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.5&lt;br /&gt;
| 27 August 2021&lt;br /&gt;
| 39500&lt;br /&gt;
| [[Moodle Mobile 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.4&lt;br /&gt;
| 28 December 2020&lt;br /&gt;
| 39400&lt;br /&gt;
|[[Moodle Mobile 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.3&lt;br /&gt;
| 30 November 2020&lt;br /&gt;
| 39300&lt;br /&gt;
| [[Moodle Mobile 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.2&lt;br /&gt;
| 16 July 2020&lt;br /&gt;
| 39200&lt;br /&gt;
| [[Moodle Mobile 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.1&lt;br /&gt;
| 3 July 2020&lt;br /&gt;
| 39100&lt;br /&gt;
| [[Moodle Mobile 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.9.0&lt;br /&gt;
| 26 June 2020&lt;br /&gt;
| 39000&lt;br /&gt;
| [[Moodle Mobile 3.9.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.8.2&lt;br /&gt;
| 2 April 2020&lt;br /&gt;
| 38200&lt;br /&gt;
| [[Moodle Mobile 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.8.1&lt;br /&gt;
| 25 March 2020&lt;br /&gt;
| 38100&lt;br /&gt;
| [[Moodle Mobile 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.8.0&lt;br /&gt;
| 20 December 2019&lt;br /&gt;
| 38000&lt;br /&gt;
| [[Moodle Mobile 3.8.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.7.2&lt;br /&gt;
| 20 September 2019&lt;br /&gt;
| 37200&lt;br /&gt;
| [[Moodle Mobile 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.7.1&lt;br /&gt;
| 30 August 2019&lt;br /&gt;
| 37100&lt;br /&gt;
| [[Moodle Mobile 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.7.0&lt;br /&gt;
| 7 June 2019&lt;br /&gt;
| 37000&lt;br /&gt;
| [[Moodle Mobile 3.7.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.6.1&lt;br /&gt;
| 29 March 2019&lt;br /&gt;
| 36100&lt;br /&gt;
| [[Moodle Mobile 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.6.0&lt;br /&gt;
| 11 January 2019&lt;br /&gt;
| 36000&lt;br /&gt;
| [[Moodle Mobile 3.6.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.5.2&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 35200&lt;br /&gt;
| [[Moodle Mobile 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.5.1&lt;br /&gt;
| 6 July 2018&lt;br /&gt;
| 35100&lt;br /&gt;
| [[Moodle Mobile 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle App 3.5.0&lt;br /&gt;
| 25 June 2018&lt;br /&gt;
| 35000&lt;br /&gt;
| [[Moodle Mobile 3.5.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
== Moodle Mobile ==&lt;br /&gt;
Versions with support or 3.0 and previous versions, based on Ionic 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.2&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 20230&lt;br /&gt;
| [[Moodle Mobile 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.1&lt;br /&gt;
| 28 February 2018&lt;br /&gt;
| 20220&lt;br /&gt;
| [[Moodle Mobile 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.0&lt;br /&gt;
| 30 November 2017&lt;br /&gt;
| 20210&lt;br /&gt;
| [[Moodle Mobile 3.4.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.2&lt;br /&gt;
| 29 September 2017&lt;br /&gt;
| 20200&lt;br /&gt;
| [[Moodle Mobile 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.1&lt;br /&gt;
| 28 July 2017&lt;br /&gt;
| 20190&lt;br /&gt;
| [[Moodle Mobile 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.0&lt;br /&gt;
| 26 May 2017&lt;br /&gt;
| 20180&lt;br /&gt;
| [[Moodle Mobile 3.3.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.1&lt;br /&gt;
| 28 February 2017&lt;br /&gt;
| 20170&lt;br /&gt;
| [[Moodle Mobile 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.0&lt;br /&gt;
| 12 December 2016&lt;br /&gt;
| 20160&lt;br /&gt;
| [[Moodle Mobile 3.2.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.3&lt;br /&gt;
| 19 October 2016&lt;br /&gt;
| 20150&lt;br /&gt;
| [[Moodle Mobile 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.2&lt;br /&gt;
| 27 July 2016&lt;br /&gt;
| 2014&lt;br /&gt;
| [[Moodle Mobile 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.1&lt;br /&gt;
| 14 June 2016&lt;br /&gt;
| 2013&lt;br /&gt;
| [[Moodle Mobile 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.0&lt;br /&gt;
| 23 May 2016&lt;br /&gt;
| 2012&lt;br /&gt;
| [[Moodle Mobile 3.1.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.0.0&lt;br /&gt;
| 15 April 2016&lt;br /&gt;
| 2011&lt;br /&gt;
| [[Moodle Mobile 3.0.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.9&lt;br /&gt;
| 29 February 2016&lt;br /&gt;
| 2010&lt;br /&gt;
| [[Moodle Mobile 2.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.8&lt;br /&gt;
| 22 January 2016&lt;br /&gt;
| 2009&lt;br /&gt;
| [[Moodle Mobile 2.8 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.7&lt;br /&gt;
| 29 December 2015&lt;br /&gt;
| 2008&lt;br /&gt;
| [[Moodle Mobile 2.7 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.6&lt;br /&gt;
| 27 November 2015&lt;br /&gt;
| 2007&lt;br /&gt;
| [[Moodle Mobile 2.6 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.5&lt;br /&gt;
| 6 November 2015&lt;br /&gt;
| 2006&lt;br /&gt;
| [[Moodle Mobile 2.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.4&lt;br /&gt;
| 21 October 2015&lt;br /&gt;
| 2005&lt;br /&gt;
| [[Moodle Mobile 2.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.3&lt;br /&gt;
| 8 October 2015&lt;br /&gt;
| 2004&lt;br /&gt;
| [[Moodle Mobile 2.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.2&lt;br /&gt;
| 10 September 2015&lt;br /&gt;
| 2003&lt;br /&gt;
| [[Moodle Mobile 2.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.1&lt;br /&gt;
| 28 August 2015&lt;br /&gt;
| 2002&lt;br /&gt;
| [[Moodle Mobile 2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.0&lt;br /&gt;
| 31 July 2015&lt;br /&gt;
| 2000&lt;br /&gt;
| [[Moodle Mobile 2.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
== Moodle Mobile 1 ==&lt;br /&gt;
See [[Moodle Mobile 1 release notes]]&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Moodle Desktop release notes]]&lt;br /&gt;
* [[Moodle Mobile Roadmap]]&lt;br /&gt;
[[Category: Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=62048</id>
		<title>Moodle App Release Process</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=62048"/>
		<updated>2022-04-22T12:34:52Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* The release day */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Two weeks before (Code freeze) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Create an issue in the tracker for the release, like: MOBILE-1248&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Force an update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as release candidate) with new strings in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Ask someone from sites or community team to review the new English strings. &lt;br /&gt;
| Community or Sites team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Announce in the moodletranslation forums the new strings available: https://lang.moodle.org/mod/forum/view.php?id=5. This will allow translators to add the new strings during the days prior to the release.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Add the release notes in the release issue created (search for the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20%3D%20release_notes release_notes tag]). Ask someone from the documentation team or Martin to review the release notes.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Contact the marketing team announcing the new release and highlights.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Add new QA tests to the “Testing cases” document. New QA tests should be labeled with [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20resolution%20in%20(Unresolved%2C%20Fixed)%20AND%20labels%20%3D%20qa_test_required%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC qa_test_required]. Remove that label once are added to the document.&lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Run npm audit to ensure all the dependencies are OK.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Freeze Cordova plugins and Javascript libraries versions (node modules) in the integration branch.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 10.&lt;br /&gt;
| &#039;&#039;&#039;Start testing&#039;&#039;&#039;&lt;br /&gt;
| Tester&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The release day ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1. &lt;br /&gt;
| Fix the version name in integration/config.xml, integration/package.json and integration:src/config.json (remove the -dev).&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Integrate the [https://github.com/moodlehq/moodleapp/compare/master...integration integration branch onto the master one]. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Do some testing with the production builds before sending the application to the stores (overall testing to see that nothing is broken because of the branch merge done in step 2):&lt;br /&gt;
* Correct definitive version name displayed (and commit)&lt;br /&gt;
* AOT compiling worked&lt;br /&gt;
* Language strings synchronised from lang.moodle.net&lt;br /&gt;
* New language packs added&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Send the applications to the stores for review. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Create a TAG/Release in github ([https://github.com/moodlehq/moodleapp/releases moodlehq/moodleapp]) with the version number.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Mark the issue and the [https://tracker.moodle.org/projects/MOBILE?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page version] as released in the tracker.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Update release notes [[Moodle_Mobile_Release_Notes]] .&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The following days ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Social media announcements (Forum and Twitter).&lt;br /&gt;
| All the team &amp;amp; Marketing team &lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Post in moodle.org/news.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Review the users and developers documentation (check that everything is in order). Review the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20in%20%28docs_required%2C%20dev_docs_required%29 docs_required and dev_docs_required_tags]. Review the [https://docs.moodle.org/en/Moodle_Mobile_features Mobile features wiki documentation].&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Delete the integration and desktop branches and create it again based on master.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Bump version numbers in the following files in the integration branch: config.xml, src/config.json (appending a -dev to the versionname field to indicate that is a development version), package.json (including mac-&amp;gt;bundleVersion) and desktop/assets/windows/AppXManifest.xml.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Unfreeze Cordova plugins and Javascript libraries versions (node modules).&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Execute the combine CSS gulp task to generate a new CSS file for the BMA designer.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Check that the [https://cloud.docker.com/u/moodlehq/repository/docker/moodlehq/moodleapp/general Docker image] for the new version was successfully built.&lt;br /&gt;
| Integration Lead &lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as final release) in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle App Release Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Processes]]&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
{{DISPLAYTITLE:Moodle app release process}}&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=61929</id>
		<title>Moodle App Release Process</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=61929"/>
		<updated>2022-04-07T09:05:47Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* 1 day before */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Two weeks before (Code freeze) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Create an issue in the tracker for the release, like: MOBILE-1248&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Force an update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as release candidate) with new strings in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Ask someone from sites or community team to review the new English strings. &lt;br /&gt;
| Community or Sites team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Announce in the moodletranslation forums the new strings available: https://lang.moodle.org/mod/forum/view.php?id=5. This will allow translators to add the new strings during the days prior to the release.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Add the release notes in the release issue created (search for the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20%3D%20release_notes release_notes tag]). Ask someone from the documentation team or Martin to review the release notes.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Contact the marketing team announcing the new release and highlights.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Add new QA tests to the “Testing cases” document. New QA tests should be labeled with [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20resolution%20in%20(Unresolved%2C%20Fixed)%20AND%20labels%20%3D%20qa_test_required%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC qa_test_required]. Remove that label once are added to the document.&lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Run npm audit to ensure all the dependencies are OK.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Freeze Cordova plugins and Javascript libraries versions (node modules) in the integration branch.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 10.&lt;br /&gt;
| &#039;&#039;&#039;Start testing&#039;&#039;&#039;&lt;br /&gt;
| Tester&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The release day ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1. &lt;br /&gt;
| Fix the version name in integration/config.xml and integration:src/config.json (remove the -dev).&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Integrate the [https://github.com/moodlehq/moodleapp/compare/master...integration integration branch onto the master one]. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Do some testing with the production builds before sending the application to the stores (overall testing to see that nothing is broken because of the branch merge done in step 2):&lt;br /&gt;
* Correct definitive version name displayed (and commit)&lt;br /&gt;
* AOT compiling worked&lt;br /&gt;
* Language strings synchronised from lang.moodle.net&lt;br /&gt;
* New language packs added&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Send the applications to the stores for review. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Create a TAG/Release in github ([https://github.com/moodlehq/moodleapp/releases moodlehq/moodleapp]) with the version number.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Mark the issue and the [https://tracker.moodle.org/projects/MOBILE?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page version] as released in the tracker.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Update release notes [[Moodle_Mobile_Release_Notes]] .&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The following days ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Social media announcements (Forum and Twitter).&lt;br /&gt;
| All the team &amp;amp; Marketing team &lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Post in moodle.org/news.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Review the users and developers documentation (check that everything is in order). Review the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20in%20%28docs_required%2C%20dev_docs_required%29 docs_required and dev_docs_required_tags]. Review the [https://docs.moodle.org/en/Moodle_Mobile_features Mobile features wiki documentation].&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Delete the integration and desktop branches and create it again based on master.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Bump version numbers in the following files in the integration branch: config.xml, src/config.json (appending a -dev to the versionname field to indicate that is a development version), package.json (including mac-&amp;gt;bundleVersion) and desktop/assets/windows/AppXManifest.xml.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Unfreeze Cordova plugins and Javascript libraries versions (node modules).&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Execute the combine CSS gulp task to generate a new CSS file for the BMA designer.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Check that the [https://cloud.docker.com/u/moodlehq/repository/docker/moodlehq/moodleapp/general Docker image] for the new version was successfully built.&lt;br /&gt;
| Integration Lead &lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as final release) in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle App Release Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Processes]]&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
{{DISPLAYTITLE:Moodle app release process}}&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=61918</id>
		<title>Moodle App Release Process</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Process&amp;diff=61918"/>
		<updated>2022-03-31T15:02:51Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Two weeks before (Code freeze) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Two weeks before (Code freeze) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Create an issue in the tracker for the release, like: MOBILE-1248&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Force an update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as release candidate) with new strings in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Ask someone from sites or community team to review the new English strings. &lt;br /&gt;
| Community or Sites team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Announce in the moodletranslation forums the new strings available: https://lang.moodle.org/mod/forum/view.php?id=5. This will allow translators to add the new strings during the days prior to the release.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Add the release notes in the release issue created (search for the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20%3D%20release_notes release_notes tag]). Ask someone from the documentation team or Martin to review the release notes.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Contact the marketing team announcing the new release and highlights.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Add new QA tests to the “Testing cases” document. New QA tests should be labeled with [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20resolution%20in%20(Unresolved%2C%20Fixed)%20AND%20labels%20%3D%20qa_test_required%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC qa_test_required]. Remove that label once are added to the document.&lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Run npm audit to ensure all the dependencies are OK.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Freeze Cordova plugins and Javascript libraries versions (node modules) in the integration branch.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 10.&lt;br /&gt;
| &#039;&#039;&#039;Start testing&#039;&#039;&#039;&lt;br /&gt;
| Tester&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1 day before ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Backport to local_mobile (all branches) all the new required Web Services by new features.&lt;br /&gt;
Check if existing Web Services should be added to the local_mobile service (because they were added to the Mobile app service).&lt;br /&gt;
&lt;br /&gt;
Once all the Web Services are backported and tested, publish a new version in the plugins database (via TAGS) so admin can updates their sites.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The release day ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1. &lt;br /&gt;
| Fix the version name in integration/config.xml and integration:src/config.json (remove the -dev).&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Integrate the [https://github.com/moodlehq/moodleapp/compare/master...integration integration branch onto the master one]. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Do some testing with the production builds before sending the application to the stores (overall testing to see that nothing is broken because of the branch merge done in step 2):&lt;br /&gt;
* Correct definitive version name displayed (and commit)&lt;br /&gt;
* AOT compiling worked&lt;br /&gt;
* Language strings synchronised from lang.moodle.net&lt;br /&gt;
* New language packs added&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Send the applications to the stores for review. &lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Create a TAG/Release in github ([https://github.com/moodlehq/moodleapp/releases moodlehq/moodleapp]) with the version number.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Mark the issue and the [https://tracker.moodle.org/projects/MOBILE?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page version] as released in the tracker.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Update release notes [[Moodle_Mobile_Release_Notes]] .&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The following days ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;table table-striped table-bordered&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:20px&amp;quot; | #&lt;br /&gt;
! Task&lt;br /&gt;
! style=&amp;quot;width:12%&amp;quot; | Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| 1.&lt;br /&gt;
| Social media announcements (Forum and Twitter).&lt;br /&gt;
| All the team &amp;amp; Marketing team &lt;br /&gt;
|-&lt;br /&gt;
| 2.&lt;br /&gt;
| Post in moodle.org/news.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 3.&lt;br /&gt;
| Review the users and developers documentation (check that everything is in order). Review the [https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20labels%20in%20%28docs_required%2C%20dev_docs_required%29 docs_required and dev_docs_required_tags]. Review the [https://docs.moodle.org/en/Moodle_Mobile_features Mobile features wiki documentation].&lt;br /&gt;
| All the team&lt;br /&gt;
|-&lt;br /&gt;
| 4.&lt;br /&gt;
| Delete the integration and desktop branches and create it again based on master.&lt;br /&gt;
| Team Lead&lt;br /&gt;
|-&lt;br /&gt;
| 5.&lt;br /&gt;
| Bump version numbers in the following files in the integration branch: config.xml, src/config.json (appending a -dev to the versionname field to indicate that is a development version), package.json (including mac-&amp;gt;bundleVersion) and desktop/assets/windows/AppXManifest.xml.&lt;br /&gt;
| Integration Lead&lt;br /&gt;
|-&lt;br /&gt;
| 6.&lt;br /&gt;
| Unfreeze Cordova plugins and Javascript libraries versions (node modules).&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 7.&lt;br /&gt;
| Execute the combine CSS gulp task to generate a new CSS file for the BMA designer.&lt;br /&gt;
| Developer&lt;br /&gt;
|-&lt;br /&gt;
| 8.&lt;br /&gt;
| Check that the [https://cloud.docker.com/u/moodlehq/repository/docker/moodlehq/moodleapp/general Docker image] for the new version was successfully built.&lt;br /&gt;
| Integration Lead &lt;br /&gt;
|-&lt;br /&gt;
| 9.&lt;br /&gt;
| Update of the [https://moodle.org/plugins/view.php?id=997 local_moodlemobileapp] plugin (as final release) in moodle.org/plugins (only for Moodle version 2.6). &lt;br /&gt;
| Dev&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle App Release Notes]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Processes]]&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
{{DISPLAYTITLE:Moodle app release process}}&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61917</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61917"/>
		<updated>2022-03-31T10:43:34Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: English corrections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications. They can also opt-in to receive them not only on the app but also via email. Messages sent using this API can be delivered to non-app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only get to active app users.&lt;br /&gt;
&lt;br /&gt;
In both cases, please remember that the number of user devices that can receive Push Notifications is dictated by your app [https://moodle.com/app/ subscription].&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what is explained in the [[Message API]] please notice that it is possible to add a &amp;quot;customdata&amp;quot; field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section below.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to Moodle&lt;br /&gt;
* notification (number): Whether it is a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (JSON encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. It has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘in-app’ or any other value.&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body:&#039;&#039;&#039;&lt;br /&gt;
 curl AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app:&#039;&#039;&#039;&lt;br /&gt;
 curl AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open in a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app):&#039;&#039;&#039;&lt;br /&gt;
 curl AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from your Moodle site settings: Site administration &amp;gt; Messaging &amp;gt; Mobile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app, it can also be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About -&amp;gt; Click at app version -&amp;gt; Push notification ID.&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
The device could be android-fcm or ios-fcm (in the example we used android-fcm only).&lt;br /&gt;
[[Category:Mobile]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61912</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61912"/>
		<updated>2022-03-30T12:28:21Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Sample CURL requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
In both cases please remember that the number of user devices that can receive Push Notifications is dictated by your app [https://moodle.com/app/ subscription].&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
 curl AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
 curl AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open in a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
 curl AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from your Moodle site settings: Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app, it can also be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About -&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
The device could be android-fcm or ios-fcm (in the example we used android-fcm only)&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61911</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61911"/>
		<updated>2022-03-30T12:25:36Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Sample CURL requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
In both cases please remember that the number of user devices that can receive Push Notifications is dictated by your app [https://moodle.com/app/ subscription].&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61909</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61909"/>
		<updated>2022-03-29T15:02:55Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
In both cases please remember that the number of user devices that can receive Push Notifications is dictated by your app [https://moodle.com/app/ subscription].&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61908</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61908"/>
		<updated>2022-03-29T15:01:58Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Payload format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
In both cases please remember that the number of user devices that can receive Push Notifications is dictated by your app [https://moodle.com/app/ subscription].&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61907</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61907"/>
		<updated>2022-03-29T15:01:28Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
In both cases please remember that the number of user devices that can receive Push Notifications is dictated by your app [https://moodle.com/app/ subscription].&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61906</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61906"/>
		<updated>2022-03-29T14:59:09Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Sample CURL requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification.&lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Notification including an icon and picture (only displayed on Android devices) opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61905</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61905"/>
		<updated>2022-03-29T14:58:33Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Sample CURL requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification. &lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61904</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61904"/>
		<updated>2022-03-29T14:58:05Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Airnotifier API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification. &lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
&lt;br /&gt;
Airnotifier is the name of the Push Notification server used by Moodle. It is possible to use its own API to send custom notifications from Moodle without having to use Moodle&#039;s Message API.&lt;br /&gt;
&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61903</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61903"/>
		<updated>2022-03-29T14:56:36Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Moodle’s Message API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification. &lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
&lt;br /&gt;
Please read the official Moodle documentation, [[Message API]], where it is explained how to create a new message provider within a plugin.&lt;br /&gt;
&lt;br /&gt;
Apart from what it is explained in the [[Message API]] please notice that it is possible to add a customdata field (json-encoded) with additional parameters. Those parameters are the ones described in the Airnotifier API section bellow.&lt;br /&gt;
&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61902</id>
		<title>Sending custom Push Notifications to the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Sending_custom_Push_Notifications_to_the_Moodle_App&amp;diff=61902"/>
		<updated>2022-03-29T14:53:53Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: Created page with &amp;quot;{{Moodle App (Ionic 5)}}  There are two ways to send custom Push Notifications to the Moodle app users:  # By using Moodle’s Message API implementing a message provider  # B...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle App (Ionic 5)}}&lt;br /&gt;
&lt;br /&gt;
There are two ways to send custom Push Notifications to the Moodle app users:&lt;br /&gt;
&lt;br /&gt;
# By using Moodle’s Message API implementing a message provider &lt;br /&gt;
# By directly using the Airnotifier (Moodle’s Push Notification server) APIs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Main differences are:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By using Moodle’s Message API, users (students, teachers, etc..) can opt-out to not receive custom notifications, they can also opt-in to receive them not only on the app but also via email. Messages sent using this API can arrive to non app users.&lt;br /&gt;
&lt;br /&gt;
Using the Airnotifier API will force the user to receive the notification unless they change their app settings to not receive any notification. &lt;br /&gt;
Messages sent using this API will only arrive to active app users.&lt;br /&gt;
&lt;br /&gt;
== Moodle’s Message API ==&lt;br /&gt;
&lt;br /&gt;
Please read the official Moodle documentation: [[Message API]]&lt;br /&gt;
&lt;br /&gt;
== Airnotifier API ==&lt;br /&gt;
&lt;br /&gt;
=== Payload format ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mandatory fields:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* processor (string): Always set to moodle&lt;br /&gt;
* notification (number): Whether it’s a notification (1) or a message (0).&lt;br /&gt;
* subject (string): Notification title.&lt;br /&gt;
* smallmessage (string): Notification body, short text.&lt;br /&gt;
* fullmessage (string): Notification body, ignored if smallmessage is set.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optional&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* site (string): Site ID (md5 hash of site URL + username)&lt;br /&gt;
* Siteurl (string): Site URL (used to identify the site the notification is coming from)&lt;br /&gt;
* wwwroot (string): Moodle’s $CFG-&amp;gt;wwwroot&lt;br /&gt;
* component (string): Moodle’s component that generated the notification&lt;br /&gt;
* contexturl (string): URL the notification is related to&lt;br /&gt;
* customdata (json encoded object, all fields are optional)&lt;br /&gt;
** notificationiconurl (string): Icon to display in the notification (Android only).&lt;br /&gt;
** notificationpictureurl (string). Large picture to display in the notification (Android only).&lt;br /&gt;
** tokenpluginfile (string): Token to view the icon if needed.&lt;br /&gt;
** extendedtext (string). An extended text (HTML), opened in popup when clicked. &lt;br /&gt;
** appurl (string): When notification is clicked, open this URL. Has preference over contexturl but it will be ignored if extendedtext is set.&lt;br /&gt;
** appurlopenin (string): Where to open the previous URL ‘browser’, ‘inapp’ or any other value.&lt;br /&gt;
&lt;br /&gt;
=== Sample CURL requests ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_URL&#039;&#039;&#039;: Can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;APP_ID&#039;&#039;&#039;: commoodlemoodlemobile for the standard Moodle app&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AIRNOTIFIER_ACCESS_KEY&#039;&#039;&#039;: Your Airnotifier Access key that can be obtained from Site administration &amp;gt; Messaging &amp;gt; Mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DEVICE_TOKEN&#039;&#039;&#039;: The user’s receiving the notification device token, for testing purposes you can get it via the app -&amp;gt; App settings -&amp;gt; About .&amp;gt; Click at app version -&amp;gt; Push notification ID&lt;br /&gt;
In Moodle the push ids are in the user_devices table (pushid field), the previous table has to be joined with message_airnotifier_devices to obtain active devices. &lt;br /&gt;
&lt;br /&gt;
Device could be android-fcm or ios-fcm&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Simple notification, only subject and body&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;,  &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;}}&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening a popup with custom content on the app&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{\&amp;quot;extendedtext\&amp;quot; : \&amp;quot;Extended tex that will open on a popupt\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notification opening URL that can be handled by the app (a course within the app)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 curl https://AIRNOTIFIER_URL/api/v2/push -X POST -H &amp;quot;X-AN-APP-NAME: APP_ID&amp;quot; -H &amp;quot;X-AN-APP-KEY: AIRNOTIFIER_ACCESS_KEY&amp;quot; --data &#039;{&amp;quot;device&amp;quot;: &amp;quot;android-fcm&amp;quot;, &amp;quot;token&amp;quot;: &amp;quot;DEVICE_TOKEN&amp;quot;, &amp;quot;extra&amp;quot;: {&amp;quot;processor&amp;quot; : &amp;quot;moodle&amp;quot;, &amp;quot;notification&amp;quot;: 1, &amp;quot;subject&amp;quot;: &amp;quot;Title test&amp;quot;, &amp;quot;fullmessage&amp;quot;: &amp;quot;Message test&amp;quot;, &amp;quot;customdata&amp;quot;: &amp;quot;{ \&amp;quot;appurl\&amp;quot; : \&amp;quot;https://mymoodlesite.net/course/view.php?id=18\&amp;quot;, \&amp;quot;notificationiconurl\&amp;quot; : \&amp;quot;https://picsum.photos/50\&amp;quot;, \&amp;quot;notificationpictureurl\&amp;quot; : \&amp;quot;https://picsum.photos/200\&amp;quot;}&amp;quot;}}&#039;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Using_the_Moodle_App_in_a_browser&amp;diff=61737</id>
		<title>Using the Moodle App in a browser</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Using_the_Moodle_App_in_a_browser&amp;diff=61737"/>
		<updated>2022-02-16T18:26:34Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Installation and configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Browsers are not officially supported by the application, but you can use a Chromium-based browser for development if you don’t need any native functionality.&lt;br /&gt;
&lt;br /&gt;
Please notice that it has to be a Chromium-based browser, because the application relies on the [https://caniuse.com/?search=websql Web SQL Database API] which isn&#039;t supported in most browsers. This is a non-standard API, but that&#039;s not a problem because this is only used in the browser. Running on a native environment, the application relies on native APIs that are well supported.&lt;br /&gt;
{{Moodle App (Ionic 5)}}&lt;br /&gt;
== Differences between Chromium and Google Chrome ==&lt;br /&gt;
Google Chrome is the Chromium open source project built, packaged, and distributed by Google. We can say that Chromium is Google Chrome without the &amp;quot;Google&amp;quot; add-ons. For that reason, we recommend using Chromium instead of Google Chrome.&lt;br /&gt;
== Advantages and disadvantages of using a browser instead of a native device ==&lt;br /&gt;
Main advantages:&lt;br /&gt;
* Faster development.&lt;br /&gt;
* DOM inspector.&lt;br /&gt;
* Network monitor.&lt;br /&gt;
* Database inspector.&lt;br /&gt;
* Emulation options.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* You can&#039;t use native functionality.&lt;br /&gt;
* If you need to use Cordova plugins, you will probably need to provide a way to emulate those APIs in the browser or avoid calling them in the browser environment.&lt;br /&gt;
* You will always need to test in a native device prior to a production release.&lt;br /&gt;
* You will need to verify that your CSS/layout looks the same in native devices.&lt;br /&gt;
== Installation and configuration ==&lt;br /&gt;
You can install the Chromium browser by downloading it from [https://www.chromium.org/getting-involved/download-chromium the official download page].&lt;br /&gt;
&lt;br /&gt;
In order to run the Moodle App, we recommend that you launch the browser with a couple of arguments. These are necessary to disable some of the limitations that don&#039;t exist in the native application, and also prepare the development environment:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chromium-browser --allow-file-access-from-files --disable-web-security --allow-running-insecure-content --no-referrers --unlimited-storage --auto-open-devtools-for-tabs --user-data-dir=~/.chromium-dev-data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The command above will work on Linux. If you are using other operative system, check out [https://www.chromium.org/developers/how-tos/run-chromium-with-flags how to run chromium with flags] in other environments.&lt;br /&gt;
&lt;br /&gt;
Please, notice also that certain versions of Chrome might required this additional flag to work: --disable-site-isolation-trials&lt;br /&gt;
&lt;br /&gt;
For more info about the user data dir, please read [https://chromium.googlesource.com/chromium/src/+/master/docs/user_data_dir.md the official documentation].&lt;br /&gt;
=== Creating a shortcut ===&lt;br /&gt;
We strongly recommend that you create a new shortcut and use it only for working with the app during development. In Linux, and possibly other operating systems, these arguments only work if you don&#039;t already have the same browser running. Hence if you use Google Chrome as your normal browser, you can use Chromium for development and vice versa.&lt;br /&gt;
&lt;br /&gt;
In Linux, you can create such a shortcut by writing a script that is globally available. For example, you can create the following file in &amp;lt;code&amp;gt;/usr/local/bin/unsafe-chromium&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
chromium-browser --allow-file-access-from-files --disable-web-security --allow-running-insecure-content --no-referrers --unlimited-storage --auto-open-devtools-for-tabs --user-data-dir=/home/{username}/.chromium-dev-data $@&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Notice that this time we shouldn&#039;t use &amp;lt;code&amp;gt;~/.chromium-dev-data&amp;lt;/code&amp;gt; to describe the user data dir. That&#039;s because this file can be called from a different shell, and &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; could not be interpreted properly (this may end up creating a folder called &amp;quot;~&amp;quot; in your project folder, and you probably don&#039;t want that).&lt;br /&gt;
&lt;br /&gt;
Also, remember to make this file executable by running &amp;lt;code&amp;gt;sudo chmod +x /usr/local/bin/unsafe-chromium&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For convenience, you can also define an application launch that calls this script.&lt;br /&gt;
&amp;lt;p class=&amp;quot;alert alert-info&amp;quot;&amp;gt;&#039;&#039;&#039;Help wanted!&#039;&#039;&#039; These instructions have only been tested in Linux. If you are using a different operative system, [[Talk:Using the Moodle App in a browser|let us know]] how it went (or just [https://docs.moodle.org/dev/index.php?title=Using_the_Moodle_App_in_a_browser&amp;amp;veaction=edit edit this page]!).&amp;lt;/p&amp;gt;&lt;br /&gt;
=== Configuring the default browser ===&lt;br /&gt;
When you launch the application by running &amp;lt;code&amp;gt;npm start&amp;lt;/code&amp;gt;, this will open a tab on your default browser. You can close this tab and open the url with your development browser, but if you want to do it automatically you can override the default browser by setting the &amp;lt;code&amp;gt;MOODLE_APP_BROWSER&amp;lt;/code&amp;gt; environment variable.&lt;br /&gt;
&lt;br /&gt;
For example, if you have created a shortcut like we mentioned in the previous section, you can just add the following to your &amp;lt;code&amp;gt;~/.bashrc&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export MOODLE_APP_BROWSER=unsafe-chromium&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;alert alert-info&amp;quot;&amp;gt;&#039;&#039;&#039;Help wanted!&#039;&#039;&#039; These instructions have only been tested in Linux. If you are using a different operative system, [[Talk:Using the Moodle App in a browser|let us know]] how it went (or just [https://docs.moodle.org/dev/index.php?title=Using_the_Moodle_App_in_a_browser&amp;amp;veaction=edit edit this page]!).&amp;lt;/p&amp;gt;&lt;br /&gt;
== Tips &amp;amp; tricks ==&lt;br /&gt;
Once you have everything set up, you should be able to develop like you would with any other front-end application. You can learn about the development tools you have available by reading the [https://developer.chrome.com/devtools/index Chrome DevTools documentation].&lt;br /&gt;
&lt;br /&gt;
Here&#039;s some things we find useful to work with the Moodle App in particular:&lt;br /&gt;
* [https://developer.chrome.com/docs/devtools/device-mode/ Device Mode] — You can use this feature to make the browser behave more like a native device. This will work best if you [https://developer.chrome.com/docs/devtools/customize/placement/ dock the development panel] to one side (left or right), but you may want to do something else in your environment.&lt;br /&gt;
* [https://developer.chrome.com/docs/devtools/console/ Console Panel] — This panel is essential for any developer, since it will show you any errors or custom messages that you&#039;ve written. You can also use the search box to filter messages seeing everything is too overwhelming. You will also see specific logs from the Moodle App, but keep in mind that they are not used in production environment. If you are not running the application yourself, you can inspect the environment by opening the /assets/env.json url.&lt;br /&gt;
* [https://developer.chrome.com/docs/devtools/dom/ Elements Panel] — This panel is also essential for any developer, you&#039;ll be able to inspect and modify the HTML that is actually being rendered.&lt;br /&gt;
* [https://developer.chrome.com/docs/devtools/network/ Network Panel] — This panel can be useful if you are trying to see how the Moodle App communicates with a Moodle site. You may also want to [https://developer.chrome.com/docs/devtools/network/reference/#disable-cache disable the cache] in order to have the same behaviour after each reload. However, keep in mind that this only disables the browser cache, any Web Service calls that are cached by the Moodle App will remain cached. You can learn more about network requests in the [[Debugging network requests in the Moodle App]] page.&lt;br /&gt;
* [https://developer.chrome.com/docs/devtools/storage/websql/ WebSQL Inspector] — As mentioned before, WebSQL is a non-standard API. But since the Moodle App uses it for development, this inspector may come in handy. Keep in mind that the native application does not use WebSQL, so it is possible that you see some different behaviour in a native device. But it should be reliable for the most part.&lt;br /&gt;
[[Category: Mobile]]&lt;br /&gt;
[[Category: Moodle App Ionic 5]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.5_release_notes&amp;diff=61165</id>
		<title>Moodle Mobile 3.9.5 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.5_release_notes&amp;diff=61165"/>
		<updated>2021-08-31T09:00:50Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* New features and improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 27 August 2021&lt;br /&gt;
==New features and improvements==&lt;br /&gt;
* Accessibility improvements to achieve WCAG 2.1 AA compliance&lt;br /&gt;
* H5P improvements - play packages using as much screen as possible and improve the way they are embedded&lt;br /&gt;
* Moodle 3.11 student activity completion support&lt;br /&gt;
* LTI 1.3 launch support&lt;br /&gt;
* iOS ITP settings support to allow the iOS version of the app to embed content from different URLs&lt;br /&gt;
* New option in iOS for allowing a user to open a file using the system preview or a dedicated app&lt;br /&gt;
* Plagiarism information displayed in essay question types&lt;br /&gt;
* Word count support in quiz essay questions&lt;br /&gt;
* Quiz pass grade displayed on quiz front page&lt;br /&gt;
==Iconic 5 upgrade==&lt;br /&gt;
In this version, we have upgraded the framework we use for building the app. Note that there are several changes which may impact plugins or sites using their own custom mobile CSS:&lt;br /&gt;
* If you have developed a plugin that is supported for the Moodle app please read [[Adapt your Mobile plugins to Ionic 5]]&lt;br /&gt;
* If you have a Premium app subscription and your own Moodle app theme please read [[Ionic5 style migration guide]]&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3496 - NOT_FOUND_ERR when uploading video for Assignment from &amp;quot;Photo albums&amp;quot; on iOS&lt;br /&gt;
* MOBILE-3563 - Workshop does not have submit button, when allowed late submissions&lt;br /&gt;
* MOBILE-3567 - The app does not launch a course view event after the user self-enrol into the course&lt;br /&gt;
* MOBILE-3615 - Button &amp;quot;Help&amp;quot; opens wrong website &lt;br /&gt;
* MOBILE-3623 - Site plugins: success message not seen if combined with goBackOnSuccess&lt;br /&gt;
* MOBILE-3670 - Navbar color and custom CSS clash on login page.&lt;br /&gt;
* MOBILE-3674 - Make CoreUrl.sameDomainAndPath case insensitive&lt;br /&gt;
* MOBILE-3693 - Radio button: item not clickable if it contains links&lt;br /&gt;
* MOBILE-3694 - Auto-login only works in first iframe if several are displayed at the same time&lt;br /&gt;
* MOBILE-3701 - iOS: SCORM package reloaded when clicking a link with href &#039;#&#039; and handled via JS&lt;br /&gt;
* MOBILE-3704 - Page: Files with parameters not working&lt;br /&gt;
* MOBILE-3709 - SCORM does not registrer cmi.core.total_time APP mobile&lt;br /&gt;
* MOBILE-3713 - Cookies not sent to iframes in iOS 14 (preventing embedding external content such as H5P)&lt;br /&gt;
* MOBILE-3722 - It is not possible to create events for 2022 onwards&lt;br /&gt;
* MOBILE-3724 - Fix LTI 1.3 launch in the app&lt;br /&gt;
* MOBILE-3789 - Assignment blind marking&lt;br /&gt;
* MOBILE-3797 - User profiles can cause infinite requests with custom course themes&lt;br /&gt;
* MOBILE-3832 - Infinite scroll: infinite requests when an error happens&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
* MOBILE-3757 - Support new student completion&lt;br /&gt;
=== Task ===&lt;br /&gt;
* MOBILE-3732 - Display plagiarism information in the essay question type&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-3673 - Update target SDK to 30&lt;br /&gt;
* MOBILE-3680 - Apply essay question min/max word count in the app&lt;br /&gt;
* MOBILE-3698 - Review if word count changes done in MDL-70796 should be applied to the app&lt;br /&gt;
* MOBILE-3716 - Include the Scan QR code button in the reconnect screen&lt;br /&gt;
* MOBILE-3734 - Review single activity course format in Ionic 5&lt;br /&gt;
* MOBILE-3739 - Add a leave guard on chat&lt;br /&gt;
* MOBILE-3742 - Support links to other sites in Ionic 5 (redirect)&lt;br /&gt;
* MOBILE-3754 - Pass grade not displayed on quiz front page&lt;br /&gt;
* MOBILE-3758 - Update H5P library to 1.24.02&lt;br /&gt;
* MOBILE-3761 - Show &amp;quot;open with&amp;quot; dialog when opening a file&lt;br /&gt;
* MOBILE-3762 - Recaptcha open button does not explain the function&lt;br /&gt;
* MOBILE-3765 - Include a link to a permanent survey about the Moodle app&lt;br /&gt;
* MOBILE-3766 - Include a link to provide feedback during beta testing&lt;br /&gt;
* MOBILE-3771 - Do not display the bottom navigation menu for the H5P activity when playing a package&lt;br /&gt;
* MOBILE-3783 - Release Moodle app version 3.9.5&lt;br /&gt;
=== Sub-task ===&lt;br /&gt;
* MOBILE-3565 - Create a minimum base of the app using Ionic 5&lt;br /&gt;
* MOBILE-3591 - Migrate tags structure&lt;br /&gt;
* MOBILE-3592 - Migrate user feature to ionic 5&lt;br /&gt;
* MOBILE-3608 - Migrate blocks to ionic5&lt;br /&gt;
* MOBILE-3609 - Implement split view component&lt;br /&gt;
* MOBILE-3620 - Migrate filters to Ionic 5&lt;br /&gt;
* MOBILE-3624 - Migrate badges to Ionic 5&lt;br /&gt;
* MOBILE-3625 - Migrate blocks with module dependency to Ionic 5&lt;br /&gt;
* MOBILE-3626 - Migrate calendar to Ionic 5&lt;br /&gt;
* MOBILE-3627 - Migrate blog feature to Ionic 5&lt;br /&gt;
* MOBILE-3628 - Migrate competency and learning plans to Ionic 5&lt;br /&gt;
* MOBILE-3629 - Migrate course completion to Ionic 5&lt;br /&gt;
* MOBILE-3630 - Migrate shared files to Ionic 5&lt;br /&gt;
* MOBILE-3631 - Migrate messaging addon to Ionic 5&lt;br /&gt;
* MOBILE-3632 - Migrate Notes to Ionic 5&lt;br /&gt;
* MOBILE-3633 - Migrate notifications to Ionic 5&lt;br /&gt;
* MOBILE-3634 - Migrate remote themes to Ionic 5&lt;br /&gt;
* MOBILE-3635 - Migrate storage manager to Ionic 5&lt;br /&gt;
* MOBILE-3636 - Migrate assign activity to Ionic 5&lt;br /&gt;
* MOBILE-3637 - Migrate book activity to Ionic 5&lt;br /&gt;
* MOBILE-3638 - Migrate chat activity to Ionic 5&lt;br /&gt;
* MOBILE-3639 - Migrate choice activity to Ionic 5&lt;br /&gt;
* MOBILE-3640 - Migrate database activity to Ionic 5&lt;br /&gt;
* MOBILE-3641 - Migrate feedback activity to Ionic 5&lt;br /&gt;
* MOBILE-3642 - Migrate folder activity to Ionic 5&lt;br /&gt;
* MOBILE-3643 - Migrate forum activity to Ionic 5&lt;br /&gt;
* MOBILE-3644 - Migrate glossary activity to Ionic 5&lt;br /&gt;
* MOBILE-3645 - Migrate h5p activity to Ionic 5&lt;br /&gt;
* MOBILE-3646 - Migrate IMSCP activity to Ionic 5&lt;br /&gt;
* MOBILE-3647 - Migrate label activity to Ionic 5&lt;br /&gt;
* MOBILE-3648 - Migrate lesson activity to Ionic 5&lt;br /&gt;
* MOBILE-3649 - Migrate lti activity to Ionic 5&lt;br /&gt;
* MOBILE-3650 - Migrate page activity to Ionic 5&lt;br /&gt;
* MOBILE-3651 - Migrate quiz activity to Ionic 5&lt;br /&gt;
* MOBILE-3652 - Migrate resource activity to Ionic 5&lt;br /&gt;
* MOBILE-3653 - Migrate scorm activity to Ionic 5&lt;br /&gt;
* MOBILE-3654 - Migrate survey activity to Ionic 5&lt;br /&gt;
* MOBILE-3655 - Migrate url activity to Ionic 5&lt;br /&gt;
* MOBILE-3656 - Migrate wiki activity to Ionic 5&lt;br /&gt;
* MOBILE-3657 - Migrate workshop activity to Ionic 5&lt;br /&gt;
* MOBILE-3658 - Migrate comments feature to Ionic 5&lt;br /&gt;
* MOBILE-3659 - Migrate course feature to Ionic 5&lt;br /&gt;
* MOBILE-3660 - Migrate courses feature to Ionic 5&lt;br /&gt;
* MOBILE-3661 - Migrate grades feature to Ionic 5&lt;br /&gt;
* MOBILE-3662 - Migrate push notifications feature to Ionic 5&lt;br /&gt;
* MOBILE-3663 - Migrate rating feature to Ionic 5&lt;br /&gt;
* MOBILE-3664 - Migrate site plugins to Ionic 5&lt;br /&gt;
* MOBILE-3665 - Change language files placement&lt;br /&gt;
* MOBILE-3666 - Migrate core H5P code to Ionic 5&lt;br /&gt;
* MOBILE-3675 - Migrate participants and course grades tab to Ionic 5&lt;br /&gt;
* MOBILE-3689 - Review initialization&lt;br /&gt;
* MOBILE-3690 - Abstract some splitview code to improve navigation and resizing&lt;br /&gt;
* MOBILE-3691 - Prevent iframe navigation from taking over the app&lt;br /&gt;
* MOBILE-3712 - Migrate QR scanner to Ionic 5&lt;br /&gt;
* MOBILE-3720 - Review platforms support&lt;br /&gt;
* MOBILE-3738 - Migrate Behat tests to ionic 5&lt;br /&gt;
* MOBILE-3744 - Improve icons labelling&lt;br /&gt;
* MOBILE-3746 - Solve iOS Visible Keyboard Focus&lt;br /&gt;
* MOBILE-3749 - Increse touch target area to 44x44 at least&lt;br /&gt;
* MOBILE-3750 - Add an alternative way to horizontal scrolls&lt;br /&gt;
* MOBILE-3751 - Consistent heading design&lt;br /&gt;
* MOBILE-3752 - Table related a11y issues&lt;br /&gt;
* MOBILE-3753 - Improve buttons labelling&lt;br /&gt;
* MOBILE-3759 - Review ion-badges a11y text&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=61136</id>
		<title>Moodle App Release Notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=61136"/>
		<updated>2021-08-27T17:15:54Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Moodle App */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Moodle App ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.5&lt;br /&gt;
| 27 August 2021&lt;br /&gt;
| 39500&lt;br /&gt;
| [[Moodle Mobile 3.9.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.4&lt;br /&gt;
| 28 December 2020&lt;br /&gt;
| 39400&lt;br /&gt;
| [[Moodle Mobile 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.3&lt;br /&gt;
| 30 November 2020&lt;br /&gt;
| 39300&lt;br /&gt;
| [[Moodle Mobile 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.2&lt;br /&gt;
| 16 July 2020&lt;br /&gt;
| 39200&lt;br /&gt;
| [[Moodle Mobile 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.1&lt;br /&gt;
| 3 July 2020&lt;br /&gt;
| 39100&lt;br /&gt;
| [[Moodle Mobile 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.0&lt;br /&gt;
| 26 June 2020&lt;br /&gt;
| 39000&lt;br /&gt;
| [[Moodle Mobile 3.9.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.8.2&lt;br /&gt;
| 2 April 2020&lt;br /&gt;
| 38200&lt;br /&gt;
| [[Moodle Mobile 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.8.1&lt;br /&gt;
| 25 March 2020&lt;br /&gt;
| 38100&lt;br /&gt;
| [[Moodle Mobile 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.8.0&lt;br /&gt;
| 20 December 2019&lt;br /&gt;
| 38000&lt;br /&gt;
| [[Moodle Mobile 3.8.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.7.2&lt;br /&gt;
| 20 September 2019&lt;br /&gt;
| 37200&lt;br /&gt;
| [[Moodle Mobile 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.7.1&lt;br /&gt;
| 30 August 2019&lt;br /&gt;
| 37100&lt;br /&gt;
| [[Moodle Mobile 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.7.0&lt;br /&gt;
| 7 June 2019&lt;br /&gt;
| 37000&lt;br /&gt;
| [[Moodle Mobile 3.7.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.6.1&lt;br /&gt;
| 29 March 2019&lt;br /&gt;
| 36100&lt;br /&gt;
| [[Moodle Mobile 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.6.0&lt;br /&gt;
| 11 January 2019&lt;br /&gt;
| 36000&lt;br /&gt;
| [[Moodle Mobile 3.6.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.5.2&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 35200&lt;br /&gt;
| [[Moodle Mobile 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.5.1&lt;br /&gt;
| 6 July 2018&lt;br /&gt;
| 35100&lt;br /&gt;
| [[Moodle Mobile 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.5.0&lt;br /&gt;
| 25 June 2018&lt;br /&gt;
| 35000&lt;br /&gt;
| [[Moodle Mobile 3.5.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Moodle Mobile ==&lt;br /&gt;
&lt;br /&gt;
Versions with support or 3.0 and previous versions, based on Ionic 1.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.2&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 20230&lt;br /&gt;
| [[Moodle Mobile 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.1&lt;br /&gt;
| 28 February 2018&lt;br /&gt;
| 20220&lt;br /&gt;
| [[Moodle Mobile 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.0&lt;br /&gt;
| 30 November 2017&lt;br /&gt;
| 20210&lt;br /&gt;
| [[Moodle Mobile 3.4.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.2&lt;br /&gt;
| 29 September 2017&lt;br /&gt;
| 20200&lt;br /&gt;
| [[Moodle Mobile 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.1&lt;br /&gt;
| 28 July 2017&lt;br /&gt;
| 20190&lt;br /&gt;
| [[Moodle Mobile 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.0&lt;br /&gt;
| 26 May 2017&lt;br /&gt;
| 20180&lt;br /&gt;
| [[Moodle Mobile 3.3.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.1&lt;br /&gt;
| 28 February 2017&lt;br /&gt;
| 20170&lt;br /&gt;
| [[Moodle Mobile 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.0&lt;br /&gt;
| 12 December 2016&lt;br /&gt;
| 20160&lt;br /&gt;
| [[Moodle Mobile 3.2.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.3&lt;br /&gt;
| 19 October 2016&lt;br /&gt;
| 20150&lt;br /&gt;
| [[Moodle Mobile 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.2&lt;br /&gt;
| 27 July 2016&lt;br /&gt;
| 2014&lt;br /&gt;
| [[Moodle Mobile 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.1&lt;br /&gt;
| 14 June 2016&lt;br /&gt;
| 2013&lt;br /&gt;
| [[Moodle Mobile 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.0&lt;br /&gt;
| 23 May 2016&lt;br /&gt;
| 2012&lt;br /&gt;
| [[Moodle Mobile 3.1.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.0.0&lt;br /&gt;
| 15 April 2016&lt;br /&gt;
| 2011&lt;br /&gt;
| [[Moodle Mobile 3.0.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.9&lt;br /&gt;
| 29 February 2016&lt;br /&gt;
| 2010&lt;br /&gt;
| [[Moodle Mobile 2.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.8&lt;br /&gt;
| 22 January 2016&lt;br /&gt;
| 2009&lt;br /&gt;
| [[Moodle Mobile 2.8 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.7&lt;br /&gt;
| 29 December 2015&lt;br /&gt;
| 2008&lt;br /&gt;
| [[Moodle Mobile 2.7 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.6&lt;br /&gt;
| 27 November 2015&lt;br /&gt;
| 2007&lt;br /&gt;
| [[Moodle Mobile 2.6 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.5&lt;br /&gt;
| 6 November 2015&lt;br /&gt;
| 2006&lt;br /&gt;
| [[Moodle Mobile 2.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.4&lt;br /&gt;
| 21 October 2015&lt;br /&gt;
| 2005&lt;br /&gt;
| [[Moodle Mobile 2.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.3&lt;br /&gt;
| 8 October 2015&lt;br /&gt;
| 2004&lt;br /&gt;
| [[Moodle Mobile 2.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.2&lt;br /&gt;
| 10 September 2015&lt;br /&gt;
| 2003&lt;br /&gt;
| [[Moodle Mobile 2.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.1&lt;br /&gt;
| 28 August 2015&lt;br /&gt;
| 2002&lt;br /&gt;
| [[Moodle Mobile 2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.0&lt;br /&gt;
| 31 July 2015&lt;br /&gt;
| 2000&lt;br /&gt;
| [[Moodle Mobile 2.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Moodle Mobile 1 ==&lt;br /&gt;
&lt;br /&gt;
See [[Moodle Mobile 1 release notes]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle Desktop release notes]]&lt;br /&gt;
* [[Moodle Mobile Roadmap]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.5_release_notes&amp;diff=61135</id>
		<title>Moodle Mobile 3.9.5 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.5_release_notes&amp;diff=61135"/>
		<updated>2021-08-27T17:15:14Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: Not yet released&lt;br /&gt;
&lt;br /&gt;
==New features and improvements==&lt;br /&gt;
&lt;br /&gt;
* Accessibility improvements to achieve WCAG 2.1 AA compliance&lt;br /&gt;
* H5P improvements - play packages using as much screen as possible and improve the way they are embedded&lt;br /&gt;
* Moodle 3.11 student activity completion support&lt;br /&gt;
* LTI 1.3 launch support&lt;br /&gt;
* iOS ITP settings support to allow the iOS version of the app to embed content from different URLs&lt;br /&gt;
* New option in iOS for allowing a user to open a file using the system preview or a dedicated app&lt;br /&gt;
* Plagiarism information displayed in essay question types&lt;br /&gt;
* Word count support in quiz essay questions&lt;br /&gt;
* Quiz pass grade displayed on quiz front page&lt;br /&gt;
&lt;br /&gt;
==Iconic 5 upgrade==&lt;br /&gt;
&lt;br /&gt;
In this version, we have upgraded the framework we use for building the app. Note that there are several changes which may impact plugins or sites using their own custom mobile CSS:&lt;br /&gt;
&lt;br /&gt;
* If you have developed a plugin that is supported for the Moodle app please read [[Adapt your Mobile plugins to Ionic 5]]&lt;br /&gt;
* If you have a Premium app subscription and your own Moodle app theme please read [[Ionic5 style migration guide]]&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3496 - NOT_FOUND_ERR when uploading video for Assignment from &amp;quot;Photo albums&amp;quot; on iOS&lt;br /&gt;
* MOBILE-3563 - Workshop does not have submit button, when allowed late submissions&lt;br /&gt;
* MOBILE-3567 - The app does not launch a course view event after the user self-enrol into the course&lt;br /&gt;
* MOBILE-3615 - Button &amp;quot;Help&amp;quot; opens wrong website &lt;br /&gt;
* MOBILE-3623 - Site plugins: success message not seen if combined with goBackOnSuccess&lt;br /&gt;
* MOBILE-3670 - Navbar color and custom CSS clash on login page.&lt;br /&gt;
* MOBILE-3674 - Make CoreUrl.sameDomainAndPath case insensitive&lt;br /&gt;
* MOBILE-3693 - Radio button: item not clickable if it contains links&lt;br /&gt;
* MOBILE-3694 - Auto-login only works in first iframe if several are displayed at the same time&lt;br /&gt;
* MOBILE-3701 - iOS: SCORM package reloaded when clicking a link with href &#039;#&#039; and handled via JS&lt;br /&gt;
* MOBILE-3704 - Page: Files with parameters not working&lt;br /&gt;
* MOBILE-3709 - SCORM does not registrer cmi.core.total_time APP mobile&lt;br /&gt;
* MOBILE-3713 - Cookies not sent to iframes in iOS 14 (preventing embedding external content such as H5P)&lt;br /&gt;
* MOBILE-3722 - It is not possible to create events for 2022 onwards&lt;br /&gt;
* MOBILE-3724 - Fix LTI 1.3 launch in the app&lt;br /&gt;
* MOBILE-3789 - Assignment blind marking&lt;br /&gt;
* MOBILE-3797 - User profiles can cause infinite requests with custom course themes&lt;br /&gt;
* MOBILE-3832 - Infinite scroll: infinite requests when an error happens&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
* MOBILE-3757 - Support new student completion&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
* MOBILE-3732 - Display plagiarism information in the essay question type&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-3673 - Update target SDK to 30&lt;br /&gt;
* MOBILE-3680 - Apply essay question min/max word count in the app&lt;br /&gt;
* MOBILE-3698 - Review if word count changes done in MDL-70796 should be applied to the app&lt;br /&gt;
* MOBILE-3716 - Include the Scan QR code button in the reconnect screen&lt;br /&gt;
* MOBILE-3734 - Review single activity course format in Ionic 5&lt;br /&gt;
* MOBILE-3739 - Add a leave guard on chat&lt;br /&gt;
* MOBILE-3742 - Support links to other sites in Ionic 5 (redirect)&lt;br /&gt;
* MOBILE-3754 - Pass grade not displayed on quiz front page&lt;br /&gt;
* MOBILE-3758 - Update H5P library to 1.24.02&lt;br /&gt;
* MOBILE-3761 - Show &amp;quot;open with&amp;quot; dialog when opening a file&lt;br /&gt;
* MOBILE-3762 - Recaptcha open button does not explain the function&lt;br /&gt;
* MOBILE-3765 - Include a link to a permanent survey about the Moodle app&lt;br /&gt;
* MOBILE-3766 - Include a link to provide feedback during beta testing&lt;br /&gt;
* MOBILE-3771 - Do not display the bottom navigation menu for the H5P activity when playing a package&lt;br /&gt;
* MOBILE-3783 - Release Moodle app version 3.9.5&lt;br /&gt;
&lt;br /&gt;
=== Sub-task ===&lt;br /&gt;
* MOBILE-3565 - Create a minimum base of the app using Ionic 5&lt;br /&gt;
* MOBILE-3591 - Migrate tags structure&lt;br /&gt;
* MOBILE-3592 - Migrate user feature to ionic 5&lt;br /&gt;
* MOBILE-3608 - Migrate blocks to ionic5&lt;br /&gt;
* MOBILE-3609 - Implement split view component&lt;br /&gt;
* MOBILE-3620 - Migrate filters to Ionic 5&lt;br /&gt;
* MOBILE-3624 - Migrate badges to Ionic 5&lt;br /&gt;
* MOBILE-3625 - Migrate blocks with module dependency to Ionic 5&lt;br /&gt;
* MOBILE-3626 - Migrate calendar to Ionic 5&lt;br /&gt;
* MOBILE-3627 - Migrate blog feature to Ionic 5&lt;br /&gt;
* MOBILE-3628 - Migrate competency and learning plans to Ionic 5&lt;br /&gt;
* MOBILE-3629 - Migrate course completion to Ionic 5&lt;br /&gt;
* MOBILE-3630 - Migrate shared files to Ionic 5&lt;br /&gt;
* MOBILE-3631 - Migrate messaging addon to Ionic 5&lt;br /&gt;
* MOBILE-3632 - Migrate Notes to Ionic 5&lt;br /&gt;
* MOBILE-3633 - Migrate notifications to Ionic 5&lt;br /&gt;
* MOBILE-3634 - Migrate remote themes to Ionic 5&lt;br /&gt;
* MOBILE-3635 - Migrate storage manager to Ionic 5&lt;br /&gt;
* MOBILE-3636 - Migrate assign activity to Ionic 5&lt;br /&gt;
* MOBILE-3637 - Migrate book activity to Ionic 5&lt;br /&gt;
* MOBILE-3638 - Migrate chat activity to Ionic 5&lt;br /&gt;
* MOBILE-3639 - Migrate choice activity to Ionic 5&lt;br /&gt;
* MOBILE-3640 - Migrate database activity to Ionic 5&lt;br /&gt;
* MOBILE-3641 - Migrate feedback activity to Ionic 5&lt;br /&gt;
* MOBILE-3642 - Migrate folder activity to Ionic 5&lt;br /&gt;
* MOBILE-3643 - Migrate forum activity to Ionic 5&lt;br /&gt;
* MOBILE-3644 - Migrate glossary activity to Ionic 5&lt;br /&gt;
* MOBILE-3645 - Migrate h5p activity to Ionic 5&lt;br /&gt;
* MOBILE-3646 - Migrate IMSCP activity to Ionic 5&lt;br /&gt;
* MOBILE-3647 - Migrate label activity to Ionic 5&lt;br /&gt;
* MOBILE-3648 - Migrate lesson activity to Ionic 5&lt;br /&gt;
* MOBILE-3649 - Migrate lti activity to Ionic 5&lt;br /&gt;
* MOBILE-3650 - Migrate page activity to Ionic 5&lt;br /&gt;
* MOBILE-3651 - Migrate quiz activity to Ionic 5&lt;br /&gt;
* MOBILE-3652 - Migrate resource activity to Ionic 5&lt;br /&gt;
* MOBILE-3653 - Migrate scorm activity to Ionic 5&lt;br /&gt;
* MOBILE-3654 - Migrate survey activity to Ionic 5&lt;br /&gt;
* MOBILE-3655 - Migrate url activity to Ionic 5&lt;br /&gt;
* MOBILE-3656 - Migrate wiki activity to Ionic 5&lt;br /&gt;
* MOBILE-3657 - Migrate workshop activity to Ionic 5&lt;br /&gt;
* MOBILE-3658 - Migrate comments feature to Ionic 5&lt;br /&gt;
* MOBILE-3659 - Migrate course feature to Ionic 5&lt;br /&gt;
* MOBILE-3660 - Migrate courses feature to Ionic 5&lt;br /&gt;
* MOBILE-3661 - Migrate grades feature to Ionic 5&lt;br /&gt;
* MOBILE-3662 - Migrate push notifications feature to Ionic 5&lt;br /&gt;
* MOBILE-3663 - Migrate rating feature to Ionic 5&lt;br /&gt;
* MOBILE-3664 - Migrate site plugins to Ionic 5&lt;br /&gt;
* MOBILE-3665 - Change language files placement&lt;br /&gt;
* MOBILE-3666 - Migrate core H5P code to Ionic 5&lt;br /&gt;
* MOBILE-3675 - Migrate participants and course grades tab to Ionic 5&lt;br /&gt;
* MOBILE-3689 - Review initialization&lt;br /&gt;
* MOBILE-3690 - Abstract some splitview code to improve navigation and resizing&lt;br /&gt;
* MOBILE-3691 - Prevent iframe navigation from taking over the app&lt;br /&gt;
* MOBILE-3712 - Migrate QR scanner to Ionic 5&lt;br /&gt;
* MOBILE-3720 - Review platforms support&lt;br /&gt;
* MOBILE-3738 - Migrate Behat tests to ionic 5&lt;br /&gt;
* MOBILE-3744 - Improve icons labelling&lt;br /&gt;
* MOBILE-3746 - Solve iOS Visible Keyboard Focus&lt;br /&gt;
* MOBILE-3749 - Increse touch target area to 44x44 at least&lt;br /&gt;
* MOBILE-3750 - Add an alternative way to horizontal scrolls&lt;br /&gt;
* MOBILE-3751 - Consistent heading design&lt;br /&gt;
* MOBILE-3752 - Table related a11y issues&lt;br /&gt;
* MOBILE-3753 - Improve buttons labelling&lt;br /&gt;
* MOBILE-3759 - Review ion-badges a11y text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Remote_Themes_Upgrade_Guide&amp;diff=58990</id>
		<title>Moodle App Remote Themes Upgrade Guide</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Remote_Themes_Upgrade_Guide&amp;diff=58990"/>
		<updated>2021-06-21T12:24:07Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* How to inspect the app styles and CSS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Ionic5}}&lt;br /&gt;
&lt;br /&gt;
In the following guide you will find some examples to migrate your styles to apply ionic5 based Moodle app (3.9.5). It contains tables where each row is a migration to do, the left part is the old code and the right part the new one.&lt;br /&gt;
&lt;br /&gt;
We recommend that you prepend your old CSS rules (see ‘Before starting the migration’), by doing so users that are still using Moodle App 3.9.4 (or earlier versions) will see the same styling you had until now.&lt;br /&gt;
&lt;br /&gt;
==Before starting the migration==&lt;br /&gt;
&lt;br /&gt;
# Remove all styles using ionic classes ending with &#039;&#039;&#039;-wp&#039;&#039;&#039; (Windows Phone is not supported therefore it’s not necessary to specify it)&lt;br /&gt;
# Check [https://github.com/moodlehq/moodleapp/blob/ionic5/src/theme/theme.light.scss the theme file (link can change in the future)] where almost all variables are specified.&lt;br /&gt;
# As in the previous version, do not use any Saas variable (the ones starting with $). But you can use CSS3 ones (starting with --)&lt;br /&gt;
# We recommend prepending all css rules with &#039;&#039;&#039;body.ionic5&#039;&#039;&#039; in order to make them only available for ionic5 and the old ones prepend them with &#039;&#039;&#039;body:not(.ionic5)&#039;&#039;&#039; for the previous versions of the Moodle App (3.9.4, 3.9.3, and so on).&lt;br /&gt;
# Be aware that example rules may differ from your css that could be more specific.&lt;br /&gt;
&lt;br /&gt;
=== How to inspect the app styles and CSS ===&lt;br /&gt;
&lt;br /&gt;
We recommend you to install the Chromium browser and follow this guide: [[Moodle Mobile development using Chrome or Chromium]]&lt;br /&gt;
&lt;br /&gt;
For opening the new version of the app you can use this link: https://ionic5.apps.moodledemo.net. (This link can change in a near future)&lt;br /&gt;
&lt;br /&gt;
Please, notice that it is very important to launch the browser with the indicated flags in the previous document, otherwise your custom CSS will not load.&lt;br /&gt;
&lt;br /&gt;
=== Platform based styles ===&lt;br /&gt;
&lt;br /&gt;
To apply a variable or a rule only to iOS or Android, prepend the whole rule with &#039;&#039;&#039;html.ios&#039;&#039;&#039; for ios or &#039;&#039;&#039;html.md&#039;&#039;&#039; for android devices. Note the correct rule is to place html before body.&lt;br /&gt;
&lt;br /&gt;
===Dark mode styles===&lt;br /&gt;
To apply a variable or a rule only to dark mode, prepend the rule with &#039;&#039;&#039;body.dark&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example, toolbar background color on ios dark mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
html.ios body.ionic5.dark {&lt;br /&gt;
    --core-header-toolbar-background: red;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Bear in mind that you can disable Dark Mode for all your users following [https://docs.moodle.org/en/Moodle_app_guide_for_admins#Disabled_features Moodle app guide for admins (Disabled features)]&lt;br /&gt;
&lt;br /&gt;
===Shadow DOM===&lt;br /&gt;
Ionic is a set of web components and shadow DOM is a way to encapsulate them and make them a little less transparent to the developer and user (hiding markup structure, style, and behavior) but avoiding clash when using them.&lt;br /&gt;
&lt;br /&gt;
This makes it more difficult to personalize and change some parts of those components. However you can check the [https://ionicframework.com/docs/components Ionic documentation of each] to check the parts that are customizable.&lt;br /&gt;
&lt;br /&gt;
====Example, to change ion-button:====&lt;br /&gt;
# Check shadow parts that you can access.&lt;br /&gt;
&lt;br /&gt;
You can style “native” part this way:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
ion-button::part(native) {&lt;br /&gt;
    text-transform: none;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Check css exposed variables:&lt;br /&gt;
You can change all buttons background, or just the ones with an specific class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
ion-button {&lt;br /&gt;
    --background: red;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ion-button.specific {&lt;br /&gt;
    --background: yellow;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====More information about shadow DOM:====&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM Using shadow DOM - Web Components | MDN]&lt;br /&gt;
* [https://ionicframework.com/docs/theming/css-shadow-parts CSS Shadow Parts - Ionic Documentation]&lt;br /&gt;
* [https://ionicframework.com/blog/shadow-dom-in-ionic-and-why-its-awesome/ Shadow DOM in Ionic (and Why it&#039;s Awesome) - Ionic Blog]&lt;br /&gt;
&lt;br /&gt;
== Main colors ==&lt;br /&gt;
The main color in the app is Moodle orange, but you can change it just using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--brand-color: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will probably reduce all the css you are applying right now.&lt;br /&gt;
===Named Colors===&lt;br /&gt;
&lt;br /&gt;
--blue, --red, --green, --yellow, --turquoise, --purple but you’ll have to define also the variants: --blue-light, --blue-dark, --red-light, --red-dark, and also for green and yellow (purple and turquoise don’t use any variant).&lt;br /&gt;
&lt;br /&gt;
===Purpose colors===&lt;br /&gt;
* --primary (brand-color)&lt;br /&gt;
* --danger (red)&lt;br /&gt;
* --warning (yellow)&lt;br /&gt;
* --success (green)&lt;br /&gt;
* --info (blue)&lt;br /&gt;
* --light (gray-lighter)&lt;br /&gt;
* --medium (gray-light)&lt;br /&gt;
* --dark (black)&lt;br /&gt;
&lt;br /&gt;
For those you’ll have to define also some variants, ie, primary color:&lt;br /&gt;
&lt;br /&gt;
* --ion-color-primary-rgb: RGB list of the color, ie 245, 233, 222;&lt;br /&gt;
* --ion-color-primary-contrast: Black or white depending on which color gives more contrast.&lt;br /&gt;
* --ion-color-primary-contrast-rgb: RGB version of the contrast color: 0, 0, 0 or 255, 255, 255&lt;br /&gt;
* --ion-color-primary-shade: Slightly darker color. (mix 12% of black)&lt;br /&gt;
* --ion-color-primary-tint: Slightly lighter color. (mix 10% of white)&lt;br /&gt;
&lt;br /&gt;
There are limitations on copying those colors (blue, red) to the purpose colors (primary, secondary, success, etc) and, the changes won’t apply to both of them so you’ll have to define all the variables to have a complete change.&lt;br /&gt;
&lt;br /&gt;
===Page background===&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--background-color: white;&lt;br /&gt;
--ion-background-color-rgb: 255, 255, 255; // Need to be translated to rgb.&amp;lt;/code&amp;gt;&lt;br /&gt;
===Main text color===&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--text-color: black;&lt;br /&gt;
--ion-text-color-rgb: 0, 0, 0; // Need to be translated to rgb.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Color used in categories and secondary content.&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--subdued-text-color: gray;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Links color&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--core-link-color: blue;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Header toolbar==&lt;br /&gt;
On the header toolbar, we’ve added a bottom border that you can disable. &lt;br /&gt;
&lt;br /&gt;
===Background===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;&lt;br /&gt;
.toolbar-background-md,&lt;br /&gt;
.toolbar-background-ios {&lt;br /&gt;
    background: red;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-header-toolbar-background: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Text and buttons===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;&lt;br /&gt;
.toolbar-title-md,&lt;br /&gt;
.toolbar-title-ios {&lt;br /&gt;
    color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-header-toolbar-color: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;&lt;br /&gt;
.toolbar-title-md,&lt;br /&gt;
.toolbar-title-ios {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;ion-header ion-toolbar.in-toolbar h1,&lt;br /&gt;
ion-header ion-toolbar.in-toolbar h2 {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Buttons color===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;&lt;br /&gt;
.bar-button-clear-md-default, .bar-button-default-md, .bar-button-md-default,&lt;br /&gt;
.bar-button.button-md,&lt;br /&gt;
.bar-button-clear-ios-default, .bar-button-default-ios, .bar-button-ios-default,&lt;br /&gt;
.bar-button.button-ios {&lt;br /&gt;
    color: yellow;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;ion-header ion-toolbar ion-button {&lt;br /&gt;
    --ion-toolbar-color: blue;&lt;br /&gt;
    --color: yellow;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Border width and color (new)===&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--core-header-toolbar-border-width: 2px; // 0 will disable it.&lt;br /&gt;
--core-header-toolbar-border-color: yellow;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bottom tab bar (main menu)==&lt;br /&gt;
===Background===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.tabs-md .tabbar,&lt;br /&gt;
.tabs-ios .tabbar {&lt;br /&gt;
    background: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-bottom-tabs-background: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Tab icon color===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.tabs-md .tab-button-icon,&lt;br /&gt;
.tabs-ios .tab-button-icon {&lt;br /&gt;
    color: blue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-bottom-tabs-color: blue;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Selected tab icon color===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;tabs-md .tab-button[aria-selected=true] .tab-button-icon,&lt;br /&gt;
.tabs-ios .tab-button[aria-selected=true] .tab-button-icon {&lt;br /&gt;
    color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-bottom-tabs-color-selected: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Badge color and text===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;core-ion-tabs .tab-badge.badge {&lt;br /&gt;
    color: white;&lt;br /&gt;
    background: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-bottom-tabs-badge-text-color: white;&lt;br /&gt;
--core-bottom-tabs-badge-color: red;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Top tabs==&lt;br /&gt;
===Tabs background===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.core-tabs-bar {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-tabs-background: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Individual tab background===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.core-tabs-bar .tab-slide {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-tab-background: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Unselected tab styles===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.core-tabs-bar .tab-slide {&lt;br /&gt;
  color: red;&lt;br /&gt;
  border-bottom-color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-tab-color: red;&lt;br /&gt;
--core-tab-border-color: red;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Selected tab styles===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.core-tabs-bar .tab-slide[aria-selected=true]{&lt;br /&gt;
   color: red;&lt;br /&gt;
   border-bottom-color: red;&lt;br /&gt;
   font-weigth: normal;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-tab-color-active: red;&lt;br /&gt;
--core-tab-border-color-active: red;&lt;br /&gt;
--core-tab-font-weight-active: bold;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Items==&lt;br /&gt;
===Items background color===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;ion-item {&lt;br /&gt;
    background: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--ion-item-background: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Item divider background color===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;.item-divider-md,&lt;br /&gt;
.item-divider-ios {&lt;br /&gt;
    background: red;&lt;br /&gt;
    color: yellow;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--item-divider-background: red;&lt;br /&gt;
--item-divider-color: yellow;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Empty divider background===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| New selector.&lt;br /&gt;
| &amp;lt;code css&amp;gt;--spacer-background: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
==Buttons==&lt;br /&gt;
To change button colors, see Purpose buttons section. Also you can set some properties checking like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
ion-button {&lt;br /&gt;
    --background: red;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://ionicframework.com/docs/api/button#css-custom-properties Check Ionic documentation for more information.]&lt;br /&gt;
&lt;br /&gt;
Use [https://ionicframework.com/docs/api/fab-button ion-fab-button] to change Floating action buttons.&lt;br /&gt;
&lt;br /&gt;
==Progress bar==&lt;br /&gt;
You can now easily style the progress bars.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--core-progressbar-height: 8px;&lt;br /&gt;
--core-progressbar-color: red;&lt;br /&gt;
--core-progressbar-text-color: black;&lt;br /&gt;
--core-progressbar-background: white;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==More page==&lt;br /&gt;
===Icons===&lt;br /&gt;
The icons in the more page can now easily change the color:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;page-core-mainmenu-more ion-icon {&lt;br /&gt;
    color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-more-icon: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
To change a color on a particular icon you’ll have to use the class of each handler, for example, to change the color of the folder icon on the menu item named Files:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;page-core-mainmenu-more .ion-md-folder,&lt;br /&gt;
page-core-mainmenu-more .ion-ios-folder {&lt;br /&gt;
    color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;.addon-privatefiles-handler ion-icon {  &lt;br /&gt;
    color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===Item border color===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code css&amp;gt;page-core-mainmenu-more .item-block.item-ios .item-inner,&lt;br /&gt;
page-core-mainmenu-more .item-block.item-md .item-inner {&lt;br /&gt;
    border-bottom-color: red;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code css&amp;gt;--core-more-item-border: red;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The dividers background color can be overridden using &#039;&#039;&#039;--spacer-background: red;&#039;&#039;&#039;&lt;br /&gt;
==Login page==&lt;br /&gt;
You can personalize some colors in the login page: (only credentials page, after selecting the site).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--core-login-background: red;&lt;br /&gt;
--core-login-text-color: blue;&lt;br /&gt;
--core-login-input-background: green;&lt;br /&gt;
--core-login-input-color: yellow;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Calendar page ==&lt;br /&gt;
Calendar page can be personalized.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--addon-calendar-event-category-color: purple;&lt;br /&gt;
--addon-calendar-event-course-color: red;&lt;br /&gt;
--addon-calendar-event-group-color: yellow;&lt;br /&gt;
--addon-calendar-event-user-color: blue};&lt;br /&gt;
--addon-calendar-event-site-color: green;&lt;br /&gt;
--addon-calendar-today-border-color: orange;&lt;br /&gt;
--addon-calendar-border-color: gray;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Messages page==&lt;br /&gt;
&lt;br /&gt;
Message discussion page (including: chat activity and comments)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--addon-messages-message-bg: white;&lt;br /&gt;
--addon-messages-message-activated-bg: gray-light;&lt;br /&gt;
--addon-messages-message-note-text: gray-dark;&lt;br /&gt;
--addon-messages-message-mine-bg: gray-light;&lt;br /&gt;
--addon-messages-message-mine-activated-bg: gray;&lt;br /&gt;
--addon-messages-discussion-badge: orange;&lt;br /&gt;
--addon-messages-discussion-badge-text: white;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some modifications on the input field:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code css&amp;gt;&lt;br /&gt;
--core-send-message-input-background: gray-light;&lt;br /&gt;
--core-send-message-input-color: black;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App&amp;diff=58989</id>
		<title>Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App&amp;diff=58989"/>
		<updated>2021-06-21T12:23:13Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle Mobile}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IMPORTANT&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This documentation is valid only for Moodle Mobile 3.5 onwards (the version of the app using the Ionic 3 framework).&lt;br /&gt;
&lt;br /&gt;
We are still working on this documentation:&lt;br /&gt;
&lt;br /&gt;
If you want to support your plugin in the Mobile app, please read [[Mobile support for plugins]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IONIC5 UPGRADE&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* If you have developed a plugin that is supported for the mobile app please read: [[Adapt your Mobile plugins to Ionic 5]]&lt;br /&gt;
* If you have a Premium app subscription and your own Moodle App theme please read: [[Ionic5 style migration guide]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* Documentation for [[Moodle Mobile 2 (Ionic 1)]] (Obsolete, only for Moodle Mobile &amp;lt; 3.5)&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_FAQ&amp;diff=58938</id>
		<title>Moodle App FAQ</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_FAQ&amp;diff=58938"/>
		<updated>2021-05-31T15:06:25Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle Mobile}}&lt;br /&gt;
&lt;br /&gt;
== How can I contribute to Moodle Mobile? ==&lt;br /&gt;
&lt;br /&gt;
You can help with any issue marked with the tag contribfriendly: https://tracker.moodle.org/issues/?jql=project%20%3D%20MOBILE%20AND%20status%20%3D%20Open%20AND%20labels%20%3D%20contribfriendly&lt;br /&gt;
&lt;br /&gt;
If you want to help with another issue, please let us know first via the tracker (a comment in the issue itself).&lt;br /&gt;
&lt;br /&gt;
You have a detailed description of our development process here: [[Moodle App Development Process]]&lt;br /&gt;
&lt;br /&gt;
== Everything seems to be correctly configured but I see this error: Cannot connect: Verify that your have typed correctly the URL and that your site uses Moodle 2.4 or later ==&lt;br /&gt;
&lt;br /&gt;
* Ensure that debugging is disabled in your site: Administration &amp;gt; Development &amp;gt; Debugging&lt;br /&gt;
* Check that the ADOdb option is disabled if you are using the external database auth or enrolment plugin. (In Plugins &amp;gt; Authentication &amp;gt; External database and in Plugins &amp;gt; Enrolment &amp;gt; External database).&lt;br /&gt;
* If your site uses an SSL certificate, it must be a trusted certificate, not self-signed. Please use this tool or a similar one to check that your certificate is fine: [https://www.geocerts.com/ssl_checker SSL Checker]. All the checks must be ok, including the &amp;quot;Certificate Chain Complete&amp;quot;. Otherwise the app might work on iOS but not on Android.&lt;br /&gt;
&lt;br /&gt;
== The app starts but it says it cannot connect to any site I try ==&lt;br /&gt;
&lt;br /&gt;
This is because you need to use a different browser with special flags enabled so cross domains XHR requests are allowed.&lt;br /&gt;
&lt;br /&gt;
In sort, you need to download Chromium from https://download-chromium.appspot.com/ and open it with this command:&lt;br /&gt;
&lt;br /&gt;
 chromium --allow-file-access-from-files --disable-web-security &lt;br /&gt;
&lt;br /&gt;
For additional information please, read: [[Moodle Mobile development using Chrome or Chromium]]&lt;br /&gt;
&lt;br /&gt;
== I get a blank page in Chrome/Chromium when launching the app in Windows ==&lt;br /&gt;
&lt;br /&gt;
* Ensure that you have downloaded the latest master version from github (git checkout master; git pull master; git checkout mybranch; git rebase master)&lt;br /&gt;
* Ensure that gulp-slash is installed: npm install gulp-slash&lt;br /&gt;
* Run gulp again&lt;br /&gt;
&lt;br /&gt;
== Some features like IMSCP, resource mini sites, local notifications are not working in the browser ==&lt;br /&gt;
&lt;br /&gt;
Some features must be tested directly in a mobile device via ionic run android or ionic run ios. &lt;br /&gt;
&lt;br /&gt;
It will require you to install the platform specific SDK or development tools, follow your platform guide here: http://cordova.apache.org/docs/en/edge/guide_platforms_index.md.html#Platform%20Guides&lt;br /&gt;
&lt;br /&gt;
== What is the difference between a native app and a Mobile specific theme or responsive theme? ==&lt;br /&gt;
&lt;br /&gt;
See http://moodle.org/mod/forum/discuss.php?d=206736#p901475&lt;br /&gt;
&lt;br /&gt;
Also http://moodle.org/mod/forum/discuss.php?d=206736#p901751&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Development_Process&amp;diff=58937</id>
		<title>Moodle App Development Process</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Development_Process&amp;diff=58937"/>
		<updated>2021-05-31T15:04:45Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: Created page with &amp;quot;{{Moodle Mobile}}   The development of new features and improvements in the Moodle App is organised in the following six phases:  Discovery - Shaping - Implementation - QA Tes...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle Mobile}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The development of new features and improvements in the Moodle App is organised in the following six phases:&lt;br /&gt;
&lt;br /&gt;
Discovery - Shaping - Implementation - QA Testing - Release - Evaluation&lt;br /&gt;
&lt;br /&gt;
As a summary of the process we can say that during the discovery phase we do an initial selection of features and improvements to be included in the next release of the app by reviewing the feedback from different stakeholders and the improvements detected by Moodle’s UX team user research. &lt;br /&gt;
&lt;br /&gt;
In the shaping phase we do an initial high-level design and specifications so we can commence with the implementation phase in which the developers, with the help of our designers, will implement the selected features.&lt;br /&gt;
&lt;br /&gt;
During the Testing &amp;amp; QA phase, we do intensive testing to check that there are not regressions and, sometimes, we publish Beta versions so our community can check in advance the upcoming new features and provide feedback before the release so we can make the necessary adjustments.&lt;br /&gt;
&lt;br /&gt;
Once we are confident we have a stable new version that is aligned with our stakeholders’ expectations we move to the Release phase in which the new version of the app is fully rolled-out to our users.&lt;br /&gt;
&lt;br /&gt;
During the evaluation phase we analyse our stakeholders feedback to validate if we met their expectations.&lt;br /&gt;
&lt;br /&gt;
== Discovery ==&lt;br /&gt;
&lt;br /&gt;
During this first phase we analyse our different stakeholders’ needs and then we prioritise them so we can build a short-term roadmap for upcoming app releases. &lt;br /&gt;
&lt;br /&gt;
We have different stakeholders (order does not indicate importance): &lt;br /&gt;
&lt;br /&gt;
* End users&lt;br /&gt;
* External compliance entities/organisations&lt;br /&gt;
* Moodle Partners and Resellers&lt;br /&gt;
* BMA clients&lt;br /&gt;
* Pro/Premium plans clients&lt;br /&gt;
* Moodle Community&lt;br /&gt;
* Other Moodle Product teams&lt;br /&gt;
&lt;br /&gt;
=== Prioritisation ===&lt;br /&gt;
We use the MoSCoW method. The term MoSCoW itself is an acronym derived from the first letter of each of four prioritisation categories: M - Must have S - Should have C - Could have W - Won&#039;t have.&lt;br /&gt;
&lt;br /&gt;
There is some existing criteria for what’s mandatory (MUST) to include in a new release:&lt;br /&gt;
* New Moodle LMS functionality (affecting students)&lt;br /&gt;
* New Moodle Workplace functionality (affecting students)&lt;br /&gt;
* User-facing serious UX problems (app speed/performance, notifications, navigation and resume activity/courses)&lt;br /&gt;
* Compliance (GDPR, accessibility)&lt;br /&gt;
* Technology (mandatory libraries updates etc…)&lt;br /&gt;
* Critical bugs&lt;br /&gt;
* Security issues&lt;br /&gt;
&lt;br /&gt;
For what’s not mandatory, we use additional methods such as “Value versus Complexity” but there is always a subjective evaluation and the Moodle Apps Product Manager is the one making the final decisions.&lt;br /&gt;
&lt;br /&gt;
New features and improvements under the “Could have” category can be removed at any time during the implementation phase if we feel we won’t be able to implement them.&lt;br /&gt;
&lt;br /&gt;
Only critical issues (bugs or MUST not properly detected such as LMS changes) can be added once the implementation phase has commenced but minor nice-to-have improvements will often be added throughout the release cycle.&lt;br /&gt;
&lt;br /&gt;
=== Schedule ===&lt;br /&gt;
We usually release between four to six versions of the Moodle app per year. &lt;br /&gt;
&lt;br /&gt;
Usually a few weeks after a Moodle LMS major release and also between two major LMS releases.&lt;br /&gt;
&lt;br /&gt;
== Shaping ==&lt;br /&gt;
&lt;br /&gt;
During this phase there are two major things happening:&lt;br /&gt;
#A high-level design solution is drafted&lt;br /&gt;
#Technical specifications are created&lt;br /&gt;
&lt;br /&gt;
So basically, we are defining what the feature should be doing, how it will work and how it interacts with other systems and the rest of the app. The evaluation criteria (used to check if we solved the problem once is used by end users) is also defined in this phase.&lt;br /&gt;
&lt;br /&gt;
During this phase a developer and a designer will work together so the designer is aware of the technical limitations and the developer has a clear understanding of the high-level proposed solution to be refined during the implementation phase. &lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
During this phase the developer and the designer will work on building the solution outlined in the Shaping phase, making decisions and choosing trade-offs about the finer details. Both the designer and the developer have full responsibility and they work autonomously unless they need specific help from other developers with more experience in certain areas.&lt;br /&gt;
&lt;br /&gt;
Before the code gets integrated and it is ready for testing, a colleague has to perform the so-called peer-review, that is basically another developer (not involved in the original implementation) taking a fresh look at the code.&lt;br /&gt;
&lt;br /&gt;
Once the code implementing the features is integrated, a tester will ensure that it works as expected. Automatic tests should be added by the developer in new features, so this step is mostly to look for regressions and to check that all the possible use cases for the solution were considered at implementation time.&lt;br /&gt;
&lt;br /&gt;
== QA testing ==&lt;br /&gt;
&lt;br /&gt;
Once all the selected new features, improvements and bugs fixes have been implemented and tested, we perform a complete review of the Moodle app functionality in order to detect possible regressions.&lt;br /&gt;
&lt;br /&gt;
This is manually done, we go through a list of features of the Moodle app and we check that everything is working as expected in both Android and iOS devices.&lt;br /&gt;
&lt;br /&gt;
At the beginning of this process, we also invite our community members to do some beta testing of the upcoming new features of improvements, to do this, we use Apple TestFlight and Android Beta Testing. Our community members are able to provide feedback prior to the release that will help to detect potential issues.&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
Once the QA testing phase has finished, we move on into the Release phase which consists basically in doing a full-rollout of the new version of the app in Google Play and the Apple App Store.&lt;br /&gt;
&lt;br /&gt;
== Evaluation ==&lt;br /&gt;
&lt;br /&gt;
In this phase we basically collect feedback to see if the new features and improvements are well received by our final users. As well as using the evaluation criteria we defined in the Shaping phase.&lt;br /&gt;
If something is not working as expected because it has bugs or the selected design solution is not working for most of our users we will action in the next development cycle to address the problem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Mobile]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Debugging_network_requests_in_the_Moodle_App&amp;diff=58725</id>
		<title>Debugging network requests in the Moodle App</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Debugging_network_requests_in_the_Moodle_App&amp;diff=58725"/>
		<updated>2021-05-05T13:02:30Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle Mobile}}== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This guide will help you find and report problems with the Moodle Mobile app on your site.&lt;br /&gt;
&lt;br /&gt;
It is especially useful for the following problems:&lt;br /&gt;
* Unable to log in on your site&lt;br /&gt;
* When you receive one of the following error messages in the app:&lt;br /&gt;
** Can not find data record in database table external_functions&lt;br /&gt;
** Invalid response value detected&lt;br /&gt;
** Cannot get course contents&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Moodle 3.1 onwards (your site needs at least this version)&lt;br /&gt;
* Moodle Desktop app 3.6.1 onwards or Google Chrome/Chromium browser&lt;br /&gt;
[[{{ns:file}}:moodlemobile_enabledebug.png|thumb|300px]]&lt;br /&gt;
&lt;br /&gt;
== Enabling debugging on your Moodle site ==&lt;br /&gt;
&lt;br /&gt;
# Go to Debugging in the Site administration&lt;br /&gt;
# For &amp;quot;Debug messages&amp;quot; select &#039;DEVELOPER&#039;&lt;br /&gt;
# Tick &amp;quot;Display debug messages&amp;quot;&lt;br /&gt;
# Click the &#039;Save changes&#039; button.&lt;br /&gt;
&lt;br /&gt;
Note: Remember to disable debugging again once you have finished debugging your problem.&lt;br /&gt;
&lt;br /&gt;
== Enabling debugging on the mobile app ==&lt;br /&gt;
&lt;br /&gt;
# Go to the More tab&lt;br /&gt;
# Go to Settings &amp;gt; General&lt;br /&gt;
# Enable &amp;quot;Display debug messages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note: Remember to disable debugging again once you have finished debugging your problem.&lt;br /&gt;
&lt;br /&gt;
== First try ==&lt;br /&gt;
&lt;br /&gt;
At this point, you may not need fo go further on this guide.&lt;br /&gt;
&lt;br /&gt;
Log-out and log-in again into your site and try to reproduce the error, hopefully, with Moodle and app debugging enabled you will see an explanatory message of what is happening.&lt;br /&gt;
&lt;br /&gt;
If you are unable to find a solution, contact a [https://moodle.com/partners/ Moodle Partner] or post in the [https://moodle.org/mod/forum/view.php?id=7798 Moodle for mobile forum] on moodle.org for non-guaranteed community support.&lt;br /&gt;
&lt;br /&gt;
== Setting up the debugging tool ==&lt;br /&gt;
&lt;br /&gt;
=== Moodle Desktop ===&lt;br /&gt;
&lt;br /&gt;
The recommended way to debug the problem is using the Moodle Desktop app. Please notice that the app version should be 3.6.1 or higher. The desktop app lets you debug some features, such as Single Sign-On, that require a built app to work, rather than a hosted or local ionic build running in a web browser.&lt;br /&gt;
&lt;br /&gt;
You can download the desktop app [https://download.moodle.org/desktop/ from here].&lt;br /&gt;
&lt;br /&gt;
Download the desktop app, install it and open it. Once it&#039;s open, you can open the &amp;quot;Developer tools&amp;quot; with the following shortcut:&lt;br /&gt;
&lt;br /&gt;
* In MacOS: Cmd + Option + I&lt;br /&gt;
* In Windows or Linux: Ctrl + Shift + I&lt;br /&gt;
&lt;br /&gt;
Once the Developer Tools are open, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Dock the new panels on the right side (in the new panel top-right options choose “Dock to the right” icon)&lt;br /&gt;
# Click the Network tab (at the top-center)&lt;br /&gt;
# Enable the filter (filter shape icon) so it changes to colour red&lt;br /&gt;
# In the new text field displayed when enabling the filter write &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you are ready to debug all the web services requests sent to your Moodle site by the mobile app.&lt;br /&gt;
&lt;br /&gt;
=== Chrome or Chromium ===&lt;br /&gt;
&lt;br /&gt;
[[{{ns:file}}:moodlemobile_chrome_inspect_network.png|thumb|300px]]&lt;br /&gt;
&lt;br /&gt;
Another option is to use Google Chrome or Google Chromium to debug this. If you already have the Moodle Desktop app you can skip this section.&lt;br /&gt;
&lt;br /&gt;
Debugging the mobile app is not so easy, so we have provided an online web version of the app that can be easily debugged using the Chrome browser.&lt;br /&gt;
&lt;br /&gt;
# Open your Chrome browser and go to https://mobileapp.moodledemo.net/&lt;br /&gt;
# Open your browser options (icon at the top-right of your browser window), then go to More tools -&amp;gt; Developer tools&lt;br /&gt;
# Dock the new panels on the right side (in the new panel top-right options choose “Dock to the right” icon)&lt;br /&gt;
# Click the Network tab (at the top-center)&lt;br /&gt;
# Enable the filter (filter shape icon) so it changes to colour red&lt;br /&gt;
# In the new text field displayed when enabling the filter write &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you are ready to debug all the web services requests sent to your Moodle site by the mobile app.&lt;br /&gt;
&lt;br /&gt;
== Debugging a web service (WS) error ==&lt;br /&gt;
&lt;br /&gt;
[[{{ns:file}}:moodlemobile_chrome_debug_ws_error.png|thumb|300px]]&lt;br /&gt;
&lt;br /&gt;
# Connect to your site and browse to the functionality displaying an error&lt;br /&gt;
# In the right panel you will see a list of requests made by the app to your Moodle site (token.php server.php server.php etc..)&lt;br /&gt;
# Click on each one of them (starting with the last one in the list) but skip those that don’t start with token.php or server.php&lt;br /&gt;
# In the new sub-window open select the “Response” tab and check if you see an error&lt;br /&gt;
# Copy the error then go to the [[:en:Moodle Mobile FAQ|Moodle Mobile FAQ]] in the user docs to check if there is a known solution for it&lt;br /&gt;
# If you are unable to find a solution, contact a [https://moodle.com/partners/ Moodle Partner] or post in the [https://moodle.org/mod/forum/view.php?id=7798 Moodle for mobile forum] on moodle.org for non-guaranteed community support.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to log-in into a site configured to use browser or embedded authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can execute the following in the js console:&lt;br /&gt;
&lt;br /&gt;
 window.handleOpenURL(&amp;quot;moodlemobile://URL?token=WSTOKEN&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
You can also launch a normal authentication process (allowing the authentication popup) and capture in the Network tab the redirect to moodlemobile://... created by the admin/tool/mobile/launch.php script and then execute in the console:&lt;br /&gt;
&lt;br /&gt;
  window.handleOpenURL(&amp;quot;moodlemobile://token=ABCxNGUxMD........=&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle Mobile development using Chrome or Chromium]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58398</id>
		<title>Moodle Mobile 3.9.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58398"/>
		<updated>2021-03-08T13:18:40Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* New features and improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 30 November 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* Students can submit quizzes with essay question types including attachments (Requires Moodle 3.10)&lt;br /&gt;
* New Course Completion notifications (Requires Moodle 3.10)&lt;br /&gt;
* New option to log out from the Moodle App through the web (Requires Moodle 3.10)&lt;br /&gt;
* Audio-recording supported in more devices&lt;br /&gt;
* Activity improvements:&lt;br /&gt;
** Choice: New show available spaces setting (Requires Moodle 3.10)&lt;br /&gt;
** Lesson: Option to allow unlimited number of attempts for each question (Requires Moodle 3.10)&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3200 - Database: students can add entries in a group that doesn&#039;t belong to them (visible groups)&lt;br /&gt;
* MOBILE-3265 - Can&#039;t change H5P strings language after the package has been downloaded&lt;br /&gt;
* MOBILE-3430 - Messaging - Repeat message sent if internet connection drops during sending&lt;br /&gt;
* MOBILE-3464 - Hiding core-tabs on scroll makes scroll a bit clunky and can cause some issues&lt;br /&gt;
* MOBILE-3465 - Adding window.open in a click event makes clicks override the app&lt;br /&gt;
* MOBILE-3468 - No error is displayed if you scan another URL scheme in credentials&lt;br /&gt;
* MOBILE-3469 - Single Activity course: if there are (sticky) blocks, the tablet view only shows the description (Forum at least)&lt;br /&gt;
* MOBILE-3471 - Find a way to have webview plugin only in iOS&lt;br /&gt;
* MOBILE-3477 - iOS app stays loading forever if a site has a lot of calendar events&lt;br /&gt;
* MOBILE-3487 - Invalidate only unknown files isn&#039;t working as expected&lt;br /&gt;
* MOBILE-3488 - Open local HTML file in Android: images aren&#039;t seen&lt;br /&gt;
* MOBILE-3489 - Android: App cannot access geolocation if Location is disabled in the device&lt;br /&gt;
* MOBILE-3503 - Scrolling/swipping from the bottom of a course page to top make top tabs to &amp;quot;shake&amp;quot;&lt;br /&gt;
* MOBILE-3508 - External linked files (google drive repository) do not work in mobile app&lt;br /&gt;
* MOBILE-3509 - Mobile app goes to blank notification page when clicking forum digest notification&lt;br /&gt;
* MOBILE-3511 - ionViewDidLeave not called in split view right pane&lt;br /&gt;
* MOBILE-3515 - Error: Avoid hardcoding the debug mode&lt;br /&gt;
* MOBILE-3519 - Forum: When following a link in app to a discussion, file attachments don&#039;t work&lt;br /&gt;
* MOBILE-3526 - Custom CFBundleShortVersionString can&#039;t be set&lt;br /&gt;
* MOBILE-3530 - Offload course files - error: &amp;quot;Cannot read property &#039;getFiles&#039; of undefined&lt;br /&gt;
* MOBILE-3532 - iOS: top bar has disappeared &lt;br /&gt;
* MOBILE-3533 - Disabled messaging - Hide &amp;quot;messages&amp;quot; section within preferences&lt;br /&gt;
* MOBILE-3534 - Update macOS signing script&lt;br /&gt;
* MOBILE-3539 - Course overview displays In Progress courses if all filters are disabled&lt;br /&gt;
* MOBILE-3556 - Mobile app site check causes unnecessary errors in server log&lt;br /&gt;
* MOBILE-3557 - Display &amp;quot;Not available&amp;quot; in hidden sections which name is displayed to users&lt;br /&gt;
* MOBILE-3562 - Course image is displayed twice (second time as part of the course attachments) in the pre-self enrol view&lt;br /&gt;
* MOBILE-3571 - Filters: core_filters_get_available_in_context call can exceed PHP input variables limit&lt;br /&gt;
* MOBILE-3578 - Multiple duplicate requests to tool_lp_data_for_user_competency_summary_in_course in the user profile&lt;br /&gt;
* MOBILE-3583 - Fix multichoice questions for 3.10&lt;br /&gt;
* MOBILE-3589 - Lesson: support unlimited max attempts&lt;br /&gt;
* MOBILE-3590 - Don&#039;t display H5P Embed button in the app&lt;br /&gt;
* MOBILE-3598 - H5P packages disappear after opening a new page with a package&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
* MOBILE-3432 - Implement file type exclusion list for mobile&lt;br /&gt;
* MOBILE-3454 - Support disabling check available text filters in the app&lt;br /&gt;
* MOBILE-3501 - Create task to push a branch and automatically update tracker issue&lt;br /&gt;
* MOBILE-3540 - Let links specify if they should be opened in InAppBrowser&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
* MOBILE-3425 - Update required Node version to 11+&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-2272 - Quiz Essay Question Uploading in the mobile app&lt;br /&gt;
* MOBILE-3188 - Cached web service responses for activity should show in manage storage&lt;br /&gt;
* MOBILE-3338 - Apply component and componentId to WS calls&lt;br /&gt;
* MOBILE-3421 - iPad: subtitles in video if too long are not seen on the screen&lt;br /&gt;
* MOBILE-3435 - Handle required custom fields in signup&lt;br /&gt;
* MOBILE-3445 - Let plugins disable PTR&lt;br /&gt;
* MOBILE-3449 - Sync assingment submission when PTR from submission review page&lt;br /&gt;
* MOBILE-3450 - Improve synchronizing a logged out site&lt;br /&gt;
* MOBILE-3451 - Display more data about devices in the app&lt;br /&gt;
* MOBILE-3453 - Don&#039;t unpack more than one H5P package at the same time&lt;br /&gt;
* MOBILE-3472 - Indicate restriction access after the section when &#039;All sections&#039; is selected&lt;br /&gt;
* MOBILE-3480 - Support images and links using svg + image/a in the app&lt;br /&gt;
* MOBILE-3490 - Media capture should fallback to Media (self-recorded audios) if there is not an external audio recording app configured&lt;br /&gt;
* MOBILE-3492 - Don&#039;t collapse content in large screens&lt;br /&gt;
* MOBILE-3493 - Don&#039;t display section selector if there are no sections&lt;br /&gt;
* MOBILE-3499 - Unlock plugins and libraries after 3.9.2 release&lt;br /&gt;
* MOBILE-3505 - App freezes when SSO via inappbrowser is launched in an active site where the token expired&lt;br /&gt;
* MOBILE-3507 - Improve Push notification handling for supporting custom notifications&lt;br /&gt;
* MOBILE-3510 - Revise encoding H5P message (&amp;amp;#039; is being shown instead of &#039;)&lt;br /&gt;
* MOBILE-3512 - Desktop: Revise &#039;Course overview&#039;(more columns)&lt;br /&gt;
* MOBILE-3514 - Support the &amp;quot;Show available spaces&amp;quot; choice setting in the app&lt;br /&gt;
* MOBILE-3516 - Use fork of InAppBrowser if they don&#039;t release a new version before 3.9.3 release&lt;br /&gt;
* MOBILE-3543 - Update electron version&lt;br /&gt;
* MOBILE-3546 - Make sitelisting fields configurable&lt;br /&gt;
* MOBILE-3548 - Make site url input placeholder easy to change using language strings&lt;br /&gt;
* MOBILE-3549 - Allow any HTML tag in plugins templates&lt;br /&gt;
* MOBILE-3553 - Remove version from H5P jquery file&lt;br /&gt;
* MOBILE-3554 - Add a setting to force login_logo.png usage&lt;br /&gt;
* MOBILE-3558 - Day view: the add event icon &amp;quot;+&amp;quot; should scroll&lt;br /&gt;
* MOBILE-3569 - Allow IFRAME to use XHTML document in Resource add-on&lt;br /&gt;
* MOBILE-3572 - Default the app color scheme to light&lt;br /&gt;
* MOBILE-3587 - Support autocomplete for connect/reconnect screens&lt;br /&gt;
* MOBILE-3596 - Send the block ID to tool_mobile_get_content&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_Roadmap&amp;diff=58370</id>
		<title>Moodle Mobile Roadmap</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_Roadmap&amp;diff=58370"/>
		<updated>2021-02-25T15:42:50Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: Redirected page to Roadmap&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Roadmap]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=58188</id>
		<title>Moodle App Release Notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_App_Release_Notes&amp;diff=58188"/>
		<updated>2020-12-30T17:31:58Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Moodle App ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.4&lt;br /&gt;
| 28 December 2020&lt;br /&gt;
| 39400&lt;br /&gt;
| [[Moodle Mobile 3.9.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.3&lt;br /&gt;
| 30 November 2020&lt;br /&gt;
| 39300&lt;br /&gt;
| [[Moodle Mobile 3.9.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.2&lt;br /&gt;
| 16 July 2020&lt;br /&gt;
| 39200&lt;br /&gt;
| [[Moodle Mobile 3.9.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.1&lt;br /&gt;
| 3 July 2020&lt;br /&gt;
| 39100&lt;br /&gt;
| [[Moodle Mobile 3.9.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.9.0&lt;br /&gt;
| 26 June 2020&lt;br /&gt;
| 39000&lt;br /&gt;
| [[Moodle Mobile 3.9.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.8.2&lt;br /&gt;
| 2 April 2020&lt;br /&gt;
| 38200&lt;br /&gt;
| [[Moodle Mobile 3.8.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.8.1&lt;br /&gt;
| 25 March 2020&lt;br /&gt;
| 38100&lt;br /&gt;
| [[Moodle Mobile 3.8.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.8.0&lt;br /&gt;
| 20 December 2019&lt;br /&gt;
| 38000&lt;br /&gt;
| [[Moodle Mobile 3.8.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.7.2&lt;br /&gt;
| 20 September 2019&lt;br /&gt;
| 37200&lt;br /&gt;
| [[Moodle Mobile 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.7.1&lt;br /&gt;
| 30 August 2019&lt;br /&gt;
| 37100&lt;br /&gt;
| [[Moodle Mobile 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.7.0&lt;br /&gt;
| 7 June 2019&lt;br /&gt;
| 37000&lt;br /&gt;
| [[Moodle Mobile 3.7.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.6.1&lt;br /&gt;
| 29 March 2019&lt;br /&gt;
| 36100&lt;br /&gt;
| [[Moodle Mobile 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.6.0&lt;br /&gt;
| 11 January 2019&lt;br /&gt;
| 36000&lt;br /&gt;
| [[Moodle Mobile 3.6.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.5.2&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 35200&lt;br /&gt;
| [[Moodle Mobile 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.5.1&lt;br /&gt;
| 6 July 2018&lt;br /&gt;
| 35100&lt;br /&gt;
| [[Moodle Mobile 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.5.0&lt;br /&gt;
| 25 June 2018&lt;br /&gt;
| 35000&lt;br /&gt;
| [[Moodle Mobile 3.5.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Moodle Mobile ==&lt;br /&gt;
&lt;br /&gt;
Versions with support or 3.0 and previous versions, based on Ionic 1.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Version name&lt;br /&gt;
! Date&lt;br /&gt;
! Version code&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.2&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 20230&lt;br /&gt;
| [[Moodle Mobile 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.1&lt;br /&gt;
| 28 February 2018&lt;br /&gt;
| 20220&lt;br /&gt;
| [[Moodle Mobile 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.4.0&lt;br /&gt;
| 30 November 2017&lt;br /&gt;
| 20210&lt;br /&gt;
| [[Moodle Mobile 3.4.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.2&lt;br /&gt;
| 29 September 2017&lt;br /&gt;
| 20200&lt;br /&gt;
| [[Moodle Mobile 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.1&lt;br /&gt;
| 28 July 2017&lt;br /&gt;
| 20190&lt;br /&gt;
| [[Moodle Mobile 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.3.0&lt;br /&gt;
| 26 May 2017&lt;br /&gt;
| 20180&lt;br /&gt;
| [[Moodle Mobile 3.3.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.1&lt;br /&gt;
| 28 February 2017&lt;br /&gt;
| 20170&lt;br /&gt;
| [[Moodle Mobile 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.2.0&lt;br /&gt;
| 12 December 2016&lt;br /&gt;
| 20160&lt;br /&gt;
| [[Moodle Mobile 3.2.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.3&lt;br /&gt;
| 19 October 2016&lt;br /&gt;
| 20150&lt;br /&gt;
| [[Moodle Mobile 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.2&lt;br /&gt;
| 27 July 2016&lt;br /&gt;
| 2014&lt;br /&gt;
| [[Moodle Mobile 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.1&lt;br /&gt;
| 14 June 2016&lt;br /&gt;
| 2013&lt;br /&gt;
| [[Moodle Mobile 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.1.0&lt;br /&gt;
| 23 May 2016&lt;br /&gt;
| 2012&lt;br /&gt;
| [[Moodle Mobile 3.1.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 3.0.0&lt;br /&gt;
| 15 April 2016&lt;br /&gt;
| 2011&lt;br /&gt;
| [[Moodle Mobile 3.0.0 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.9&lt;br /&gt;
| 29 February 2016&lt;br /&gt;
| 2010&lt;br /&gt;
| [[Moodle Mobile 2.9 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.8&lt;br /&gt;
| 22 January 2016&lt;br /&gt;
| 2009&lt;br /&gt;
| [[Moodle Mobile 2.8 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.7&lt;br /&gt;
| 29 December 2015&lt;br /&gt;
| 2008&lt;br /&gt;
| [[Moodle Mobile 2.7 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.6&lt;br /&gt;
| 27 November 2015&lt;br /&gt;
| 2007&lt;br /&gt;
| [[Moodle Mobile 2.6 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.5&lt;br /&gt;
| 6 November 2015&lt;br /&gt;
| 2006&lt;br /&gt;
| [[Moodle Mobile 2.5 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.4&lt;br /&gt;
| 21 October 2015&lt;br /&gt;
| 2005&lt;br /&gt;
| [[Moodle Mobile 2.4 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.3&lt;br /&gt;
| 8 October 2015&lt;br /&gt;
| 2004&lt;br /&gt;
| [[Moodle Mobile 2.3 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.2&lt;br /&gt;
| 10 September 2015&lt;br /&gt;
| 2003&lt;br /&gt;
| [[Moodle Mobile 2.2 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.1&lt;br /&gt;
| 28 August 2015&lt;br /&gt;
| 2002&lt;br /&gt;
| [[Moodle Mobile 2.1 release notes|Release Notes]]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle Mobile 2.0&lt;br /&gt;
| 31 July 2015&lt;br /&gt;
| 2000&lt;br /&gt;
| [[Moodle Mobile 2.0 release notes|Release Notes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Moodle Mobile 1 ==&lt;br /&gt;
&lt;br /&gt;
See [[Moodle Mobile 1 release notes]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle Desktop release notes]]&lt;br /&gt;
* [[Moodle Mobile Roadmap]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.4_release_notes&amp;diff=58187</id>
		<title>Moodle Mobile 3.9.4 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.4_release_notes&amp;diff=58187"/>
		<updated>2020-12-30T17:31:16Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: Created page with &amp;quot;Moodle Mobile release notes &amp;gt; {{FULLPAGENAME}}  Release date: 28 December 2020  == New features and improvements ==  * Minor improvements and bug fixes  ==Complete list of...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 28 December 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* Minor improvements and bug fixes&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3616 - Loading modal displayed forever when opening a course with a custom course format&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-3607 - Site plugins: CSS should be included in DOM in reliable order&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58127</id>
		<title>Moodle Mobile 3.9.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58127"/>
		<updated>2020-11-30T19:33:08Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 30 November 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* Students can now submit quizzes with essay question types including attachments&lt;br /&gt;
* New Course Completion notifications&lt;br /&gt;
* New option to log out from the Moodle App through the web&lt;br /&gt;
* Audio-recording now supported in more devices&lt;br /&gt;
* Several improvements for activity modules:&lt;br /&gt;
** Choice: New show available spaces setting&lt;br /&gt;
** Lesson: Allow maximum number of attempts to be unlimited &lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3200 - Database: students can add entries in a group that doesn&#039;t belong to them (visible groups)&lt;br /&gt;
* MOBILE-3265 - Can&#039;t change H5P strings language after the package has been downloaded&lt;br /&gt;
* MOBILE-3430 - Messaging - Repeat message sent if internet connection drops during sending&lt;br /&gt;
* MOBILE-3464 - Hiding core-tabs on scroll makes scroll a bit clunky and can cause some issues&lt;br /&gt;
* MOBILE-3465 - Adding window.open in a click event makes clicks override the app&lt;br /&gt;
* MOBILE-3468 - No error is displayed if you scan another URL scheme in credentials&lt;br /&gt;
* MOBILE-3469 - Single Activity course: if there are (sticky) blocks, the tablet view only shows the description (Forum at least)&lt;br /&gt;
* MOBILE-3471 - Find a way to have webview plugin only in iOS&lt;br /&gt;
* MOBILE-3477 - iOS app stays loading forever if a site has a lot of calendar events&lt;br /&gt;
* MOBILE-3487 - Invalidate only unknown files isn&#039;t working as expected&lt;br /&gt;
* MOBILE-3488 - Open local HTML file in Android: images aren&#039;t seen&lt;br /&gt;
* MOBILE-3489 - Android: App cannot access geolocation if Location is disabled in the device&lt;br /&gt;
* MOBILE-3503 - Scrolling/swipping from the bottom of a course page to top make top tabs to &amp;quot;shake&amp;quot;&lt;br /&gt;
* MOBILE-3508 - External linked files (google drive repository) do not work in mobile app&lt;br /&gt;
* MOBILE-3509 - Mobile app goes to blank notification page when clicking forum digest notification&lt;br /&gt;
* MOBILE-3511 - ionViewDidLeave not called in split view right pane&lt;br /&gt;
* MOBILE-3515 - Error: Avoid hardcoding the debug mode&lt;br /&gt;
* MOBILE-3519 - Forum: When following a link in app to a discussion, file attachments don&#039;t work&lt;br /&gt;
* MOBILE-3526 - Custom CFBundleShortVersionString can&#039;t be set&lt;br /&gt;
* MOBILE-3530 - Offload course files - error: &amp;quot;Cannot read property &#039;getFiles&#039; of undefined&lt;br /&gt;
* MOBILE-3532 - iOS: top bar has disappeared &lt;br /&gt;
* MOBILE-3533 - Disabled messaging - Hide &amp;quot;messages&amp;quot; section within preferences&lt;br /&gt;
* MOBILE-3534 - Update macOS signing script&lt;br /&gt;
* MOBILE-3539 - Course overview displays In Progress courses if all filters are disabled&lt;br /&gt;
* MOBILE-3556 - Mobile app site check causes unnecessary errors in server log&lt;br /&gt;
* MOBILE-3557 - Display &amp;quot;Not available&amp;quot; in hidden sections which name is displayed to users&lt;br /&gt;
* MOBILE-3562 - Course image is displayed twice (second time as part of the course attachments) in the pre-self enrol view&lt;br /&gt;
* MOBILE-3571 - Filters: core_filters_get_available_in_context call can exceed PHP input variables limit&lt;br /&gt;
* MOBILE-3578 - Multiple duplicate requests to tool_lp_data_for_user_competency_summary_in_course in the user profile&lt;br /&gt;
* MOBILE-3583 - Fix multichoice questions for 3.10&lt;br /&gt;
* MOBILE-3589 - Lesson: support unlimited max attempts&lt;br /&gt;
* MOBILE-3590 - Don&#039;t display H5P Embed button in the app&lt;br /&gt;
* MOBILE-3598 - H5P packages disappear after opening a new page with a package&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
* MOBILE-3432 - Implement file type exclusion list for mobile&lt;br /&gt;
* MOBILE-3454 - Support disabling check available text filters in the app&lt;br /&gt;
* MOBILE-3501 - Create task to push a branch and automatically update tracker issue&lt;br /&gt;
* MOBILE-3540 - Let links specify if they should be opened in InAppBrowser&lt;br /&gt;
&lt;br /&gt;
=== Task ===&lt;br /&gt;
* MOBILE-3425 - Update required Node version to 11+&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-2272 - Quiz Essay Question Uploading in the mobile app&lt;br /&gt;
* MOBILE-3188 - Cached web service responses for activity should show in manage storage&lt;br /&gt;
* MOBILE-3338 - Apply component and componentId to WS calls&lt;br /&gt;
* MOBILE-3421 - iPad: subtitles in video if too long are not seen on the screen&lt;br /&gt;
* MOBILE-3435 - Handle required custom fields in signup&lt;br /&gt;
* MOBILE-3445 - Let plugins disable PTR&lt;br /&gt;
* MOBILE-3449 - Sync assingment submission when PTR from submission review page&lt;br /&gt;
* MOBILE-3450 - Improve synchronizing a logged out site&lt;br /&gt;
* MOBILE-3451 - Display more data about devices in the app&lt;br /&gt;
* MOBILE-3453 - Don&#039;t unpack more than one H5P package at the same time&lt;br /&gt;
* MOBILE-3472 - Indicate restriction access after the section when &#039;All sections&#039; is selected&lt;br /&gt;
* MOBILE-3480 - Support images and links using svg + image/a in the app&lt;br /&gt;
* MOBILE-3490 - Media capture should fallback to Media (self-recorded audios) if there is not an external audio recording app configured&lt;br /&gt;
* MOBILE-3492 - Don&#039;t collapse content in large screens&lt;br /&gt;
* MOBILE-3493 - Don&#039;t display section selector if there are no sections&lt;br /&gt;
* MOBILE-3499 - Unlock plugins and libraries after 3.9.2 release&lt;br /&gt;
* MOBILE-3505 - App freezes when SSO via inappbrowser is launched in an active site where the token expired&lt;br /&gt;
* MOBILE-3507 - Improve Push notification handling for supporting custom notifications&lt;br /&gt;
* MOBILE-3510 - Revise encoding H5P message (&amp;amp;#039; is being shown instead of &#039;)&lt;br /&gt;
* MOBILE-3512 - Desktop: Revise &#039;Course overview&#039;(more columns)&lt;br /&gt;
* MOBILE-3514 - Support the &amp;quot;Show available spaces&amp;quot; choice setting in the app&lt;br /&gt;
* MOBILE-3516 - Use fork of InAppBrowser if they don&#039;t release a new version before 3.9.3 release&lt;br /&gt;
* MOBILE-3543 - Update electron version&lt;br /&gt;
* MOBILE-3546 - Make sitelisting fields configurable&lt;br /&gt;
* MOBILE-3548 - Make site url input placeholder easy to change using language strings&lt;br /&gt;
* MOBILE-3549 - Allow any HTML tag in plugins templates&lt;br /&gt;
* MOBILE-3553 - Remove version from H5P jquery file&lt;br /&gt;
* MOBILE-3554 - Add a setting to force login_logo.png usage&lt;br /&gt;
* MOBILE-3558 - Day view: the add event icon &amp;quot;+&amp;quot; should scroll&lt;br /&gt;
* MOBILE-3569 - Allow IFRAME to use XHTML document in Resource add-on&lt;br /&gt;
* MOBILE-3572 - Default the app color scheme to light&lt;br /&gt;
* MOBILE-3587 - Support autocomplete for connect/reconnect screens&lt;br /&gt;
* MOBILE-3596 - Send the block ID to tool_mobile_get_content&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.8.2_release_notes&amp;diff=58125</id>
		<title>Moodle Mobile 3.8.2 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.8.2_release_notes&amp;diff=58125"/>
		<updated>2020-11-30T15:07:59Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 2 April 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* Usability improvements in the Login page&lt;br /&gt;
* Performance improvements&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
&lt;br /&gt;
* MOBILE-3387 - Prevent duplicate AJAX calls&lt;br /&gt;
* MOBILE-3389 - Improve error messages and help in login page&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58124</id>
		<title>Moodle Mobile 3.9.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58124"/>
		<updated>2020-11-30T15:07:10Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 30 November 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* Students can now submit quizzes with essay question types including attachments&lt;br /&gt;
* New Course Completion notifications&lt;br /&gt;
* New option to log out from the Moodle App through the web&lt;br /&gt;
* Audio-recording now supported in more devices&lt;br /&gt;
* Several improvements for activity modules:&lt;br /&gt;
** Choice: New show available spaces setting&lt;br /&gt;
** Lesson: Allow maximum number of attempts to be unlimited &lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.2_release_notes&amp;diff=58123</id>
		<title>Moodle Mobile 3.9.2 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.2_release_notes&amp;diff=58123"/>
		<updated>2020-11-30T15:07:00Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 16 July 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* This is an un-scheduled release with several bug fixes and minor improvements.&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3426 - SCORM course displays only on half of screen on mobile devices (phone and tablet)&lt;br /&gt;
* MOBILE-3466 - Check calendar current day&lt;br /&gt;
* MOBILE-3473 - File/More options doesn&#039;t allow uploading files bigger than 10MB&lt;br /&gt;
* MOBILE-3475 - Called function &amp;quot;isVersionGreaterEqualThan&amp;quot; of undefined error in the &amp;quot;token expired&amp;quot; credentials screen&lt;br /&gt;
* MOBILE-3481 - Fix max width for iframe&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-3452 - Workshops (iOS): titles (ionic styles)&lt;br /&gt;
* MOBILE-3474 - Remove autofocus from the forgotten password screen and site URL / site finder screen when QR login button is displayed&lt;br /&gt;
* MOBILE-3476 - Make demo accounts case-insensitive&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.1_release_notes&amp;diff=58122</id>
		<title>Moodle Mobile 3.9.1 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.1_release_notes&amp;diff=58122"/>
		<updated>2020-11-30T15:06:43Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 3 July 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* This is an un-scheduled release due to a bug caused by a localisation issue in the Traditional Chinese language pack.&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-3461 - iframe-viewer uses a string in hideUntil instead of a boolean&lt;br /&gt;
* MOBILE-3462 - Make sure app direction is either ltr or rtl&lt;br /&gt;
* MOBILE-3467 - Authenticate using a custom URL scheme not working if site is logged out&lt;br /&gt;
* MOBILE-3470 - mod_resource file cannot be opened after PTR in course page&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-3458 - Validate URL for custom URLs and QR reader when app has fixed sites&lt;br /&gt;
* MOBILE-3459 - Disable QR reader in main menu&lt;br /&gt;
* MOBILE-3463 - Add an option to add a new site using URL&lt;br /&gt;
&lt;br /&gt;
[[Category:Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.0_release_notes&amp;diff=58121</id>
		<title>Moodle Mobile 3.9.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.0_release_notes&amp;diff=58121"/>
		<updated>2020-11-30T15:06:28Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 26 June 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* H5P activity - including offline tracking support (requires Moodle 3.9)&lt;br /&gt;
* iPad multitasking - having the Moodle app sharing the screen at the same time as other apps (similar to Android split view)&lt;br /&gt;
* On-boarding slides for new Moodle app users (Android only)&lt;br /&gt;
* Site finder - enabling a user to easily find their Moodle site by entering the name (no need to enter the site URL)&lt;br /&gt;
* QR reader - enabling a user to scan QR codes and open external URLs or courses and activities in the app&lt;br /&gt;
* Feedback from the app (active app users only)&lt;br /&gt;
&lt;br /&gt;
== Exclusive features for Pro and Premium subscriptions == &lt;br /&gt;
* QR code auto-login - enabling a user to scan a QR code in their Moodle site profile and be automatically logged in in the app without having to enter their credentials (requires Moodle 3.9)&lt;br /&gt;
* Site finder customised info - site admins can customise the information about their site which is displayed in site finder search results&lt;br /&gt;
Learn more about our Pro and Premium subscriptions [https://moodle.com/app/ here]&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;br /&gt;
&lt;br /&gt;
=== New Feature ===&lt;br /&gt;
* MOBILE-3305 - Implement removing individual downloaded courses&lt;br /&gt;
* MOBILE-3411 - Support H5P activity in the app (without tracking)&lt;br /&gt;
* MOBILE-3412 - Support tracking in H5P activities&lt;br /&gt;
* MOBILE-3413 - Let users view their attempts in H5P activities&lt;br /&gt;
* MOBILE-3414 - Create new onboarding slides for Android only&lt;br /&gt;
* MOBILE-3416 - Support multitasking in iPad (aka split view)&lt;br /&gt;
&lt;br /&gt;
=== Improvement ===&lt;br /&gt;
* MOBILE-2995 - QR code support in the app&lt;br /&gt;
* MOBILE-3101 - Use WKWebView&lt;br /&gt;
* MOBILE-3134 - For plugin activities the size context menu item is not updating automatically without a refresh&lt;br /&gt;
* MOBILE-3249 - Mobile: Sort courses by short name.&lt;br /&gt;
* MOBILE-3270 - Files uploaded from Google Drive (Android) have an incorrect size (4 bytes)&lt;br /&gt;
* MOBILE-3309 - Use ionic-cli as a project dependency&lt;br /&gt;
* MOBILE-3331 - Accessibility - open in browser &amp;amp; PDF icons causing problems for screenreaders&lt;br /&gt;
* MOBILE-3344 - Desktop (Windows): revise file types for file submission using Zip&lt;br /&gt;
* MOBILE-3351 - Desktop (Win / Ubuntu): Image preview (magnifying glass) to use all available space&lt;br /&gt;
* MOBILE-3370 - Add App Support for block_activity_results&lt;br /&gt;
* MOBILE-3375 - Make resource warnings less intrusive&lt;br /&gt;
* MOBILE-3380 - Split view placeholder always displays an arrow pointing to the left, even in RTL&lt;br /&gt;
* MOBILE-3382 - Show unread messages badge&lt;br /&gt;
* MOBILE-3394 - Add event when user activity is sent&lt;br /&gt;
* MOBILE-3402 - Improve Login UX&lt;br /&gt;
* MOBILE-3406 - Refactor apps&#039; H5P code to make it more similar to H5P&#039;s PHP and Moodle structure&lt;br /&gt;
* MOBILE-3417 - Allow Blocks plugins to specify a fallback&lt;br /&gt;
* MOBILE-3418 - Use WKWebView in InAppBrowser for iOS&lt;br /&gt;
* MOBILE-3419 - Make RTE button use &amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;, &amp;lt;strong&amp;gt;&amp;lt;/strong&amp;gt; instead of &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;, &amp;lt;b&amp;gt;&amp;lt;/b&amp;gt; for accessibility&lt;br /&gt;
* MOBILE-3422 - Revise tablet view when keyboard is activated&lt;br /&gt;
* MOBILE-3436 - Improve UX when opening a scorm&lt;br /&gt;
* MOBILE-3437 - Calculate download size: ignore size of files already downloaded&lt;br /&gt;
* MOBILE-3447 - Support disabling InAppBrowser in LTI in the app&lt;br /&gt;
* MOBILE-3294 - Behat tests for the Moodle App&lt;br /&gt;
* MOBILE-3434 - Update behat tests for the Moodle App&lt;br /&gt;
&lt;br /&gt;
=== Bug ===&lt;br /&gt;
* MOBILE-2870 - Feedback Activity - &amp;quot;Answer the Questions&amp;quot; button styling issue&lt;br /&gt;
* MOBILE-3015 - Mobile app crash when select subtitle in video player iOS&lt;br /&gt;
* MOBILE-3346 - Not possible to see your own workshop submission feedback on the App&lt;br /&gt;
* MOBILE-3363 - When the dark theme is on, the pop-up windows and the keyboard remain with a light background&lt;br /&gt;
* MOBILE-3368 - Required node version in package.json to avoid confusion&lt;br /&gt;
* MOBILE-3377 - Android: RTE buttons don&#039;t work when some text is selected&lt;br /&gt;
* MOBILE-3384 - Cannot read property &#039;errorcode&#039; of null if local/mobile/check.php returns null&lt;br /&gt;
* MOBILE-3390 - Database URL Field &amp;quot;Forced name for the link&amp;quot; doesn&#039;t show in Mobile view&lt;br /&gt;
* MOBILE-3398 - mod_data doesn&#039;t browse correctly when using ##moreurl##&lt;br /&gt;
* MOBILE-3400 - &amp;quot;Last accessed&amp;quot; module list sort is not updated after a course is viewed&lt;br /&gt;
* MOBILE-3407 - Drops aren&#039;t displayed in drag and drop into image questions in Moodle 3.6&lt;br /&gt;
* MOBILE-3420 - Blog images are not loaded properly&lt;br /&gt;
* MOBILE-3424 - Fix vulnerability in jQuery 1.9.1&lt;br /&gt;
* MOBILE-3438 - Update drag and drop code with changes on MDL-58645&lt;br /&gt;
* MOBILE-3443 - Big Modals on  landscape like multichoice on database are not closable&lt;br /&gt;
* MOBILE-3448 - File name is not unique when uploading&lt;br /&gt;
&lt;br /&gt;
[[Category: Mobile]]&lt;br /&gt;
[[Category:Release notes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58120</id>
		<title>Moodle Mobile 3.9.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58120"/>
		<updated>2020-11-30T15:03:21Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 30 November 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
* Students can now submit quizzes with essay question types including attachments&lt;br /&gt;
* New Course Completion notifications&lt;br /&gt;
* New option to log out from the Moodle App through the web&lt;br /&gt;
* Audio-recording now supported in more devices&lt;br /&gt;
* Several improvements for activity modules:&lt;br /&gt;
** Choice: New show available spaces setting&lt;br /&gt;
** Lesson: Allow maximum number of attempts to be unlimited &lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58115</id>
		<title>Moodle Mobile 3.9.3 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Mobile_3.9.3_release_notes&amp;diff=58115"/>
		<updated>2020-11-30T12:19:03Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: Created page with &amp;quot;Moodle Mobile release notes &amp;gt; {{FULLPAGENAME}}  Release date: 30 November 2020  == New features and improvements ==   ==Complete list of issues==&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Moodle Mobile release notes]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: 30 November 2020&lt;br /&gt;
&lt;br /&gt;
== New features and improvements ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Complete list of issues==&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Peer_reviewing&amp;diff=58076</id>
		<title>Peer reviewing</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Peer_reviewing&amp;diff=58076"/>
		<updated>2020-11-19T14:58:07Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* The Moodle mobile app */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Process=&lt;br /&gt;
&lt;br /&gt;
Peer review process helps to prepare the issue for integration. The peer reviewer is another developer who was not involved in the development process on the issue and therefore can take a fresh look and notice something that original developer might have forgotten during development. It is important to check that the bug actually is present and the code fixes it without creating new regressions. &lt;br /&gt;
&lt;br /&gt;
==Completing Peer review as a community member==&lt;br /&gt;
&lt;br /&gt;
Any other developer can review any change. That is why it is called &#039;peer&#039; review. However, not everyone has the necessary permissions in the tracker to click the buttons &#039;Start peer review&#039;, &#039;Finish peer review&#039; etc. This should not discourage you from looking at other contributors code and providing comments and feedback. The issue will still need to wait for someone with the right permissions to come along and click the buttons, but they can read your review and then need do no more than double-check some points, which will save a lot of time.&lt;br /&gt;
&lt;br /&gt;
To provide feedback to the developer, leave the issue in &amp;quot;Waiting for Peer Review&amp;quot; (since you don&#039;t have permission to do anything else, and also that makes it easy for someone with sufficient permissions to find the issue and move it forwards). Review the code using the checklist below, including any appropriate comments.  Once finished, please post a comment clearly stating the outcome of your review.  If you think it needs more work then indicate what needs to be changed.  If you are happy with the patch, leave a clear comment that you believe this is ready to be made part of Moodle.  This can then easily be seen by a HQ developer or component lead and they can quickly take appropriate action.&lt;br /&gt;
&lt;br /&gt;
If a followup review happens to identify something you did not find, you have an opportunity to expand your knowledge and provide better reviews in the future as well as having saved everybody else some time.&lt;br /&gt;
&lt;br /&gt;
Feedback to indicate the issue is ready to progress might look like the following;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks again for your contribution. I have reviewed the patch:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[Copy and paste the checklist here, and complete it]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I don&#039;t have permission to use the peer review buttons on this issue. I hope that someone with sufficient permissions will move the issue forwards soon.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feedback to indicate the issue requires further work might look like the following;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch. I think the following points require further work&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[Copy and paste the checklist here, and complete it]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Please indicate If you are willing to continue working on this issue and complete the solution.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can you help with peer reviewing? If so, please see the [https://tracker.moodle.org/issues/?filter=13607 list of issues waiting for peer review].&lt;br /&gt;
&lt;br /&gt;
==Peer review for development by HQ or a known common contributor==&lt;br /&gt;
&lt;br /&gt;
When code comes from a HQ developer or external developer who has been contributing significantly to Moodle and is well acquainted with Moodle standards, peer review is limited to checking the code according to the Checklist below. &lt;br /&gt;
&lt;br /&gt;
If everything is fine, the peer reviewer submits the issue for integration. &lt;br /&gt;
&lt;br /&gt;
If some additional work is needed or the author specifically asked not to submit for integration yet, the peer reviewer clicks on “Finish peer review” and the issue state returns to “Development in progress”. Usually the name of the peer reviewer stays on the issue and if a second peer review is requested it is expected that the same Peer reviewer picks it up. If the peer reviewer is not able to do the second review, they should remove their name and comment about it. Otherwise the issue does not appear on “waiting for peer review” dashboard. Please remember that not all jira users have permission to submit for integration.&lt;br /&gt;
&lt;br /&gt;
==Peer review for external developers==&lt;br /&gt;
&lt;br /&gt;
When the code has come from an external developer, the peer reviewer will also help the developer to lead the issue to integration. In this case the peer reviewer should not use “Finish peer review” button. &lt;br /&gt;
&lt;br /&gt;
If the issue needs additional work, the peer reviewer comments about the suggested changes but does not change the status of the issue and it remains as “Peer review in progress”. If the author of the patch does not reply in 4 days, the peer reviewer may select either to complete the patch themselves or reopen the issue. The decision should be based on the amount of work required to complete the solution, for example, changing coding style or commit message, rebasing, backporting, adding testing instructions, etc. should be performed by the peer reviewer. This may require picking the commits into reviewer’s git branch. &lt;br /&gt;
&lt;br /&gt;
It is very important to give the credit to the author of the code by either keeping their authorship on the commit or adding “Thanks to XXXX for providing the patch” to the commit message. If the author of the patch is not in jira-developers group the special user &#039;moodle.com&#039; should be entered in Assignee field.&lt;br /&gt;
&lt;br /&gt;
There could be situations when the patch is incomplete, does not fix the original issue, creates regressions or otherwise is not correct. As stated above, the peer reviewer should comment about it and wait for the feedback from the author. If there is no feedback, or the author can not work on this issue any more, and the peer reviewer also does not find it easy and important enough to complete, the issue needs to be reopened. Button “Fail peer review” (available to HQ developers only) will reset the issue status to “Reopened”. On this screen peer reviewer should remove assignee, peer reviewer and “patch” label from the issue. This way issue will become available again for anybody who want to work on it. All communication will remain in comments and issue history.&lt;br /&gt;
&lt;br /&gt;
If the issue has passed peer review but the integrator or tester has raised some questions about it, then normally the developer who created the patch would be expected to respond. If they do no respond quickly enough, then the peer reviewer is expected to step in and take responsibility for the change they reviewed.&lt;br /&gt;
&lt;br /&gt;
Once the issue is ready for integration, you can submit it to integration on behalf of the developer. Most external developers (those who are not in the jira-developers group) do not have permission to submit their own issues to integration so cannot do it themselves.&lt;br /&gt;
&lt;br /&gt;
==Replies templates==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch.&amp;lt;br/&amp;gt;&lt;br /&gt;
I have reviewed your code and can confirm that it addresses the reported issue. We would like to include it in core. Moodle values its contributors and tries to give them credit when possible. If you are interested in your name appearing on the https://moodle.org/dev/contributions.php page you can create a git commit that we will then pull into Moodle. You can learn more about Git and how Moodle uses it at &amp;lt;nowiki&amp;gt;[Git for developers|https://docs.moodle.org/dev/Git_for_developers]&amp;lt;/nowiki&amp;gt; page. Please let me know if you want to prepare a git branch. Or if you don’t have time to go through the whole process at the moment I can pick your patch myself.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch.&amp;lt;br/&amp;gt;&lt;br /&gt;
Your code looks almost ready for integration into Moodle. There are just some little things that need to be changed to comply with Moodle standards. Can you please take a look at the review results below and tell me if you are able to modify your branch to address them.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
I have reviewed your patch, it addresses the problem and complies with Moodle standards. I&#039;m pushing this issue for integration. Following Moodle &amp;lt;nowiki&amp;gt;[Process|https://docs.moodle.org/dev/Process]&amp;lt;/nowiki&amp;gt; it will go through integration review and testing before being included in the product. There might be additional questions from an integrator and/or a tester at those stages. It would be appreciated if you read tracker emails and can reply to questions if needed. If everything goes well during the next two stages your issue will be included in the next weekly release and your count on https://moodle.org/dev/contributions.php page will increase.&amp;lt;br/&amp;gt;&lt;br /&gt;
Thanks again for your contribution.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch.&amp;lt;br/&amp;gt;&lt;br /&gt;
Unfortunately this patch does not fully address the reported issue. ... DETAILS...&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Even though the code does solve the issue in the short-term it is very likely to create regressions ..... &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
I have spent some time reviewing the patch and I would recommend that you ..... &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Please let me know If you are willing to continue working on this issue and complete the solution.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Checklist=&lt;br /&gt;
&lt;br /&gt;
These are points to consider while peer-reviewing issues. Further explanation below.&lt;br /&gt;
&lt;br /&gt;
 [] Syntax&lt;br /&gt;
 [] Output&lt;br /&gt;
 [] Language&lt;br /&gt;
 [] Databases&lt;br /&gt;
 [] Testing (instructions and automated tests)&lt;br /&gt;
 [] Security&lt;br /&gt;
 [] Privacy (see [[Privacy API]])&lt;br /&gt;
 [] Performance and Clustering&lt;br /&gt;
 [] Documentation&lt;br /&gt;
 [] Git&lt;br /&gt;
 [] Third party code&lt;br /&gt;
 [] Sanity check&lt;br /&gt;
 [] Icons&lt;br /&gt;
 [] The Moodle mobile app&lt;br /&gt;
&lt;br /&gt;
Acceptable check-marks are Y (for yes), N (for no) or - (for not applicable). All N check-marks should be accompanied by an explanation of the problem that still needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
To allow the community of Moodle developers to work together, conventions should be followed.&lt;br /&gt;
&lt;br /&gt;
* The code is easy to understand and, where it isn&#039;t, comments have been provided.&lt;br /&gt;
* Variables are named correctly (all lower case, no camel-case, no underscores).&lt;br /&gt;
* Functions are named correctly (all lower case, no camel-case, underscores allowed).&lt;br /&gt;
* PHP DocBlocks have been updated and adhere to [[Coding_style#Documentation_and_comments|coding style guide]].&lt;br /&gt;
* Where functions are being removed, the [[Deprecation]] process is followed.&lt;br /&gt;
* The code doesn&#039;t use [[Deprecated_functions_in_2.0|deprecated functions]].&lt;br /&gt;
* $_GET, $_POST, $_REQUEST, $_COOKIE, and $_SESSION are never used.&lt;br /&gt;
&lt;br /&gt;
See the [[Coding style]] guide for details.&lt;br /&gt;
Most of the previous items list are checked automatically by the CiBot ([[Automated code review]]). So in this case it&#039;s recommended to review the execution results to validate that there aren&#039;t errors. However, take into account that for now, CiBot is not checking all file types (it happens, for instance, with the Javascript files).&lt;br /&gt;
&lt;br /&gt;
==Output==&lt;br /&gt;
Output needs to be controlled by renderers to achieve consistency and correct application of themes.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* output renders are used to generate output strings, including HTML tags;&lt;br /&gt;
* HTML output is valid html5;&lt;br /&gt;
* no inline styles have been used in HTML output (everything has to be in CSS);&lt;br /&gt;
* CSS has been added to the appropriate CSS files (base, specific area, sometimes canvas); and&lt;br /&gt;
* the code doesn&#039;t use buffered output unless absolutely necessary.&lt;br /&gt;
* all visual output has a RTL alternative included&lt;br /&gt;
&lt;br /&gt;
feedback any notices (E_STRICT, etc) seen into the MDL.&lt;br /&gt;
&lt;br /&gt;
==Language==&lt;br /&gt;
To achieve appropriate internationalisation of Moodle, language strings must be managed correctly.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* new language strings are named correctly (all lower case, no camel-case, underscores are permissible in some cases);&lt;br /&gt;
* help strings are named and formatted as described in [[Help strings]];&lt;br /&gt;
* language strings are used instead of hard-coded strings for text output;&lt;br /&gt;
* language strings have not been removed or renamed, had their meaning changed or had their parameters changed in stable branches (permitted only in master); and&lt;br /&gt;
* [https://docs.moodle.org/dev/Commit_cheat_sheet#Include_AMOS_script_in_the_commit_if_needed AMOS commands]  have been specified when moving or copying language strings.&lt;br /&gt;
&lt;br /&gt;
==Databases==&lt;br /&gt;
DB calls are the greatest performance bottleneck in Moodle.&lt;br /&gt;
&lt;br /&gt;
If there is SQL code you can test quickly then do so. &lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* there are minimal DB calls (no excessive use of the DB); and&lt;br /&gt;
* the code uses SQL compatible with all the supported DB engines (check all selected fields appear in an &#039;order by&#039; clause).&lt;br /&gt;
&lt;br /&gt;
==Testing instructions and automated tests==&lt;br /&gt;
It is the developer&#039;s responsibility to test code before integration. Issues should not be sent for peer review without tests so that the peer reviewer can assess their quality and use them to consider the scope of the issue.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* there are specific testing instructions that state how, as well as what, to test. Please ensure that the testing instructions:&lt;br /&gt;
** [[Testing instructions guide|are in the correct format]];&lt;br /&gt;
** are clear; and&lt;br /&gt;
** are concise;&lt;br /&gt;
** they consider other perspectives of other users perhaps not considered by original developers e.g. Moodle mobile app users&lt;br /&gt;
* the assignee has tested according to the instructions and verified that they are passing (This is the responsibility of the assignee, not the peer reviewer)&lt;br /&gt;
* new unit tests have been added when there is a change in functionality; and&lt;br /&gt;
* &#039;&#039;&#039;unit tests pass&#039;&#039;&#039; for related areas where changes have been made.&lt;br /&gt;
* &#039;&#039;&#039;Behat tests pass&#039;&#039;&#039; for related areas where changes have been made, especially when it involved UI changes.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
The user community relies on Moodle being responsibly secure.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* user login is checked where an identity is needed;&lt;br /&gt;
* sesskey values are checked before all write actions where appropriate (some read actions as well);&lt;br /&gt;
* capabilities are checked where roles differ; and&lt;br /&gt;
* if the issue itself is a [[Security|security]] issue, the [[Process#Security_issues|security process]] is being followed.&lt;br /&gt;
** Ensure that the fix is &#039;&#039;&#039;not&#039;&#039;&#039; available in a public repository (ie. a personal Github account); stand-alone patches should be provided instead.&lt;br /&gt;
** The issue will not be integrated until just before the next minor version release.&lt;br /&gt;
&lt;br /&gt;
==Privacy==&lt;br /&gt;
The user community relies on Moodle keeping user&#039;s privacy.&lt;br /&gt;
&lt;br /&gt;
See more info [[Privacy_API]]&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* No unnecessary personal user data is saved;&lt;br /&gt;
* All personal user data is saved in compliance with [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) which is an EU directive;&lt;br /&gt;
* For all stored data you will need to:&lt;br /&gt;
** Describe the type of data that they store;&lt;br /&gt;
** Provide a way to export that data; and&lt;br /&gt;
** Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
==Performance and clustering==&lt;br /&gt;
It is easy to write code that works sufficiently well when you are working on either small sets of data or with a small number of active users.  Picking performance issues can be quite difficult and can required a complex level of understanding of both the section of code being reviewed, but also other parts that interact with it.&lt;br /&gt;
&lt;br /&gt;
Clustering is when the same code is run on different computers and an end user could send each request to a different computer.  This can produce a number of concurrency issues if not thought through.  One example is;  If you complete an opcache_reset(), no other server except the one you ran it on knows that it happened.  So data can get out of sync.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* Any filesystem, database or cache accesses are done in the most efficient way.&lt;br /&gt;
* That any code or function that appear expensive are not in critical paths.  eg; They don&#039;t load on every page.&lt;br /&gt;
* The least possible code is running to complete the task, especially looking for hidden loops.  They can appear from calling functions.&lt;br /&gt;
* Any code that runs is not specific to a single node. (eg opcache_reset())  This ensures clusters will run correctly.&lt;br /&gt;
* If the code could affect performance at all, make sure there is a comment noting what was considered.&lt;br /&gt;
** What they did to mitigate performance impact, or why they thought it wasn&#039;t an issue.&lt;br /&gt;
** Why they made certain trade-offs.&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
Work does not stop when code is integrated.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* The PHPdoc comments on all classes, methods and fields are useful. (Comments that just repeat the function name are not helpful! Add value.)&lt;br /&gt;
* Where an API has been changed significantly, the relevant upgrade.txt file has been updated with information.&lt;br /&gt;
* Where something has been deprecated, that the comments don&#039;t just say &amp;quot;do NOT use this any more!!!&amp;quot; but acutally say what should be done instead.&lt;br /&gt;
* Appropriate [[Tracker_issue_labels|labels]] have been added when there has been a function change, particularly&lt;br /&gt;
** docs_required (any functional change, usually paired with ui_change),&lt;br /&gt;
** dev_docs_required (any change to APIs, usually paired with api_change),&lt;br /&gt;
** ui_change (any functional change, usually paired with docs_required, except ui_change remains permanetly),&lt;br /&gt;
** api_change (any change to APIs that devs will need to know about, usually paired with dev_docs_required, except api_change remains permanetly),&lt;br /&gt;
** unit_test_required and acceptance_test_required, when there are api or ui changes needing improved coverage, and&lt;br /&gt;
** qa_test_required (significant functional change, not covered by unit/acceptance ones).&lt;br /&gt;
* Also, verify that the components for the issue are correctly set, so maintainers (subscribed by default) will be mailed about issues early in the process.&lt;br /&gt;
&lt;br /&gt;
==Git==&lt;br /&gt;
Ensure that:&lt;br /&gt;
* the commit matches the [[Coding style#Git_commits|Coding style]]&lt;br /&gt;
* the Git history is clean and the work has been rebased to logical commits; and&lt;br /&gt;
* the original author of the work provided as a patch has been given credit within the commit (as author of in the commit message if changes were made).&lt;br /&gt;
&lt;br /&gt;
==Third party code==&lt;br /&gt;
Does the change contain [[Plugin with third party libraries|third party code]]? If so, ensure that:&lt;br /&gt;
&lt;br /&gt;
* The code is licensed under a [http://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses| GPL compatible license].&lt;br /&gt;
* The instructions for upgrading/importing the library and contained within a readme_moodle.txt file.&lt;br /&gt;
* The library is recorded in a thirdparty.xml file, including licensing information.&lt;br /&gt;
* Third party code has been scanned to check for url accessible entry points that could be exploited. These should either be disabled, or if required functionality they should be checked for security weaknesses.&lt;br /&gt;
* Does not duplicate the functionality of any existing api or third party library in core.&lt;br /&gt;
* Any modifications to third party code are recorded in readme_moodle.txt&lt;br /&gt;
&lt;br /&gt;
==Sanity check==&lt;br /&gt;
Ensure that:&lt;br /&gt;
* the code seems to solve the described problem completely within its reported scope (and further issues have been created to resolve remaining parts or further refactoring);&lt;br /&gt;
* the code makes sense in relation to the broader codebase (look at the whole function, not just the altered code); and&lt;br /&gt;
* the developer has searched for and fixed other areas that may also have been affected by the same problem.&lt;br /&gt;
* verify that the related component maintainers, if known, have participated and are aware of the issue (as assignee, or existing comments...). If they have not, please perform a friendly &amp;lt;tt&amp;gt;@mention&amp;lt;/tt&amp;gt; to make them aware about the issue. A list of component leads is available here: https://docs.moodle.org/dev/Component_Leads&lt;br /&gt;
* if any version numbers have been changed in [[version.php]] files, then the changes follow [[Moodle_versions#How_to_increment_version_numbers_in_core|the rule for updating version numbers in core]].&lt;br /&gt;
* there are comments on tracker explaining why current approach was taken and why other options (especially large issues). If not comment asking them to explain&lt;br /&gt;
&lt;br /&gt;
==Icons==&lt;br /&gt;
Are new icons being introduced? If so, ensure that:&lt;br /&gt;
* the icons abide by our [https://docs.moodle.org/dev/Moodle_icons icon guidelines] with regards to size, design and format&lt;br /&gt;
* the icons are do not unnecessarily add new ways of expressing existing concepts&lt;br /&gt;
* the icons are in a pix folder that makes sense&lt;br /&gt;
&lt;br /&gt;
==The Moodle mobile app==&lt;br /&gt;
The Moodle app supports most of the student-related Moodle functionality. It is important to think about how a change in that type of functionality might affect it.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* The issue is labelled with affects_mobileapp when the developer suspects that the changes can affect the app. &lt;br /&gt;
* New module settings are returned via the existing Web Services in the module&lt;br /&gt;
* When the code includes a new Web Service that will be necessary for the Moodle app, the new Web Service is included in the mobile service&lt;br /&gt;
* New global settings that affect new features for the app are included in the WebServices returning global settings (tool_mobile_get_config)&lt;br /&gt;
* The testing instructions include testing steps for the Moodle App&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [http://moodle.org/plugins/view.php?plugin=local_codechecker Code checker plugin]&lt;br /&gt;
&lt;br /&gt;
[[Category: Processes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Peer_reviewing&amp;diff=58075</id>
		<title>Peer reviewing</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Peer_reviewing&amp;diff=58075"/>
		<updated>2020-11-19T14:55:02Z</updated>

		<summary type="html">&lt;p&gt;Jleyva: /* Checklist */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Process=&lt;br /&gt;
&lt;br /&gt;
Peer review process helps to prepare the issue for integration. The peer reviewer is another developer who was not involved in the development process on the issue and therefore can take a fresh look and notice something that original developer might have forgotten during development. It is important to check that the bug actually is present and the code fixes it without creating new regressions. &lt;br /&gt;
&lt;br /&gt;
==Completing Peer review as a community member==&lt;br /&gt;
&lt;br /&gt;
Any other developer can review any change. That is why it is called &#039;peer&#039; review. However, not everyone has the necessary permissions in the tracker to click the buttons &#039;Start peer review&#039;, &#039;Finish peer review&#039; etc. This should not discourage you from looking at other contributors code and providing comments and feedback. The issue will still need to wait for someone with the right permissions to come along and click the buttons, but they can read your review and then need do no more than double-check some points, which will save a lot of time.&lt;br /&gt;
&lt;br /&gt;
To provide feedback to the developer, leave the issue in &amp;quot;Waiting for Peer Review&amp;quot; (since you don&#039;t have permission to do anything else, and also that makes it easy for someone with sufficient permissions to find the issue and move it forwards). Review the code using the checklist below, including any appropriate comments.  Once finished, please post a comment clearly stating the outcome of your review.  If you think it needs more work then indicate what needs to be changed.  If you are happy with the patch, leave a clear comment that you believe this is ready to be made part of Moodle.  This can then easily be seen by a HQ developer or component lead and they can quickly take appropriate action.&lt;br /&gt;
&lt;br /&gt;
If a followup review happens to identify something you did not find, you have an opportunity to expand your knowledge and provide better reviews in the future as well as having saved everybody else some time.&lt;br /&gt;
&lt;br /&gt;
Feedback to indicate the issue is ready to progress might look like the following;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks again for your contribution. I have reviewed the patch:&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[Copy and paste the checklist here, and complete it]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
I don&#039;t have permission to use the peer review buttons on this issue. I hope that someone with sufficient permissions will move the issue forwards soon.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feedback to indicate the issue requires further work might look like the following;&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch. I think the following points require further work&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[Copy and paste the checklist here, and complete it]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Please indicate If you are willing to continue working on this issue and complete the solution.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Can you help with peer reviewing? If so, please see the [https://tracker.moodle.org/issues/?filter=13607 list of issues waiting for peer review].&lt;br /&gt;
&lt;br /&gt;
==Peer review for development by HQ or a known common contributor==&lt;br /&gt;
&lt;br /&gt;
When code comes from a HQ developer or external developer who has been contributing significantly to Moodle and is well acquainted with Moodle standards, peer review is limited to checking the code according to the Checklist below. &lt;br /&gt;
&lt;br /&gt;
If everything is fine, the peer reviewer submits the issue for integration. &lt;br /&gt;
&lt;br /&gt;
If some additional work is needed or the author specifically asked not to submit for integration yet, the peer reviewer clicks on “Finish peer review” and the issue state returns to “Development in progress”. Usually the name of the peer reviewer stays on the issue and if a second peer review is requested it is expected that the same Peer reviewer picks it up. If the peer reviewer is not able to do the second review, they should remove their name and comment about it. Otherwise the issue does not appear on “waiting for peer review” dashboard. Please remember that not all jira users have permission to submit for integration.&lt;br /&gt;
&lt;br /&gt;
==Peer review for external developers==&lt;br /&gt;
&lt;br /&gt;
When the code has come from an external developer, the peer reviewer will also help the developer to lead the issue to integration. In this case the peer reviewer should not use “Finish peer review” button. &lt;br /&gt;
&lt;br /&gt;
If the issue needs additional work, the peer reviewer comments about the suggested changes but does not change the status of the issue and it remains as “Peer review in progress”. If the author of the patch does not reply in 4 days, the peer reviewer may select either to complete the patch themselves or reopen the issue. The decision should be based on the amount of work required to complete the solution, for example, changing coding style or commit message, rebasing, backporting, adding testing instructions, etc. should be performed by the peer reviewer. This may require picking the commits into reviewer’s git branch. &lt;br /&gt;
&lt;br /&gt;
It is very important to give the credit to the author of the code by either keeping their authorship on the commit or adding “Thanks to XXXX for providing the patch” to the commit message. If the author of the patch is not in jira-developers group the special user &#039;moodle.com&#039; should be entered in Assignee field.&lt;br /&gt;
&lt;br /&gt;
There could be situations when the patch is incomplete, does not fix the original issue, creates regressions or otherwise is not correct. As stated above, the peer reviewer should comment about it and wait for the feedback from the author. If there is no feedback, or the author can not work on this issue any more, and the peer reviewer also does not find it easy and important enough to complete, the issue needs to be reopened. Button “Fail peer review” (available to HQ developers only) will reset the issue status to “Reopened”. On this screen peer reviewer should remove assignee, peer reviewer and “patch” label from the issue. This way issue will become available again for anybody who want to work on it. All communication will remain in comments and issue history.&lt;br /&gt;
&lt;br /&gt;
If the issue has passed peer review but the integrator or tester has raised some questions about it, then normally the developer who created the patch would be expected to respond. If they do no respond quickly enough, then the peer reviewer is expected to step in and take responsibility for the change they reviewed.&lt;br /&gt;
&lt;br /&gt;
Once the issue is ready for integration, you can submit it to integration on behalf of the developer. Most external developers (those who are not in the jira-developers group) do not have permission to submit their own issues to integration so cannot do it themselves.&lt;br /&gt;
&lt;br /&gt;
==Replies templates==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch.&amp;lt;br/&amp;gt;&lt;br /&gt;
I have reviewed your code and can confirm that it addresses the reported issue. We would like to include it in core. Moodle values its contributors and tries to give them credit when possible. If you are interested in your name appearing on the https://moodle.org/dev/contributions.php page you can create a git commit that we will then pull into Moodle. You can learn more about Git and how Moodle uses it at &amp;lt;nowiki&amp;gt;[Git for developers|https://docs.moodle.org/dev/Git_for_developers]&amp;lt;/nowiki&amp;gt; page. Please let me know if you want to prepare a git branch. Or if you don’t have time to go through the whole process at the moment I can pick your patch myself.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch.&amp;lt;br/&amp;gt;&lt;br /&gt;
Your code looks almost ready for integration into Moodle. There are just some little things that need to be changed to comply with Moodle standards. Can you please take a look at the review results below and tell me if you are able to modify your branch to address them.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
I have reviewed your patch, it addresses the problem and complies with Moodle standards. I&#039;m pushing this issue for integration. Following Moodle &amp;lt;nowiki&amp;gt;[Process|https://docs.moodle.org/dev/Process]&amp;lt;/nowiki&amp;gt; it will go through integration review and testing before being included in the product. There might be additional questions from an integrator and/or a tester at those stages. It would be appreciated if you read tracker emails and can reply to questions if needed. If everything goes well during the next two stages your issue will be included in the next weekly release and your count on https://moodle.org/dev/contributions.php page will increase.&amp;lt;br/&amp;gt;&lt;br /&gt;
Thanks again for your contribution.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
Thanks for providing a patch.&amp;lt;br/&amp;gt;&lt;br /&gt;
Unfortunately this patch does not fully address the reported issue. ... DETAILS...&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Even though the code does solve the issue in the short-term it is very likely to create regressions ..... &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
I have spent some time reviewing the patch and I would recommend that you ..... &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Please let me know If you are willing to continue working on this issue and complete the solution.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Checklist=&lt;br /&gt;
&lt;br /&gt;
These are points to consider while peer-reviewing issues. Further explanation below.&lt;br /&gt;
&lt;br /&gt;
 [] Syntax&lt;br /&gt;
 [] Output&lt;br /&gt;
 [] Language&lt;br /&gt;
 [] Databases&lt;br /&gt;
 [] Testing (instructions and automated tests)&lt;br /&gt;
 [] Security&lt;br /&gt;
 [] Privacy (see [[Privacy API]])&lt;br /&gt;
 [] Performance and Clustering&lt;br /&gt;
 [] Documentation&lt;br /&gt;
 [] Git&lt;br /&gt;
 [] Third party code&lt;br /&gt;
 [] Sanity check&lt;br /&gt;
 [] Icons&lt;br /&gt;
 [] The Moodle mobile app&lt;br /&gt;
&lt;br /&gt;
Acceptable check-marks are Y (for yes), N (for no) or - (for not applicable). All N check-marks should be accompanied by an explanation of the problem that still needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
To allow the community of Moodle developers to work together, conventions should be followed.&lt;br /&gt;
&lt;br /&gt;
* The code is easy to understand and, where it isn&#039;t, comments have been provided.&lt;br /&gt;
* Variables are named correctly (all lower case, no camel-case, no underscores).&lt;br /&gt;
* Functions are named correctly (all lower case, no camel-case, underscores allowed).&lt;br /&gt;
* PHP DocBlocks have been updated and adhere to [[Coding_style#Documentation_and_comments|coding style guide]].&lt;br /&gt;
* Where functions are being removed, the [[Deprecation]] process is followed.&lt;br /&gt;
* The code doesn&#039;t use [[Deprecated_functions_in_2.0|deprecated functions]].&lt;br /&gt;
* $_GET, $_POST, $_REQUEST, $_COOKIE, and $_SESSION are never used.&lt;br /&gt;
&lt;br /&gt;
See the [[Coding style]] guide for details.&lt;br /&gt;
Most of the previous items list are checked automatically by the CiBot ([[Automated code review]]). So in this case it&#039;s recommended to review the execution results to validate that there aren&#039;t errors. However, take into account that for now, CiBot is not checking all file types (it happens, for instance, with the Javascript files).&lt;br /&gt;
&lt;br /&gt;
==Output==&lt;br /&gt;
Output needs to be controlled by renderers to achieve consistency and correct application of themes.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* output renders are used to generate output strings, including HTML tags;&lt;br /&gt;
* HTML output is valid html5;&lt;br /&gt;
* no inline styles have been used in HTML output (everything has to be in CSS);&lt;br /&gt;
* CSS has been added to the appropriate CSS files (base, specific area, sometimes canvas); and&lt;br /&gt;
* the code doesn&#039;t use buffered output unless absolutely necessary.&lt;br /&gt;
* all visual output has a RTL alternative included&lt;br /&gt;
&lt;br /&gt;
feedback any notices (E_STRICT, etc) seen into the MDL.&lt;br /&gt;
&lt;br /&gt;
==Language==&lt;br /&gt;
To achieve appropriate internationalisation of Moodle, language strings must be managed correctly.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* new language strings are named correctly (all lower case, no camel-case, underscores are permissible in some cases);&lt;br /&gt;
* help strings are named and formatted as described in [[Help strings]];&lt;br /&gt;
* language strings are used instead of hard-coded strings for text output;&lt;br /&gt;
* language strings have not been removed or renamed, had their meaning changed or had their parameters changed in stable branches (permitted only in master); and&lt;br /&gt;
* [https://docs.moodle.org/dev/Commit_cheat_sheet#Include_AMOS_script_in_the_commit_if_needed AMOS commands]  have been specified when moving or copying language strings.&lt;br /&gt;
&lt;br /&gt;
==Databases==&lt;br /&gt;
DB calls are the greatest performance bottleneck in Moodle.&lt;br /&gt;
&lt;br /&gt;
If there is SQL code you can test quickly then do so. &lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* there are minimal DB calls (no excessive use of the DB); and&lt;br /&gt;
* the code uses SQL compatible with all the supported DB engines (check all selected fields appear in an &#039;order by&#039; clause).&lt;br /&gt;
&lt;br /&gt;
==Testing instructions and automated tests==&lt;br /&gt;
It is the developer&#039;s responsibility to test code before integration. Issues should not be sent for peer review without tests so that the peer reviewer can assess their quality and use them to consider the scope of the issue.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* there are specific testing instructions that state how, as well as what, to test. Please ensure that the testing instructions:&lt;br /&gt;
** [[Testing instructions guide|are in the correct format]];&lt;br /&gt;
** are clear; and&lt;br /&gt;
** are concise;&lt;br /&gt;
** they consider other perspectives of other users perhaps not considered by original developers e.g. Moodle mobile app users&lt;br /&gt;
* the assignee has tested according to the instructions and verified that they are passing (This is the responsibility of the assignee, not the peer reviewer)&lt;br /&gt;
* new unit tests have been added when there is a change in functionality; and&lt;br /&gt;
* &#039;&#039;&#039;unit tests pass&#039;&#039;&#039; for related areas where changes have been made.&lt;br /&gt;
* &#039;&#039;&#039;Behat tests pass&#039;&#039;&#039; for related areas where changes have been made, especially when it involved UI changes.&lt;br /&gt;
&lt;br /&gt;
==Security==&lt;br /&gt;
The user community relies on Moodle being responsibly secure.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* user login is checked where an identity is needed;&lt;br /&gt;
* sesskey values are checked before all write actions where appropriate (some read actions as well);&lt;br /&gt;
* capabilities are checked where roles differ; and&lt;br /&gt;
* if the issue itself is a [[Security|security]] issue, the [[Process#Security_issues|security process]] is being followed.&lt;br /&gt;
** Ensure that the fix is &#039;&#039;&#039;not&#039;&#039;&#039; available in a public repository (ie. a personal Github account); stand-alone patches should be provided instead.&lt;br /&gt;
** The issue will not be integrated until just before the next minor version release.&lt;br /&gt;
&lt;br /&gt;
==Privacy==&lt;br /&gt;
The user community relies on Moodle keeping user&#039;s privacy.&lt;br /&gt;
&lt;br /&gt;
See more info [[Privacy_API]]&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* No unnecessary personal user data is saved;&lt;br /&gt;
* All personal user data is saved in compliance with [https://en.wikipedia.org/wiki/General_Data_Protection_Regulation General Data Protection Regulation] (GDPR) which is an EU directive;&lt;br /&gt;
* For all stored data you will need to:&lt;br /&gt;
** Describe the type of data that they store;&lt;br /&gt;
** Provide a way to export that data; and&lt;br /&gt;
** Provide a way to delete that data.&lt;br /&gt;
&lt;br /&gt;
==Performance and clustering==&lt;br /&gt;
It is easy to write code that works sufficiently well when you are working on either small sets of data or with a small number of active users.  Picking performance issues can be quite difficult and can required a complex level of understanding of both the section of code being reviewed, but also other parts that interact with it.&lt;br /&gt;
&lt;br /&gt;
Clustering is when the same code is run on different computers and an end user could send each request to a different computer.  This can produce a number of concurrency issues if not thought through.  One example is;  If you complete an opcache_reset(), no other server except the one you ran it on knows that it happened.  So data can get out of sync.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* Any filesystem, database or cache accesses are done in the most efficient way.&lt;br /&gt;
* That any code or function that appear expensive are not in critical paths.  eg; They don&#039;t load on every page.&lt;br /&gt;
* The least possible code is running to complete the task, especially looking for hidden loops.  They can appear from calling functions.&lt;br /&gt;
* Any code that runs is not specific to a single node. (eg opcache_reset())  This ensures clusters will run correctly.&lt;br /&gt;
* If the code could affect performance at all, make sure there is a comment noting what was considered.&lt;br /&gt;
** What they did to mitigate performance impact, or why they thought it wasn&#039;t an issue.&lt;br /&gt;
** Why they made certain trade-offs.&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
Work does not stop when code is integrated.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* The PHPdoc comments on all classes, methods and fields are useful. (Comments that just repeat the function name are not helpful! Add value.)&lt;br /&gt;
* Where an API has been changed significantly, the relevant upgrade.txt file has been updated with information.&lt;br /&gt;
* Where something has been deprecated, that the comments don&#039;t just say &amp;quot;do NOT use this any more!!!&amp;quot; but acutally say what should be done instead.&lt;br /&gt;
* Appropriate [[Tracker_issue_labels|labels]] have been added when there has been a function change, particularly&lt;br /&gt;
** docs_required (any functional change, usually paired with ui_change),&lt;br /&gt;
** dev_docs_required (any change to APIs, usually paired with api_change),&lt;br /&gt;
** ui_change (any functional change, usually paired with docs_required, except ui_change remains permanetly),&lt;br /&gt;
** api_change (any change to APIs that devs will need to know about, usually paired with dev_docs_required, except api_change remains permanetly),&lt;br /&gt;
** unit_test_required and acceptance_test_required, when there are api or ui changes needing improved coverage, and&lt;br /&gt;
** qa_test_required (significant functional change, not covered by unit/acceptance ones).&lt;br /&gt;
* Also, verify that the components for the issue are correctly set, so maintainers (subscribed by default) will be mailed about issues early in the process.&lt;br /&gt;
&lt;br /&gt;
==Git==&lt;br /&gt;
Ensure that:&lt;br /&gt;
* the commit matches the [[Coding style#Git_commits|Coding style]]&lt;br /&gt;
* the Git history is clean and the work has been rebased to logical commits; and&lt;br /&gt;
* the original author of the work provided as a patch has been given credit within the commit (as author of in the commit message if changes were made).&lt;br /&gt;
&lt;br /&gt;
==Third party code==&lt;br /&gt;
Does the change contain [[Plugin with third party libraries|third party code]]? If so, ensure that:&lt;br /&gt;
&lt;br /&gt;
* The code is licensed under a [http://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses| GPL compatible license].&lt;br /&gt;
* The instructions for upgrading/importing the library and contained within a readme_moodle.txt file.&lt;br /&gt;
* The library is recorded in a thirdparty.xml file, including licensing information.&lt;br /&gt;
* Third party code has been scanned to check for url accessible entry points that could be exploited. These should either be disabled, or if required functionality they should be checked for security weaknesses.&lt;br /&gt;
* Does not duplicate the functionality of any existing api or third party library in core.&lt;br /&gt;
* Any modifications to third party code are recorded in readme_moodle.txt&lt;br /&gt;
&lt;br /&gt;
==Sanity check==&lt;br /&gt;
Ensure that:&lt;br /&gt;
* the code seems to solve the described problem completely within its reported scope (and further issues have been created to resolve remaining parts or further refactoring);&lt;br /&gt;
* the code makes sense in relation to the broader codebase (look at the whole function, not just the altered code); and&lt;br /&gt;
* the developer has searched for and fixed other areas that may also have been affected by the same problem.&lt;br /&gt;
* verify that the related component maintainers, if known, have participated and are aware of the issue (as assignee, or existing comments...). If they have not, please perform a friendly &amp;lt;tt&amp;gt;@mention&amp;lt;/tt&amp;gt; to make them aware about the issue. A list of component leads is available here: https://docs.moodle.org/dev/Component_Leads&lt;br /&gt;
* if any version numbers have been changed in [[version.php]] files, then the changes follow [[Moodle_versions#How_to_increment_version_numbers_in_core|the rule for updating version numbers in core]].&lt;br /&gt;
* there are comments on tracker explaining why current approach was taken and why other options (especially large issues). If not comment asking them to explain&lt;br /&gt;
&lt;br /&gt;
==Icons==&lt;br /&gt;
Are new icons being introduced? If so, ensure that:&lt;br /&gt;
* the icons abide by our [https://docs.moodle.org/dev/Moodle_icons icon guidelines] with regards to size, design and format&lt;br /&gt;
* the icons are do not unnecessarily add new ways of expressing existing concepts&lt;br /&gt;
* the icons are in a pix folder that makes sense&lt;br /&gt;
&lt;br /&gt;
==The Moodle mobile app==&lt;br /&gt;
The Moodle app supports most of the user-related Moodle functionality. It is important to think about how a change in student-related features might affect it.&lt;br /&gt;
&lt;br /&gt;
Ensure that:&lt;br /&gt;
* The issue is labelled with affects_mobileapp so the Moodle Apps team will have a chance to review the changes and how they will affect the app&lt;br /&gt;
* New module settings are returned via the existing Web Services in the module&lt;br /&gt;
* When the code includes a new Web Service that will be necessary for the Moodle app, the new Web Service is included in the mobile service&lt;br /&gt;
* New global settings that affect new features for the app are included in the WebServices returning global settings (tool_mobile_get_config)&lt;br /&gt;
* The testing instructions include testing steps for the Moodle App&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
* [http://moodle.org/plugins/view.php?plugin=local_codechecker Code checker plugin]&lt;br /&gt;
&lt;br /&gt;
[[Category: Processes]]&lt;/div&gt;</summary>
		<author><name>Jleyva</name></author>
	</entry>
</feed>