]> gitweb.stoutner.com Git - PrivacyCell.git/commitdiff
Bump target API to 33. https://redmine.stoutner.com/issues/890
authorSoren Stoutner <soren@stoutner.com>
Tue, 29 Nov 2022 00:09:33 +0000 (17:09 -0700)
committerSoren Stoutner <soren@stoutner.com>
Tue, 29 Nov 2022 00:09:33 +0000 (17:09 -0700)
45 files changed:
app/build.gradle
app/src/main/AndroidManifest.xml
app/src/main/assets/de/changelog.html
app/src/main/assets/de/licenses.html
app/src/main/assets/de/permissions.html
app/src/main/assets/en/changelog.html
app/src/main/assets/en/licenses.html
app/src/main/assets/en/permissions.html
app/src/main/assets/es/changelog.html
app/src/main/assets/es/licenses.html
app/src/main/assets/es/permissions.html
app/src/main/assets/fr/changelog.html
app/src/main/assets/fr/licenses.html
app/src/main/assets/fr/permissions.html
app/src/main/assets/images/notification_important_rounded_filled.svg [new file with mode: 0644]
app/src/main/assets/images/payments_rounded.svg
app/src/main/assets/it/changelog.html
app/src/main/assets/it/licenses.html
app/src/main/assets/it/permissions.html
app/src/main/assets/ru/changelog.html
app/src/main/assets/ru/licenses.html
app/src/main/assets/ru/permissions.html
app/src/main/java/com/stoutner/privacycell/activities/LogcatActivity.kt
app/src/main/java/com/stoutner/privacycell/activities/PrivacyCellActivity.kt
app/src/main/java/com/stoutner/privacycell/activities/ProtocolsActivity.kt
app/src/main/java/com/stoutner/privacycell/activities/SettingsActivity.kt
app/src/main/java/com/stoutner/privacycell/dialogs/NotificationPermissionDialog.kt [new file with mode: 0644]
app/src/main/java/com/stoutner/privacycell/dialogs/PhonePermissionDialog.kt
app/src/main/java/com/stoutner/privacycell/fragments/SettingsFragment.kt
app/src/main/java/com/stoutner/privacycell/helpers/ProtocolHelper.kt
app/src/main/java/com/stoutner/privacycell/services/RealtimeMonitoringService.kt
app/src/main/res/drawable/news.xml
app/src/main/res/drawable/notification_permission.xml [new file with mode: 0644]
app/src/main/res/layout/settings_bottom_appbar.xml
app/src/main/res/layout/settings_top_appbar.xml
app/src/main/res/values-de/strings.xml
app/src/main/res/values-es/strings.xml
app/src/main/res/values-fr/strings.xml
app/src/main/res/values-it/strings.xml
app/src/main/res/values-ru/strings.xml
app/src/main/res/values/strings.xml
app/src/main/res/xml/preferences.xml
build.gradle
fastlane/metadata/android/fr-FR/changelogs/10.txt [new file with mode: 0644]
gradle/wrapper/gradle-wrapper.properties

index c96e6cb7f9315bb3bd20b2e38eb628e48c2a2f7e..160ef730ed34285779b16ad50342944abc672102 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -23,12 +23,12 @@ plugins {
 }
 
 android {
-    compileSdk 32
+    compileSdk 33
 
     defaultConfig {
         applicationId "com.stoutner.privacycell"
         minSdk 30
-        targetSdk 32
+        targetSdk 33
         versionCode 10
         versionName "1.8.1"
     }
@@ -51,16 +51,17 @@ android {
 
 dependencies {
     // Include the following AndroidX libraries.
-    implementation 'androidx.appcompat:appcompat:1.4.2'
-    implementation 'androidx.core:core-ktx:1.8.0'
+    implementation 'androidx.appcompat:appcompat:1.5.1'
+    implementation 'androidx.core:core-ktx:1.9.0'
+    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
     implementation 'androidx.preference:preference-ktx:1.2.0'
     implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
-    implementation 'androidx.webkit:webkit:1.4.0'
+    implementation 'androidx.webkit:webkit:1.5.0'
     implementation 'androidx.work:work-runtime-ktx:2.7.1'
 
     // Include the Kotlin standard library.  This should be the same version number listed in the project build.gradle.
-    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10'
+    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20'
 
     // Include the Google material library.
-    implementation 'com.google.android.material:material:1.6.1'
-}
\ No newline at end of file
+    implementation 'com.google.android.material:material:1.7.0'
+}
index 3df75fd6d3e8d2fcca70b7bf9c1380bd41ae8e0c..f79605c1cd9c9d41031a31c980dad4b226e34b8e 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
     xmlns:tools="http://schemas.android.com/tools"
     android:installLocation="auto" >
 
-    <!-- Required to read cell network information. -->
+    <!-- Required to read cell network information.  <Dangerous permission> -->
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
-    <!-- Required to display a realtime notification icon. -->
+    <!-- Required to display a notification.  <Dangerous permission> -->
+    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
+
+    <!-- Required to run a foreground service (which is the only type of service that can display notifications). -->
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
     <!-- Required to start the realtime notification icon at boot. -->
             </intent-filter>
         </receiver>
     </application>
-</manifest>
\ No newline at end of file
+</manifest>
index 2144701eaa3de2e0e446de6aa5101270d4b9e91c..611653c4c84f0665481076d5d93aad4faa2db0e7 100644 (file)
@@ -29,8 +29,8 @@
     </head>
 
     <body>
-        <h3>1.8.1 (Version Code 10)</h3>
-        <p>8. August 2022 - Mindest-API 30, Ziel-API 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8-1/">1.8.1</a> (Version Code 10)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=ab7601a6d91b6035862bb47b1ac259855e3aba3b">8. August 2022</a> - Mindest-API 30, Ziel-API 32</p>
         <ul>
             <li>Fehler behoben, durch den nach Änderung der Netzwerk-Verbindung <a href="https://redmine.stoutner.com/issues/864">Benachrichtigungen wieder aktiviert</a> wurden.</li>
             <li><a href="https://redmine.stoutner.com/issues/884">Zweifarbig violetten Text</a> zum Nachtmodus (Theme) hinzugefügt.</li>
index bbc85872f4027d4629623ea481c7062f8a99a20d..a0143c889a77119d82ceee41d3de608b98f6fba3 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -30,7 +30,7 @@
 
     <body>
         <h3>Copyright</h3>
-        <p>Privacy Cell ist Copyright © 2021-2022 von <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <p>Privacy Cell ist Copyright 2021-2022 von <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
 
         <h3>Lizenz</h3>
         <p>Privacy Cell wird unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+-Lizenz</a> veröffentlicht. Den gesamten Text der Lizenz finden Sie unterhalb.
@@ -77,6 +77,7 @@
         <p><svg class="icon"><use href="../images/groups_filled.svg#icon"/></svg> groups_filled.</p>
         <p><svg class="icon"><use href="../images/list_alt_rounded.svg#icon"/></svg> list_alt_rounded.</p>
         <p><svg class="icon"><use href="../images/map_rounded.svg#icon"/></svg> map_rounded.</p>
+        <p><svg class="icon"><use href="../images/notification_important_rounded_filled.svg#icon"/></svg> notification_important_<wbr>rounded_filled.</p>
         <p><svg class="icon"><use href="../images/payments_rounded.svg#icon"/></svg> payments_rounded.</p>
         <p><svg class="icon"><use href="../images/phone_android_outlined.svg#icon"/></svg> phone_android_outlined.</p>
         <p><svg class="icon"><use href="../images/policy_filled.svg#icon"/></svg> policy_filled.</p>
@@ -1009,4 +1010,6 @@ ANY KIND, either express or
 implied. See the License for
 the specific language governing
 permissions and limitations
-under the License.</pre>
\ No newline at end of file
+under the License.</pre>
+    </body>
+</html>
index ddd1bbc70f4bc1a9e5898ffd5161efa884cf7744..8c137594e7eac60a96ae363a512d1a7f3a3867d8 100644 (file)
         <p>Privacy Cell verwendet folgende Berechtigungen:</p>
 
         <h3>Telefon-Status und Identität lesen</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission. READ_PHONE_STATE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission.<wbr>READ_PHONE_STATE</a></p>
         <p>Benötigt, um die vom Mobilfunk-Netzwerk genutzten Protokolle zu ermitteln.</p>
 
         <h3>Vordergrund-Service ausführen</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_SERVICE</a></p>
         <p>Erlaubt Privacy Cell, ein Benachrichtigungs-Icon für die Echtzeit-Überwachung in der Status-Zeile anzuzeigen.</p>
 
         <h3>Ausführung bei Systemstart</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission. RECEIVE_BOOT_COMPLETED</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_BOOT_COMPLETED</a></p>
         <p>Erlaubt Privacy Cell die Echtzeit-Überwachung zu aktivieren, wenn das Smartphone gebootet wird.</p>
     </body>
 </html>
\ No newline at end of file
index 358728bb18d98fb59d47c97f8a8eb8dca66ed427..8886d011daee4fd490877c72c705b0f08b54e8e1 100644 (file)
@@ -27,8 +27,8 @@
     </head>
 
     <body>
-        <h3>1.8.1 (version code 10)</h3>
-        <p>8 August 2022 - minimum API 30, target API 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8-1/">1.8.1</a> (version code 10)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=ab7601a6d91b6035862bb47b1ac259855e3aba3b">8 August 2022</a> - minimum API 30, target API 32</p>
         <ul>
             <li>Fix a bug that <a href="https://redmine.stoutner.com/issues/864">re-enabled notifications</a> when the network changed.</li>
             <li>Add <a href="https://redmine.stoutner.com/issues/884">dual-toned violet text</a> to the Night Theme.</li>
index a7f17438df9db5b23f2988d5d7addb7e40540ef2..70854bee7929614decfc9975549f4acabe579f45 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
@@ -28,7 +28,7 @@
 
     <body>
         <h3>Copyright</h3>
-        <p>Privacy Cell copyright © 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <p>Privacy Cell copyright 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
 
         <h3>License</h3>
         <p>Privacy Cell is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>. The full text of the license is below.
@@ -71,6 +71,7 @@
         <p><svg class="icon"><use href="../images/groups_filled.svg#icon"/></svg> groups_filled.</p>
         <p><svg class="icon"><use href="../images/list_alt_rounded.svg#icon"/></svg> list_alt_rounded.</p>
         <p><svg class="icon"><use href="../images/map_rounded.svg#icon"/></svg> map_rounded.</p>
+        <p><svg class="icon"><use href="../images/notification_important_rounded_filled.svg#icon"/></svg> notification_important_<wbr>rounded_filled.</p>
         <p><svg class="icon"><use href="../images/payments_rounded.svg#icon"/></svg> payments_rounded.</p>
         <p><svg class="icon"><use href="../images/phone_android_outlined.svg#icon"/></svg> phone_android_outlined.</p>
         <p><svg class="icon"><use href="../images/policy_filled.svg#icon"/></svg> policy_filled.</p>
@@ -1003,4 +1004,6 @@ ANY KIND, either express or
 implied. See the License for
 the specific language governing
 permissions and limitations
-under the License.</pre>
\ No newline at end of file
+under the License.</pre>
+    </body>
+</html>
index aa77ee31f73d37f6767a892ac7bb2acdb9385633..be792c7cc15057f5a99e3e2937923b5f9f815e6b 100644 (file)
         <p>Privacy Cell uses the following permissions.</p>
 
         <h3>Read phone status and identity</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission. READ_PHONE_STATE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission.<wbr>READ_PHONE_STATE</a></p>
         <p>Required to determine which protocols are being used by the cell phone network.</p>
 
         <h3>Run foreground service</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_SERVICE</a></p>
         <p>Allows Privacy Cell to display a realtime monitoring notification icon in the status bar.</p>
 
         <h3>Run at startup</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission. RECEIVE_BOOT_COMPLETED</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_BOOT_COMPLETED</a></p>
         <p>Allows Privacy Cell to enable the realtime monitoring service when the phone boots.</p>
     </body>
 </html>
\ No newline at end of file
index 77068a5babcc5fc384570d6f7814f9b41dcba4c4..9e3b1c45c3cfa6f32417390725edbf5bf1e3b190 100644 (file)
@@ -29,8 +29,8 @@
     </head>
 
     <body>
-        <h3>1.8.1 (versión del código 10)</h3>
-        <p>8 de agosto de 2022 - API mínimo 30, API objetivo 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8-1/">1.8.1</a> (versión del código 10)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=ab7601a6d91b6035862bb47b1ac259855e3aba3b">8 de agosto de 2022</a> - API mínimo 30, API objetivo 32</p>
         <ul>
             <li>Corregir un error que <a href="https://redmine.stoutner.com/issues/864">volvía a activar las notificaciones</a> cuando cambiaba la red.</li>
             <li>Añadir <a href="https://redmine.stoutner.com/issues/884">un texto violeta de doble tono</a>al Tema Nocturno.</li>
index 3a606fa1cef19fda5ab80ed611a27b118434ee81..fe4125fa365c8f4d86e55db36017d8d22786d4c6 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Jose A. León.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -30,7 +30,7 @@
 
     <body>
         <h3>Copyright</h3>
-        <p>Copyright de Privacy Cell © 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <p>Copyright de Privacy Cell 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
 
         <h3>Licencia</h3>
         <p>Privacy Cell se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>. El texto completo de la licencia se muestra abajo.
@@ -78,6 +78,7 @@
         <p><svg class="icon"><use href="../images/groups_filled.svg#icon"/></svg> groups_filled.</p>
         <p><svg class="icon"><use href="../images/list_alt_rounded.svg#icon"/></svg> list_alt_rounded.</p>
         <p><svg class="icon"><use href="../images/map_rounded.svg#icon"/></svg> map_rounded.</p>
+        <p><svg class="icon"><use href="../images/notification_important_rounded_filled.svg#icon"/></svg> notification_important_<wbr>rounded_filled.</p>
         <p><svg class="icon"><use href="../images/payments_rounded.svg#icon"/></svg> payments_rounded.</p>
         <p><svg class="icon"><use href="../images/phone_android_outlined.svg#icon"/></svg> phone_android_outlined.</p>
         <p><svg class="icon"><use href="../images/policy_filled.svg#icon"/></svg> policy_filled.</p>
@@ -1010,4 +1011,6 @@ ANY KIND, either express or
 implied. See the License for
 the specific language governing
 permissions and limitations
-under the License.</pre>
\ No newline at end of file
+under the License.</pre>
+    </body>
+</html>
index 83824ed717df9fceef6af1755047c51cb0105b3d..dd8000eb9041b9336404fc33f7277feae1a65d06 100644 (file)
         <p>Privacy Cell usa los siguientes permisos.</p>
 
         <h3>Leer el estado del teléfono e identidad</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission. READ_PHONE_STATE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission.<wbr>READ_PHONE_STATE</a></p>
         <p>Requerido para determinar qué protocolos se están usando por la red del teléfono celular.</p>
 
         <h3>Run foreground service</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_SERVICE</a></p>
         <p>Allows Privacy Cell to display a realtime monitoring notification icon in the status bar.</p>
 
         <h3>Run at startup</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission. RECEIVE_BOOT_COMPLETED</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_BOOT_COMPLETED</a></p>
         <p>Allows Privacy Cell to enable the realtime monitoring service when the phone boots.</p>
     </body>
 </html>
\ No newline at end of file
index ed22614d824c2eb1d5a38c43a2727524f497e7d6..2be404f606f027fe6ee6f2eb1de26471c31b2ed0 100644 (file)
     </head>
 
     <body>
-        <h3>1.8.1 (version de code 10)</h3>
-        <p>8 Août 2022 - API minimum 30, API cible 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8-1/">1.8.1</a> (version du code 10)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=ab7601a6d91b6035862bb47b1ac259855e3aba3b">8 Août 2022</a> - API minimale : 30, API optimale : 32</p>
         <ul>
-            <li>Fix a bug that <a href="https://redmine.stoutner.com/issues/864">re-enabled notifications</a> when the network changed.</li>
-            <li>Add <a href="https://redmine.stoutner.com/issues/884">dual-toned violet text</a> to the Night Theme.</li>
+            <li>Correction d'un bug qui <a href="https://redmine.stoutner.com/issues/864">réactivait les notifications</a> lorsque le réseau changeait.</li>
+            <li>Ajout <a href="https://redmine.stoutner.com/issues/884">d'un texte violet à deux tons</a> sur le thème de Nuit.</li>
             <li>Mise à jour de la traduction française par <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (version de code 9)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14 Juin 2022</a> - API minimum 30, API cible 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (version du code 9)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14 Juin 2022</a> - API minimale : 30, API optimale : 32</p>
         <ul>
             <li>Inclure l'état <a href="https://redmine.stoutner.com/issues/851">du réseau voix</a> dans la détermination de la sécurité globale du réseau cellulaire.</li>
             <li>Correction d'un bogue <a href="https://redmine.stoutner.com/issues/850">qui empêchait parfois la désactivation des notifications</a>.</li>
             <li>Mise à jour de la traduction française par <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (version de code 8)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24 Mars 2022</a> - API minimum 30, API cible 31</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (version du code 8)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24 Mars 2022</a> - API minimale : 30, API optimale : 31</p>
         <ul>
             <li>Ajout d'un ajout d'un avertissement lors de la connexion à <a href="https://redmine.stoutner.com/issues/795">des réseaux anciens et peu sûrs</a>.</li>
             <li>Ajout d'une <a href="https://redmine.stoutner.com/issues/774">entrée listant l'ensemble des protocoles</a>.</li>
             <li>Mise à jour de la traduction française par <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-6/">1.6</a> (version de code 7)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=2be052aa618f414a18d73f5075b3b3776180bee5">21 Décembre 2021</a> - API minimum 30, API cible 31</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-6/">1.6</a> (version du code 7)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=2be052aa618f414a18d73f5075b3b3776180bee5">21 Décembre 2021</a> - API minimale : 30, API optimale : 31</p>
         <ul>
             <li>Suppression des permissions inutiles ajoutées <a href="https://redmine.stoutner.com/issues/775">androidx.work</a>.</li>
             <li>Correction du service de notification ne pouvant pas <a href="https://redmine.stoutner.com/issues/777">se redémarrer en arrière-plan</a> sur Android 12.</li>
             <li>Première traduction complète en russe.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-5/">1.5</a> (version de code 6)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=6ee1470b74f7643f50bf7f1ebfdb578dcac829f2">3 Novembre 2021</a> - API minimum 30, API cible 31</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-5/">1.5</a> (version du code 6)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=6ee1470b74f7643f50bf7f1ebfdb578dcac829f2">3 Novembre 2021</a> - API minimale : 30, API optimale : 31</p>
         <ul>
             <li>Correction d'un <a href="https://redmine.stoutner.com/issues/771">plantage avec la supervision temps-réel </a> si la permission READ_PHONE_STATE était désactivée.</li>
             <li>Page de <a href="https://redmine.stoutner.com/issues/772">l'API cible à 31</a> (Android 12).</li>
             <li>Première traduction française complète effectuée par <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-4/">1.4</a> (version de code 5)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=a1d76c6e3ed465dd14385c5a37416ee30922021f">18 Octobre 2021</a> - API minimum 30, API cible 30.</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-4/">1.4</a> (version du code 5)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=a1d76c6e3ed465dd14385c5a37416ee30922021f">18 Octobre 2021</a> - API minimale : 30, API optimale : 30.</p>
         <ul>
             <li>Correction de problèmes <a href="https://redmine.stoutner.com/issues/764">de plantage du monitoring en temps réel</a> ou
                 <a href="https://redmine.stoutner.com/issues/763">lorsque le mauvais son est joué</a>.</li>
             <li>Première traduction italienne intégrale réalisée par Francesco Buratti.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-3/">1.3</a> (version de code 4)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=0611c698c5c7163dbe84e4d592fb3bf6150ab1a2">29 Septembre 2021</a> – API minimum 30, API cible 30.</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-3/">1.3</a> (version du code 4)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=0611c698c5c7163dbe84e4d592fb3bf6150ab1a2">29 Septembre 2021</a> – API minimale : 30, API optimale : 30.</p>
         <ul>
             <li>Ajout d'une <a href="https://redmine.stoutner.com/issues/750">option de vérification en temps réel</a>.</li>
             <li>Traduction française mise à jour par <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-2/">1.2</a> (version de code 3)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=70a8bdb781941d9f433b18a91befe03137d65a6f">15 Septembre 2021</a> - API minimum 30, API cible 30.</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-2/">1.2</a> (version du code 3)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=70a8bdb781941d9f433b18a91befe03137d65a6f">15 Septembre 2021</a> - API minimale : 30, API optimale : 30.</p>
         <ul>
             <li>Ajout d'une option permettant d'utiliser un <a href="https://redmine.stoutner.com/issues/749">barre d'application inférieure</a>.</li>
             <li>Traduction française partielle réalisée par <a href="mailto:kevinliste@framalistes.org">Kévin L</a>.</li>
             <li>Traduction italienne partielle réalisée par Francesco Buratti.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-1/">1.1</a> (version de code 2)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=62586b5aaccbfa0fa265040513f3984264bd0379">30 Août 2021</a> - API minimum 30, API cible 30.</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-1/">1.1</a> (version du code 2)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=62586b5aaccbfa0fa265040513f3984264bd0379">30 Août 2021</a> - API minimale : 30, API optimale : 30.</p>
         <ul>
             <li>Ajout <a href="https://redmine.stoutner.com/issues/756">de menus d'information</a> pour les types de réseaux.</li>
             <li>Traduction espagnole partielle réalisée par Jose A. León.</li>
         </ul>
 
-        <h3><a href="https://www.stoutner.com/privacy-cell-1-0/">1.0</a> (version de code 1)</h3>
-        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=13c6fd95ce6986c052fed7918576b77619dc9c2a">25 Août 2021</a> - API minimum 30, API cible 30.</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-0/">1.0</a> (version du code 1)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=13c6fd95ce6986c052fed7918576b77619dc9c2a">25 Août 2021</a> - API minimale : 30, API optimale : 30.</p>
         <ul>
             <li>Version initiale.</li>
         </ul>
index ddf7b8642aca6f9b09918c4c482ad5285ce3c2b4..cd091d94fe8243060b4d3af51801012363d3309f 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Kévin L. <kevinliste@framalistes.org>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -30,7 +30,7 @@
 
     <body>
         <h3>Copyright</h3>
-        <p>Privacy Cell copyright © 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <p>Privacy Cell copyright 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
 
         <h3>Licence</h3>
         <p>Privacy Cell est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>. Le texte intégral de la licence se trouve ci-dessous.
@@ -78,6 +78,7 @@
         <p><svg class="icon"><use href="../images/groups_filled.svg#icon"/></svg> groups_filled.</p>
         <p><svg class="icon"><use href="../images/list_alt_rounded.svg#icon"/></svg> list_alt_rounded.</p>
         <p><svg class="icon"><use href="../images/map_rounded.svg#icon"/></svg> map_rounded.</p>
+        <p><svg class="icon"><use href="../images/notification_important_rounded_filled.svg#icon"/></svg> notification_important_<wbr>rounded_filled.</p>
         <p><svg class="icon"><use href="../images/payments_rounded.svg#icon"/></svg> payments_rounded.</p>
         <p><svg class="icon"><use href="../images/phone_android_outlined.svg#icon"/></svg> phone_android_outlined.</p>
         <p><svg class="icon"><use href="../images/policy_filled.svg#icon"/></svg> policy_filled.</p>
@@ -1010,4 +1011,6 @@ ANY KIND, either express or
 implied. See the License for
 the specific language governing
 permissions and limitations
-under the License.</pre>
\ No newline at end of file
+under the License.</pre>
+    </body>
+</html>
index 9353e50b20a1e8f7b78ce602d75a6f05ac1ac56d..04e1c79fb7da7b888ab995d7a0acde603b15c937 100644 (file)
         <p>Privacy Cell utilise l'autorisation suivante.</p>
 
         <h3>Lecture du statut et de l'identité du téléphone</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission. READ_PHONE_STATE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission.<wbr>READ_PHONE_STATE</a></p>
         <p>Nécessaire pour déterminer quels protocoles sont utilisés par le réseau de téléphonie mobile.</p>
 
         <h3>Exécuter un service en premier plan</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_SERVICE</a></p>
         <p>Permet à Privacy Cell d'afficher une icône de notification de surveillance en temps réel dans la barre d'état.</p>
 
         <h3>Exécution au démarrage</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission. RECEIVE_BOOT_COMPLETED</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_BOOT_COMPLETED</a></p>
         <p>Permet à Privacy Cell d'activer le service de surveillance en temps réel lorsque le téléphone démarre.</p>
     </body>
 </html>
\ No newline at end of file
diff --git a/app/src/main/assets/images/notification_important_rounded_filled.svg b/app/src/main/assets/images/notification_important_rounded_filled.svg
new file mode 100644 (file)
index 0000000..202926a
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!--
+  This file is a modified version of `notification_importang_rounded_filled`, which is part of the Android Material icon set and is released under the Apache License 2.0.
+
+  Changes copyright 2022 Soren Stoutner <soren@stoutner.com>.  The resulting file is released under the GPLv3+ license.
+
+  This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
+
+  Privacy Cell is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  Privacy Cell is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with Privacy Cell.  If not, see <http://www.gnu.org/licenses/>. -->
+
+<svg
+    xmlns="http://www.w3.org/2000/svg"
+    viewBox="0 0 48 48"
+    id="icon">
+
+    <path
+        d="M24 26.6q.65 0 1.075-.425.425-.425.425-1.075v-7.6q0-.65-.425-1.075Q24.65 16 24 16q-.65 0-1.075.425-.425.425-.425 1.075v7.6q0 .65.425 1.075.425.425 1.075.425Zm0 5.4q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 28.7 24 28.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 32 24 32ZM9.5 38q-.65 0-1.075-.425Q8 37.15 8 36.5q0-.65.425-1.075Q8.85 35 9.5 35h2.7V19.7q0-4.1 2.475-7.425T21.2 8.1V6.65q0-1.15.825-1.9T24 4q1.15 0 1.975.75.825.75.825 1.9V8.1q4.05.85 6.55 4.175 2.5 3.325 2.5 7.425V35h2.65q.65 0 1.075.425Q40 35.85 40 36.5q0 .65-.425 1.075Q39.15 38 38.5 38ZM24 44q-1.6 0-2.8-1.175Q20 41.65 20 40h8q0 1.65-1.175 2.825Q25.65 44 24 44Z" />
+</svg>
index 8a9b2b67011999fb23379516b5ebc1f956020723..7d707ee076bf7e2e4f1a0a8bd686d74c782b54e0 100644 (file)
@@ -3,7 +3,7 @@
 <!--
   This file is a modified version of `payments_rounded`, which is part of the Android Material icon set and is released under the Apache License 2.0.
 
-  Changes copyright © 2021 Soren Stoutner <soren@stoutner.com>.  The resulting file is released under the GPLv3+ license.
+  Changes copyright 2021 Soren Stoutner <soren@stoutner.com>.  The resulting file is released under the GPLv3+ license.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
@@ -27,4 +27,4 @@
 
     <path
         d="M23,8v10c0,1.1-0.9,2-2,2H5c-0.55,0-1-0.45-1-1c0-0.55,0.45-1,1-1h16V8c0-0.55,0.45-1,1-1S23,7.45,23,8z M4,16 c-1.66,0-3-1.34-3-3V7c0-1.66,1.34-3,3-3h12c1.66,0,3,1.34,3,3v7c0,1.1-0.9,2-2,2H4z M7,10c0,1.66,1.34,3,3,3s3-1.34,3-3 s-1.34-3-3-3S7,8.34,7,10z" />
-</svg>
\ No newline at end of file
+</svg>
index a0aaf75077ee50897fb6ce6ddc30d7e346dd8db5..55e406f885563a20a51da8e4d572d4ba58830d1a 100644 (file)
@@ -29,8 +29,8 @@
     </head>
 
     <body>
-        <h3>1.8.1 (versione codice 10)</h3>
-        <p>8 Agosto 2022 -  minima API 30, target API 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8-1/">1.8.1</a> (versione codice 10)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=ab7601a6d91b6035862bb47b1ac259855e3aba3b">8 Agosto 2022</a> -  minima API 30, target API 32</p>
         <ul>
             <li>Correzione di un baco che <a href="https://redmine.stoutner.com/issues/864">riabilitava le notifiche</a> quando la rete cambiava.</li>
             <li>Aggiunta di <a href="https://redmine.stoutner.com/issues/884">un testo con doppio tono di viola</a> al tema scuro.</li>
index 4ac32f11c882fcd394b02224329346ddd35b9033..13233640d8bb05a9a0a2fc01e00bbc84209992fa 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
@@ -30,7 +30,7 @@
 
     <body>
         <h3>Copyright</h3>
-        <p>Privacy Cell copyright © 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <p>Privacy Cell copyright 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
 
         <h3>Licenza</h3>
         <p>Privacy Cell è rilasciato con <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>. Il testo completo è riportato di seguito.
@@ -74,6 +74,7 @@
         <p><svg class="icon"><use href="../images/groups_filled.svg#icon"/></svg> groups_filled.</p>
         <p><svg class="icon"><use href="../images/list_alt_rounded.svg#icon"/></svg> list_alt_rounded.</p>
         <p><svg class="icon"><use href="../images/map_rounded.svg#icon"/></svg> map_rounded.</p>
+        <p><svg class="icon"><use href="../images/notification_important_rounded_filled.svg#icon"/></svg> notification_important_<wbr>rounded_filled.</p>
         <p><svg class="icon"><use href="../images/payments_rounded.svg#icon"/></svg> payments_rounded.</p>
         <p><svg class="icon"><use href="../images/phone_android_outlined.svg#icon"/></svg> phone_android_outlined.</p>
         <p><svg class="icon"><use href="../images/policy_filled.svg#icon"/></svg> policy_filled.</p>
@@ -1006,4 +1007,6 @@ ANY KIND, either express or
 implied. See the License for
 the specific language governing
 permissions and limitations
-under the License.</pre>
\ No newline at end of file
+under the License.</pre>
+    </body>
+</html>
index f904133b25e40d0697a5acf260bb284e979fbf5b..5062c6a3d26b23164d860f5c4d5e3d2e26191dfe 100644 (file)
         <p>Privacy Cell richiede le seguenti autorizzazioni.</p>
 
         <h3>Lettura dello stato e dell'identità del telefono</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission. READ_PHONE_STATE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission.<wbr>READ_PHONE_STATE</a></p>
         <p>Richiesta per determinare i protocolli utilizzati dalla rete.</p>
 
         <h3>Run foreground service</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_SERVICE</a></p>
         <p>Allows Privacy Cell to display a realtime monitoring notification icon in the status bar.</p>
 
         <h3>Run at startup</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission. RECEIVE_BOOT_COMPLETED</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_BOOT_COMPLETED</a></p>
         <p>Allows Privacy Cell to enable the realtime monitoring service when the phone boots.</p>
     </body>
 </html>
\ No newline at end of file
index 2ed8acd0e5d8cb4d0e92b53cd8d08fa68e40c9c2..03d6c7c7ddac952ac3f73e8faec6028e39feea2a 100644 (file)
@@ -27,8 +27,8 @@
     </head>
 
     <body>
-        <h3>1.8.1 (код версии 10)</h3>
-        <p>8 августа 2022 года - минимальный API 30, целевой API 32</p>
+        <h3><a href="https://www.stoutner.com/privacy-cell-1-8-1/">1.8.1</a> (код версии 10)</h3>
+        <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=ab7601a6d91b6035862bb47b1ac259855e3aba3b">8 августа 2022 года</a> - минимальный API 30, целевой API 32</p>
         <ul>
             <li>Исправлена ошибка, <a href="https://redmine.stoutner.com/issues/864">из-за которой при изменении сети</a> повторно включались уведомления.</li>
             <li>Для ночной темы <a href="https://redmine.stoutner.com/issues/884">добавлен двухтоновый фиолетовый текст</a>.</li>
index a45c0e73b190da8317fc11423b4982ac257bb3a5..6a989f5250a1d783a42d531825210ff2e5afcaaf 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
@@ -28,7 +28,7 @@
 
     <body>
         <h3>Авторские права</h3>
-        <p>Авторские права Privacy Cell © 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+        <p>Авторские права Privacy Cell 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
 
         <h3>Лицензия</h3>
         <p>Privacy Cell выпускается под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>. Полный текст лицензии приведен ниже.
@@ -72,6 +72,7 @@
         <p><svg class="icon"><use href="../images/groups_filled.svg#icon"/></svg> groups_filled.</p>
         <p><svg class="icon"><use href="../images/list_alt_rounded.svg#icon"/></svg> list_alt_rounded.</p>
         <p><svg class="icon"><use href="../images/map_rounded.svg#icon"/></svg> map_rounded.</p>
+        <p><svg class="icon"><use href="../images/notification_important_rounded_filled.svg#icon"/></svg> notification_important_<wbr>rounded_filled.</p>
         <p><svg class="icon"><use href="../images/payments_rounded.svg#icon"/></svg> payments_rounded.</p>
         <p><svg class="icon"><use href="../images/phone_android_outlined.svg#icon"/></svg> phone_android_outlined.</p>
         <p><svg class="icon"><use href="../images/policy_filled.svg#icon"/></svg> policy_filled.</p>
@@ -1004,4 +1005,6 @@ ANY KIND, either express or
 implied. See the License for
 the specific language governing
 permissions and limitations
-under the License.</pre>
\ No newline at end of file
+under the License.</pre>
+    </body>
+</html>
index 13da9bf58e28245df00b8bd45a4031b2a700ed1e..8c84905142f45a8eeaeefd8fd1762109a3cb186a 100644 (file)
         <p>Privacy Cell использует следующие разрешения:</p>
 
         <h3>Чтение статуса и идентификатора телефона</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission. READ_PHONE_STATE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE">android.permission.<wbr>READ_PHONE_STATE</a></p>
         <p>Необходим для определения используемых протоколов в сети сотовой связи.</p>
 
         <h3>Запуск фоновой службы</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_SERVICE</a></p>
         <p>Разрешает Privacy Cell отображать значок уведомления о мониторинге в реальном времени в строке состояния.</p>
 
         <h3>Запуск при загрузке</h3>
-        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission. RECEIVE_BOOT_COMPLETED</a></p>
+        <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_BOOT_COMPLETED</a></p>
         <p>Разрешает Privacy Cell включать службу мониторинга в реальном времени при загрузке телефона.</p>
     </body>
 </html>
\ No newline at end of file
index ca396c233c010dadecc5d8721b9eee28b3982a03..e7ba180168a2c39cc54715aef9197f393e31c9cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -40,6 +40,11 @@ import com.google.android.material.snackbar.Snackbar
 
 import com.stoutner.privacycell.R
 
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
 import java.io.BufferedReader
 import java.io.IOException
 import java.io.InputStreamReader
@@ -59,7 +64,7 @@ class LogcatActivity : AppCompatActivity() {
     private lateinit var logcatTextView: TextView
 
     // Define the save logcat activity result launcher.  It must be defined before `onCreate()` is run or the app will crash.
-    private val saveLogcatActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument()) { fileNameUri: Uri? ->
+    private val saveLogcatActivityResultLauncher = registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { fileNameUri: Uri? ->
         // Only save the file if the URI is not null, which happens if the user exited the file picker by pressing back.
         if (fileNameUri != null) {
             try {
@@ -69,11 +74,16 @@ class LogcatActivity : AppCompatActivity() {
                 // Open an output stream.
                 val outputStream = contentResolver.openOutputStream(fileNameUri)!!
 
-                // Write the logcat string to the output stream.
-                outputStream.write(logcatString.toByteArray(StandardCharsets.UTF_8))
+                // Save the logcat using a coroutine with Dispatchers.IO.
+                CoroutineScope(Dispatchers.Main).launch {
+                    withContext(Dispatchers.IO) {
+                        // Write the logcat string to the output stream.
+                        outputStream.write(logcatString.toByteArray(StandardCharsets.UTF_8))
 
-                // Close the output stream.
-                outputStream.close()
+                        // Close the output stream.
+                        outputStream.close()
+                    }
+                }
 
                 // Get a cursor from the content resolver.
                 val contentResolverCursor = contentResolver.query(fileNameUri, null, null, null)!!
@@ -260,4 +270,4 @@ class LogcatActivity : AppCompatActivity() {
         // Stop the swipe to refresh animation if it is displayed.
         swipeRefreshLayout.isRefreshing = false
     }
-}
\ No newline at end of file
+}
index b158e057db725a5dc2eaf778a32ad9d5081b0320..dcdd6a3a0fb882554a66561ad2fe8ea6b29b45a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -54,11 +54,12 @@ import com.google.android.material.navigation.NavigationView
 
 import com.stoutner.privacycell.R
 import com.stoutner.privacycell.dialogs.PhonePermissionDialog
+import com.stoutner.privacycell.dialogs.PhonePermissionDialog.StoragePermissionDialogListener
 import com.stoutner.privacycell.dialogs.WebViewDialog
 import com.stoutner.privacycell.helpers.ProtocolHelper
 import com.stoutner.privacycell.services.RealtimeMonitoringService
 
-class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener, PhonePermissionDialog.StoragePermissionDialogListener {
+class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener, StoragePermissionDialogListener {
     // Define the class variables.
     private var voiceNetworkSecurityStatus = ProtocolHelper.UNPOPULATED
     private var dataNetworkSecurityStatus = ProtocolHelper.UNPOPULATED
@@ -73,6 +74,12 @@ class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItem
     private lateinit var overallStatusImageView: ImageView
     private lateinit var overallStatusTextView: TextView
 
+    companion object {
+        // Define the public constants.
+        const val PHONE_PERMISSION_REQUEST_CODE = 0
+        const val NOTIFICATION_PERMISSION_REQUEST_CODE = 1
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         // Run the default commands.
         super.onCreate(savedInstanceState)
@@ -333,7 +340,7 @@ class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItem
         } else {  // The phone permission has not been granted.
             // Check if the user has previously denied the storage permission.
             if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)) {  // Show a dialog explaining the request first.
-                // Check to see if a phone permission dialog is already displayed.  This happens if the app is restarted when the dialog is shown.
+                // Check to see if a phone permission dialog is already displayed.  This happens if the app is restarted while the dialog is shown.
                 if (supportFragmentManager.findFragmentByTag(getString(R.string.phone_permission)) == null) {  // No dialog is currently shown.
                     // Instantiate the phone permission dialog fragment.
                     val phonePermissionDialogFragment = PhonePermissionDialog()
@@ -342,8 +349,8 @@ class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItem
                     phonePermissionDialogFragment.show(supportFragmentManager, getString(R.string.phone_permission))
                 }
             } else {  // Show the permission request directly.
-                // Request the read phone state permission.  There is only one permission request in the app, so it has a request code of 0.
-                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), 0)
+                // Request the read phone state permission.
+                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), PHONE_PERMISSION_REQUEST_CODE)
             }
         }
     }
@@ -490,16 +497,16 @@ class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItem
     }
 
     override fun onCloseStoragePermissionDialog() {
-        // Request the read phone state permission.  There is only one permission request in the app, so it has a request code of 0.
-        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), 0)
+        // Request the read phone state permission.
+        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), PHONE_PERMISSION_REQUEST_CODE)
     }
 
     override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
         // Run the default commands.
         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
 
-        //Only process the results if they exist (this method is triggered when a dialog is presented the first time for an app, but no grant results are included).
-        if (grantResults.isNotEmpty()) {
+        // Only process the results if they exist (this method is triggered when a dialog is presented the first time for an app, but no grant results are included) and the result is for the phone permission.
+        if (grantResults.isNotEmpty() && (requestCode == PHONE_PERMISSION_REQUEST_CODE)) {
             // Check to see if the read phone state permission was granted.  If the dialog was canceled the grant results will be empty.
             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  // The read phone state permission was granted.
                 // Populate Privacy Cell.
@@ -571,4 +578,4 @@ class PrivacyCellActivity : AppCompatActivity(), NavigationView.OnNavigationItem
             stingrayDialogFragment.show(supportFragmentManager, getString(R.string.stingrays))
         }
     }
-}
\ No newline at end of file
+}
index 8a5912ffa9c396c0a41ae39020d68f29ae4706c6..d27d57adad776980dbe00651df68f974fa2bec48 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -144,4 +144,4 @@ class ProtocolsActivity : AppCompatActivity() {
             }?.show(supportFragmentManager, getString(R.string.protocols))
         }
     }
-}
\ No newline at end of file
+}
index 279d836cfd82d7c3fa5fa92b18e24fc643225f5d..098f45f8c54d8940429dc739e85a1ccb563aa844 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
 
 package com.stoutner.privacycell.activities
 
+import android.Manifest
+import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Build
 import android.os.Bundle
 import android.view.MenuItem
 
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.widget.Toolbar
+import androidx.core.app.ActivityCompat
 import androidx.preference.PreferenceManager
 
 import com.stoutner.privacycell.R
+import com.stoutner.privacycell.dialogs.NotificationPermissionDialog.NotificationPermissionDialogListener
 import com.stoutner.privacycell.fragments.SettingsFragment
+import com.stoutner.privacycell.services.RealtimeMonitoringService
 
-class SettingsActivity : AppCompatActivity() {
+class SettingsActivity : AppCompatActivity(), NotificationPermissionDialogListener {
     override fun onCreate(savedInstanceState: Bundle?) {
         // Run the default commands.
         super.onCreate(savedInstanceState)
@@ -63,6 +70,13 @@ class SettingsActivity : AppCompatActivity() {
         supportFragmentManager.beginTransaction().replace(R.id.preferences_framelayout, SettingsFragment()).commit()
     }
 
+    override fun onCloseNotificationPermissionDialog() {
+        // Request the post notifications permission if the API >= 33.
+        if (Build.VERSION.SDK_INT >= 33) {
+            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), PrivacyCellActivity.NOTIFICATION_PERMISSION_REQUEST_CODE)
+        }
+    }
+
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
         // As there is only one option, go back.
         onBackPressed()
@@ -70,4 +84,19 @@ class SettingsActivity : AppCompatActivity() {
         // Consume the event.
         return true
     }
-}
\ No newline at end of file
+
+    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
+        // Run the default commands.
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+
+        // Only process the results if they exist (this method is triggered when a dialog is presented the first time for an app, but no grant results are included)
+        // and the result is for the notification permission.
+        if (grantResults.isNotEmpty() && (requestCode == PrivacyCellActivity.NOTIFICATION_PERMISSION_REQUEST_CODE)) {
+            // Check to see if the notification permission was granted.  If the dialog was canceled the grant result will be empty.
+            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {  // The notification permission was granted.
+                // Start the realtime monitoring service.
+                startService(Intent(this, RealtimeMonitoringService::class.java))
+            }
+        }
+    }
+}
diff --git a/app/src/main/java/com/stoutner/privacycell/dialogs/NotificationPermissionDialog.kt b/app/src/main/java/com/stoutner/privacycell/dialogs/NotificationPermissionDialog.kt
new file mode 100644 (file)
index 0000000..9989945
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ *
+ * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
+ *
+ * Privacy Cell is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Privacy Cell is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Privacy Cell.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.stoutner.privacycell.dialogs
+
+import android.app.Dialog
+import android.content.Context
+import android.content.DialogInterface
+import android.os.Bundle
+
+import androidx.appcompat.app.AlertDialog
+import androidx.fragment.app.DialogFragment
+
+import com.stoutner.privacycell.R
+
+class NotificationPermissionDialog : DialogFragment() {
+    // Declare the listener.
+    private lateinit var notificationPermissionDialogListener: NotificationPermissionDialogListener
+
+    // The public interface is used to send information back to the parent activity.
+    interface NotificationPermissionDialogListener {
+        fun onCloseNotificationPermissionDialog()
+    }
+
+    override fun onAttach(context: Context) {
+        // Run the default commands.
+        super.onAttach(context)
+
+        // Get a handle for the listener from the launching context.
+        notificationPermissionDialogListener = context as NotificationPermissionDialogListener
+    }
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        // Use a builder to create the alert dialog.
+        val dialogBuilder = AlertDialog.Builder(requireContext(), R.style.Theme_PrivacyCellAlertDialog)
+
+        // Set the icon.
+        dialogBuilder.setIcon(R.drawable.notification_permission)
+
+        // Set the title.
+        dialogBuilder.setTitle(R.string.notification_permission)
+
+        // Set the text.
+        dialogBuilder.setMessage(R.string.notification_permission_text)
+
+        // Set the close button listener.
+        dialogBuilder.setNegativeButton(R.string.ok) { _: DialogInterface, _: Int ->
+            // Call the notification permission dialog listener.
+            notificationPermissionDialogListener.onCloseNotificationPermissionDialog()
+        }
+
+        // Return the alert dialog.
+        return dialogBuilder.create()
+    }
+}
index a792114db6860d64ff3fcfdbdda9e3fb411c7be0..745c7a7bbbef81c74ed25cf1563473680fd3fad8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -68,4 +68,4 @@ class PhonePermissionDialog : DialogFragment() {
         // Return the alert dialog.
         return dialogBuilder.create()
     }
-}
\ No newline at end of file
+}
index 20dfb37be3cdbb74e847fabe05125ba0b4546569..b5acce90fb45e06283ca471915c044a74f364b9f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -22,7 +22,9 @@ package com.stoutner.privacycell.fragments
 import android.Manifest
 import android.content.Intent
 import android.content.SharedPreferences
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener
 import android.content.pm.PackageManager
+import android.os.Build
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
@@ -34,11 +36,13 @@ import androidx.preference.PreferenceFragmentCompat
 import androidx.work.WorkManager
 
 import com.stoutner.privacycell.R
+import com.stoutner.privacycell.activities.PrivacyCellActivity
+import com.stoutner.privacycell.dialogs.NotificationPermissionDialog
 import com.stoutner.privacycell.services.RealtimeMonitoringService
 
 class SettingsFragment : PreferenceFragmentCompat() {
     // Declare the class variables.
-    private lateinit var sharedPreferenceChangeListener: SharedPreferences.OnSharedPreferenceChangeListener
+    private lateinit var sharedPreferenceChangeListener: OnSharedPreferenceChangeListener
 
     // Declare the class views.
     private lateinit var realtimeMonitoringPreference: Preference
@@ -153,9 +157,9 @@ class SettingsFragment : PreferenceFragmentCompat() {
         sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener)
     }
 
-    private fun getSharedPreferenceChangeListener(): SharedPreferences.OnSharedPreferenceChangeListener {
+    private fun getSharedPreferenceChangeListener(): OnSharedPreferenceChangeListener {
         // Return the shared preference change listener.
-        return SharedPreferences.OnSharedPreferenceChangeListener {sharedPreferences, key ->
+        return OnSharedPreferenceChangeListener { sharedPreferences: SharedPreferences, key: String? ->
             when (key) {
                 getString(R.string.realtime_monitoring_key) -> {
                     // Update the icon.
@@ -175,8 +179,32 @@ class SettingsFragment : PreferenceFragmentCompat() {
 
                     // Start or stop the service.
                     if (sharedPreferences.getBoolean(getString(R.string.realtime_monitoring_key), false)) {  // Realtime monitoring has been enabled.
-                        // Start the realtime monitoring service.
-                        requireActivity().startService(Intent(context, RealtimeMonitoringService::class.java))
+                        // Start the service according to the API.
+                        if (Build.VERSION.SDK_INT >= 33) {  // The device API is >= 33.
+                            // Check to see if the post notification has been granted.
+                            if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {  // The permission has been granted.
+                                // Start the realtime monitoring service.
+                                requireActivity().startService(Intent(context, RealtimeMonitoringService::class.java))
+                            } else {  // The post notification permission has not been granted.
+                                // Check if the user has previously denied the post notifications permission.
+                                if (ActivityCompat.shouldShowRequestPermissionRationale(requireActivity(), Manifest.permission.POST_NOTIFICATIONS)) {  // Show a dialog explaining the request first.
+                                    // Check to see if a notification permission dialog is already displayed.  This happens if the app is restarted while the dialog is shown.
+                                    if (requireActivity().supportFragmentManager.findFragmentByTag(getString(R.string.notification_permission)) == null) {  // No dialog is currently shown.
+                                        // Instantiate the notification permission dialog fragment.
+                                        val notificationPermissionDialogFragment = NotificationPermissionDialog()
+
+                                        // Show the notification permission alert dialog.  The permission will be requested when the dialog is closed.
+                                        notificationPermissionDialogFragment.show(requireActivity().supportFragmentManager, getString(R.string.notification_permission))
+                                    }
+                                } else {  // Show the permission request directly.
+                                    // Request the post notifications permission directly.
+                                    ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.POST_NOTIFICATIONS), PrivacyCellActivity.NOTIFICATION_PERMISSION_REQUEST_CODE)
+                                }
+                            }
+                        } else {   // The device API is < 33.
+                            // Start the realtime monitoring service.
+                            requireActivity().startService(Intent(context, RealtimeMonitoringService::class.java))
+                        }
                     } else {  // Realtime monitoring has been disabled.
                         // Stop the realtime monitoring service.
                         requireActivity().stopService(Intent(context, RealtimeMonitoringService::class.java))
@@ -232,4 +260,4 @@ class SettingsFragment : PreferenceFragmentCompat() {
         // Restart the activity after 400 milliseconds, so that the app has enough time to save the change to the preference.
         restartHandler.postDelayed(restartRunnable, 400)
     }
-}
\ No newline at end of file
+}
index dcbc9adc71b1972cabfc3c6747e715287fe5c973..11407f7517d0e9e87941876f5597c0c20b8ec50d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -69,17 +69,17 @@ class ProtocolHelper {
     }
 
     fun checkAdditionalNetworkInfo(additionalNetworkInfoType: Int): Int {
-        if ((additionalNetworkInfoType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) ||
-            (additionalNetworkInfoType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED)) {
+        return if ((additionalNetworkInfoType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) ||
+                   (additionalNetworkInfoType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED)) {
             // The additional network info is secure.
-            return SECURE
+            SECURE
         } else {
             // The additional network info is insecure.
             // TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA
             // TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO
             // TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA
             // TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -- Can be removed once the minimum API >= 31.
-            return INSECURE
+            INSECURE
         }
     }
 
@@ -112,14 +112,16 @@ class ProtocolHelper {
 
     fun getAdditionalNetworkInfoStringArray(overrideNetworkType: Int, context: Context) : Array<String> {
         // Return the string array that corresponds to the override network type.
+        @Suppress("DEPRECATION")  // OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE can be removed once the minimum API >= 31.
         return when(overrideNetworkType) {
             TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE -> arrayOf(context.getString(R.string.none), "")
             TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA -> arrayOf(context.getString(R.string.lte_ca), context.getString(R.string.lte_ca_detail))
             TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> arrayOf(context.getString(R.string.lte_advanced_pro), context.getString(R.string.lte_advanced_pro_detail))
             TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA -> arrayOf(context.getString(R.string.nr_nsa), context.getString(R.string.nr_nsa_detail))
-            TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> arrayOf(context.getString(R.string.nr_nsa_mmwave), context.getString(R.string.nr_nsa_mmwave_detail))  // Can be removed once the minimum API >= 31.
+            // OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE can be removed once the minimum API >= 31.
+            TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> arrayOf(context.getString(R.string.nr_nsa_mmwave), context.getString(R.string.nr_nsa_mmwave_detail))
             TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED -> arrayOf(context.getString(R.string.nr_advanced), context.getString(R.string.nr_advanced_detail))
             else -> arrayOf(context.getString(R.string.error), "")
         }
     }
-}
\ No newline at end of file
+}
index c54e290813c07abd015b1f3d0443dc7afdc45317..11af7b7fc357718638e46ee3cb4a976d07993361 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -307,4 +307,4 @@ class RealtimeMonitoringService : Service() {
             }
         }
     }
-}
\ No newline at end of file
+}
index 50ae1af23e207fcac8bab3c4201b1d8137bc7d93..5d70ee1fef5b8021ed05a1a5298dee0251c1abbd 100644 (file)
@@ -11,4 +11,4 @@
     <path
         android:fillColor="@color/blue_icon"
         android:pathData="M21,4L3,4c-1.1,0 -2,0.9 -2,2v13c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,6c0,-1.1 -0.9,-2 -2,-2zM21,18c0,0.55 -0.45,1 -1,1h-8L12,6h8c0.55,0 1,0.45 1,1v11zM19.25,9.5h-5.5c-0.41,0 -0.75,0.34 -0.75,0.75s0.34,0.75 0.75,0.75h5.5c0.41,0 0.75,-0.34 0.75,-0.75s-0.34,-0.75 -0.75,-0.75zM19.25,12h-5.5c-0.41,0 -0.75,0.34 -0.75,0.75s0.34,0.75 0.75,0.75h5.5c0.41,0 0.75,-0.34 0.75,-0.75s-0.34,-0.75 -0.75,-0.75zM19.25,14.5h-5.5c-0.41,0 -0.75,0.34 -0.75,0.75s0.34,0.75 0.75,0.75h5.5c0.41,0 0.75,-0.34 0.75,-0.75s-0.34,-0.75 -0.75,-0.75z" />
-</vector>
\ No newline at end of file
+</vector>
diff --git a/app/src/main/res/drawable/notification_permission.xml b/app/src/main/res/drawable/notification_permission.xml
new file mode 100644 (file)
index 0000000..24cb942
--- /dev/null
@@ -0,0 +1,13 @@
+<!-- This file comes from the Android Material icon set, where it is called `notification_important_rounded_filled`.  It is released under the Apache License 2.0. -->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="48dp"
+    android:width="48dp"
+    android:viewportHeight="48"
+    android:viewportWidth="48" >
+
+    <path
+        android:fillColor="@color/blue_icon"
+        android:pathData="M24,26.6q0.65,0 1.075,-0.425 0.425,-0.425 0.425,-1.075v-7.6q0,-0.65 -0.425,-1.075Q24.65,16 24,16q-0.65,0 -1.075,0.425 -0.425,0.425 -0.425,1.075v7.6q0,0.65 0.425,1.075 0.425,0.425 1.075,0.425ZM24,32q0.7,0 1.175,-0.475 0.475,-0.475 0.475,-1.175 0,-0.7 -0.475,-1.175Q24.7,28.7 24,28.7q-0.7,0 -1.175,0.475 -0.475,0.475 -0.475,1.175 0,0.7 0.475,1.175Q23.3,32 24,32ZM9.5,38q-0.65,0 -1.075,-0.425Q8,37.15 8,36.5q0,-0.65 0.425,-1.075Q8.85,35 9.5,35h2.7L12.2,19.7q0,-4.1 2.475,-7.425T21.2,8.1L21.2,6.65q0,-1.15 0.825,-1.9T24,4q1.15,0 1.975,0.75 0.825,0.75 0.825,1.9L26.8,8.1q4.05,0.85 6.55,4.175 2.5,3.325 2.5,7.425L35.85,35h2.65q0.65,0 1.075,0.425Q40,35.85 40,36.5q0,0.65 -0.425,1.075Q39.15,38 38.5,38ZM24,44q-1.6,0 -2.8,-1.175Q20,41.65 20,40h8q0,1.65 -1.175,2.825Q25.65,44 24,44Z" />
+</vector>
index 8b872ffa32abe98159d6aa0d1abe7b381e2e32db..0135d29a8406197edf401a4dd1c216bb62600f31 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
@@ -36,7 +36,6 @@
             android:layout_width="match_parent"
             android:layout_weight="1"/>
 
-
         <!-- The app bar theme must be specified here because the activity uses a `NoActionBar` theme. -->
         <com.google.android.material.appbar.AppBarLayout
             android:layout_height="wrap_content"
@@ -50,4 +49,4 @@
                 android:layout_width="match_parent" />
         </com.google.android.material.appbar.AppBarLayout>
     </LinearLayout>
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
index 1ed0797696e827c83fd2a639dac4e804b4c122eb..380c124b56d3d0133f677e68c6ecbcde362e1ee9 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
@@ -48,4 +48,4 @@
             android:layout_height="match_parent"
             android:layout_width="match_parent" />
     </LinearLayout>
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
index 6451192c8f426a4dee7e1aeb55e46b15278f13c5..77a6ce584edf535c30e355191f44572052000693 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Bernhard G. Keller.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
     <string name="insecure_network_channel">Unsicheres Netzwerk</string>
     <string name="antiquated_network_channel">Veraltetes Netzwerk</string>
     <string name="unknown_network_channel">Unbekanntes Netzwerk</string>
-</resources>
\ No newline at end of file
+</resources>
index 6b9f847a3c6c37ca80b0671820ab548df9ee5941..2f38a439858032862700ec80ac4956961493c874 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Jose A. León.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
     <string name="insecure_network_channel">Red insegura</string>
     <string name="antiquated_network_channel">Red anticuada</string>
     <string name="unknown_network_channel">Red desconocida</string>
-</resources>
\ No newline at end of file
+</resources>
index 2e24f1a897fd8dde97ab84791c167c5153cee83a..c7b481f72c685bbf2b7614108c66b5737431880f 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Kévin L. <kevinliste@framalistes.org>.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
     <string name="insecure_network_channel">Réseau non-sécurisé</string>
     <string name="antiquated_network_channel">Réseau obsolète</string>
     <string name="unknown_network_channel">Réseau inconnu</string>
-</resources>
\ No newline at end of file
+</resources>
index 54689e885921e8b93311a82e7e912f01d735baa5..b4e0347f86f64bbf168a5027a235d3a8f0e429b2 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   Translation 2021-2022 Francesco Buratti.  Copyright assigned to Soren Stoutner <soren@stoutner.com>.
 
     <string name="insecure_network_channel">Rete insicura</string>
     <string name="antiquated_network_channel">Rete Antiquata</string>
     <string name="unknown_network_channel">Rete sconosciuta</string>
-</resources>
\ No newline at end of file
+</resources>
index 2b2ec2b427181687dc013bfe00c0a86370ab374e..b073e5e7c095ce7bcebdbb8ff86e28031683964a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
     <string name="insecure_network_channel">Небезопасная сеть</string>
     <string name="antiquated_network_channel">Устаревшая сеть</string>
     <string name="unknown_network_channel">Неизвестная сеть</string>
-</resources>
\ No newline at end of file
+</resources>
index 648a078fa683251c37e619c7206fc9be2ff4f69d..22281a1230229f1cc82ab5996bc5476710aaeebc 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
     <string name="nr_advanced">NR Advanced – 5G</string>
     <string name="nr_advanced_detail">New Radio Advanced</string>
 
-    <!-- Phone permission dialog. -->
+    <!-- Permission dialog. -->
     <string name="phone_permission">Phone Permission</string>
     <string name="phone_permission_text">Privacy Cell needs the Read Phone State permission to determine the safety level of your cell connection.</string>
+    <string name="notification_permission">Notification Permission</string>
+    <string name="notification_permission_text">Privacy Cell needs the Post Notification permission to display realtime monitoring notifications.</string>
     <string name="ok">OK</string>
 
     <!-- Dialogs. -->
     <string name="consider_3g_antiquated_key" translatable="false">consider_3g_antiquated</string>
     <string name="interface_key" translatable="false">interface</string>
     <string name="bottom_app_bar_key" translatable="false">bottom_app_bar</string>
-</resources>
\ No newline at end of file
+</resources>
index 1d9d697e0f75c9a35fd68618cd29ba4d9814a037..95d0515bec31ebaf2ea8740e3479b3656f1e3f38 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+  Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
 
   This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
 
@@ -60,4 +60,4 @@
             app:summary="@string/bottom_app_bar_summary"
             app:defaultValue="false" />
     </PreferenceCategory>
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
index 78a3cd35609a44c49a880070e8ac6fc62fd485e4..5f4a00532056415c4deb0ac85df682c3e826baed 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2022 Soren Stoutner <soren@stoutner.com>.
  *
  * This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
  *
@@ -25,8 +25,8 @@ buildscript {
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:7.2.2'
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
+        classpath 'com.android.tools.build:gradle:7.3.1'
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20"
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
@@ -35,4 +35,4 @@ buildscript {
 
 task clean(type: Delete) {
     delete rootProject.buildDir
-}
\ No newline at end of file
+}
diff --git a/fastlane/metadata/android/fr-FR/changelogs/10.txt b/fastlane/metadata/android/fr-FR/changelogs/10.txt
new file mode 100644 (file)
index 0000000..c3bd1ab
--- /dev/null
@@ -0,0 +1,3 @@
+• Correction d'un bug qui réactivait les notifications lorsque le réseau changeait.
+• Ajout d'un texte violet à deux tons sur le thème de Nuit.
+• Mise à jour de la traduction française par Kévin L.
\ No newline at end of file
index 6f4d99208b8e21d06da0e9f4c25276a023cda0dc..177ccd7c04cebf67a7e3936cce5d8b4d5928d54f 100644 (file)
@@ -1,6 +1,6 @@
 #Thu Aug 12 09:15:13 MST 2021
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
 distributionPath=wrapper/dists
 zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME