From 335c7b24072d9b7d2d3223be73906a1eb415a3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=BDubor=20Jurena?= Date: Wed, 14 Oct 2026 10:34:13 +0200 Subject: [PATCH 1/2] docs: add live AAPS end-of-life page --- docs/EN/Maintenance/EndOfLife.md | 36 ++++++++++++++++++++++++++ docs/EN/Maintenance/ReleaseNotes.md | 2 ++ docs/EN/conf.py | 3 ++- docs/EN/index.md | 1 + docs/_static/end-of-life.js | 40 +++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 docs/EN/Maintenance/EndOfLife.md create mode 100644 docs/_static/end-of-life.js diff --git a/docs/EN/Maintenance/EndOfLife.md b/docs/EN/Maintenance/EndOfLife.md new file mode 100644 index 000000000000..dba3ef7fbf5e --- /dev/null +++ b/docs/EN/Maintenance/EndOfLife.md @@ -0,0 +1,36 @@ +# End of life + +Each AAPS version can have an end date. After this date, AAPS may limit the loop. AAPS warns you before a version expires. Plan to update before the end date, and follow the [update guide](UpdateToNewVersion.md). + +## How to use this page + +1. In AAPS, tap the three dots at the top right and choose **About**. You will see your AAPS version there. +2. Find the same version in the first table below. Read the end date next to it. Dates are written as **year-month-day**. For example, `2026-10-30` means 30 October 2026. +3. Check the [Release Notes](ReleaseNotes.md) and the [update guide](UpdateToNewVersion.md) before you update. The version you can use also depends on your phone's Android version. + +The table does not show an end date for every AAPS version. If your version is missing, its end date may not have been set yet. This does not mean it will be supported forever. + +## AAPS version end dates + +
Loading AAPS version data…
+ + + + +## Android API levels + +Android gives each system version an **API level**, which is a number used by apps. For example, API level 30 is Android 11. The table below uses API levels from AAPS version data. The AAPS version in each row is the value listed for the API level shown. This is not a full list of versions you can install. + +To choose an AAPS version for your phone, use the [Android version guidance in the Release Notes](ReleaseNotes.md#android-version-and-aaps-version). If no AAPS version is listed for an API level, the table says “None listed”. + + diff --git a/docs/EN/Maintenance/ReleaseNotes.md b/docs/EN/Maintenance/ReleaseNotes.md index 3ff00d6bfe7c..9f39c5a0e002 100644 --- a/docs/EN/Maintenance/ReleaseNotes.md +++ b/docs/EN/Maintenance/ReleaseNotes.md @@ -9,6 +9,8 @@ You will receive a notification like this when a new update is available: If you do not update until expiration date **AAPS** will switch to Open Loop. +See [End of life](EndOfLife.md) for AAPS version end dates. + **Do not ignore the notification.** New versions of **AAPS** provide important safety fixes. Therefore, every **AAPS** user must update to the latest version as soon as possible. This an effort to try to improve the safety for each **AAPS** user and the DIY community. Thank you for your understanding. (maintenance-android-version-aaps-version)= diff --git a/docs/EN/conf.py b/docs/EN/conf.py index 80d93ea2d49c..a80d46810580 100644 --- a/docs/EN/conf.py +++ b/docs/EN/conf.py @@ -28,6 +28,7 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['../_static'] +html_js_files = ['end-of-life.js'] # A list of paths that contain extra templates (or templates that overwrite builtin/theme-specific templates). Relative paths # are taken as relative to the configuration directory. @@ -61,4 +62,4 @@ 'twitter:title': 'Welcome to the AAPS documentation — AndroidAPS Documentation', 'twitter:description':'Android APS (AAPS) is an open source app for people living with insulin-dependent diabetes. It is an artificial pancreas system (APS) which runs on Android smartphones.', 'twitter:image': 'https://androidaps.readthedocs.io/en/latest/_static/androidaps-logo.png', -} \ No newline at end of file +} diff --git a/docs/EN/index.md b/docs/EN/index.md index b29added932a..d348f7a89bc0 100644 --- a/docs/EN/index.md +++ b/docs/EN/index.md @@ -150,6 +150,7 @@ Exchange site custom watchfaces <./ExchangeSiteCustomWatchfaces/index.md> Export/Import Settings <./Maintenance/ExportImportSettings.md> Reviewing your data <./Maintenance/Reviewing.md> AAPS Release Notes <./Maintenance/ReleaseNotes.md> +End of life <./Maintenance/EndOfLife.md> Documentation updates <./Maintenance/DocumentationUpdate.md> Updating to a new version of AAPS <./Maintenance/UpdateToNewVersion.md> - Browser Update <./Maintenance/UpdateBrowserBuild.md> diff --git a/docs/_static/end-of-life.js b/docs/_static/end-of-life.js new file mode 100644 index 000000000000..ec18106e5f87 --- /dev/null +++ b/docs/_static/end-of-life.js @@ -0,0 +1,40 @@ +document.addEventListener('DOMContentLoaded', async () => { + const status = document.getElementById('aaps-eol-status'); + if (!status) return; + + function showRows(id, rows) { + const container = document.getElementById(id); + const body = container.querySelector('tbody'); + for (const values of rows) { + const row = body.insertRow(); + for (const value of values) row.insertCell().textContent = value; + } + container.hidden = rows.length === 0; + } + + try { + const response = await fetch('https://raw.githubusercontent.com/nightscout/AndroidAPS/refs/heads/versions/definition.json'); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + const data = await response.json(); + if (!Array.isArray(data)) throw new Error('Invalid version data'); + + const versions = data.filter(entry => + entry && typeof entry.version === 'string' && + typeof entry.endDate === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(entry.endDate) + ).sort((a, b) => b.version.localeCompare(a.version, undefined, { numeric: true })); + const android = data.filter(entry => + entry && Number.isInteger(entry.minAndroid) && Number.isInteger(entry.maxAndroid) + ).sort((a, b) => b.minAndroid - a.minAndroid); + if (!versions.length && !android.length) throw new Error('No version data'); + + showRows('aaps-eol-versions', versions.map(entry => [entry.version, entry.endDate])); + showRows('aaps-eol-android', android.map(entry => [ + entry.minAndroid === entry.maxAndroid + ? String(entry.minAndroid) : `${entry.minAndroid}–${entry.maxAndroid}`, + typeof entry.supported === 'string' && entry.supported ? entry.supported : 'None listed' + ])); + status.remove(); + } catch { + status.textContent = 'Could not load AAPS version data. Please try again later.'; + } +}); From 4aaa11950cbb779d6eb75d4d6c28d2afb12e226a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=BDubor=20Jurena?= Date: Thu, 15 Oct 2026 21:55:52 +0200 Subject: [PATCH 2/2] docs: embed end-of-life script in page --- docs/EN/Maintenance/EndOfLife.md | 46 ++++++++++++++++++++++++++++++++ docs/EN/conf.py | 1 - docs/_static/end-of-life.js | 40 --------------------------- 3 files changed, 46 insertions(+), 41 deletions(-) delete mode 100644 docs/_static/end-of-life.js diff --git a/docs/EN/Maintenance/EndOfLife.md b/docs/EN/Maintenance/EndOfLife.md index dba3ef7fbf5e..a46704a6fcf7 100644 --- a/docs/EN/Maintenance/EndOfLife.md +++ b/docs/EN/Maintenance/EndOfLife.md @@ -34,3 +34,49 @@ To choose an AAPS version for your phone, use the [Android version guidance in t + +```{raw} html + + +``` diff --git a/docs/EN/conf.py b/docs/EN/conf.py index a80d46810580..17498c177e5b 100644 --- a/docs/EN/conf.py +++ b/docs/EN/conf.py @@ -28,7 +28,6 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['../_static'] -html_js_files = ['end-of-life.js'] # A list of paths that contain extra templates (or templates that overwrite builtin/theme-specific templates). Relative paths # are taken as relative to the configuration directory. diff --git a/docs/_static/end-of-life.js b/docs/_static/end-of-life.js deleted file mode 100644 index ec18106e5f87..000000000000 --- a/docs/_static/end-of-life.js +++ /dev/null @@ -1,40 +0,0 @@ -document.addEventListener('DOMContentLoaded', async () => { - const status = document.getElementById('aaps-eol-status'); - if (!status) return; - - function showRows(id, rows) { - const container = document.getElementById(id); - const body = container.querySelector('tbody'); - for (const values of rows) { - const row = body.insertRow(); - for (const value of values) row.insertCell().textContent = value; - } - container.hidden = rows.length === 0; - } - - try { - const response = await fetch('https://raw.githubusercontent.com/nightscout/AndroidAPS/refs/heads/versions/definition.json'); - if (!response.ok) throw new Error(`HTTP ${response.status}`); - const data = await response.json(); - if (!Array.isArray(data)) throw new Error('Invalid version data'); - - const versions = data.filter(entry => - entry && typeof entry.version === 'string' && - typeof entry.endDate === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(entry.endDate) - ).sort((a, b) => b.version.localeCompare(a.version, undefined, { numeric: true })); - const android = data.filter(entry => - entry && Number.isInteger(entry.minAndroid) && Number.isInteger(entry.maxAndroid) - ).sort((a, b) => b.minAndroid - a.minAndroid); - if (!versions.length && !android.length) throw new Error('No version data'); - - showRows('aaps-eol-versions', versions.map(entry => [entry.version, entry.endDate])); - showRows('aaps-eol-android', android.map(entry => [ - entry.minAndroid === entry.maxAndroid - ? String(entry.minAndroid) : `${entry.minAndroid}–${entry.maxAndroid}`, - typeof entry.supported === 'string' && entry.supported ? entry.supported : 'None listed' - ])); - status.remove(); - } catch { - status.textContent = 'Could not load AAPS version data. Please try again later.'; - } -});