-Privacy Cell copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+Privacy Cell copyright © 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
/*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
}
android {
- compileSdk 31
+ compileSdk 34
defaultConfig {
applicationId "com.stoutner.privacycell"
minSdk 30
- targetSdk 31
- versionCode 8
- versionName "1.7"
+ targetSdk 34
+ versionCode 12
+ versionName "1.10"
+ resourceConfigurations += ['en', 'de', 'es', 'fr', 'it', 'ru']
+ }
+
+ // Specify the compile Java version. This must match the Kotlin JVM target. For some reason the system was not setting this correctly. These can probably be removed in the future.
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+
+ // Specify the Kotlin JVM target. This must match the compile Java version. For some reason the system was not setting this correctly. These can probably be removed in the future.
+ kotlinOptions {
+ jvmTarget = 17
}
buildTypes {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
+
+ namespace 'com.stoutner.privacycell'
}
dependencies {
// Include the following AndroidX libraries.
- implementation 'androidx.appcompat:appcompat:1.4.1'
- implementation 'androidx.core:core-ktx:1.7.0'
- implementation 'androidx.preference:preference-ktx:1.2.0'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'androidx.core:core-ktx:1.12.0'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
+ implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
- implementation 'androidx.webkit:webkit:1.4.0'
- implementation 'androidx.work:work-runtime-ktx:2.7.1'
+ implementation 'androidx.webkit:webkit:1.8.0'
+ implementation 'androidx.work:work-runtime-ktx:2.8.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.6.10'
+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22'
// Include the Google material library.
- implementation 'com.google.android.material:material:1.5.0'
-}
\ No newline at end of file
+ implementation 'com.google.android.material:material:1.10.0'
+}
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
- package="com.stoutner.privacycell"
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. -->
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+ <!-- Required to display a notification. <Dangerous permission> -->
+ <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- Required to start the realtime notification icon at boot. -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+ <!-- 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" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
+
<!-- Disabled the unneeded permissions that are automatically added by `androidx.work`. <https://developer.android.com/reference/androidx/work/package-summary> -->
<uses-permission android:name="android.permission.WAKE_LOCK" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" tools:node="remove" />
<!-- Support Chromebooks that don't have a touch screen. -->
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
- <!-- App data is automatically backed up to Google cloud servers unless `android:allowBackup="false"` and `android:fullBackupContent="false"` is set.
- `tools:ignore="DataExtractionRules` removes the warning that backups can still transfer data device to device. -->
+ <!-- `tools:ignore="UnusedAttribute` removes the warning that `android:localeConfig` only applies to API >= 33. -->
<application
android:label="@string/privacy_cell"
android:icon="@mipmap/privacy_cell"
- android:allowBackup="false"
- android:fullBackupContent="false"
android:supportsRtl="true"
android:theme="@style/Theme.PrivacyCell"
- tools:ignore="DataExtractionRules" >
+ android:localeConfig="@xml/locales_config"
+ tools:ignore="UnusedAttribute" >
<!-- Privacy Cell Activity. The label uses the short name so that it isn't truncated under the icon in the launcher on most phones.
`android:launchMode="singleTask"` makes the app launch in a new task instead of inside the task of the program that sends it an intent.
<activity
android:name=".activities.SettingsActivity"
android:label="@string/settings"
- android:screenOrientation="fullUser"
- android:parentActivityName=".activities.PrivacyCellActivity" />
+ android:parentActivityName=".activities.PrivacyCellActivity"
+ android:screenOrientation="fullUser" />
<!-- Protocols Activity. The `parentActivityName` is used when navigating back. -->
<activity
android:name=".activities.ProtocolsActivity"
android:label="@string/protocols"
- android:screenOrientation="fullUser"
- android:parentActivityName=".activities.PrivacyCellActivity" />
+ android:parentActivityName=".activities.PrivacyCellActivity"
+ android:screenOrientation="fullUser" />
<!-- Logcat Activity. The `parentActivityName` is used when navigating back. -->
<activity
android:screenOrientation="fullUser" />
<!-- Realtime Monitoring Service. -->
- <service android:name=".services.RealtimeMonitoringService" />
+ <service
+ android:name=".services.RealtimeMonitoringService"
+ android:foregroundServiceType="specialUse" >
+
+ <property
+ android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
+ android:value="Displays current cell protocol security information." />
+ </service>
<!-- On Boot Completed Receiver. -->
<receiver
</intent-filter>
</receiver>
</application>
-</manifest>
\ No newline at end of file
+</manifest>
@media (prefers-color-scheme: dark) {
a {
- color: #8AB4F8; /* Violet 500 */
+ color: #5785C5; /* Violet 700 */
}
}
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021-2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <h3>1.7 (Version Code 8)</h3>
- <p>24. März 2022 - Mindest-API 30, Ziel-API 31</p>
+ <h3>1.10 (Version Code 12)</h3>
+ <p>30. Oktober 2023 - Mindest-API 30, Ziel-API 34</p>
+ <ul>
+ <li>Create an optional <a href="https://redmine.stoutner.com/issues/988">monochrome icon</a> (can be used in Android >= 13).</li>
+ <li>Allow Privacy Cell to be included in <a href="https://redmine.stoutner.com/issues/1001">system backups</a>.</li>
+ <li>Bump the <a href="https://redmine.stoutner.com/issues/1104">target API to 34</a> (Android 14).</li>
+ <li>Document <a href="https://redmine.stoutner.com/issues/940">permissions needed</a> for <a href="https://redmine.stoutner.com/issues/942">newer versions of Android</a>.</li>
+ <li>Repopulate the realtime monitoring notification every <a href="https://redmine.stoutner.com/issues/1105">15 minutes</a>.</li>
+ <li>Erste komplette deutsche Übersetzung von Bernhard G. Keller.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-9/">1.9</a> (Version Code 11)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=53f5dd586d2e9eb38280648b9084db15163fe682">5. Dezember 2022</a> - Mindest-API 30, Ziel-API 33</p>
+ <ul>
+ <li><a href="https://redmine.stoutner.com/issues/890">Ziel-API auf 33</a> (Android 13) angehoben.</li>
+ <li><a href="https://redmine.stoutner.com/issues/894">Wischgeste zum zum Ablehnen</a> der Benachrichtigungen des Echtzeit-Monitorings unter Android 13 deaktiviert.</li>
+ <li><a href="https://redmine.stoutner.com/issues/935">App-Sprachauswahl</a> zur Auswahl der Sprache von Privacy Cell unter Android 13 hinzugefügt.</li>
+ <li><a href="https://redmine.stoutner.com/issues/913">Scroll-Position im Einstellungs-Dialog</a> wird nun bei Neustarts beibehalten.</li>
+ <li>Erste komplette deutsche Übersetzung von Bernhard G. Keller.</li>
+ </ul>
+
+ <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>
+ <li>Erste komplette deutsche Übersetzung von Bernhard G. Keller.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (Version Code 9)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14. Juni 2022</a> - Mindest-API 30, Ziel-API 32</p>
+ <ul>
+ <li>Der <a href="https://redmine.stoutner.com/issues/851">Sprach-Netzwerk-Status</a> wird nun bei der Einschätzung der Gesamt-Sicherheit des Funknetzwerks berücksichtigt.</li>
+ <li>Fehler behoben, durch den gelegentlich <a href="https://redmine.stoutner.com/issues/850">Benachrichtigungen nicht abgeschaltet werden konnten</a>.</li>
+ <li><a href="https://redmine.stoutner.com/issues/827">Ziel-API auf 32</a> (Android 12L) angehoben.</li>
+ <li>Erste komplette deutsche Übersetzung von Bernhard G. Keller.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (Version Code 8)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24. März 2022</a> - Mindest-API 30, Ziel-API 31</p>
<ul>
<li>Warnung bei Verbindungen zu <a href="https://redmine.stoutner.com/issues/795">älteren, unsicheren Netzwerken</a> hinzugefügt.</li>
<li><a href="https://redmine.stoutner.com/issues/774">Protokoll-Ansicht</a> hinzugefügt.</li>
<li>Erst-Veröffentlichung.</li>
</ul>
</body>
-</html>
\ No newline at end of file
+</html>
</head>
<body>
- <p>You are connected to a cell phone network using antiquated protocols, which have multiple known vulnerabilities.</p>
+ <p>Ihr Gerät ist mit einem Netzwerk verbunden, das veraltete Protokolle verwendet, welche etliche bekannte Sicherheits-Schwachstellen beinhalten.</p>
- <p>2G networks have been <a href="https://www.eff.org/deeplinks/2022/01/victory-google-releases-disable-2g-feature-new-android-smartphones">decommissioned in most of the world</a>.
- 3G networks are currently being decommissioned. Unless you know that the carrier in your area is running antiquated protocols, you should consider your device under active attack.</p>
+ <p>2G-Netzwerke wurden in vielen Ländern bereits <a href="https://www.eff.org/deeplinks/2022/01/victory-google-releases-disable-2g-feature-new-android-smartphones">deaktiviert</a>.
+ 3G-Netzwerke werden derzeit ebenfalls abgeschaltet. Sofern Sie nicht sicher sind, dass der Provider in Ihrem Gebiet tatsächlich veraltete Protokolle nutzt, sollten Sie in Erwägung ziehen,
+ dass Ihr Gerät aktuell attackiert wird.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/CDMA2000#1X">1 times Radio Transmission Technology</a> (1xRTT) is the first version of the
- <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard, which is the 3G update of the older 2G
- <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne).
- It is the competitor to <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
+ <p><a href="https://de.wikipedia.org/wiki/CDMA2000#Typen">1 times Radio Transmission Technology</a> (1xRTT) ist die erste Version des
+ <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) Standards, welches das 3G-Update des älteren 2G-Standards
+ <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne) ist.
+ Es ist der vorwiegend in Amerika und Teilen von Asien und Afrika genutzte Konkurrent zu <a href="https://de.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, also known as CDMAOne) is a 2G standard than can be considered a direct competitor to
- <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM).</p>
+ <p><a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, auch bekannt als CDMAOne) ist ein 2G-Standard, der als direkter Konkurrent von
+ <a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM) angesehen werden kann.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Enhanced_Data_rates_for_GSM_Evolution">Enhanced Data rates for GSM Evolution</a> (EDGE)
- is a 2.5G/3G technology which can be thought of as the next step up from <a href="https://en.wikipedia.org/wiki/General_Packet_Radio_Service">General Packet Radio Service</a> (GPRS),
- which is the first evolution of the 2G <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM),
- which is the competitor to <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, also known as CDMAOne).</p>
+ <p><a href="https://de.wikipedia.org/wiki/Enhanced_Data_Rates_for_GSM_Evolution">Enhanced Data rates for GSM Evolution</a> (EDGE)
+ ist eine 2.5G/3G-Technologie, die eine Weiterentwicklung von <a href="https://de.wikipedia.org/wiki/General_Packet_Radio_Service">General Packet Radio Service</a> (GPRS) darstellt,
+ die wiederum die erste Evolutionsstufe des 2G-Standards <a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM) und
+ die Konkurrenz-Technologie zum in Amerika und Teilen von Asien und Afrika gebräuchlichen <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a>
+ (CDMA, auch bekannt als CDMAOne) ist.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://ieeexplore.ieee.org/document/6618535">Enhanced High-Rate Packet Data</a> (eHRPD) is a 3.5G/4G protocol designed to ease the transition in mixed networks to 4G
- <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE),
- particularly those coming from <a href="https://www.iotevolutionworld.com/topics/mobile-communications/articles/37366-evolution-options-from-cdma-lte-benefits-ehrpd.htm">CDMA2000</a>.</p>
+ <p><a href="https://ieeexplore.ieee.org/document/6618535">Enhanced High-Rate Packet Data</a> (eHRPD) ist ein 3.5G/4G-Protokoll, das entwickelt wurde, um den Übergang in gemischten Netzwerken zu 4G
+ <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">Long-Term Evolution</a> (LTE) zu erleichtern -
+ insbesonders für jene mit <a href="https://www.iotevolutionworld.com/topics/mobile-communications/articles/37366-evolution-options-from-cdma-lte-benefits-ehrpd.htm">CDMA2000</a>-Technologie.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) is a 3.5G evolution of the 3G
- <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- It is a competitor to the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) protocol.
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) ist eine 3.5G-Weiterentwicklung des 3G-Standards
+ <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
+ Es ist die Konkurrenz-Technologie zum <a href="https://de.wikipedia.org/wiki/HSPA">High Speed Packet Access</a> (HSPA)-Protokoll.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized release A</a> (EVDO_A) is the second release of the EVDO standard,
- which is a 3.5G evolution of the 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- It is a competitor to the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) protocol.
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized revision A</a> (EVDO_A) ist die zweite Version des EVDO-Standards,
+ welche die 3.5G-Weiterentwicklung des 3G-Standards <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) darstellt.
+ Es ist die Konkurrenz-Technologie zum <a href="https://de.wikipedia.org/wiki/HSPA">High Speed Packet Access</a> (HSPA)-Protokoll.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized release B</a> (EVDO_B) is the third release of the EVDO standard,
- which is a 3.5G evolution of the 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- It is a competitor to the <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP) protocol.
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized revision B</a> (EVDO_B) ist die dritte Version des EVDO-Standards,
+ welche die 3.5G-Weiterentwicklung des 3G-Standards <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) darstellt.
+ Es ist die Konkurrenz-Technologie zum <a href="https://de.wikipedia.org/wiki/HSPA">High Speed Packet Access</a> (HSPA)-Protokoll.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/General_Packet_Radio_Service">General Packet Radio Service</a> (GPRS) is a 2.5G/3G packet-switched protocol
- (meaning that information is split up into multiple packets similar to <a href="https://en.wikipedia.org/wiki/Internet_protocol_suite">TCP/IP</a> on the general internet).
- It is the evolution of the 2G <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM),
- which is the competitor to <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, also known as CDMAOne).</p>
+ <p><a href="https://de.wikipedia.org/wiki/General_Packet_Radio_Service">General Packet Radio Service</a> (GPRS) ist ein paketorientiertes 2.5G/3G-Protokoll
+ (die Daten werden dabei - wie bei <a href="https://en.wikipedia.org/wiki/Internet_protocol_suite">TCP/IP</a> im Internet -
+ in einzelne Pakete umgewandelt, als solche übertragen und beim Empfänger wieder zusammengesetzt).
+ Es stellt die Weiterentwicklung des 2G-Standards <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM) und die Konkurrenz-Technologie zu
+ <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, auch bekannt als CDMAOne) dar.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM) is a 2G standard.
- It is the competitor to <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, also known as CDMAOne).
- GSM eventually evolved into the 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE), which was also adopted by CDMA networks.</p>
+ <p><a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM) ist ein 2G-Standard.
+ Er stellt die Konkurrenz-Technologie zu <a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access</a> (CDMA, auch bekannt als CDMAOne) dar.
+ Aus GSM ging schließlich der 4G-Standard <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">Long-Term Evolution</a> (LTE) hervor, der auch in CDMA-Netzwerke übernommen wurde.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access#High_Speed_Downlink_Packet_Access_(HSDPA)">High Speed Downlink Packet Access</a> (HSDPA)
- is a 3.5G protocol that makes up one portion of the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) update to the 3G
- <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
- It is a competitor to the 3.5G <a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO) protocols.</p>
+ <p><a href="https://de.wikipedia.org/wiki/High_Speed_Downlink_Packet_Access">High Speed Downlink Packet Access</a> (HSDPA)
+ ist ein 3.5G-Protokoll, das einen Teil des <a href="https://de.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA)-Updates zum 3G-Standard
+ <a href="https://de.wikipedia.org/wiki/Universal_Mobile_Telecommunications_System">Universal Mobile Telecommunications System</a> (UMTS) darstellt.
+ Es ist eine Konkurrenz-Technologie zu den 3.5G-<a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO)-Protokollen.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) is a 3.5G update to the 3G
- <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
- It is a competitor to the 3.5G <a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO) protocols.</p>
+ <p><a href="https://de.wikipedia.org/wiki/HSPA">High Speed Packet Access</a> (HSPA) ist ein 3.5G-Update zum 3G-Standard
+ <a href="https://de.wikipedia.org/wiki/Universal_Mobile_Telecommunications_System">Universal Mobile Telecommunications System</a> (UMTS).
+ Es ist eine Konkurrenz-Technologie zu den 3.5G-<a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO)-Protokollen.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP) is a boost to the 3.5G
- <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) update to the 3G
- <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
- It is a competitor to the 3.5G <a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO) protocols.</p>
+ <p><a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP) ist eine Steigerungsstufe des 3.5G-Updates
+ <a href="https://de.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) der 3G-Technologie
+ <a href="https://de.wikipedia.org/wiki/Universal_Mobile_Telecommunications_System">Universal Mobile Telecommunications System</a> (UMTS).
+ Es ist eine Konkurrenz-Technologie zu den 3.5G-<a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO)-Protokollen.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access#High_Speed_Uplink_Packet_Access_(HSUPA)">High Speed Uplink Packet Access</a> (HSUPA)
- is a 3.5G protocol that makes up one portion of the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) update to the 3G
- <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
- It is a competitor to the 3.5G <a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO) protocols.</p>
+ <p><a href="https://de.wikipedia.org/wiki/High_Speed_Uplink_Packet_Access">High Speed Uplink Packet Access</a> (HSUPA)
+ ist ein 3.5G-Protokoll, das einen Teil des <a href="https://de.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA)-Updates zum 3G-Standard
+ <a href="https://de.wikipedia.org/wiki/Universal_Mobile_Telecommunications_System">Universal Mobile Telecommunications System</a> (UMTS) darstellt.
+ Es ist eine Konkurrenz-Technologie zu den 3.5G-<a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized">Evolution-Data Optimized</a> (EVDO)-Protokollen.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/IDEN">Integrated Digital Enhanced Network</a> (iDEN) was a 2G protocol developed to work around some of the limitations of the 2G
- <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM).</p>
+ <p><a href="https://de.wikipedia.org/wiki/IDEN">Integrated Digital Enhanced Network</a> (iDEN) war ein Protokoll, um 2G-
+ <a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM)-Netzwerke um zusätzliche Dienste zu ergänzen.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<body>
<p><a href="https://en.wikipedia.org/wiki/Mobile_data_offloading#Cellular_and_Wi-Fi_network_interworking">Interworking Wireless LAN</a> (IWLAN)
- is a fancy name for using an <a href="https://en.wikipedia.org/wiki/IEEE_802.11">802.11 Wi-Fi network</a> to route cell phone data.</p>
+ ist ein origineller Name für die Nutzung eines <a href="https://de.wikipedia.org/wiki/IEEE_802.11">802.11 WLAN-Netzwerks</a> zum Routen von Mobilfunkdaten.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE) is the 4G evolution of the 3G
- <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS). Notably, it replaced both UMTS,
- which descended from the 2G <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM), as well as the 3G
- <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000), which was the main competitor to UMTS.
- For the first time, this meant that cell phone networks worldwide coalesced around a single protocol, removing the need for world travelers to carry a phone with dual radios.
- One reason LTE was able to achieve this was by supporting a mixed-mode network, where CDMA2000 (or UMTS) was used for voice calls and LTE for data communications.
- This provided a seamless upgrade path for cell phone operators. Over time, most carriers eventually switched to <a href="https://en.wikipedia.org/wiki/Voice_over_LTE">Voice over LTE</a> (VoLTE).</p>
+ <p><a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">Long-Term Evolution</a> (LTE) ist die 4G-Weiterentwicklung des 3G-Standards
+ <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS). Es ersetzte sowohl UMTS,
+ das vom 2G-Standard <a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM) abstammte, als auch das 3G-System
+ <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000), das den Haupt-Konkurrenten zu UMTS darstellte.
+ Zum ersten Mal war damit möglich, Mobiltelefone weltweit mit einem Protokoll anstatt wie vorher mit zwei Funkmodulen zu nutzen.
+ Ein Grund dafür war die Unterstützung von Mixed-Mode-Netzwerken, bei denen CDMA2000 oder UMTS für Sprachanrufe und LTE für die Datenübertragung genutzt wurde.
+ Dies bot Mobilfunk-Anbietern einen nahtlosen Aufrüstungs-Pfad. Mit der Zeit wechselten die meisten Anbieter letztlich zu <a href="https://de.wikipedia.org/wiki/VoLTE">Voice over LTE</a> (VoLTE).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> is the main 5G protocol.
- It is the successor to 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE).
- It is the first wireless protocol to generally include the generation (5G) in the name.
- </p>
+ <p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> ist das Haupt-Protokoll für 5G.
+ Es ist der Nachfolger des 4G-Systems <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">Long-Term Evolution</a> (LTE).
+ Es ist das erste drahtlose Protokoll, das die Netzwerk-Generation (5G) im Namen verwendet.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/UMTS#TD-SCDMA_(UTRA-TDD_1.28_Mcps_Low_Chip_Rate_(LCR))">Time-Division Synchronous Code-Division Multiple Access</a> (TD-SCDMA) is an extension to the 3G
- <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS),
- which is the 3G successor of the 2G <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM)
- and a competitor to the <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- TD-SCDMA was only used in China.
- UMTS evolved into the 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE), which was also adopted by CDMA networks.</p>
+ <p><a href="https://en.wikipedia.org/wiki/UMTS#TD-SCDMA_(UTRA-TDD_1.28_Mcps_Low_Chip_Rate_(LCR))">Time-Division Synchronous Code-Division Multiple Access</a>
+ (TD-SCDMA) ist eine Erweiterung des 3G-Standards <a href="https://de.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS),
+ welches der Nachfolger des 2G-Standards <a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM)
+ und eine Konkurrenz-Technologie zu <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) war. TD-SCDMA wurde nur in China genutzt.
+ UMTS wurde zu <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">Long-Term Evolution</a> (LTE) weiterentwickelt, das auch in CDMA-Netzwerke übernommen wurde.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<body>
<p><a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS)
- is the 3G successor to the 2G <a href="https://en.wikipedia.org/wiki/GSM">Global System for Mobile Communications</a> (GSM)
- and a competitor to the <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- UMTS evolved into 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE), which was also adopted by CDMA networks.</p>
+ ist der Nachfolger des 2G-Standards <a href="https://de.wikipedia.org/wiki/Global_System_for_Mobile_Communications">Global System for Mobile Communications</a> (GSM)
+ und eine Konkurrenz-Technologie zu <a href="https://de.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
+ UMTS wurde zu <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">Long-Term Evolution</a> (LTE) weiterentwickelt, das auch in CDMA-Netzwerke übernommen wurde.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p>The network type is unknown.</p>
+ <p>Der Netzwerk-Typ ist unbekannt.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<body>
<p><a href="https://en.wikipedia.org/wiki/LTE_Advanced#LTE_Advanced_Pro">Long-Term Evolution Advanced Pro</a> (LTE-A Pro)
- is a 4.5G update to the 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">LTE</a> protocol.</p>
+ ist eine 4.5G-Erweiterung zum 4G-Protokoll <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">LTE</a>.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Carrier_aggregation">Long-Term Evolution Carrier Aggregation</a> (LTE CA)
- allows a 4G LTE connection to aggregate non-contiguous blocks of spectrum to increase data throughput.</p>
+ <p><a href="https://de.wikipedia.org/wiki/Carrier_Aggregation">Long-Term Evolution Carrier Aggregation</a> (LTE CA)
+ erlaubt einer 4G-LTE-Verbindung, mehrere einzelne Frequenzblöcke zu nutzen und so die maximale Datenrate pro Nutzer zu erhöhen.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p>There is no additional network information. Usually this category only applies to certain 4G and 5G networks.</p>
+ <p>Es gibt keine zusätzlichen Netzwerk-Informationen. Üblicherweise betrifft dies nur gewisse 4G- and 5G-Netzwerke.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<body>
<p><a href="https://developer.android.com/reference/android/telephony/TelephonyDisplayInfo#OVERRIDE_NETWORK_TYPE_NR_ADVANCED">New Radio Advanced</a>
- is a marketing term that indicates that the carrier has done something beyond the bare minimum to qualify for the 5G logo.
- It likely indicates that speeds beyond those typically associated with standard 5G are available.
- For example, the carrier might be using the <a href="https://en.wikipedia.org/wiki/5G_NR#Frequency_bands">mmWave spectrum</a> (24.25–52.6 GHz), which goes really fast but doesn't penetrate walls.
- Or, they might be using <a href="https://en.wikipedia.org/wiki/Carrier_aggregation">carrier aggregation</a> to increase bandwidth.</p>
+ ist ein Marketing-Begriff, der darauf hinweist, dass der Mobilfunk-Anbieter mehr als das Minimum anbietet, welches für die Qualifikation für das 5G-Logo notwendig wäre.
+ Er bedeutet, dass vermutlich Geschwindigkeiten oberhalb des typischen 5G-Standards erreicht werden können.
+ Zum Beispiel kann der Anbieter das <a href="https://en.wikipedia.org/wiki/5G_NR#Frequency_bands">mmWave-Spektrum</a> (24.25–52.6 GHz) nutzen,
+ mit dem große Geschwindigkeiten erreicht werden können, das aber Wände nicht durchdringt.
+ Auch die Nutzung von <a href="https://de.wikipedia.org/wiki/Carrier_Aggregation">Carrier Aggregation</a> (CA) zur Erhöhung von Bandbreite ist denkbar.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/5G_NR#Non-standalone_mode">New Radio Non-Standalone</a> (NR NSA) uses the 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">LTE</a>
- protocols for the control channel and 5G NR for the data channel.
- It provides much of the speed of 5G without any of the additional security benefits.
- Android phones will list this as a 5G connection, but it is not protected against modern <a href="https://en.wikipedia.org/wiki/IMSI-catcher">stingray attacks</a>.</p>
+ <p><a href="https://en.wikipedia.org/wiki/5G_NR#Non-standalone_mode">New Radio Non-Standalone</a> (NR NSA) nutzt die 4G-<a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">LTE</a>-Protokolle
+ für den Kontroll-Kanal und 5G NR für den Daten-Kanal.
+ Dies bietet weitgehend die Geschwindigkeit von 5G ohne zusätzliche Sicherheits-Vorteile.
+ Android-Geräte zeigen diese Verbindungen als 5G an, es besteht jedoch keine Absicherung gegen moderne <a href="https://de.wikipedia.org/wiki/IMSI-Catcher">Stingray-Attacken</a>.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/5G_NR#Non-standalone_mode">New Radio Non-Standalone millimeter Wave</a> (NR NSA mmWave) uses the 4G
- <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">LTE</a> protocols for the control channel and 5G NR on the
- <a href="https://en.wikipedia.org/wiki/5G_NR#Frequency_bands">mmWave spectrum</a> (24.25–52.6 GHz) for the data channel.
- It provides much of the speed of 5G without any of the additional security benefits.
- Android phones will list this as a 5G connection, but it is not protected against modern <a href="https://en.wikipedia.org/wiki/IMSI-catcher">stingray attacks</a>.</p>
+ <p><a href="https://en.wikipedia.org/wiki/5G_NR#Non-standalone_mode">New Radio Non-Standalone millimeter Wave</a> (NR NSA mmWave) nutzt die 4G-
+ <a href="https://de.wikipedia.org/wiki/Long_Term_Evolution">LTE</a>-Protokolle für den Kontroll-Kanal and 5G NR im
+ <a href="https://en.wikipedia.org/wiki/5G_NR#Frequency_bands">mmWave-Spektrum</a> (24.25–52.6 GHz) für den Daten-Kanal.
+ Dies bietet weitgehend die Geschwindigkeit von 5G ohne zusätzliche Sicherheits-Vorteile.
+ Android-Geräte zeigen diese Verbindungen als 5G an, es besteht jedoch keine Absicherung gegen moderne <a href="https://de.wikipedia.org/wiki/IMSI-Catcher">Stingray-Attacken</a>.</p>
</body>
</html>
\ No newline at end of file
<!--
Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/IMSI-catcher">IMSI catchers</a>, also known as stingrays, are fake cell phone towers that intercept your traffic and spy on you.
- Each generation of cell phone protocols has attempted to mitigate stingrays, but each has generally failed.
- With 5G, more of the traffic is encrypted in such a way that it prevents stingray spying.
- However, 5G networks can run in a blended 4G/5G mode, where the control channel is 4G and the data channel is 5G.
- This is known as <a href="https://en.wikipedia.org/wiki/5G_NR#Non-standalone_mode">5G NR NSA</a> (5G New Radio Non-Standalone) mode.
- When connected to such a blended network, a cell phone is not protected against
- <a href="https://www.wired.com/story/5g-network-stingray-surveillance-non-standalone/">modern stingray attacks</a>.</p>
-
- <p>The Android status bar does not differentiate between 5G modes. It will display the same 5G icon for Standalone and Non-Standalone networks.
- The purpose of Privacy Cell is to make it easy to tell what type of network you are connected to.
- If you are in an area where you usually are connected to a <a href="https://en.wikipedia.org/wiki/5G_NR#Standalone_mode">5G NR SA</a> network and Privacy Cell shows a 5G NR NSA connection,
- it is possible that a stingray has performed a downgrade attack to spy on your communications.</p>
-
- <p>It should be noted that paltry attempts have been made to secure cell phone protocols in the past, which have never been sufficiently well designed to provide real protection.
- Even if you are connected to a 5G NR SA network, it is likely that there are still unknown weaknesses in the network that can be exploited by a sufficiently funded adversary.
- Privacy Cell will be updated regarding these types of vulnerabilities as future research identifies them.</p>
+ <p><a href="https://de.wikipedia.org/wiki/IMSI-Catcher">IMSI-Catcher</a>, auch als Stingrays bekannt, sind Fake-Basisstationen in Mobilfunk-Netzen,
+ die den Datenverkehr abfangen und so Nutzer ausspionieren können.
+ Jede Generation von Mobilfunk-Protokollen versuchte, solche Attacken zu verhindern, jedoch scheiterten diese Versuche grundsätzlich.
+ Mit 5G wird mehr Datenverkehr verschlüsselt, um Stingray-Angriffe zu vermeiden.
+ Allerdings können 5G-Netzwerke in gemischten 4G/5G-Modi betrieben werden, in denen für den Kontroll-Kanal 4G und für den Daten-Kanal 5G genutzt wird.
+ Dies wird als <a href="https://en.wikipedia.org/wiki/5G_NR#Non-standalone_mode">5G NR NSA</a> (5G New Radio Non-Standalone) bezeichnet.
+ Verbunden mit einem solchen gemischten Netzwerk ist ein Mobiltelefon nicht gegen moderne
+ <a href="https://www.wired.com/story/5g-network-stingray-surveillance-non-standalone/">Stingray-Attacken</a> abgesichert.</p>
+
+ <p>Die Status-Anzeige in Android unterscheidet nicht zwischen den verschiedenen 5G-Modi und zeigt dasselbe 5G-Icon für Standalone- (SA) und Nicht-Standalone-Netzwerke (NSA).
+ Der Zweck von Privacy Cell ist, eine Einschätzung des Netzwerks, mit dem das eigene Gerät verbunden ist, zu ermöglichen.
+ Wenn Sie in einem Gebiet üblicherweise mit einem
+ <a href="https://en.wikipedia.org/wiki/5G_NR#Standalone_mode">5G NR SA</a>-Netzwerk verbunden sind und Privacy Cell eine 5G NR NSA-Verbindung anzeigt,
+ könnte es sein, dass ein Stingray eine Downgrade-Attacke durchgeführt hat und Ihre Kommunikation ausspioniert.</p>
+
+ <p>Es sollte bedacht werden, dass die bisherigen dürftigen Versuche, Mobilfunk-Protokolle abzusichern, nie ausreichend konzipiert waren, um tatsächlichen Schutz zu bieten.
+ Selbst bei Verbindungen über 5G NR SA-Netzwerke besteht grundsätzlich die Gefahr unbekannter Schwachstellen im Netzwerk, die von hinreichend geförderten Widersachern ausgenutzt werden können.
+ Privacy Cell wird entsprechend aktualisiert, sobald solche Schwachstellen zukünftig erforscht und erkannt werden.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
Translation 2021-2022 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<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-2023 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.
<h3>Icons</h3>
<p><img class="left" src="../images/secure.svg"/> <img class="left" src="../images/secure_notification.svg"/> sind abgeleitet von <code>security</code> und <code>5g</code>,
- welche Teil des <a href="https://material.io/icons/">Android Material Icon-Sets</a> sind und unter der
+ welche Teil des <a href="https://fonts.google.com/icons">Android Material Icon-Sets</a> sind und unter der
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 Lizenz</a> veröffentlicht werden.
- Den gesamten Text der Lizenz finden Sie unterhalb. Copyright der Änderungen: © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Den gesamten Text der Lizenz finden Sie unterhalb. Copyright der Änderungen: 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierenden Grafiken werden unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+-Lizenz</a> veröffentlicht.</p>
<p><img class="left" src="../images/insecure.svg"> <img class="left" src="../images/insecure_notification.svg"/> sind abgeleitet von <code>security</code> und <code>warning_amber_rounded</code>,
- welche Teil des <a href="https://material.io/icons/">Android Material Icon-Sets</a> sind und unter der
+ welche Teil des <a href="https://fonts.google.com/icons">Android Material Icon-Sets</a> sind und unter der
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 Lizenz</a> veröffentlicht werden.
- Copyright der Änderungen: © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Copyright der Änderungen: 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierenden Grafiken werden unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+-Lizenz</a> veröffentlicht.</p>
<p><img class="left" src="../images/antiquated.svg"/> <img class="left" src="../images/antiquated_notification.svg"/> sind abgeleitet von <code>security</code> und <code>do_not_disturb</code>,
- welche Teil des <a href="https://material.io/icons/">Android Material Icon-Sets</a> sind und unter der
+ welche Teil des <a href="https://fonts.google.com/icons">Android Material Icon-Sets</a> sind und unter der
<a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 Lizenz</a> veröffentlicht werden.
- Copyright der Änderungen: © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Copyright der Änderungen: 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Die resultierenden Grafiken werden unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+-Lizenz</a> veröffentlicht.</p>
- <p><img class="left" src="../images/antiquated_3g.svg"/> is derived from <code>security</code> and <code>3g_mobiledata_rounded</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
- The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p>Die folgenden Icons stammen aus dem <a href="https://material.io/icons/">Android Material Icon-Sets</a>,
+ <p><img class="left" src="../images/antiquated_3g.svg"/> ist abgeleitet von <code>security</code> und <code>3g_mobiledata_rounded</code>,
+ welche ein Teil des <a href="https://fonts.google.com/icons">Android Material icon set</a> und unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ lizensiert sind. Die Änderungen stehen under dem Copyright 2016, 2022 von <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Die abgeleitete Grafik steht unter der <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ Lizenz</a>.</p>
+ <p>Die folgenden Icons stammen aus dem <a href="https://fonts.google.com/icons">Android Material Icon-Sets</a>,
das unter der <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 Lizenz</a> veröffentlicht wird.
Sie sind bis auf Layout-Informationen wie Farbe und Größe unverändert. Einige von Ihnen wurden Ihrer Verwendung im Code entsprechend umbenannt.
Die Origina-Icons und -Namen findend Sie unterhalb.</p>
<p><svg class="icon"><use href="../images/format_list_bulleted_rounded.svg#icon"/></svg> format_list_bulleted_rounded.</p>
<p><svg class="icon"><use href="../images/forum_rounded.svg#icon"/></svg> forum_rounded.</p>
<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/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</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>
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>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Bernhard G. Keller. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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_<wbr>PHONE_<wbr>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>
+ <h3>Zeige Benachrichtigungen</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#POST_NOTIFICATIONS">android.permission.<wbr>POST_<wbr>NOTIFICATIONS</a></p>
<p>Erlaubt Privacy Cell, ein Benachrichtigungs-Icon für die Echtzeit-Überwachung in der Status-Zeile anzuzeigen.</p>
+ <h3>Vordergrund-Service ausführen</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE</a></p>
+ <p>Erlaubt Privacy Cell, das Benachrichtigungs-Icon für die Echtzeit-Überwachung in der Status-Zeile zu aktualisieren, auch wenn die App im Hintergrund läuft.</p>
+
+ <h3>Spezieller Vordergrund-Service</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE_SPECIAL_USE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE_<wbr>SPECIAL_<wbr>USE</a></p>
+ <p>Legt den Typ des verwendeten Vordergrund-Services fest. "Special Use" wird für Services verwendet, die nicht in die
+ <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required">Standard-Kategorien</a> für Vordergrund-Services (z.B. Medienwiedergabe, Positionsbestimmung, etc.) fallen.</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_<wbr>BOOT_<wbr>COMPLETED</a></p>
<p>Erlaubt Privacy Cell die Echtzeit-Überwachung zu aktivieren, wenn das Smartphone gebootet wird.</p>
+
+ <h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">com.stoutner.privacycell.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
+ <p>Automatisch hinzugefügt für alle Apps mit API >= 33 (Android 13), um zu verhindern, dass sich andere Apps ohne expliziter Erlaubnis mit dynamischen BroadcastReceivern verbinden.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <h3>1.7 (version code 8)</h3>
- <p>24 March 2022 - minimum API 30, target API 31</p>
+ <h3>1.10 (version code 12)</h3>
+ <p>30 October 2023 - minimum API 30, target API 34</p>
+ <ul>
+ <li>Create an optional <a href="https://redmine.stoutner.com/issues/988">monochrome icon</a> (can be used in Android >= 13).</li>
+ <li>Allow Privacy Cell to be included in <a href="https://redmine.stoutner.com/issues/1001">system backups</a>.</li>
+ <li>Bump the <a href="https://redmine.stoutner.com/issues/1104">target API to 34</a> (Android 14).</li>
+ <li>Document <a href="https://redmine.stoutner.com/issues/940">permissions needed</a> for <a href="https://redmine.stoutner.com/issues/942">newer versions of Android</a>.</li>
+ <li>Repopulate the realtime monitoring notification every <a href="https://redmine.stoutner.com/issues/1105">15 minutes</a>.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-9/">1.9</a> (version code 11)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=53f5dd586d2e9eb38280648b9084db15163fe682">5 December 2022</a> - minimum API 30, target API 33</p>
+ <ul>
+ <li>Bump the <a href="https://redmine.stoutner.com/issues/890">target API to 33</a> (Android 13).</li>
+ <li>Disable <a href="https://redmine.stoutner.com/issues/894">swiping to dismiss</a> the realtime monitoring notification on Android 13.</li>
+ <li>Enable <a href="https://redmine.stoutner.com/issues/935">per-app language support</a> on Android 13.</li>
+ <li>Preserve the <a href="https://redmine.stoutner.com/issues/913">Settings scroll location</a> on restart.</li>
+ </ul>
+
+ <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>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (version code 9)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14 June 2022</a> - minimum API 30, target API 32</p>
+ <ul>
+ <li>Include the <a href="https://redmine.stoutner.com/issues/851">voice network status</a> in determining the overall security of the cell network.</li>
+ <li>Fix a bug that sometimes <a href="https://redmine.stoutner.com/issues/850">prevented notifications from being disabled</a>.</li>
+ <li>Bump the <a href="https://redmine.stoutner.com/issues/827">target API to 32</a> (Android 12L).</li>
+ <li>First full German translation contributed by Bernhard G. Keller.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (version code 8)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24 March 2022</a> - minimum API 30, target API 31</p>
<ul>
<li>Add a warning when connecting to <a href="https://redmine.stoutner.com/issues/795">older, insecure networks</a>.</li>
<li>Add a <a href="https://redmine.stoutner.com/issues/774">protocols activity</a>.</li>
<li>Initial release.</li>
</ul>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- 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>.
<p><a href="https://en.wikipedia.org/wiki/CDMA2000#1X">1 times Radio Transmission Technology</a> (1xRTT) is the first version of the
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard, which is the 3G update of the older 2G
<a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne).
- It is the competitor to <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
+ It is the competitor to <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
<body>
<p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) is a 3.5G evolution of the 3G
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- It is a competitor to the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) protocol.
+ It is a competitor to the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) protocol.</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized release A</a> (EVDO_A) is the second release of the EVDO standard,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized revision A</a> (EVDO_A) is the second release of the EVDO standard,
which is a 3.5G evolution of the 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- It is a competitor to the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) protocol.
+ It is a competitor to the <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA) protocol.</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized release B</a> (EVDO_B) is the third release of the EVDO standard,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized revision B</a> (EVDO_B) is the third release of the EVDO standard,
which is a 3.5G evolution of the 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000) standard.
- It is a competitor to the <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP) protocol.
+ It is a competitor to the <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP) protocol.</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
<body>
<p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> is the main 5G protocol.
It is the successor to 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE).
- It is the first wireless protocol to generally include the generation (5G) in the name.
- </p>
+ It is the first wireless protocol to generally include the generation (5G) in the name.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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-2023 <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.
<h3>Icons</h3>
<p><img class="left" src="../images/secure.svg"/> <img class="left" src="../images/secure_notification.svg"/> are derived from <code>security</code> and <code>5g</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- The full text of the license is below. Modifications copyright © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ The full text of the license is below. Modifications copyright 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting images are released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><img class="left" src="../images/insecure.svg"> <img class="left" src="../images/insecure_notification.svg"/> are derived from <code>security</code> and <code>warning_amber_rounded</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ Modifications copyright 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting images are released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><img class="left" src="../images/antiquated.svg"/> <img class="left" src="../images/antiquated_notification.svg"/> are derived from <code>security</code> and <code>do_not_disturb</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ Modifications copyright 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting images are released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
<p><img class="left" src="../images/antiquated_3g.svg"/> is derived from <code>security</code> and <code>3g_mobiledata_rounded</code>,
- which are part of the <a href="https://material.io/icons/">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Modifications copyright © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ which are part of the <a href="https://fonts.google.com/icons">Android Material icon set</a> and are released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
+ Modifications copyright 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
The resulting image is released under the <a href="https://www.gnu.org/licenses/gpl-3.0.html">GPLv3+ license</a>.</p>
- <p>The following icons come from the <a href="https://material.io/icons/">Android Material icon set</a>,
+ <p>The following icons come from the <a href="https://fonts.google.com/icons">Android Material icon set</a>,
which is released under the <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
They are unchanged except for layout information like color and size. Some of them have been renamed to match their use in the code. The original icons and names are shown below.</p>
<p><svg class="icon"><use href="../images/bug_report_rounded.svg#icon"/></svg> bug_report_rounded.</p>
<p><svg class="icon"><use href="../images/format_list_bulleted_rounded.svg#icon"/></svg> format_list_bulleted_rounded.</p>
<p><svg class="icon"><use href="../images/forum_rounded.svg#icon"/></svg> forum_rounded.</p>
<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/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</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>
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>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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_<wbr>PHONE_<wbr>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>
+ <h3>Show Notifications</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#POST_NOTIFICATIONS">android.permission.<wbr>POST_<wbr>NOTIFICATIONS</a></p>
<p>Allows Privacy Cell to display a realtime monitoring notification icon in the status bar.</p>
+ <h3>Run foreground service</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE</a></p>
+ <p>Allows Privacy Cell to update the realtime monitoring notification icon when the app is not in the foreground.</p>
+
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE_SPECIAL_USE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE_<wbr>SPECIAL_<wbr>USE</a></p>
+ <p>Specifies the type of foreground service.
+ Special Use is for services that don't fit into any of the <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required">standard categories</a>.</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_<wbr>BOOT_<wbr>COMPLETED</a></p>
<p>Allows Privacy Cell to enable the realtime monitoring service when the phone boots.</p>
+
+ <h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">com.stoutner.privacycell.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
+ <p>Automatically added to all apps targeting API >= 33 (Android 13) to prevent other apps from connecting to dynamic receivers without explicit permission.</p>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021-2022 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <h3>1.7 (versión del código 8)</h3>
- <p>24 de marzo de 2022 - API mínimo 30, API objetivo 31</p>
+ <h3>1.10 (versión del código 12)</h3>
+ <p>30 de octubre de 2023 - API mínimo 30, API objetivo 34</p>
+ <ul>
+ <li>Crear un icono <a href="https://redmine.stoutner.com/issues/988">monocromo opcional</a> (puede usarse en Android >= 13).</li>
+ <li>Permitir que Privacy Cell se incluya en <a href="https://redmine.stoutner.com/issues/1001">las copias de seguridad del sistema</a>.</li>
+ <li>Subir la <a href="https://redmine.stoutner.com/issues/1104">API objetivo a 34</a> (Android 14).</li>
+ <li>Documentar <a href="https://redmine.stoutner.com/issues/940">los permisos necesarios</a> para <a href="https://redmine.stoutner.com/issues/942">las nuevas versiones de Android</a>.</li>
+ <li>Repoblar la notificación de seguimiento en tiempo real cada <a href="https://redmine.stoutner.com/issues/1105">15 minutos</a>.</li>
+ <li>Traducción actualizada al español aportada por Jose A. León.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-9/">1.9</a> (versión del código 11)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=53f5dd586d2e9eb38280648b9084db15163fe682">5 de diciembre de 2022</a> - API mínimo 30, API objetivo 33</p>
+ <ul>
+ <li>Subir la <a href="https://redmine.stoutner.com/issues/890">API de destino a 33</a> (Android 13).</li>
+ <li>Desactivar <a href="https://redmine.stoutner.com/issues/894">el deslizamiento para descartar</a> la notificación de seguimiento en tiempo real en Android 13.</li>
+ <li>Habilitar <a href="https://redmine.stoutner.com/issues/935">el soporte de idiomas por aplicación</a> en Android 13.</li>
+ <li>Preservar la <a href="https://redmine.stoutner.com/issues/913">localización de desplazamiento de los Ajustes</a> al reiniciar.</li>
+ <li>Traducción actualizada al español aportada por Jose A. León.</li>
+ </ul>
+
+ <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>
+ <li>Traducción actualizada al español aportada por Jose A. León.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (versión del código 9)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14 de junio de 2022</a> - API mínimo 30, API objetivo 32</p>
+ <ul>
+ <li>Incluir el <a href="https://redmine.stoutner.com/issues/851">estado de la red de voz</a> para determinar la seguridad general de la red celular.</li>
+ <li>Corregir un error que a veces <a href="https://redmine.stoutner.com/issues/850">impedía desactivar las notificaciones</a>.</li>
+ <li>Aumentar la <a href="https://redmine.stoutner.com/issues/827">API de destino a 32</a> (Android 12L).</li>
+ <li>Primera traducción completa al alemán aportada por Bernhard G. Keller.</li>
+ <li>Traducción actualizada al español aportada por Jose A. León.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (versión del código 8)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24 de marzo de 2022</a> - API mínimo 30, API objetivo 31</p>
<ul>
<li>Añadir una advertencia al conectarse a <a href="https://redmine.stoutner.com/issues/795">redes antiguas e inseguras</a>.</li>
<li>Añadir una <a href="https://redmine.stoutner.com/issues/774">actividad de protocolos</a>.</li>
<li>Versión inicial.</li>
</ul>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<p><a href="https://en.wikipedia.org/wiki/CDMA2000#1X">1 times Radio Transmission Technology </a> (1xRTT) es la primera versión del
<a href="https://en.wikipedia.org/wiki/CDMA2000">estándar Code-Division Multiple Access 2000</a> (CDMA2000), que es la actualización 3G del antiguo 2G
<a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne).
- Es el competidor del <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
+ Es el competidor del <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<body>
<p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) es una evolución 3.5G del 3G
<a href="https://en.wikipedia.org/wiki/CDMA2000">estándar Code-Division Multiple Access 2000</a> (CDMA2000).
- Es un competidor del <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">protocolo High Speed Packet Access</a> (HSPA).
+ Es un competidor del <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">protocolo High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized release A</a> (EVDO_A) es la segunda versión del estándar EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized revision A</a> (EVDO_A) es la segunda versión del estándar EVDO,
que es la evolución 3.5G del 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">estándar Code-Division Multiple Access 2000</a> (CDMA2000).
- Es un competidor del <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">protocolo High Speed Packet Access</a> (HSPA).
+ Es un competidor del <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">protocolo High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized release B</a> (EVDO_B) es la tercera versión del estándar EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized revision B</a> (EVDO_B) es la tercera versión del estándar EVDO,
que es una evolución 3.5G del 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">estándar Code-Division Multiple Access 2000</a> (CDMA2000).
- Es un competidor del <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">protocolo High Speed Packet Access Plus</a> (HSPAP).
+ Es un competidor del <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">protocolo High Speed Packet Access Plus</a> (HSPAP).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<body>
<p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> es el principal protocolo 5G.
Es el sucesor del 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE).
- Es el primer protocolo inalámbrico que incluye generalmente la generación (5G) en el nombre.
- </p>
+ Es el primer protocolo inalámbrico que incluye generalmente la generación (5G) en el nombre.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
Translation 2021-2022 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<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-2023 <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.
<h3>Iconos</h3>
<p><img class="left" src="../images/secure.svg"/> <img class="left" src="../images/secure_notification.svg"/> derivan de <code>security</code> y <code>5g</code>,
- que son parte del <a href="https://material.io/icons/">conjunto de iconos de Android Material</a>
+ que son parte del <a href="https://fonts.google.com/icons">conjunto de iconos de Android Material</a>
y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
- El texto completo de la licencia se muestra abajo. Copyright de modificaciones © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ El texto completo de la licencia se muestra abajo. Copyright de modificaciones 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Las imágenes resultante se liberan bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><img class="left" src="../images/insecure.svg"> <img class="left" src="../images/insecure_notification.svg"/> derivan de <code>security</code> y <code>warning_amber_rounded</code>,
- que son parte del <a href="https://material.io/icons/">conjunto de iconos de Android Material</a>
+ que son parte del <a href="https://fonts.google.com/icons">conjunto de iconos de Android Material</a>
y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
- Copyright de modificaciones © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Copyright de modificaciones 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Las imágenes resultantes se liberan bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated.svg"/> <img class="left" src="../images/antiquated_notification.svg"/> derivan de <code>security</code> y <code>do_not_disturb</code>,
- que son parte del <a href="https://material.io/icons/">conjunto de iconos de Android Material</a>
+ que son parte del <a href="https://fonts.google.com/icons">conjunto de iconos de Android Material</a>
y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
- Copyright de modificaciones © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Copyright de modificaciones 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Las imágenes resultantes se liberan bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated_3g.svg"/> se deriva de <code>security</code> y <code>3g_mobiledata_rounded</code>,
- que son parte del <a href="https://material.io/icons/">conjunto de iconos de Android Material</a>
+ que son parte del <a href="https://fonts.google.com/icons">conjunto de iconos de Android Material</a>
y son liberados bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licencia Apache 2.0</a>.
- Copyright de modificaciones © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Copyright de modificaciones 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
La imagen resultante se libera bajo la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licencia GPLv3+</a>.</p>
- <p>Los siguientes iconos vienen del <a href="https://material.io/icons/">conjunto de iconos de Android Material</a>,
+ <p>Los siguientes iconos vienen del <a href="https://fonts.google.com/icons">conjunto de iconos de Android Material</a>,
que se liberan bajo la <a href ="https://www.apache.org/licenses/LICENSE-2.0">licencia Apache 2.0</a>.
No se han modificado, salvo la información sobre el diseño, como el color y el tamaño. Algunos de ellos han sido renombrados para que coincidan con su uso en el código.
Los iconos y nombres originales se muestran a continuación.</p>
<p><svg class="icon"><use href="../images/format_list_bulleted_rounded.svg#icon"/></svg> format_list_bulleted_rounded.</p>
<p><svg class="icon"><use href="../images/forum_rounded.svg#icon"/></svg> forum_rounded.</p>
<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/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</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>
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>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Jose A. León. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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_<wbr>PHONE_<wbr>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>Allows Privacy Cell to display a realtime monitoring notification icon in the status bar.</p>
+ <h3>Mostrar notificaciones</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#POST_NOTIFICATIONS">android.permission.<wbr>POST_<wbr>NOTIFICATIONS</a></p>
+ <p>Permite a Privacy Cell mostrar un icono de notificación de supervisión en tiempo real en la barrra de estado.</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>Allows Privacy Cell to enable the realtime monitoring service when the phone boots.</p>
+ <h3>Ejecutar servicio en primer plano</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE</a></p>
+ <p>Permite a Privacy Cell actualizar el icono de notificación de supervisión cuando la aplicación no está en primer plano.</p>
+
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE_SPECIAL_USE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE_<wbr>SPECIAL_<wbr>USE</a></p>
+ <p>Especifica el tipo de servicio en primer plano.
+ El uso especial es para servicios que no encajan en ninguna de las <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required">categorías estándar</a>.</p>
+
+ <h3>Ejecutar al inicio</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_<wbr>BOOT_<wbr>COMPLETED</a></p>
+ <p>Permite a Privacy Cell activar el servicio de monitorización en tiempo real al arrancar el teléfono.</p>
+
+ <h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">com.stoutner.privacycell.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
+ <p>Se añade automáticamente a todas las aplicaciones con API >= 33 (Android 13) para impedir que otras aplicaciones se conecten a receptores dinámicos sin permiso explícito.</p>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021-2022 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <h3>1.7 (version de code 8)</h3>
- <p>24 March 2022 - API minimum 30, API cible 31</p>
+ <h3>1.10 (version du code 12)</h3>
+ <p>30 Octobre 2023 - API minimale : 30, API optimale : 34</p>
<ul>
- <li>Add a warning when connecting to <a href="https://redmine.stoutner.com/issues/795">older, insecure networks</a>.</li>
- <li>Add a <a href="https://redmine.stoutner.com/issues/774">protocols activity</a>.</li>
+ <li>Create an optional <a href="https://redmine.stoutner.com/issues/988">monochrome icon</a> (can be used in Android >= 13).</li>
+ <li>Allow Privacy Cell to be included in <a href="https://redmine.stoutner.com/issues/1001">system backups</a>.</li>
+ <li>Bump the <a href="https://redmine.stoutner.com/issues/1104">target API to 34</a> (Android 14).</li>
+ <li>Document <a href="https://redmine.stoutner.com/issues/940">permissions needed</a> for <a href="https://redmine.stoutner.com/issues/942">newer versions of Android</a>.</li>
+ <li>Repopulate the realtime monitoring notification every <a href="https://redmine.stoutner.com/issues/1105">15 minutes</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-9/">1.9</a> (version du code 11)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=53f5dd586d2e9eb38280648b9084db15163fe682">5 Décembre 2022</a> - API minimale : 30, API optimale : 33</p>
+ <ul>
+ <li>Passage de <a href="https://redmine.stoutner.com/issues/890">l'API cible à 33</a> (Android 13).</li>
+ <li>Désactivation <a href="https://redmine.stoutner.com/issues/894">du glissement pour rejeter </a> la notification de surveillance en temps réel sur Android 13.</li>
+ <li>Activation <a href="https://redmine.stoutner.com/issues/935">du support de la langue par application</a> sur Android 13.</li>
+ <li>Conservation de <a href="https://redmine.stoutner.com/issues/913">l'emplacement du défilement des paramètres </a>au redémarrage.</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/">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>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 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>Passage <a href="https://redmine.stoutner.com/issues/827">de l'API cible à 32</a> (Android 12L).</li>
+ <li>Première traduction allemande complète réalisée par Bernhard G. Keller.</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 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 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>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<p><a href="https://en.wikipedia.org/wiki/CDMA2000#1X">1 times Radio Transmission Technology</a> (1xRTT) est la première version du standard
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000), qui est une évolution 3G du standard 2G
<a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne).
- C'est un concurrent à <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
+ C'est un concurrent à <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<body>
<p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) est une évolution 3.5G du standard 3G
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- C'est un concurrent du protocole <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).
+ C'est un concurrent du protocole <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized release A</a> (EVDO_A) est la deuxième version du standard EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized revision A</a> (EVDO_A) est la deuxième version du standard EVDO,
qui est une évolution 3.5G du standard 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- C'est un concurrent du protocole <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).
+ C'est un concurrent du protocole <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized release B</a> (EVDO_B) est la troisième version du standard EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized revision B</a> (EVDO_B) est la troisième version du standard EVDO,
qui est une évolution 3.5G du standard 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- C'est un concurrent du protocole <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP).
+ C'est un concurrent du protocole <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<body>
<p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> est le protocole 5G principal.
Il s'agit du successeur de la 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE).
- Il s'agit du premier protocole sans fil à inclure généralement la génération (5G) dans son nom.
- </p>
+ Il s'agit du premier protocole sans fil à inclure généralement la génération (5G) dans son nom.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
Translation 2021-2022 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<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-2023 <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.
<h3>Icônes</h3>
<p><img class="left" src="../images/secure.svg"/> <img class="left" src="../images/secure_notification.svg"/> sont dérivés de <code>security</code> et de <code>5g</code>,
- qui font partie de l'ensemble d'icônes <a href="https://material.io/icons/">Android Material</a>
+ qui font partie de l'ensemble d'icônes <a href="https://fonts.google.com/icons">Android Material</a>
et sont publiés sous la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
- Le texte intégral de la licence est ci-dessous. Les modifications font l'objet d'un copyright © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Le texte intégral de la licence est ci-dessous. Les modifications font l'objet d'un copyright 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Les images résultantes sont publiées sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><img class="left" src="../images/insecure.svg"> <img class="left" src="../images/insecure_notification.svg"/> sont dérivés de <code>security</code> et de <code>warning_amber_rounded</code>,
- qui font partie de l'ensemble d'icônes <a href="https://material.io/icons/">Android Material</a>
+ qui font partie de l'ensemble d'icônes <a href="https://fonts.google.com/icons">Android Material</a>
et sont publiés sous la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
- Les modifications font l'objet d'un copyright © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Les modifications font l'objet d'un copyright 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Les images résultantes sont publiées sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated.svg"/> <img class="left" src="../images/antiquated_notification.svg"/> sont dérivés de <code>security</code> et de <code>do_not_disturb</code>,
- qui font partie de l'ensemble d'icônes <a href="https://material.io/icons/">Android Material</a>
+ qui font partie de l'ensemble d'icônes <a href="https://fonts.google.com/icons">Android Material</a>
et sont publiés sous la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
- Les modifications font l'objet d'un copyright © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Les modifications font l'objet d'un copyright 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Les images résultantes sont publiées sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated_3g.svg"/> est un dérivé de <code>security</code> et de <code>3g_mobiledata_rounded</code>,
- qui font partie de l'ensemble d'icônes <a href="https://material.io/icons/">Android Material</a>
+ qui font partie de l'ensemble d'icônes <a href="https://fonts.google.com/icons">Android Material</a>
et sont publiés sous la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>.
- Les modifications font l'objet d'un copyright © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ Les modifications font l'objet d'un copyright 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'image résultante est publiée sous la <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3+</a>.</p>
- <p>Les icônes suivantes proviennent de l'ensemble d'icônes <a href="https://material.io/icons/">Android Material</a>,
+ <p>Les icônes suivantes proviennent de l'ensemble d'icônes <a href="https://fonts.google.com/icons">Android Material</a>,
qui sont publiées sous la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licence Apache 2.0</a>.
Elles sont inchangés, à l'exception des informations de mise en page comme la couleur et la taille. Certaines d'entre elles ont été renommées pour correspondre à leur utilisation dans le code.
Les icônes et les noms originaux sont présentés ci-dessous.</p>
<p><svg class="icon"><use href="../images/format_list_bulleted_rounded.svg#icon"/></svg> format_list_bulleted_rounded.</p>
<p><svg class="icon"><use href="../images/forum_rounded.svg#icon"/></svg> forum_rounded.</p>
<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/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</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>
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>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Kévin L. <kevinliste@framalistes.org>. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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_<wbr>PHONE_<wbr>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>
+ <h3>Show Notifications</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#POST_NOTIFICATIONS">android.permission.<wbr>POST_<wbr>NOTIFICATIONS</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écuter un service en premier plan</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE</a></p>
+ <p>Allows Privacy Cell to update the realtime monitoring notification icon when the app is not in the foreground.</p>
+
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE_SPECIAL_USE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE_<wbr>SPECIAL_<wbr>USE</a></p>
+ <p>Specifies the type of foreground service.
+ Special Use is for services that don't fit into any of the <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required">standard categories</a>.</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_<wbr>BOOT_<wbr>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>
+
+ <h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">com.stoutner.privacycell.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
+ <p>Ajout automatique à toutes les applications ciblant l'API >= 33 (Android 13) pour empêcher les autres applications de se connecter aux destinataires dynamiques sans autorisation explicite.</p>
</body>
-</html>
\ No newline at end of file
+</html>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
-<!--
- This file is a modified version of `list_alt_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.
-
- 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 24 24"
- id="icon" >
-
- <path
- d="M12 9h4c.55 0 1-.45 1-1s-.45-1-1-1h-4c-.55 0-1 .45-1 1s.45 1 1 1zm0 4h4c.55 0 1-.45 1-1s-.45-1-1-1h-4c-.55 0-1 .45-1 1s.45 1 1 1zm0 4h4c.55 0 1-.45 1-1s-.45-1-1-1h-4c-.55 0-1 .45-1 1s.45 1 1 1zM7 7h2v2H7zm0 4h2v2H7zm0 4h2v2H7zM20 3H4c-.55 0-1 .45-1 1v16c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zm-1 16H5V5h14v14z" />
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!--
+ This file is a modified version of `list_alt_rounded_24`, 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 24 24"
+ id="icon" >
+
+ <path
+ d="M5 21q-.825 0-1.413-.587Q3 19.825 3 19V5q0-.825.587-1.413Q4.175 3 5 3h14q.825 0 1.413.587Q21 4.175 21 5v14q0 .825-.587 1.413Q19.825 21 19 21Zm0-2h14V5H5v14Zm3-2q.425 0 .713-.288Q9 16.425 9 16t-.287-.713Q8.425 15 8 15t-.713.287Q7 15.575 7 16t.287.712Q7.575 17 8 17Zm0-4q.425 0 .713-.288Q9 12.425 9 12t-.287-.713Q8.425 11 8 11t-.713.287Q7 11.575 7 12t.287.712Q7.575 13 8 13Zm0-4q.425 0 .713-.288Q9 8.425 9 8t-.287-.713Q8.425 7 8 7t-.713.287Q7 7.575 7 8t.287.712Q7.575 9 8 9Zm4 8h4q.425 0 .712-.288Q17 16.425 17 16t-.288-.713Q16.425 15 16 15h-4q-.425 0-.712.287Q11 15.575 11 16t.288.712Q11.575 17 12 17Zm0-4h4q.425 0 .712-.288Q17 12.425 17 12t-.288-.713Q16.425 11 16 11h-4q-.425 0-.712.287Q11 11.575 11 12t.288.712Q11.575 13 12 13Zm0-4h4q.425 0 .712-.288Q17 8.425 17 8t-.288-.713Q16.425 7 16 7h-4q-.425 0-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9ZM5 19V5v14Z" />
+</svg>
--- /dev/null
+<?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>
<!--
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>.
<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>
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021-2022 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <h3>1.7 (versione codice 8)</h3>
- <p>24 Marzo 2022 - minima API 30, target API 31</p>
+ <h3>1.10 (versione codice 12)</h3>
+ <p>30 Ottobre 2023 - minima API 30, target API 34</p>
+ <ul>
+ <li>Create an optional <a href="https://redmine.stoutner.com/issues/988">monochrome icon</a> (can be used in Android >= 13).</li>
+ <li>Allow Privacy Cell to be included in <a href="https://redmine.stoutner.com/issues/1001">system backups</a>.</li>
+ <li>Bump the <a href="https://redmine.stoutner.com/issues/1104">target API to 34</a> (Android 14).</li>
+ <li>Document <a href="https://redmine.stoutner.com/issues/940">permissions needed</a> for <a href="https://redmine.stoutner.com/issues/942">newer versions of Android</a>.</li>
+ <li>Repopulate the realtime monitoring notification every <a href="https://redmine.stoutner.com/issues/1105">15 minutes</a>.</li>
+ <li>Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-9/">1.9</a> (versione codice 11)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=53f5dd586d2e9eb38280648b9084db15163fe682">5 Dicembre 2022</a> - minima API 30, target API 33</p>
+ <ul>
+ <li>Modifica della <a href="https://redmine.stoutner.com/issues/890">target API a 33</a> (Android 13).</li>
+ <li>Disabilitata la possibilità di <a href="https://redmine.stoutner.com/issues/894">effettuare lo swipe per eliminare</a> la notifica di monitoraggio in tempo reale su Android 13.</li>
+ <li>Abilitato il <a href="https://redmine.stoutner.com/issues/935">supporto della lingua per-app</a> su Android 13.</li>
+ <li>Mantenimento della <a href="https://redmine.stoutner.com/issues/913">posizione dello scorrimento delle impostazioni</a> al riavvio.</li>
+ <li>Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.</li>
+ </ul>
+
+ <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>
+ <li>Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (versione codice 9)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14 Giugno 2022</a> - minima API 30, target API 32</p>
+ <ul>
+ <li>Incluso lo <a href="https://redmine.stoutner.com/issues/851">stato della rete voce</a> nella determinazione della sicurezza complessiva della rete.</li>
+ <li>Correzione di un baco che talvolta <a href="https://redmine.stoutner.com/issues/850">impediva di disabilitare le notifiche</a>.</li>
+ <li>Spostamento della <a href="https://redmine.stoutner.com/issues/827">target API a 32</a> (Android 12L).</li>
+ <li>Prima traduzione completa in lingua tedesca fornita da Bernhard G. Keller.</li>
+ <li>Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (versione codice 8)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24 Marzo 2022</a> - minima API 30, target API 31</p>
<ul>
<li>Aggiunta di un avviso nel caso in cui ci si connetta a <a href="https://redmine.stoutner.com/issues/795">reti più vecchie e insicure</a>.</li>
<li>Aggiunta di una <a href="https://redmine.stoutner.com/issues/774">scheda relativa ai protocolli</a>.</li>
<li>Primo rilascio.</li>
</ul>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<p><a href="https://en.wikipedia.org/wiki/CDMA2000#1X">1 times Radio Transmission Technology</a> (1xRTT) è la prima versione dello standard
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000), che è il primo aggiornamento 3G del vecchio protocollo 2G
<a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne).
- E' il concorrente del protocollo <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
+ E' il concorrente del protocollo <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<body>
<p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) è una evoluzione 3.5G dello standard 3G
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- E' un concorrente del protocollo <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).
+ E' un concorrente del protocollo <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized release A</a> (EVDO_A) è la seconda release dello standard EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized revision A</a> (EVDO_A) è la seconda release dello standard EVDO,
che è una evoluzione 3.5G dello standard 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- E' un concorrente del protocollo <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).
+ E' un concorrente del protocollo <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized release B</a> (EVDO_B) è la terza release dello standard EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized revision B</a> (EVDO_B) è la terza release dello standard EVDO,
che è una evoluzione 3.5G dello standard 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- E' un concorrente del protocollo <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP).
+ E' un concorrente del protocollo <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
Translation 2021 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<body>
<p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> è il protocollo principale 5G.
E' il successore del protocollo 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE).
- E' il primo protocollo wireless che contiene la generazione (in questo caso 5G) all'interno del proprio nome.
- </p>
+ E' il primo protocollo wireless che contiene la generazione (in questo caso 5G) all'interno del proprio nome.</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
Translation 2021-2022 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
<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-2023 <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.
<h3>Icone</h3>
<p><img class="left" src="../images/secure.svg"/> <img class="left" src="../images/secure_notification.svg"/> sono derivate da <code>security</code> e <code>5g</code>,
- che sono parte del <a href="https://material.io/icons/">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
- Il testo completo della licenza è riportato qui sotto. Il copyright delle modifiche © 2016, 2021-2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ che sono parte del <a href="https://fonts.google.com/icons">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ Il testo completo della licenza è riportato qui sotto. Il copyright delle modifiche 2016, 2021-2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Le immagini risultanti sono rilasciate sotto la <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><img class="left" src="../images/insecure.svg"> <img class="left" src="../images/insecure_notification.svg"/> sono derivate da <code>security</code> e <code>warning_amber_rounded</code>,
- che sono parte del <a href="https://material.io/icons/">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
- Il copyright delle modifiche © 2016, 2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ che sono parte del <a href="https://fonts.google.com/icons">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ Il copyright delle modifiche 2016, 2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Le immagini risultanti sono rilasciate sotto la <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated.svg"/> <img class="left" src="../images/antiquated_notification.svg"/> sono derivate da <code>security</code> e <code>do_not_disturb</code>,
- che sono parte del <a href="https://material.io/icons/">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
- Il copyright delle modifiche © 2016, 2021-2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ che sono parte del <a href="https://fonts.google.com/icons">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ Il copyright delle modifiche 2016, 2021-2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Le immagini risultanti sono rilasciate sotto la <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated_3g.svg"/> è derivata da <code>security</code> e <code>3g_mobiledata_rounded</code>,
- che sono parte del <a href="https://material.io/icons/">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
- Il copyright delle modifiche © 2016, 2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ che sono parte del <a href="https://fonts.google.com/icons">set di icone Android Material</a> e sono rilasciate sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
+ Il copyright delle modifiche 2016, 2022 appartiene a <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
L'immagine risultante è rilasciata sotto la <a href="https://www.gnu.org/licenses/gpl-3.0.html">Licenza GPLv3+</a>.</p>
- <p>Le icone seguenti provengono dal <a href="https://material.io/icons/">set di icone Android Material</a>,
+ <p>Le icone seguenti provengono dal <a href="https://fonts.google.com/icons">set di icone Android Material</a>,
che è rilasciato sotto la <a href ="https://www.apache.org/licenses/LICENSE-2.0">Licenza Apache 2.0</a>.
Non sono state modificate ad eccezione delle informazioni del layout come il colore e le dimensioni. Alcune sono state rinominate per essere coerenti con il loro utilizzo nel codice.
Le icone originali e i loro nomi sono riportate di seguito.</p>
<p><svg class="icon"><use href="../images/format_list_bulleted_rounded.svg#icon"/></svg> format_list_bulleted_rounded.</p>
<p><svg class="icon"><use href="../images/forum_rounded.svg#icon"/></svg> forum_rounded.</p>
<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/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</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>
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>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
- Translation 2021 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
+ Translation 2021-2023 Francesco Buratti. Copyright assigned to Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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_<wbr>PHONE_<wbr>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>Allows Privacy Cell to display a realtime monitoring notification icon in the status bar.</p>
+ <h3>Mostra notifiche</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#POST_NOTIFICATIONS">android.permission.<wbr>POST_<wbr>NOTIFICATIONS</a></p>
+ <p>Permette a Privacy Cell di mostrare una icona di notifica di monitoraggio in tempo reale nella barra di stato.</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>Allows Privacy Cell to enable the realtime monitoring service when the phone boots.</p>
+ <h3>Esegui il servizio in primo piano</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE</a></p>
+ <p>Permette a Privacy Cell di aggiornare licona di notifica di monitoraggio in tempo reale anche quando la app non è in primo piano.</p>
+
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE_SPECIAL_USE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE_<wbr>SPECIAL_<wbr>USE</a></p>
+ <p>Specifica il tipo di servizio in primo piano.
+ L'utilizzo speciale è per i servizi che non ricadono in nessuna delle <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required">categorie standard</a>.</p>
+
+ <h3>Esegui all'avvio</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#RECEIVE_BOOT_COMPLETED">android.permission.<wbr>RECEIVE_<wbr>BOOT_<wbr>COMPLETED</a></p>
+ <p>Permette a Privacy Cell di abilitare il servizio di monitoraggio in tempo reale durante l'avvio del dispositivo.</p>
+
+ <h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">com.stoutner.privacycell.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
+ <p>Aggiunta automaticamente a tutte le App che hanno come target API >= 33 (Android 13) per impedire ad altre App di connettersi ai ricevitori dinamici senza una autorizzazione esplicita.</p>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
</head>
<body>
- <h3>1.7 (код версии 8)</h3>
- <p>24 мая 2022 года - минимальный API 30, целевой API 31</p>
+ <h3>1.10 (код версии 12)</h3>
+ <p>30 октября 2023 года - минимальный API 30, целевой API 34</p>
+ <ul>
+ <li>Создан дополнительный <a href="https://redmine.stoutner.com/issues/988">монохромный значок</a> (может использоваться в Android >= 13).</li>
+ <li>Разрешено включать Privacy Cell в <a href="https://redmine.stoutner.com/issues/1001">системные резервные копии</a>.</li>
+ <li>Целевой API <a href="https://redmine.stoutner.com/issues/1104">повышен до 34</a> (Android 14).</li>
+ <li>Документированы <a href="https://redmine.stoutner.com/issues/940">необходимые разрешения</a> для <a href="https://redmine.stoutner.com/issues/942">новых версий Android</a>.</li>
+ <li>Повторное формирование уведомления о мониторинге в реальном времени каждые <a href="https://redmine.stoutner.com/issues/1105">15 минут</a>.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-9/">1.9</a> (код версии 11)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=53f5dd586d2e9eb38280648b9084db15163fe682">5 декабря 2022 года</a> - минимальный API 30, целевой API 33</p>
+ <ul>
+ <li>Целевой API <a href="https://redmine.stoutner.com/issues/890">повышен до 33</a> (Android 13).</li>
+ <li>Отключен <a href="https://redmine.stoutner.com/issues/894">свайп уведомления</a> о мониторинге в реальном времени на Android 13.</li>
+ <li>Включена <a href="https://redmine.stoutner.com/issues/935">поддержка языков для каждого приложения</a> на Android 13.</li>
+ <li>При перезапуске <a href="https://redmine.stoutner.com/issues/913">сохраняется положение прокрутки</a> настроек.</li>
+ <li>Первый полный перевод на русский язык.</li>
+ </ul>
+
+ <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>
+ <li>Первый полный перевод на русский язык.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-8/">1.8</a> (код версии 9)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=f60b140868c2f0d564657e96d48508b4fbdc546b">14 июня 2022 года</a> - минимальный API 30, целевой API 32</p>
+ <ul>
+ <li>Теперь при определении общей безопасности сотовой сети <a href="https://redmine.stoutner.com/issues/851">будет учитываться статус голосовой сети</a>.</li>
+ <li>Исправлена ошибка, из-за которой иногда <a href="https://redmine.stoutner.com/issues/850">не удавалось отключить уведомления</a>.</li>
+ <li>Повышен <a href="https://redmine.stoutner.com/issues/827">целевой API до 32</a> (Android 12L).</li>
+ <li>Первый полный перевод на немецкий язык, выполненный Бернхардом Г. Келлером (Bernhard G. Keller).</li>
+ <li>Первый полный перевод на русский язык.</li>
+ </ul>
+
+ <h3><a href="https://www.stoutner.com/privacy-cell-1-7/">1.7</a> (код версии 8)</h3>
+ <p><a href="https://gitweb.stoutner.com/?p=PrivacyCell.git;a=commitdiff;h=b11b84b24c660fac3a69f2dbe4bd615d73811219">24 мая 2022 года</a> - минимальный API 30, целевой API 31</p>
<ul>
<li>Добавлено предупреждение при подключении к <a href="https://redmine.stoutner.com/issues/795">устаревшим, небезопасным сетям</a>.</li>
<li>Добавлена <a href="https://redmine.stoutner.com/issues/774">опция протоколирования</a>.</li>
<li>Первый релиз.</li>
</ul>
</body>
-</html>
\ No newline at end of file
+</html>
<!--
- 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>.
<p><a href="https://en.wikipedia.org/wiki/CDMA2000#1X">1 times Radio Transmission Technology</a> (1xRTT) - это первая версия стандарта
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000), который является обновлением стандарта 3G более старого стандарта 2G
<a href="https://en.wikipedia.org/wiki/CdmaOne">Code-Division Multiple Access One</a> (CDMAOne).
- Он является конкурентом <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).
+ Он является конкурентом <a href="https://en.wikipedia.org/wiki/UMTS">Universal Mobile Telecommunications System</a> (UMTS).</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
<body>
<p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rel._0_(TIA-856_Release_0)">Evolution-Data Optimized release 0</a> (EVDO_0) - это развитие стандарта 3G в стандарт 3.5G
<a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- Он является конкурентом <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).
+ Он является конкурентом <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized release A</a> (EVDO_A) - это вторая версия стандарта EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._A_(TIA-856_Revision_A)">Evolution-Data Optimized revision A</a> (EVDO_A) - это вторая версия стандарта EVDO,
который является развитием стандарта 3.5G из 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- Он является конкурентом <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).
+ Он является конкурентом <a href="https://en.wikipedia.org/wiki/High_Speed_Packet_Access">High Speed Packet Access</a> (HSPA).</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
</head>
<body>
- <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized release B</a> (EVDO_B) - это третий релиз стандарта EVDO,
+ <p><a href="https://en.wikipedia.org/wiki/Evolution-Data_Optimized#EV-DO_Rev._B_(TIA-856_Revision_B)">Evolution-Data Optimized revision B</a> (EVDO_B) - это третий релиз стандарта EVDO,
который является развитием стандарта 3.5G из 3G <a href="https://en.wikipedia.org/wiki/CDMA2000">Code-Division Multiple Access 2000</a> (CDMA2000).
- Он является конкурентом <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP).
+ Он является конкурентом <a href="https://en.wikipedia.org/wiki/Evolved_High_Speed_Packet_Access">High Speed Packet Access Plus</a> (HSPAP).</p>
</body>
</html>
\ No newline at end of file
<!--
- 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>.
<body>
<p><a href="https://en.wikipedia.org/wiki/5G_NR">5G New Radio</a> это основной протокол 5G.
Он является преемником 4G <a href="https://en.wikipedia.org/wiki/LTE_(telecommunication)">Long-Term Evolution</a> (LTE).
- Это первый протокол беспроводной связи, в названии которого присутствует слово "поколение" (5G).
- </p>
+ Это первый протокол беспроводной связи, в названии которого присутствует слово "поколение" (5G).</p>
</body>
</html>
\ No newline at end of file
<!--
- Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<body>
<h3>Авторские права</h3>
- <p>Авторские права Privacy Cell © 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.</p>
+ <p>Авторские права Privacy Cell 2021-2023 <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>. Полный текст лицензии приведен ниже.
<h3>Значки</h3>
<p><img class="left" src="../images/secure.svg"/> <img class="left" src="../images/secure_notification.svg"/> являются производными от <code>security</code> и <code>5g</code>,
- которые являются частью набора значков <a href="https://material.io/icons/">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
- Полный текст лицензии приведен ниже. Модификации авторских прав © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ которые являются частью набора значков <a href="https://fonts.google.com/icons">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
+ Полный текст лицензии приведен ниже. Модификации авторских прав 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Получившиеся изображения выпускаются под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><img class="left" src="../images/insecure.svg"> <img class="left" src="../images/insecure_notification.svg"/> являются производными от <code>security</code> и <code>warning_amber_rounded</code>,
- которые являются частью набора значков <a href="https://material.io/icons/">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
- Модификации авторских прав © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ которые являются частью набора значков <a href="https://fonts.google.com/icons">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
+ Модификации авторских прав 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Получившиеся изображения выпускаются под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated.svg"/> <img class="left" src="../images/antiquated_notification.svg"/> являются производными от <code>security</code> и <code>do_not_disturb</code>,
- которые являются частью набора значков <a href="https://material.io/icons/">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
- Модификации авторских прав © 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ которые являются частью набора значков <a href="https://fonts.google.com/icons">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
+ Модификации авторских прав 2016, 2021-2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Получившиеся изображения выпускаются под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
<p><img class="left" src="../images/antiquated_3g.svg"/> является производной от <code>security</code> и <code>3g_mobiledata_rounded</code>,
- которые являются частью набора значков <a href="https://material.io/icons/">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
- Модификации авторских прав © 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
+ которые являются частью набора значков <a href="https://fonts.google.com/icons">Android Material</a> и выпущены под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
+ Модификации авторских прав 2016, 2022 <a href="mailto:soren@stoutner.com">Soren Stoutner</a>.
Получившееся изображение выпускается под <a href="https://www.gnu.org/licenses/gpl-3.0.html">лицензией GPLv3+</a>.</p>
- <p>Следующие значки взяты из набора значков <a href="https://material.io/icons/">Android Material</a>,
+ <p>Следующие значки взяты из набора значков <a href="https://fonts.google.com/icons">Android Material</a>,
который выпущен под <a href ="https://www.apache.org/licenses/LICENSE-2.0">лицензией Apache 2.0</a>.
Они не изменились, за исключением информации о макете, такой как цвет и размер. Некоторые из них были переименованы, чтобы обеспечить их соответствие использованию в коде.
Оригинальные значки и их названия показаны ниже.</p>
<p><svg class="icon"><use href="../images/format_list_bulleted_rounded.svg#icon"/></svg> format_list_bulleted_rounded.</p>
<p><svg class="icon"><use href="../images/forum_rounded.svg#icon"/></svg> forum_rounded.</p>
<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/list_alt_rounded_24.svg#icon"/></svg> list_alt_rounded_24.</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>
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>
<!--
- Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
<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_<wbr>PHONE_<wbr>STATE</a></p>
<p>Необходим для определения используемых протоколов в сети сотовой связи.</p>
- <h3>Ð\97апÑ\83Ñ\81к Ñ\84оновой Ñ\81лÑ\83жбÑ\8b</h3>
- <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission. FOREGROUND_SERVICE</a></p>
+ <h3>Ð\9eÑ\82обÑ\80ажение Ñ\83ведомлений</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission.html#POST_NOTIFICATIONS">android.permission.<wbr>POST_<wbr>NOTIFICATIONS</a></p>
<p>Разрешает Privacy Cell отображать значок уведомления о мониторинге в реальном времени в строке состояния.</p>
+ <h3>Запуск фоновой службы</h3>
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE</a></p>
+ <p>Разрешает Privacy Cell обновлять значок уведомления о мониторинге в реальном времени при работе приложения в фоновом режиме.</p>
+
+ <p><a href="https://developer.android.com/reference/android/Manifest.permission#FOREGROUND_SERVICE_SPECIAL_USE">android.permission.<wbr>FOREGROUND_<wbr>SERVICE_<wbr>SPECIAL_<wbr>USE</a></p>
+ <p>Определяет тип сервиса фонового режима.
+ Специальное использование предназначено для сервисов, которые не соответствуют ни одной из
+ <a href="https://developer.android.com/about/versions/14/changes/fgs-types-required">стандартных категорий</a>.</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_<wbr>BOOT_<wbr>COMPLETED</a></p>
<p>Разрешает Privacy Cell включать службу мониторинга в реальном времени при загрузке телефона.</p>
+
+ <h3><a href="https://developer.android.com/about/versions/13/features#runtime-receivers">com.stoutner.privacycell.<wbr>DYNAMIC_<wbr>RECEIVER_<wbr>NOT_<wbr>EXPORTED_<wbr>PERMISSION</a></h3>
+ <p>Автоматически добавляется во все приложения, использующие API >= 33 (Android 13) для предотвращения подключения других приложений к динамическим приемникам без явного разрешения.</p>
</body>
-</html>
\ No newline at end of file
+</html>
/*
- * 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>.
*
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
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 {
// 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)!!
// Stop the swipe to refresh animation if it is displayed.
swipeRefreshLayout.isRefreshing = false
}
-}
\ No newline at end of file
+}
/*
- * 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>.
*
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
+
// Declare the class variables.
- private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle
private lateinit var phoneStateListener: PhoneStateListener // The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
// Declare the class views.
+ private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle
private lateinit var drawerLayout: DrawerLayout
- private lateinit var summaryTextView: TextView
+ private lateinit var overallStatusLinearLayout: LinearLayout
+ 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.
// Get handles for the views.
drawerLayout = findViewById(R.id.drawerlayout)
val toolbar = findViewById<Toolbar>(R.id.toolbar)
- val stingrayLinearLayout = findViewById<LinearLayout>(R.id.stingray_linearlayout)
- val stingrayImageView = findViewById<ImageView>(R.id.stingray_imageview)
- summaryTextView = findViewById(R.id.summary_textview)
+ overallStatusLinearLayout = findViewById(R.id.overall_status_linearlayout)
+ overallStatusImageView = findViewById(R.id.overall_status_imageview)
+ overallStatusTextView = findViewById(R.id.overall_status_textview)
val voiceNetworkLinearLayout = findViewById<LinearLayout>(R.id.voice_network_linearlayout)
val voiceNetworkTextView = findViewById<TextView>(R.id.voice_network)
val voiceNetworkDetailsTextView = findViewById<TextView>(R.id.voice_network_details)
}
})
+ // Instantiate the protocol helper.
+ val protocolHelper = ProtocolHelper()
+
// Define the phone state listener. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
phoneStateListener = object : PhoneStateListener() {
- @SuppressLint("SwitchIntDef")
- override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) {
- // Declare the stingray dialog type integer.
- val summaryDialogTypeInteger: Int
-
- // Populate the stingray security information. <https://source.android.com/devices/tech/connect/acts-5g-testing>
- if ((telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_NR) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_IWLAN) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_UNKNOWN)) { // This is a secure network.
- // Populate the image view.
- stingrayImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.secure))
-
- // Set the text.
- summaryTextView.text = getString(R.string.secure_protocols)
-
- // Set the text color.
- summaryTextView.setTextColor(getColor(R.color.blue_text))
-
- // Set the stingray dialog type integer.
- summaryDialogTypeInteger = WebViewDialog.STINGRAY
- } else if ((telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_LTE) || (!consider3gAntiquated && (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_1xRTT ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EVDO_0) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EVDO_A) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EVDO_B) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EHRPD) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_UMTS) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_TD_SCDMA) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSDPA) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSUPA) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSPA) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSPAP)))) {
- // This is an insecure network.
- // Populate the image view.
- stingrayImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.insecure))
-
- // Set the text.
- summaryTextView.text = getString(R.string.insecure_protocols)
-
- // Set the text color.
- summaryTextView.setTextColor(getColor(R.color.yellow_900))
-
- // Set the stingray dialog type integer.
- summaryDialogTypeInteger = WebViewDialog.STINGRAY
- } else { // This is an antiquated network.
- // Populate the image view.
- stingrayImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.antiquated))
-
- // Set the text.
- summaryTextView.text = getString(R.string.antiquated_protocols)
-
- // Set the text color.
- summaryTextView.setTextColor(getColor(R.color.red_text))
-
- // Set the stingray dialog type integer.
- summaryDialogTypeInteger = WebViewDialog.ANTIQUATED_NETWORK
- }
+ @Deprecated("Deprecated in Java")
+ override fun onServiceStateChanged(serviceState: ServiceState) { // Update the voice network.
+ // Get the network registration info for the voice network, which is the second of the three entries (the first appears to be Wi-Fi and the third appears to be the cell data network).
+ val networkRegistrationInfo = serviceState.networkRegistrationInfoList[1]
- // Get the strings that correspond to the network information.
- val dataNetworkType = getNetworkType(telephonyDisplayInfo.networkType)
- val additionalNetworkInfo = getAdditionalNetworkInfo(telephonyDisplayInfo.overrideNetworkType)
+ // Get the voice network type int.
+ val voiceNetworkTypeInt = networkRegistrationInfo.accessNetworkTechnology
- // Populate the data network text views.
- dataNetworkTextView.text = getString(R.string.data_network, dataNetworkType[0])
- dataNetworkDetailsTextView.text = dataNetworkType[1]
- additionalNetworkInfoTextView.text = getString(R.string.additional_network_info, additionalNetworkInfo[0])
- additionalNetworkInfoDetailsTextView.text = additionalNetworkInfo[1]
+ // Get the voice network security status.
+ voiceNetworkSecurityStatus = protocolHelper.checkNetwork(voiceNetworkTypeInt, consider3gAntiquated)
- // Set the stingray click listener.
- stingrayLinearLayout.setOnClickListener {
- // Instantiate the stingray dialog fragment.
- val stingrayDialogFragment = WebViewDialog().type(summaryDialogTypeInteger)
+ // Get the voice network type.
+ val voiceNetworkStringArray = protocolHelper.getNetworkTypeStringArray(voiceNetworkTypeInt, applicationContext)
- // Show the alert dialog.
- stingrayDialogFragment.show(supportFragmentManager, getString(R.string.stingrays))
+ // Populate the voice network text views.
+ voiceNetworkTextView.text = getString(R.string.voice_network, voiceNetworkStringArray[0])
+ voiceNetworkDetailsTextView.text = voiceNetworkStringArray[1]
+
+ // Set the color of the voice network.
+ when (voiceNetworkSecurityStatus) {
+ ProtocolHelper.SECURE -> voiceNetworkTextView.setTextColor(getColor(R.color.blue_text))
+ ProtocolHelper.INSECURE -> voiceNetworkTextView.setTextColor(getColor(R.color.yellow_text))
+ ProtocolHelper.ANTIQUATED -> voiceNetworkTextView.setTextColor(getColor(R.color.red_text))
}
- // Set the data network click listener.
- dataNetworkLinearLayout.setOnClickListener {
- // Instantiate the data network dialog fragment according to the network type.
- val dataNetworkDialogFragment = when (telephonyDisplayInfo.networkType) {
+ // Set the voice network click listener.
+ voiceNetworkLinearLayout.setOnClickListener {
+ // Instantiate the voice network dialog fragment according to the network type.
+ val voiceNetworkDialogFragment = when (voiceNetworkTypeInt) {
TelephonyManager.NETWORK_TYPE_UNKNOWN -> WebViewDialog().type(WebViewDialog.NETWORK_UNKNOWN)
TelephonyManager.NETWORK_TYPE_GPRS -> WebViewDialog().type(WebViewDialog.NETWORK_GPRS)
TelephonyManager.NETWORK_TYPE_EDGE -> WebViewDialog().type(WebViewDialog.NETWORK_EDGE)
}
// Show the alert dialog.
- dataNetworkDialogFragment.show(supportFragmentManager, getString(R.string.voice_network))
+ voiceNetworkDialogFragment.show(supportFragmentManager, getString(R.string.voice_network))
}
- // Set the additional network info click listener.
- additionalNetworkInfoLinearLayout.setOnClickListener {
- // Instantiate the initial network info dialog fragment according to the network type.
- val additionalNetworkInfoDialogFragment = when (telephonyDisplayInfo.overrideNetworkType) {
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NONE)
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_LTE_CA)
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_LTE_ADVANCED_PRO)
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NR_NSA)
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NR_NSA_MMWAVE) // Can be removed once the minimum API >= 31.
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NR_ADVANCED)
- else -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NONE)
- }
-
- // Show the alert dialog.
- additionalNetworkInfoDialogFragment.show(supportFragmentManager, getString(R.string.voice_network))
- }
+ // Populate the overall security status.
+ populateOverallSecurityStatus()
}
- override fun onServiceStateChanged(serviceState: ServiceState) {
- // Get the network registration info for the voice network, which is the second of the three entries (the first appears to be Wi-Fi and the third appears to be the cell data network).
- val networkRegistrationInfo = serviceState.networkRegistrationInfoList[1]
+ @Deprecated("Deprecated in Java")
+ @SuppressLint("SwitchIntDef")
+ override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) { // Update the data network.
+ // Get the network type integers. <https://source.android.com/devices/tech/connect/acts-5g-testing>
+ val dataNetworkTypeInt = telephonyDisplayInfo.networkType
+ val additionalNetworkInfoTypeInt = telephonyDisplayInfo.overrideNetworkType
- // Get the voice network type.
- val voiceNetworkType = getNetworkType(networkRegistrationInfo.accessNetworkTechnology)
+ // Get the data network security status.
+ dataNetworkSecurityStatus = protocolHelper.checkNetwork(dataNetworkTypeInt, consider3gAntiquated)
- // Populate the voice network text views.
- voiceNetworkTextView.text = getString(R.string.voice_network, voiceNetworkType[0])
- voiceNetworkDetailsTextView.text = voiceNetworkType[1]
+ // Get the strings that correspond to the network information.
+ val dataNetworkStringArray = protocolHelper.getNetworkTypeStringArray(dataNetworkTypeInt, applicationContext)
+ val additionalNetworkInfoStringArray = protocolHelper.getAdditionalNetworkInfoStringArray(additionalNetworkInfoTypeInt, applicationContext)
- // Set the voice network click listener.
- voiceNetworkLinearLayout.setOnClickListener {
- // Instantiate the voice network dialog fragment according to the network type.
- val voiceNetworkDialogFragment = when (networkRegistrationInfo.accessNetworkTechnology) {
+ // Populate the data network text views.
+ dataNetworkTextView.text = getString(R.string.data_network, dataNetworkStringArray[0])
+ dataNetworkDetailsTextView.text = dataNetworkStringArray[1]
+ additionalNetworkInfoTextView.text = getString(R.string.additional_network_info, additionalNetworkInfoStringArray[0])
+ additionalNetworkInfoDetailsTextView.text = additionalNetworkInfoStringArray[1]
+
+ // Set the color of the data network.
+ when (dataNetworkSecurityStatus) {
+ ProtocolHelper.SECURE -> dataNetworkTextView.setTextColor(getColor(R.color.blue_text))
+ ProtocolHelper.INSECURE -> dataNetworkTextView.setTextColor(getColor(R.color.yellow_text))
+ ProtocolHelper.ANTIQUATED -> dataNetworkTextView.setTextColor(getColor(R.color.red_text))
+ }
+
+ // Set the color of the additional network info.
+ when (protocolHelper.checkAdditionalNetworkInfo(additionalNetworkInfoTypeInt)) {
+ ProtocolHelper.SECURE -> additionalNetworkInfoTextView.setTextColor(getColor(R.color.blue_text))
+ ProtocolHelper.INSECURE -> additionalNetworkInfoTextView.setTextColor(getColor(R.color.yellow_text))
+ ProtocolHelper.ANTIQUATED -> additionalNetworkInfoTextView.setTextColor(getColor(R.color.red_text))
+ }
+
+ // Set the data network click listener.
+ dataNetworkLinearLayout.setOnClickListener {
+ // Instantiate the data network dialog fragment according to the network type.
+ val dataNetworkDialogFragment = when (dataNetworkTypeInt) {
TelephonyManager.NETWORK_TYPE_UNKNOWN -> WebViewDialog().type(WebViewDialog.NETWORK_UNKNOWN)
TelephonyManager.NETWORK_TYPE_GPRS -> WebViewDialog().type(WebViewDialog.NETWORK_GPRS)
TelephonyManager.NETWORK_TYPE_EDGE -> WebViewDialog().type(WebViewDialog.NETWORK_EDGE)
}
// Show the alert dialog.
- voiceNetworkDialogFragment.show(supportFragmentManager, getString(R.string.voice_network))
+ dataNetworkDialogFragment.show(supportFragmentManager, getString(R.string.voice_network))
}
+
+ // Set the additional network info click listener.
+ additionalNetworkInfoLinearLayout.setOnClickListener {
+ // Instantiate the initial network info dialog fragment according to the network type.
+ val additionalNetworkInfoDialogFragment = when (telephonyDisplayInfo.overrideNetworkType) {
+ TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NONE)
+ TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_LTE_CA)
+ TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_LTE_ADVANCED_PRO)
+ TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NR_NSA)
+ TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NR_NSA_MMWAVE) // Can be removed once the minimum API >= 31.
+ TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NR_ADVANCED)
+ else -> WebViewDialog().type(WebViewDialog.OVERRIDE_NETWORK_NONE)
+ }
+
+ // Show the alert dialog.
+ additionalNetworkInfoDialogFragment.show(supportFragmentManager, getString(R.string.voice_network))
+ }
+
+ // Populate the overall security status.
+ populateOverallSecurityStatus()
}
}
} 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()
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)
}
}
}
}
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.
registerTelephonyManagerListener()
} else { // The read phone state permission was denied.
// Display the phone permission text on the main activity.
- summaryTextView.text = getString(R.string.phone_permission_text)
+ overallStatusTextView.text = getString(R.string.phone_permission_text)
}
}
}
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
// Listen to changes in the cell network state. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
- telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED or PhoneStateListener.LISTEN_SERVICE_STATE)
+ telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE or PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
}
- private fun getNetworkType(networkType: Int) : Array<String> {
- // Return the string that corresponds to the network type.
- return when(networkType) {
- TelephonyManager.NETWORK_TYPE_UNKNOWN -> arrayOf(getString(R.string.unknown), "")
- TelephonyManager.NETWORK_TYPE_GPRS -> arrayOf(getString(R.string.gprs), getString(R.string.gprs_detail))
- TelephonyManager.NETWORK_TYPE_EDGE -> arrayOf(getString(R.string.edge), getString(R.string.edge_detail))
- TelephonyManager.NETWORK_TYPE_UMTS -> arrayOf(getString(R.string.umts), getString(R.string.umts_detail))
- TelephonyManager.NETWORK_TYPE_CDMA -> arrayOf(getString(R.string.cdma), getString(R.string.cdma_detail))
- TelephonyManager.NETWORK_TYPE_EVDO_0 -> arrayOf(getString(R.string.evdo_0), getString(R.string.evdo_0_detail))
- TelephonyManager.NETWORK_TYPE_EVDO_A -> arrayOf(getString(R.string.evdo_a), getString(R.string.evdo_a_detail))
- TelephonyManager.NETWORK_TYPE_1xRTT -> arrayOf(getString(R.string.rtt), getString(R.string.rtt_detail))
- TelephonyManager.NETWORK_TYPE_HSDPA -> arrayOf(getString(R.string.hsdpa), getString(R.string.hsdpa_detail))
- TelephonyManager.NETWORK_TYPE_HSUPA -> arrayOf(getString(R.string.hsupa), getString(R.string.hsupa_detail))
- TelephonyManager.NETWORK_TYPE_HSPA -> arrayOf(getString(R.string.hspa), getString(R.string.hspa_detail))
- TelephonyManager.NETWORK_TYPE_IDEN -> arrayOf(getString(R.string.iden), getString(R.string.iden_detail))
- TelephonyManager.NETWORK_TYPE_EVDO_B -> arrayOf(getString(R.string.evdo_b), getString(R.string.evdo_b_detail))
- TelephonyManager.NETWORK_TYPE_LTE -> arrayOf(getString(R.string.lte), getString(R.string.lte_detail))
- TelephonyManager.NETWORK_TYPE_EHRPD -> arrayOf(getString(R.string.ehrpd), getString(R.string.ehrpd_detail))
- TelephonyManager.NETWORK_TYPE_HSPAP -> arrayOf(getString(R.string.hspap), getString(R.string.hspap_detail))
- TelephonyManager.NETWORK_TYPE_GSM -> arrayOf(getString(R.string.gsm), getString(R.string.gsm_detail))
- TelephonyManager.NETWORK_TYPE_TD_SCDMA -> arrayOf(getString(R.string.td_scdma), getString(R.string.td_scdma_detail))
- TelephonyManager.NETWORK_TYPE_IWLAN -> arrayOf(getString(R.string.iwlan), getString(R.string.iwlan_detail))
- TelephonyManager.NETWORK_TYPE_NR -> arrayOf(getString(R.string.nr), getString(R.string.nr_detail))
- else -> arrayOf(getString(R.string.error), "")
+ private fun populateOverallSecurityStatus() {
+ // Create an overall status dialog type integer.
+ val overallStatusDialogTypeInt: Int
+
+ // Populate the over security status.
+ if ((voiceNetworkSecurityStatus == ProtocolHelper.ANTIQUATED) || (dataNetworkSecurityStatus == ProtocolHelper.ANTIQUATED)) { // This is an antiquated network.
+ // Populate the image view.
+ overallStatusImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.antiquated))
+
+ // Set the text.
+ overallStatusTextView.text = getString(R.string.antiquated_protocols)
+
+ // Set the text color.
+ overallStatusTextView.setTextColor(getColor(R.color.red_text))
+
+ // Set the stingray dialog type integer.
+ overallStatusDialogTypeInt = WebViewDialog.ANTIQUATED_NETWORK
+ } else if ((voiceNetworkSecurityStatus == ProtocolHelper.INSECURE) || (dataNetworkSecurityStatus == ProtocolHelper.INSECURE)) { // This is an insecure network.
+ // Populate the image view.
+ overallStatusImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.insecure))
+
+ // Set the text.
+ overallStatusTextView.text = getString(R.string.insecure_protocols)
+
+ // Set the text color.
+ overallStatusTextView.setTextColor(getColor(R.color.yellow_text))
+
+ // Set the stingray dialog type integer.
+ overallStatusDialogTypeInt = WebViewDialog.STINGRAY
+ } else { // This is a secure network.
+ // Populate the image view.
+ overallStatusImageView.setImageDrawable(AppCompatResources.getDrawable(applicationContext, R.drawable.secure))
+
+ // Set the text.
+ overallStatusTextView.text = getString(R.string.secure_protocols)
+
+ // Set the text color.
+ overallStatusTextView.setTextColor(getColor(R.color.blue_text))
+
+ // Set the stingray dialog type integer.
+ overallStatusDialogTypeInt = WebViewDialog.STINGRAY
}
- }
- private fun getAdditionalNetworkInfo(overrideNetworkType: Int) : Array<String> {
- // Return the string that corresponds to the override network type.
- return when(overrideNetworkType) {
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE -> arrayOf(getString(R.string.none), "")
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA -> arrayOf(getString(R.string.lte_ca), getString(R.string.lte_ca_detail))
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> arrayOf(getString(R.string.lte_advanced_pro), getString(R.string.lte_advanced_pro_detail))
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA -> arrayOf(getString(R.string.nr_nsa), getString(R.string.nr_nsa_detail))
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> arrayOf(getString(R.string.nr_nsa_mmwave), getString(R.string.nr_nsa_mmwave_detail)) // Can be removed once the minimum API >= 31.
- TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED -> arrayOf(getString(R.string.nr_advanced), getString(R.string.nr_advanced_detail))
- else -> arrayOf(getString(R.string.error), "")
+ // Set the overall status click listener.
+ overallStatusLinearLayout.setOnClickListener {
+ // Instantiate the stingray dialog fragment.
+ val stingrayDialogFragment = WebViewDialog().type(overallStatusDialogTypeInt)
+
+ // Show the alert dialog.
+ stingrayDialogFragment.show(supportFragmentManager, getString(R.string.stingrays))
}
}
-}
\ No newline at end of file
+}
/*
- * 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>.
*
}?.show(supportFragmentManager, getString(R.string.protocols))
}
}
-}
\ No newline at end of file
+}
/*
- * 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(), NotificationPermissionDialogListener {
+ // Declare the class variables.
+ private lateinit var settingsFragment: SettingsFragment
-class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Run the default commands.
super.onCreate(savedInstanceState)
// Display the home arrow on the action bar.
actionBar.setDisplayHomeAsUpEnabled(true)
- // Load the preferences fragment.
- supportFragmentManager.beginTransaction().replace(R.id.preferences_framelayout, SettingsFragment()).commit()
+ // Instantiate the settings fragment.
+ settingsFragment = SettingsFragment()
+
+ // Load the settings fragment.
+ supportFragmentManager.beginTransaction().replace(R.id.preferences_framelayout, settingsFragment).commitNow()
+ }
+
+ 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()
+ 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))
- // Consume the event.
- return true
+ // Update the realtime monitoring preference summary.
+ settingsFragment.updateRealtimeMonitoringSummary()
+ }
+ }
}
-}
\ No newline at end of file
+}
--- /dev/null
+/*
+ * 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()
+ }
+}
/*
- * 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>.
*
// Return the alert dialog.
return dialogBuilder.create()
}
-}
\ No newline at end of file
+}
/*
- * 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>.
*
import android.app.Dialog
import android.content.Intent
-import android.content.res.Configuration
import android.os.Bundle
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
-import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewAssetLoader
-import androidx.webkit.WebViewFeature
import com.stoutner.privacycell.R
// Get a handle for the WebView.
webView = alertDialog.findViewById(R.id.webview)!!
- // Get the current theme status.
- val currentThemeStatus = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
-
- // Check to see if the app is in night mode.
- if (currentThemeStatus == Configuration.UI_MODE_NIGHT_YES && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { // The app is in night mode.
- // Apply the dark WebView theme.
- WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
- }
-
// Create a WebView asset loader.
val webViewAssetLoader = WebViewAssetLoader.Builder().addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(requireContext())).build()
// Save the scroll position.
savedInstanceState.putInt(SCROLL_Y, webView.scrollY)
}
-}
\ No newline at end of file
+}
/*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
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
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
+// Define the class constants.
+private const val SCROLL_Y = "scroll_y"
+
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
private lateinit var consider3gAntiquatedPreference: Preference
private lateinit var bottomAppBarPreference: Preference
+ companion object {
+ // Declare the private static class variables. For some reason (I'm looking at you Android's Activity Lifecycle) this only works if these are static.
+ private var fragmentRestarted: Boolean = false
+ private var scrollY: Int = 0
+ }
+
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Load the preferences from the XML file.
setPreferencesFromResource(R.xml.preferences, rootKey)
} else {
bottomAppBarPreference.setIcon(R.drawable.bottom_app_bar_disabled)
}
- }
-
- // The listener should be unregistered when the app is paused.
- override fun onPause() {
- // Run the default commands.
- super.onPause()
-
- // Get a handle for the shared preferences.
- val sharedPreferences = preferenceScreen.sharedPreferences!!
-
- // Unregister the shared preference listener.
- sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener)
- }
-
- // The listener should be re-registered when the app is resumed.
- override fun onResume() {
- // Run the default commands.
- super.onResume()
- // Get a new shared preference change listener.
- sharedPreferenceChangeListener = getSharedPreferenceChangeListener()
-
- // Get a handle for the shared preferences.
- val sharedPreferences = preferenceScreen.sharedPreferences!!
+ // Check if the fragment has been restarted.
+ if (savedInstanceState != null) {
+ // Set the fragment restarted flag.
+ fragmentRestarted = true
- // Re-register the shared preference listener.
- sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener)
+ // Save the scroll Y.
+ scrollY = savedInstanceState.getInt(SCROLL_Y)
+ }
}
- 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.
// 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))
}
}
+ // The listener should be unregistered when the app is paused.
+ override fun onPause() {
+ // Run the default commands.
+ super.onPause()
+
+ // Get a handle for the shared preferences.
+ val sharedPreferences = preferenceScreen.sharedPreferences!!
+
+ // Unregister the shared preference listener.
+ sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener)
+ }
+
+ // The listener should be re-registered when the app is resumed.
+ override fun onResume() {
+ // Run the default commands.
+ super.onResume()
+
+ // Get a new shared preference change listener.
+ sharedPreferenceChangeListener = getSharedPreferenceChangeListener()
+
+ // Get a handle for the shared preferences.
+ val sharedPreferences = preferenceScreen.sharedPreferences!!
+
+ // Re-register the shared preference listener.
+ sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener)
+
+ // Update the realtime monitoring preference summary.
+ updateRealtimeMonitoringSummary()
+
+ // Restore the scroll position if the fragment has been restarted.
+ if (fragmentRestarted) {
+ // Reset the fragment restarted flag.
+ fragmentRestarted = false
+
+ // Set the scroll position.
+ listView.smoothScrollBy(0, scrollY)
+ }
+ }
+
+ override fun onSaveInstanceState(savedInstanceState: Bundle) {
+ // Run the default commands.
+ super.onSaveInstanceState(savedInstanceState)
+
+ // Save the scroll position.
+ savedInstanceState.putInt(SCROLL_Y, listView.computeVerticalScrollOffset())
+ }
+
private fun restartPrivacyCell() {
// Create an intent to restart Privacy Cell.
val restartIntent = requireActivity().parentActivityIntent!!
// 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
+
+ fun updateRealtimeMonitoringSummary() {
+ // Update the summary according to the API.
+ if (Build.VERSION.SDK_INT >= 33) { // The API >= 33.
+ // Set the summary according to the notification permission status.
+ if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED)
+ realtimeMonitoringPreference.summary = getString(R.string.realtime_monitoring_summary)
+ else
+ realtimeMonitoringPreference.summary = (getString(R.string.realtime_monitoring_summary) + " " + getString(R.string.notification_permission_denied))
+ } else { // The API is < 33.
+ // Set the realtime monitoring summary.
+ realtimeMonitoringPreference.summary = getString(R.string.realtime_monitoring_summary)
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright 2022-2023 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.helpers
+
+import android.content.Context
+import android.telephony.TelephonyDisplayInfo
+import android.telephony.TelephonyManager
+
+import com.stoutner.privacycell.R
+
+class ProtocolHelper {
+ companion object {
+ // Define the public static companion object constants.
+ const val UNPOPULATED = -1
+ const val SECURE = 0
+ const val INSECURE = 1
+ const val ANTIQUATED = 2
+ }
+
+ fun checkNetwork(networkType: Int, consider3gAntiquated: Boolean): Int {
+ if ((networkType == TelephonyManager.NETWORK_TYPE_NR) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_IWLAN) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_UNKNOWN)) {
+ // The network is secure.
+ return SECURE
+ } else if (networkType == TelephonyManager.NETWORK_TYPE_LTE) {
+ // The network is insecure.
+ return INSECURE
+ } else if (!consider3gAntiquated &&
+ ((networkType == TelephonyManager.NETWORK_TYPE_1xRTT) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_EVDO_0) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_EVDO_A) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_EVDO_B) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_EHRPD) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_UMTS) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_TD_SCDMA) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_HSDPA) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_HSUPA) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_HSPA) ||
+ (networkType == TelephonyManager.NETWORK_TYPE_HSPAP))) {
+ // The network is insecure.
+ return INSECURE
+ } else {
+ // Either 3G networks are considered antiquated, or this is a 2G network.
+ // TelephonyManager.NETWORK_TYPE_GPRS
+ // TelephonyManager.NETWORK_TYPE_EDGE
+ // TelephonyManager.NETWORK_TYPE_CDMA
+ // TelephonyManager.NETWORK_TYPE_IDEN
+ // TelephonyManager.NETWORK_TYPE_GSM
+ return ANTIQUATED
+ }
+ }
+
+ fun checkAdditionalNetworkInfo(additionalNetworkInfoType: Int): Int {
+ return if ((additionalNetworkInfoType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) ||
+ (additionalNetworkInfoType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED)) {
+ // The additional network info is 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.
+ INSECURE
+ }
+ }
+
+ fun getNetworkTypeStringArray(networkType: Int, context: Context) : Array<String> {
+ // Return the string array that corresponds to the network type. The deprecated `NETWORK_TYPE_IDEN` can be removed once the minimum API >= 34.
+ @Suppress("DEPRECATION")
+ return when(networkType) {
+ TelephonyManager.NETWORK_TYPE_UNKNOWN -> arrayOf(context.getString(R.string.unknown), "")
+ TelephonyManager.NETWORK_TYPE_GPRS -> arrayOf(context.getString(R.string.gprs), context.getString(R.string.gprs_detail))
+ TelephonyManager.NETWORK_TYPE_EDGE -> arrayOf(context.getString(R.string.edge), context.getString(R.string.edge_detail))
+ TelephonyManager.NETWORK_TYPE_UMTS -> arrayOf(context.getString(R.string.umts), context.getString(R.string.umts_detail))
+ TelephonyManager.NETWORK_TYPE_CDMA -> arrayOf(context.getString(R.string.cdma), context.getString(R.string.cdma_detail))
+ TelephonyManager.NETWORK_TYPE_EVDO_0 -> arrayOf(context.getString(R.string.evdo_0), context.getString(R.string.evdo_0_detail))
+ TelephonyManager.NETWORK_TYPE_EVDO_A -> arrayOf(context.getString(R.string.evdo_a), context.getString(R.string.evdo_a_detail))
+ TelephonyManager.NETWORK_TYPE_1xRTT -> arrayOf(context.getString(R.string.rtt), context.getString(R.string.rtt_detail))
+ TelephonyManager.NETWORK_TYPE_HSDPA -> arrayOf(context.getString(R.string.hsdpa), context.getString(R.string.hsdpa_detail))
+ TelephonyManager.NETWORK_TYPE_HSUPA -> arrayOf(context.getString(R.string.hsupa), context.getString(R.string.hsupa_detail))
+ TelephonyManager.NETWORK_TYPE_HSPA -> arrayOf(context.getString(R.string.hspa), context.getString(R.string.hspa_detail))
+ TelephonyManager.NETWORK_TYPE_IDEN -> arrayOf(context.getString(R.string.iden), context.getString(R.string.iden_detail))
+ TelephonyManager.NETWORK_TYPE_EVDO_B -> arrayOf(context.getString(R.string.evdo_b), context.getString(R.string.evdo_b_detail))
+ TelephonyManager.NETWORK_TYPE_LTE -> arrayOf(context.getString(R.string.lte), context.getString(R.string.lte_detail))
+ TelephonyManager.NETWORK_TYPE_EHRPD -> arrayOf(context.getString(R.string.ehrpd), context.getString(R.string.ehrpd_detail))
+ TelephonyManager.NETWORK_TYPE_HSPAP -> arrayOf(context.getString(R.string.hspap), context.getString(R.string.hspap_detail))
+ TelephonyManager.NETWORK_TYPE_GSM -> arrayOf(context.getString(R.string.gsm), context.getString(R.string.gsm_detail))
+ TelephonyManager.NETWORK_TYPE_TD_SCDMA -> arrayOf(context.getString(R.string.td_scdma), context.getString(R.string.td_scdma_detail))
+ TelephonyManager.NETWORK_TYPE_IWLAN -> arrayOf(context.getString(R.string.iwlan), context.getString(R.string.iwlan_detail))
+ TelephonyManager.NETWORK_TYPE_NR -> arrayOf(context.getString(R.string.nr), context.getString(R.string.nr_detail))
+ else -> arrayOf(context.getString(R.string.error), "")
+ }
+ }
+
+ 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))
+ // 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), "")
+ }
+ }
+}
/*
- * Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021,2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
}
}
}
-}
\ No newline at end of file
+}
/*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
import android.os.Binder
import android.os.IBinder
import android.telephony.PhoneStateListener // This can be replaced by `TelephonyCallback` once the minimum API >= 31.
+import android.telephony.ServiceState
import android.telephony.TelephonyDisplayInfo
import android.telephony.TelephonyManager
import com.stoutner.privacycell.R
import com.stoutner.privacycell.activities.PrivacyCellActivity
+import com.stoutner.privacycell.helpers.ProtocolHelper
import com.stoutner.privacycell.workers.RegisterRealtimeListenerWorker
import java.util.concurrent.TimeUnit
// Define the class variables.
private var currentStatus = ""
+ private var voiceNetworkSecurityStatus = ProtocolHelper.UNPOPULATED
+ private var dataNetworkSecurityStatus = ProtocolHelper.UNPOPULATED
+
+ // Declare the class variables.
+ private lateinit var notificationManager: NotificationManager
private lateinit var phoneStateListener: PhoneStateListener // The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
+ private lateinit var privacyCellPendingIntent: PendingIntent
inner class ServiceBinder : Binder() {
// Get a copy of this service as a binder.
// Get a handle for the shared preferences.
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
- // Get a handle for the notification manager.
- val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
-
- // Create a notification channel group.
- notificationManager.createNotificationChannelGroup(NotificationChannelGroup(REALTIME_MONITORING, getString(R.string.realtime_monitoring)))
-
- // Prepare the notification channels.
- val secureNetworkChannel = NotificationChannel(SECURE_NETWORK, getString(R.string.secure_network_channel), NotificationManager.IMPORTANCE_HIGH)
- val insecureNetworkChannel = NotificationChannel(INSECURE_NETWORK, getString(R.string.insecure_network_channel), NotificationManager.IMPORTANCE_HIGH)
- val antiquatedNetworkChannel = NotificationChannel(ANTIQUATED_NETWORK, getString(R.string.antiquated_network_channel), NotificationManager.IMPORTANCE_HIGH)
- val unknownNetworkChannel = NotificationChannel(UNKNOWN_NETWORK, getString(R.string.unknown_network_channel), NotificationManager.IMPORTANCE_LOW)
+ // Check to see if realtime monitoring is enabled. Sometimes the shared preferences can't return a value in time, because Android sucks.
+ // So, the default value is set to true, which is the safest value if the shared preferences can't be queried.
+ if (sharedPreferences.getBoolean(applicationContext.getString(R.string.realtime_monitoring_key), true)) { // Realtime monitoring is enabled.
+ // Get a handle for the notification manager.
+ notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
- // Set the notification channel group.
- secureNetworkChannel.group = REALTIME_MONITORING
- insecureNetworkChannel.group = REALTIME_MONITORING
- antiquatedNetworkChannel.group = REALTIME_MONITORING
- unknownNetworkChannel.group = REALTIME_MONITORING
+ // Create a notification channel group.
+ notificationManager.createNotificationChannelGroup(NotificationChannelGroup(REALTIME_MONITORING, getString(R.string.realtime_monitoring)))
- // Disable the notification dots.
- secureNetworkChannel.setShowBadge(false)
- insecureNetworkChannel.setShowBadge(false)
- antiquatedNetworkChannel.setShowBadge(false)
- unknownNetworkChannel.setShowBadge(false)
+ // Prepare the notification channels.
+ val secureNetworkChannel = NotificationChannel(SECURE_NETWORK, getString(R.string.secure_network_channel), NotificationManager.IMPORTANCE_HIGH)
+ val insecureNetworkChannel = NotificationChannel(INSECURE_NETWORK, getString(R.string.insecure_network_channel), NotificationManager.IMPORTANCE_HIGH)
+ val antiquatedNetworkChannel = NotificationChannel(ANTIQUATED_NETWORK, getString(R.string.antiquated_network_channel), NotificationManager.IMPORTANCE_HIGH)
+ val unknownNetworkChannel = NotificationChannel(UNKNOWN_NETWORK, getString(R.string.unknown_network_channel), NotificationManager.IMPORTANCE_LOW)
- // Set the primary channel notifications to be public.
- secureNetworkChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
- insecureNetworkChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
- antiquatedNetworkChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
+ // Set the notification channel group.
+ secureNetworkChannel.group = REALTIME_MONITORING
+ insecureNetworkChannel.group = REALTIME_MONITORING
+ antiquatedNetworkChannel.group = REALTIME_MONITORING
+ unknownNetworkChannel.group = REALTIME_MONITORING
- // Create the notification channels.
- notificationManager.createNotificationChannel(secureNetworkChannel)
- notificationManager.createNotificationChannel(insecureNetworkChannel)
- notificationManager.createNotificationChannel(antiquatedNetworkChannel)
- notificationManager.createNotificationChannel(unknownNetworkChannel)
+ // Disable the notification dots.
+ secureNetworkChannel.setShowBadge(false)
+ insecureNetworkChannel.setShowBadge(false)
+ antiquatedNetworkChannel.setShowBadge(false)
+ unknownNetworkChannel.setShowBadge(false)
- // Create a notification builder.
- val notificationBuilder = Notification.Builder(this, UNKNOWN_NETWORK)
+ // Set the primary channel notifications to be public.
+ secureNetworkChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
+ insecureNetworkChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
+ antiquatedNetworkChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
- // Create an intent to open Privacy Cell.
- val privacyCellIntent = Intent(this, PrivacyCellActivity::class.java)
+ // Create the notification channels.
+ notificationManager.createNotificationChannel(secureNetworkChannel)
+ notificationManager.createNotificationChannel(insecureNetworkChannel)
+ notificationManager.createNotificationChannel(antiquatedNetworkChannel)
+ notificationManager.createNotificationChannel(unknownNetworkChannel)
- // Create a pending intent from the Privacy Cell intent.
- val privacyCellPendingIntent = PendingIntent.getActivity(this, 0, privacyCellIntent, PendingIntent.FLAG_IMMUTABLE)
+ // Create a notification builder.
+ val notificationBuilder = Notification.Builder(this, UNKNOWN_NETWORK)
- // Set the notification to open Privacy Cell.
- notificationBuilder.setContentIntent(privacyCellPendingIntent)
+ // Create an intent to open Privacy Cell.
+ val privacyCellIntent = Intent(this, PrivacyCellActivity::class.java)
- // Set the notification text.
- notificationBuilder.setContentText(getString(R.string.unknown_network))
+ // Create a pending intent from the Privacy Cell intent.
+ privacyCellPendingIntent = PendingIntent.getActivity(this, 0, privacyCellIntent, PendingIntent.FLAG_IMMUTABLE)
- // Set the notification icon.
- notificationBuilder.setSmallIcon(R.drawable.antiquated_notification_enabled)
+ // Set the notification to open Privacy Cell.
+ notificationBuilder.setContentIntent(privacyCellPendingIntent)
- // Set the color.
- notificationBuilder.setColor(getColor(R.color.red_notification_icon))
+ // Set the notification text.
+ notificationBuilder.setContentText(getString(R.string.unknown_network))
- // Start the foreground notification.
- startForeground(NOTIFICATION_ID, notificationBuilder.build())
+ // Set the notification icon.
+ notificationBuilder.setSmallIcon(R.drawable.antiquated_notification_enabled)
- // Define the phone state listener. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
- phoneStateListener = object : PhoneStateListener() {
- override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) {
- // Get the consider 3G antiquated preference.
- val consider3gAntiquated = sharedPreferences.getBoolean(getString(R.string.consider_3g_antiquated_key), false)
+ // Set the color.
+ notificationBuilder.setColor(getColor(R.color.red_notification_icon))
- // Populate the notification according to the network type.
- if ((telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_NR) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_IWLAN) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_UNKNOWN)) { // This is a secure network.
- // Only update the notification if the network status has changed.
- if (currentStatus != SECURE_NETWORK) {
- // Create a secure network notification builder.
- val secureNetworkNotificationBuilder = Notification.Builder(applicationContext, SECURE_NETWORK)
+ // Prevent swiping to dismiss the notification. This no longer works (except on the lock screen) in API >= 34.
+ notificationBuilder.setOngoing(true)
- // Set the notification to open Privacy Cell.
- secureNetworkNotificationBuilder.setContentIntent(privacyCellPendingIntent)
+ // Start the foreground notification.
+ startForeground(NOTIFICATION_ID, notificationBuilder.build())
- // Set the notification text.
- secureNetworkNotificationBuilder.setContentText(getString(R.string.secure_network))
+ // Instantiate the protocol helper.
+ val protocolHelper = ProtocolHelper()
- // Set the notification icon.
- secureNetworkNotificationBuilder.setSmallIcon(R.drawable.secure_notification_enabled)
-
- // Set the color.
- secureNetworkNotificationBuilder.setColor(getColor(R.color.blue_icon))
-
- // Update the notification.
- notificationManager.notify(NOTIFICATION_ID, secureNetworkNotificationBuilder.build())
+ // Get a handle for the telephony manager.
+ val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
- // Store the new network status.
- currentStatus = SECURE_NETWORK
- }
- } else if ((telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_LTE) || (!consider3gAntiquated && (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_1xRTT ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EVDO_0) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EVDO_A) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EVDO_B) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_EHRPD) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_UMTS) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_TD_SCDMA) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSDPA) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSUPA) ||
- (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSPA) || (telephonyDisplayInfo.networkType == TelephonyManager.NETWORK_TYPE_HSPAP)))) {
- // This is an insecure network.
- // Only update the notification if the network status has changed.
- if (currentStatus != INSECURE_NETWORK) {
- // Create an insecure network notification builder.
- val insecureNetworkNotificationBuilder = Notification.Builder(applicationContext, INSECURE_NETWORK)
-
- // Set the notification to open Privacy Cell.
- insecureNetworkNotificationBuilder.setContentIntent(privacyCellPendingIntent)
-
- // Set the notification text.
- insecureNetworkNotificationBuilder.setContentText(getString(R.string.insecure_network))
-
- // Set the notification icon.
- insecureNetworkNotificationBuilder.setSmallIcon(R.drawable.insecure_notification_enabled)
-
- // Set the color.
- insecureNetworkNotificationBuilder.setColor(getColor(R.color.yellow_notification_icon))
-
- // Update the notification.
- notificationManager.notify(NOTIFICATION_ID, insecureNetworkNotificationBuilder.build())
-
- // Store the new network status.
- currentStatus = INSECURE_NETWORK
+ // Define the phone state listener. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
+ phoneStateListener = object : PhoneStateListener() {
+ @Deprecated("Deprecated in Java")
+ override fun onServiceStateChanged(serviceState: ServiceState) { // Update the voice network status.
+ // Check to see if realtime monitoring is enabled. Sometimes the system keeps running the service even when it is supposed to shut down.
+ if (sharedPreferences.getBoolean(applicationContext.getString(R.string.realtime_monitoring_key), true)) { // Realtime monitoring is enabled.
+ // Get the network registration info for the voice network, which is the second of the three entries (the first appears to be Wi-Fi and the third appears to be the cell data network).
+ val networkRegistrationInfo = serviceState.networkRegistrationInfoList[1]
+
+ // Get the consider 3G antiquated preference.
+ val consider3gAntiquated = sharedPreferences.getBoolean(getString(R.string.consider_3g_antiquated_key), false)
+
+ // Update the voice network security status.
+ voiceNetworkSecurityStatus = protocolHelper.checkNetwork(networkRegistrationInfo.accessNetworkTechnology, consider3gAntiquated)
+
+ // Populate the notification.
+ populateNotification()
+ } else { // Realtime monitoring is disabled.
+ // Cancel the current listener if it exists. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
+ telephonyManager.listen(phoneStateListener, LISTEN_NONE)
}
- } else { // This is an antiquated network.
- // Only update the notification if the network status has changed.
- if (currentStatus != ANTIQUATED_NETWORK) {
- // Create an antiquated network notification builder.
- val antiquatedNetworkNotificationBuilder = Notification.Builder(applicationContext, ANTIQUATED_NETWORK)
-
- // Set the notification to open Privacy Cell.
- antiquatedNetworkNotificationBuilder.setContentIntent(privacyCellPendingIntent)
-
- // Set the notification text.
- antiquatedNetworkNotificationBuilder.setContentText(getString(R.string.antiquated_network))
-
- // Set the notification icon.
- antiquatedNetworkNotificationBuilder.setSmallIcon(R.drawable.antiquated_notification_enabled)
-
- // Set the color.
- antiquatedNetworkNotificationBuilder.setColor(getColor(R.color.red_notification_icon))
-
- // Update the notification.
- notificationManager.notify(NOTIFICATION_ID, antiquatedNetworkNotificationBuilder.build())
+ }
- // Store the new network status.
- currentStatus = ANTIQUATED_NETWORK
+ @Deprecated("Deprecated in Java")
+ override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) { // Update the data network status.
+ // Check to see if realtime monitoring is enabled. Sometimes the system keeps running the service even when it is supposed to shut down.
+ if (sharedPreferences.getBoolean(applicationContext.getString(R.string.realtime_monitoring_key), true)) { // Realtime monitoring is enabled.
+ // Get the consider 3G antiquated preference.
+ val consider3gAntiquated = sharedPreferences.getBoolean(getString(R.string.consider_3g_antiquated_key), false)
+
+ // Update the data network security status.
+ dataNetworkSecurityStatus = protocolHelper.checkNetwork(telephonyDisplayInfo.networkType, consider3gAntiquated)
+
+ // Populate the notification.
+ populateNotification()
+ } else { // Realtime monitoring is disabled.
+ // Cancel the current listener if it exists. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
+ telephonyManager.listen(phoneStateListener, LISTEN_NONE)
}
}
}
- }
- // Check to see if the read phone state permission has been granted.
- if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
- // Create a register realtime listener work request that fires every hour.
- // This periodic request will fire shortly after being created (it fires about every hour near the beginning of the hour) and will reregister the listener if it gets garbage collected.
- val registerRealtimeListenerWorkRequest = PeriodicWorkRequestBuilder<RegisterRealtimeListenerWorker>(1, TimeUnit.HOURS).build()
+ // Check to see if the read phone state permission has been granted.
+ if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
+ // Create a register realtime listener work request that fires every fifteen minutes.
+ // This periodic request will fire shortly after being created and will reregister the listener if it gets garbage collected.
+ val registerRealtimeListenerWorkRequest = PeriodicWorkRequestBuilder<RegisterRealtimeListenerWorker>(15, TimeUnit.MINUTES).build()
- // Register the realtime listener work request.
- WorkManager.getInstance(this).enqueueUniquePeriodicWork(getString(R.string.register_listener_work_request), ExistingPeriodicWorkPolicy.REPLACE, registerRealtimeListenerWorkRequest)
+ // Register the realtime listener work request.
+ WorkManager.getInstance(this).enqueueUniquePeriodicWork(getString(R.string.register_listener_work_request), ExistingPeriodicWorkPolicy.REPLACE, registerRealtimeListenerWorkRequest)
+ }
+ } else { // Realtime monitoring is disabled. This can happen if the restart listener work request fires after realtime monitoring has been disabled.
+ // Cancel the realtime listener work request.
+ WorkManager.getInstance(applicationContext).cancelUniqueWork(applicationContext.getString(R.string.register_listener_work_request))
}
// Return a sticky service.
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
// Listen for changes to the phone state. The `PhoneStateListener` can be replaced by `TelephonyCallback` once the minimum API >= 31.
- telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
+ telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE or PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
+ }
+ }
+
+ fun populateNotification() {
+ // Get the list of current notifications.
+ val activeNotificationsArray = notificationManager.activeNotifications
+
+ // Check to see if there is a current notification.
+ val noCurrentNotification = activeNotificationsArray.isEmpty()
+
+ // Populate the notification according to the security status.
+ if ((voiceNetworkSecurityStatus == ProtocolHelper.ANTIQUATED) || (dataNetworkSecurityStatus == ProtocolHelper.ANTIQUATED)) { // This is an antiquated network.
+ // Only update the notification if the network status has changed.
+ if ((currentStatus != ANTIQUATED_NETWORK) || noCurrentNotification) {
+ // Create an antiquated network notification builder.
+ val antiquatedNetworkNotificationBuilder = Notification.Builder(applicationContext, ANTIQUATED_NETWORK)
+
+ // Set the notification to open Privacy Cell.
+ antiquatedNetworkNotificationBuilder.setContentIntent(privacyCellPendingIntent)
+
+ // Set the notification text.
+ antiquatedNetworkNotificationBuilder.setContentText(getString(R.string.antiquated_network))
+
+ // Set the notification icon.
+ antiquatedNetworkNotificationBuilder.setSmallIcon(R.drawable.antiquated_notification_enabled)
+
+ // Set the color.
+ antiquatedNetworkNotificationBuilder.setColor(getColor(R.color.red_notification_icon))
+
+ // Prevent swiping to dismiss the notification. This no longer works (except on the lock screen) in API >= 34.
+ antiquatedNetworkNotificationBuilder.setOngoing(true)
+
+ // Update the notification.
+ notificationManager.notify(NOTIFICATION_ID, antiquatedNetworkNotificationBuilder.build())
+
+ // Store the new network status.
+ currentStatus = ANTIQUATED_NETWORK
+ }
+ } else if ((voiceNetworkSecurityStatus == ProtocolHelper.INSECURE) || (dataNetworkSecurityStatus == ProtocolHelper.INSECURE)) { // This is an insecure network.
+ // Only update the notification if the network status has changed.
+ if ((currentStatus != INSECURE_NETWORK) || noCurrentNotification) {
+ // Create an insecure network notification builder.
+ val insecureNetworkNotificationBuilder = Notification.Builder(applicationContext, INSECURE_NETWORK)
+
+ // Set the notification to open Privacy Cell.
+ insecureNetworkNotificationBuilder.setContentIntent(privacyCellPendingIntent)
+
+ // Set the notification text.
+ insecureNetworkNotificationBuilder.setContentText(getString(R.string.insecure_network))
+
+ // Set the notification icon.
+ insecureNetworkNotificationBuilder.setSmallIcon(R.drawable.insecure_notification_enabled)
+
+ // Set the color.
+ insecureNetworkNotificationBuilder.setColor(getColor(R.color.yellow_notification_icon))
+
+ // Prevent swiping to dismiss the notification. This no longer works (except on the lock screen) in API >= 34.
+ insecureNetworkNotificationBuilder.setOngoing(true)
+
+ // Update the notification.
+ notificationManager.notify(NOTIFICATION_ID, insecureNetworkNotificationBuilder.build())
+
+ // Store the new network status.
+ currentStatus = INSECURE_NETWORK
+ }
+ } else { // This is a secure network.
+ // Only update the notification if the network status has changed.
+ if ((currentStatus != SECURE_NETWORK) || noCurrentNotification) {
+ // Create a secure network notification builder.
+ val secureNetworkNotificationBuilder = Notification.Builder(applicationContext, SECURE_NETWORK)
+
+ // Set the notification to open Privacy Cell.
+ secureNetworkNotificationBuilder.setContentIntent(privacyCellPendingIntent)
+
+ // Set the notification text.
+ secureNetworkNotificationBuilder.setContentText(getString(R.string.secure_network))
+
+ // Set the notification icon.
+ secureNetworkNotificationBuilder.setSmallIcon(R.drawable.secure_notification_enabled)
+
+ // Set the color.
+ secureNetworkNotificationBuilder.setColor(getColor(R.color.blue_icon))
+
+ // Prevent swiping to dismiss the notification. This no longer works (except on the lock screen) in API >= 34.
+ secureNetworkNotificationBuilder.setOngoing(true)
+
+ // Update the notification.
+ notificationManager.notify(NOTIFICATION_ID, secureNetworkNotificationBuilder.build())
+
+ // Store the new network status.
+ currentStatus = SECURE_NETWORK
+ }
}
}
-}
\ No newline at end of file
+}
/*
- * Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
val realtimeMonitoring = sharedPreferences.getBoolean(applicationContext.getString(R.string.realtime_monitoring_key), true)
// Perform the functions according to the realtime monitoring status.
+ @Suppress("DEPRECATION") // The deprecated `getRunningServices()` now only returns services started by Privacy Cell, but that is all we want to know anyway.
if (realtimeMonitoring) { // Realtime monitoring is enabled.
// Get a handle for the activity manager.
val activityManager: ActivityManager = applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
- // Get a list of the running service info. The deprecated `getRunningServices()` now only returns services stared by Privacy Cell, but that is all we want to know anyway.
+ // Get a list of the running service info. The deprecated `getRunningServices()` now only returns services started by Privacy Cell, but that is all we want to know anyway.
val runningServiceInfoList: List<ActivityManager.RunningServiceInfo> = activityManager.getRunningServices(1)
// Check to see if the service is currently running.
// Register the telephony manager listener.
realtimeMonitoringService.registerTelephonyManagerListener()
+ // Populate the notification, which might have been accidentally dismissed by the user beginning in Android 14.
+ realtimeMonitoringService.populateNotification()
+
// Unbind the service.
applicationContext.unbindService(this)
}
applicationContext.bindService(Intent(applicationContext, RealtimeMonitoringService::class.java), serviceConnection, 0)
}
} else { // Realtime monitoring is disabled.
+ // Stop the realtime monitoring service.
+ applicationContext.stopService(Intent(applicationContext, RealtimeMonitoringService::class.java))
+
// Cancel the realtime listener work request.
WorkManager.getInstance(applicationContext).cancelUniqueWork(applicationContext.getString(R.string.register_listener_work_request))
}
// Return a success.
return Result.success()
}
-}
\ No newline at end of file
+}
/*
- * Copyright © 2021 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
import android.content.Context
import android.content.Intent
+import androidx.preference.PreferenceManager
+import androidx.work.WorkManager
import androidx.work.Worker
import androidx.work.WorkerParameters
+
+import com.stoutner.privacycell.R
import com.stoutner.privacycell.services.RealtimeMonitoringService
class RestartServiceWorker(appContext: Context, workerParameters: WorkerParameters) : Worker(appContext, workerParameters) {
override fun doWork(): Result {
- // Start the realtime monitoring service as a foreground service, which is required because the worker is running in the background.
- applicationContext.startForegroundService(Intent(applicationContext, RealtimeMonitoringService::class.java))
+ // Get a handle for the shared preferences.
+ val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext)
+
+ // Check to see if realtime monitoring is enabled. Sometimes the shared preferences can't return a value in time, because Android sucks.
+ // So, the default value is set to true, which is the safest value if the shared preferences can't be queried.
+ if (sharedPreferences.getBoolean(applicationContext.getString(R.string.realtime_monitoring_key), true)) { // Realtime monitoring is enabled.
+ // Start the realtime monitoring service as a foreground service, which is required because the worker is running in the background.
+ applicationContext.startForegroundService(Intent(applicationContext, RealtimeMonitoringService::class.java))
+ } else { // Realtime monitoring is disabled.
+ // Stop the realtime monitoring service.
+ applicationContext.stopService(Intent(applicationContext, RealtimeMonitoringService::class.java))
+
+ // Cancel the realtime listener work request.
+ WorkManager.getInstance(applicationContext).cancelUniqueWork(applicationContext.getString(R.string.register_listener_work_request))
+ }
// Return a success.
return Result.success()
}
-}
\ No newline at end of file
+}
<!--
- Copyright © 2016,2021-2022 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
This file is derived from `security` and `3g_mobiledata_rounded`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="256"
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_disabled"
- android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM57.188,83.742l35.405,0c9.737,-0 17.703,7.967 17.703,17.703l0,13.277c0,7.347 -5.931,13.277 -13.277,13.277 7.347,0 13.277,5.931 13.277,13.277l0,13.277c0,9.737 -7.967,17.703 -17.703,17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l35.405,0l0,-17.703l-26.554,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l26.554,0l0,-17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852zM145.703,83.742l53.108,0c4.868,0 8.852,3.983 8.852,8.852 0,4.868 -3.983,8.852 -8.852,8.852l-53.108,0l0,53.109l44.257,0l0,-17.703l-13.277,0c-4.868,0 -8.851,-3.983 -8.851,-8.852 0,-4.868 3.982,-8.852 8.851,-8.852l22.129,0c4.868,0 8.852,3.983 8.852,8.852l0,26.555c0,9.737 -7.967,17.703 -17.703,17.703L145.703,172.258C135.967,172.258 128,164.291 128,154.555L128,101.445c0,-9.737 7.967,-17.703 17.703,-17.703z" />
+ android:fillColor="@color/disabled_icon"
+ android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM57.188,83.742l35.405,0c9.737,-0 17.703,7.967 17.703,17.703l0,13.277c0,7.347 -5.931,13.277 -13.277,13.277 7.347,0 13.277,5.931 13.277,13.277l0,13.277c0,9.737 -7.967,17.703 -17.703,17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l35.405,0l0,-17.703l-26.554,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l26.554,0l0,-17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852zM145.703,83.742l53.108,0c4.868,0 8.852,3.983 8.852,8.852 0,4.868 -3.983,8.852 -8.852,8.852l-53.108,0l0,53.109l44.257,0l0,-17.703l-13.277,0c-4.868,0 -8.851,-3.983 -8.851,-8.852 0,-4.868 3.982,-8.852 8.851,-8.852l22.129,0c4.868,0 8.852,3.983 8.852,8.852l0,26.555c0,9.737 -7.967,17.703 -17.703,17.703L145.703,172.258C135.967,172.258 128,164.291 128,154.555L128,101.445c0,-9.737 7.967,-17.703 17.703,-17.703z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
<!--
- Copyright © 2016,2021-2022 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
This file is derived from `security` and `3g_mobiledata_rounded`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="256"
<path
android:fillColor="@color/red_icon"
- android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM57.188,83.742l35.405,0c9.737,-0 17.703,7.967 17.703,17.703l0,13.277c0,7.347 -5.931,13.277 -13.277,13.277 7.347,0 13.277,5.931 13.277,13.277l0,13.277c0,9.737 -7.967,17.703 -17.703,17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l35.405,0l0,-17.703l-26.554,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l26.554,0l0,-17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852zM145.703,83.742l53.108,0c4.868,0 8.852,3.983 8.852,8.852 0,4.868 -3.983,8.852 -8.852,8.852l-53.108,0l0,53.109l44.257,0l0,-17.703l-13.277,0c-4.868,0 -8.851,-3.983 -8.851,-8.852 0,-4.868 3.982,-8.852 8.851,-8.852l22.129,0c4.868,0 8.852,3.983 8.852,8.852l0,26.555c0,9.737 -7.967,17.703 -17.703,17.703L145.703,172.258C135.967,172.258 128,164.291 128,154.555L128,101.445c0,-9.737 7.967,-17.703 17.703,-17.703z" />
+ android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM57.188,83.742l35.405,0c9.737,-0 17.703,7.967 17.703,17.703l0,13.277c0,7.347 -5.931,13.277 -13.277,13.277 7.347,0 13.277,5.931 13.277,13.277l0,13.277c0,9.737 -7.967,17.703 -17.703,17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l35.405,0l0,-17.703l-26.554,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852l26.554,0l0,-17.703l-35.405,0c-4.868,0 -8.852,-3.983 -8.852,-8.852 0,-4.868 3.983,-8.852 8.852,-8.852zM145.703,83.742l53.108,0c4.868,0 8.852,3.983 8.852,8.852 0,4.868 -3.983,8.852 -8.852,8.852l-53.108,0l0,53.109l44.257,0l0,-17.703l-13.277,0c-4.868,0 -8.851,-3.983 -8.851,-8.852 0,-4.868 3.982,-8.852 8.851,-8.852l22.129,0c4.868,0 8.852,3.983 8.852,8.852l0,26.555c0,9.737 -7.967,17.703 -17.703,17.703L145.703,172.258C135.967,172.258 128,164.291 128,154.555L128,101.445c0,-9.737 7.967,-17.703 17.703,-17.703z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_disabled"
+ android:fillColor="@color/disabled_icon"
android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM128,46.928c44.752,0 81.072,36.321 81.072,81.072 0,44.752 -36.321,81.072 -81.072,81.072C83.248,209.072 46.928,172.752 46.928,128 46.928,83.248 83.248,46.928 128,46.928ZM128,63.143c-14.998,0 -28.781,5.108 -39.726,13.701L179.156,167.726C187.75,156.781 192.857,142.998 192.857,128 192.857,92.166 163.834,63.143 128,63.143ZM76.844,88.274C68.25,99.219 63.143,113.002 63.143,128c0,35.834 29.024,64.857 64.857,64.857 14.998,0 28.781,-5.108 39.726,-13.701z" />
</vector>
\ No newline at end of file
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_ghosted"
+ android:fillColor="@color/ghosted_icon"
android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM128,46.928c44.752,0 81.072,36.321 81.072,81.072 0,44.752 -36.321,81.072 -81.072,81.072C83.248,209.072 46.928,172.752 46.928,128 46.928,83.248 83.248,46.928 128,46.928ZM128,63.143c-14.998,0 -28.781,5.108 -39.726,13.701L179.156,167.726C187.75,156.781 192.857,142.998 192.857,128 192.857,92.166 163.834,63.143 128,63.143ZM76.844,88.274C68.25,99.219 63.143,113.002 63.143,128c0,35.834 29.024,64.857 64.857,64.857 14.998,0 28.781,-5.108 39.726,-13.701z" />
</vector>
\ No newline at end of file
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_disabled"
+ android:fillColor="@color/disabled_icon"
android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM20,19L4,19c-0.55,0 -1,-0.45 -1,-1v-1c0,-0.55 0.45,-1 1,-1h16c0.55,0 1,0.45 1,1v1c0,0.55 -0.45,1 -1,1z" />
</vector>
\ No newline at end of file
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM20,19L4,19c-0.55,0 -1,-0.45 -1,-1v-1c0,-0.55 0.45,-1 1,-1h16c0.55,0 1,0.45 1,1v1c0,0.55 -0.45,1 -1,1z" />
</vector>
\ No newline at end of file
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
- android:fillColor="@color/icon_enabled"
- android:pathData="M19,8h-1.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96l0.93,-0.93c0.39,-0.39 0.39,-1.02 0,-1.41 -0.39,-0.39 -1.02,-0.39 -1.41,0l-1.47,1.47C12.96,5.06 12.49,5 12,5s-0.96,0.06 -1.41,0.17L9.11,3.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41l0.92,0.93C7.88,6.55 7.26,7.22 6.81,8L5,8c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L5,12c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1v1c0,0.34 0.04,0.67 0.09,1L5,16c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L19,18c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-1.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h1c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-1v-1c0,-0.34 -0.04,-0.67 -0.09,-1L19,10c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1zM13,16h-2c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1h2c0.55,0 1,0.45 1,1s-0.45,1 -1,1zM13,12h-2c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1h2c0.55,0 1,0.45 1,1s-0.45,1 -1,1z" />
+ android:fillColor="@color/blue_icon"
+ android:pathData="M19,8h-1.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96l0.93,-0.93c0.39,-0.39 0.39,-1.02 0,-1.41 -0.39,-0.39 -1.02,-0.39 -1.41,0l-1.47,1.47C12.96,5.06 12.49,5 12,5s-0.96,0.06 -1.41,0.17L9.11,3.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41l0.92,0.93C7.88,6.55 7.26,7.22 6.81,8L5,8c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L5,12c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1v1c0,0.34 0.04,0.67 0.09,1L5,16c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h1.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L19,18c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-1.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h1c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-1v-1c0,-0.34 -0.04,-0.67 -0.09,-1L19,10c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1zM13,16h-2c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1h2c0.55,0 1,0.45 1,1s-0.45,1 -1,1zM13,12h-2c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1h2c0.55,0 1,0.45 1,1s-0.45,1 -1,1z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
android:autoMirrored="true" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M4,10.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM4,4.5c-0.83,0 -1.5,0.67 -1.5,1.5S3.17,7.5 4,7.5 5.5,6.83 5.5,6 4.83,4.5 4,4.5zM4,16.5c-0.83,0 -1.5,0.68 -1.5,1.5s0.68,1.5 1.5,1.5 1.5,-0.68 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM8,19h12c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L8,17c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM8,13h12c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L8,11c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM7,6c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L8,5c-0.55,0 -1,0.45 -1,1z" />
</vector>
\ No newline at end of file
android:viewportWidth="24" >
<path
- android:fillColor="@color/logcat_icons"
+ android:fillColor="@color/logcat_icon"
android:pathData="M18.3,5.71c-0.39,-0.39 -1.02,-0.39 -1.41,0L12,10.59 7.11,5.7c-0.39,-0.39 -1.02,-0.39 -1.41,0 -0.39,0.39 -0.39,1.02 0,1.41L10.59,12 5.7,16.89c-0.39,0.39 -0.39,1.02 0,1.41 0.39,0.39 1.02,0.39 1.41,0L12,13.41l4.89,4.89c0.39,0.39 1.02,0.39 1.41,0 0.39,-0.39 0.39,-1.02 0,-1.41L13.41,12l4.89,-4.89c0.38,-0.38 0.38,-1.02 0,-1.4z" />
</vector>
\ No newline at end of file
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="48dp"
- android:width="48dp"
+ android:height="24dp"
+ android:width="24dp"
android:viewportHeight="24"
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M12,12.75c1.63,0 3.07,0.39 4.24,0.9c1.08,0.48 1.76,1.56 1.76,2.73L18,18H6l0,-1.61c0,-1.18 0.68,-2.26 1.76,-2.73C8.93,13.14 10.37,12.75 12,12.75zM4,13c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C2,12.1 2.9,13 4,13zM5.13,14.1C4.76,14.04 4.39,14 4,14c-0.99,0 -1.93,0.21 -2.78,0.58C0.48,14.9 0,15.62 0,16.43V18l4.5,0v-1.61C4.5,15.56 4.73,14.78 5.13,14.1zM20,13c1.1,0 2,-0.9 2,-2c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2C18,12.1 18.9,13 20,13zM24,16.43c0,-0.81 -0.48,-1.53 -1.22,-1.85C21.93,14.21 20.99,14 20,14c-0.39,0 -0.76,0.04 -1.13,0.1c0.4,0.68 0.63,1.46 0.63,2.29V18l4.5,0V16.43zM12,6c1.66,0 3,1.34 3,3c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3C9,7.34 10.34,6 12,6z" />
</vector>
\ No newline at end of file
android:autoMirrored="true" >
<path
- android:fillColor="@color/logcat_icons"
+ android:fillColor="@color/logcat_icon"
android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z" />
</vector>
\ No newline at end of file
android:autoMirrored="true" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="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,8zM4,16c-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,2H4zM7,10c0,1.66 1.34,3 3,3s3,-1.34 3,-3s-1.34,-3 -3,-3S7,8.34 7,10z" />
</vector>
\ No newline at end of file
android:autoMirrored="true" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M20,6h-1v8c0,0.55 -0.45,1 -1,1L6,15v1c0,1.1 0.9,2 2,2h10l4,4L22,8c0,-1.1 -0.9,-2 -2,-2zM17,11L17,4c0,-1.1 -0.9,-2 -2,-2L4,2c-1.1,0 -2,0.9 -2,2v13l4,-4h9c1.1,0 2,-0.9 2,-2z" />
</vector>
\ No newline at end of file
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_disabled"
+ android:fillColor="@color/disabled_icon"
android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM128.017,31.444c5.849,0 11.699,2.977 15.048,8.931l65.493,116.475c6.697,11.907 -1.652,26.858 -15.047,26.858l-130.987,0c-13.394,0 -21.744,-14.951 -15.047,-26.858L112.97,40.375c3.349,-5.954 9.198,-8.931 15.047,-8.931zM128.017,49.327 L62.523,165.803l130.987,0zM128.017,85.228c4.784,0 8.698,4.029 8.698,8.953l0,17.905c0,4.924 -3.915,8.953 -8.698,8.953 -4.784,0 -8.697,-4.029 -8.697,-8.953l0,-17.905c0,-4.924 3.914,-8.953 8.697,-8.953zM119.319,138.944l17.396,0l0,17.905l-17.396,0z" />
</vector>
\ No newline at end of file
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_ghosted"
+ android:fillColor="@color/ghosted_icon"
android:pathData="M128,0 L23.272,46.546L23.272,116.363C23.272,180.945 67.956,241.338 128,256 188.044,241.338 232.728,180.945 232.728,116.363L232.728,46.546ZM128.017,31.444c5.849,0 11.699,2.977 15.048,8.931l65.493,116.475c6.697,11.907 -1.652,26.858 -15.047,26.858l-130.987,0c-13.394,0 -21.744,-14.951 -15.047,-26.858L112.97,40.375c3.349,-5.954 9.198,-8.931 15.047,-8.931zM128.017,49.327 L62.523,165.803l130.987,0zM128.017,85.228c4.784,0 8.698,4.029 8.698,8.953l0,17.905c0,4.924 -3.915,8.953 -8.698,8.953 -4.784,0 -8.697,-4.029 -8.697,-8.953l0,-17.905c0,-4.924 3.914,-8.953 8.697,-8.953zM119.319,138.944l17.396,0l0,17.905l-17.396,0z" />
</vector>
\ No newline at end of file
android:autoMirrored="true" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M14.17,5L19,9.83V19H5V5L14.17,5L14.17,5M14.17,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V9.83c0,-0.53 -0.21,-1.04 -0.59,-1.41l-4.83,-4.83C15.21,3.21 14.7,3 14.17,3L14.17,3zM7,15h10v2H7V15zM7,11h10v2H7V11zM7,7h7v2H7V7z" />
</vector>
\ No newline at end of file
-<!-- This file comes from the Android Material icon set, where it is called `chrome_reader_mode_rounded`. It is released under the Apache License 2.0. -->
+<!-- This file comes from the Android Material icon set, where it is called `list_alt_rounded_24`. It is released under the Apache License 2.0. -->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="24"
android:autoMirrored="true" >
<path
- android:fillColor="@color/icon_enabled"
- android:pathData="M12,9h4c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-4c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM12,13h4c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-4c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM12,17h4c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1h-4c-0.55,0 -1,0.45 -1,1s0.45,1 1,1zM7,7h2v2L7,9zM7,11h2v2L7,13zM7,15h2v2L7,17zM20,3L4,3c-0.55,0 -1,0.45 -1,1v16c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1L21,4c0,-0.55 -0.45,-1 -1,-1zM19,19L5,19L5,5h14v14z" />
-</vector>
\ No newline at end of file
+ android:fillColor="@color/blue_icon"
+ android:pathData="M5,21q-0.825,0 -1.413,-0.587Q3,19.825 3,19L3,5q0,-0.825 0.587,-1.413Q4.175,3 5,3h14q0.825,0 1.413,0.587Q21,4.175 21,5v14q0,0.825 -0.587,1.413Q19.825,21 19,21ZM5,19h14L19,5L5,5v14ZM8,17q0.425,0 0.713,-0.288Q9,16.425 9,16t-0.287,-0.713Q8.425,15 8,15t-0.713,0.287Q7,15.575 7,16t0.287,0.712Q7.575,17 8,17ZM8,13q0.425,0 0.713,-0.288Q9,12.425 9,12t-0.287,-0.713Q8.425,11 8,11t-0.713,0.287Q7,11.575 7,12t0.287,0.712Q7.575,13 8,13ZM8,9q0.425,0 0.713,-0.288Q9,8.425 9,8t-0.287,-0.713Q8.425,7 8,7t-0.713,0.287Q7,7.575 7,8t0.287,0.712Q7.575,9 8,9ZM12,17h4q0.425,0 0.712,-0.288Q17,16.425 17,16t-0.288,-0.713Q16.425,15 16,15h-4q-0.425,0 -0.712,0.287Q11,15.575 11,16t0.288,0.712Q11.575,17 12,17ZM12,13h4q0.425,0 0.712,-0.288Q17,12.425 17,12t-0.288,-0.713Q16.425,11 16,11h-4q-0.425,0 -0.712,0.287Q11,11.575 11,12t0.288,0.712Q11.575,13 12,13ZM12,9h4q0.425,0 0.712,-0.288Q17,8.425 17,8t-0.288,-0.713Q16.425,7 16,7h-4q-0.425,0 -0.712,0.287Q11,7.575 11,8t0.288,0.712Q11.575,9 12,9ZM5,19L5,5v14Z"
+ tools:ignore="VectorPath" />
+</vector>
android:autoMirrored="true" >
<path
- android:fillColor="@color/icon_enabled"
+ 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>
--- /dev/null
+<!-- 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>
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M20,3H4C2.9,3 2,3.9 2,5v14c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3zM20,19H4V5h16V19z" />
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M19.41,10.42l-1.42,-1.42l-3.17,3.17l-1.41,-1.42l-1.41,1.41l2.82,2.84z" />
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M5,7h5v2h-5z" />
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M5,11h5v2h-5z" />
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M5,15h5v2h-5z" />
</vector>
android:viewportWidth="24">
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M16,1L8,1C6.34,1 5,2.34 5,4v16c0,1.66 1.34,3 3,3h8c1.66,0 3,-1.34 3,-3L19,4c0,-1.66 -1.34,-3 -3,-3zM14,21h-4v-1h4v1zM17.25,18L6.75,18L6.75,4h10.5v14z" />
</vector>
--- /dev/null
+<!--
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+
+ This file is derived from `security` and `5g`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
+
+ 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/>. -->
+
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:height="108dp"
+ android:width="108dp"
+ android:viewportHeight="256"
+ android:viewportWidth="256" >
+
+ <group
+ android:scaleX="0.4888889"
+ android:scaleY="0.4888889"
+ android:translateX="65.422226"
+ android:translateY="65.422226" >
+
+ <path
+ android:fillColor="@color/black"
+ android:pathData="M128,0 L23.27,46.55L23.27,116.36c-0,64.58 44.68,124.97 104.73,139.64 60.04,-14.66 104.73,-75.05 104.73,-139.64L232.73,46.55ZM54.85,76.63l48.66,0c4.54,0 8.11,3.57 8.11,8.11 0,4.54 -3.57,8.11 -8.11,8.11l-40.55,0l0,24.33l32.44,0c8.92,0 16.22,7.3 16.22,16.22l0,24.33c0,8.92 -7.3,16.22 -16.22,16.22l-40.55,0c-4.54,0 -8.11,-3.57 -8.11,-8.11 0,-4.54 3.57,-8.11 8.11,-8.11l40.55,0l0,-24.33l-40.55,0c-4.54,0 -8.11,-3.57 -8.11,-8.11l0,-40.55c0,-4.54 3.57,-8.11 8.11,-8.11zM144.05,76.63l56.76,0c4.54,0 8.11,3.57 8.11,8.11 0,4.54 -3.57,8.11 -8.11,8.11L144.05,92.85l0,64.87l48.66,0l0,-24.33l-24.33,0c-4.54,0 -8.11,-3.57 -8.11,-8.11 0,-4.54 3.57,-8.11 8.11,-8.11l32.44,0c4.54,0 8.11,3.57 8.11,8.11l0,32.44c0,8.92 -7.3,16.22 -16.22,16.22L144.05,173.94c-8.92,0 -16.22,-7.3 -16.22,-16.22L127.84,92.85c0,-8.92 7.3,-16.22 16.22,-16.22z"
+ tools:ignore="VectorPath" />
+ </group>
+</vector>
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M21,5l-9,-4L3,5v6c0,5.55 3.84,10.74 9,12c2.3,-0.56 4.33,-1.9 5.88,-3.71l-3.12,-3.12c-1.94,1.29 -4.58,1.07 -6.29,-0.64c-1.95,-1.95 -1.95,-5.12 0,-7.07c1.95,-1.95 5.12,-1.95 7.07,0c1.71,1.71 1.92,4.35 0.64,6.29l2.9,2.9C20.29,15.69 21,13.38 21,11V5z" />
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M12,12m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" />
</vector>
\ No newline at end of file
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M12,5c-3.87,0 -7,3.13 -7,7h2c0,-2.76 2.24,-5 5,-5s5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM13,14.29c0.88,-0.39 1.5,-1.26 1.5,-2.29 0,-1.38 -1.12,-2.5 -2.5,-2.5S9.5,10.62 9.5,12c0,1.02 0.62,1.9 1.5,2.29v3.3L7.59,21 9,22.41l3,-3 3,3L16.41,21 13,17.59v-3.3zM12,1C5.93,1 1,5.93 1,12h2c0,-4.97 4.03,-9 9,-9s9,4.03 9,9h2c0,-6.07 -4.93,-11 -11,-11z" />
</vector>
\ No newline at end of file
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
+ android:fillColor="@color/blue_icon"
android:pathData="M14.65,4.98l-5,-1.75c-0.42,-0.15 -0.88,-0.15 -1.3,-0.01L4.36,4.56C3.55,4.84 3,5.6 3,6.46v11.85c0,1.41 1.41,2.37 2.72,1.86l2.93,-1.14c0.22,-0.09 0.47,-0.09 0.69,-0.01l5,1.75c0.42,0.15 0.88,0.15 1.3,0.01l3.99,-1.34c0.81,-0.27 1.36,-1.04 1.36,-1.9V5.69c0,-1.41 -1.41,-2.37 -2.72,-1.86l-2.93,1.14c-0.22,0.08 -0.46,0.09 -0.69,0.01zM15,18.89l-6,-2.11V5.11l6,2.11v11.67z" />
</vector>
\ No newline at end of file
android:viewportWidth="24" >
<path
- android:fillColor="@color/logcat_icons"
+ android:fillColor="@color/logcat_icon"
android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM19,19L5,19L5,5h11.17L19,7.83L19,19zM12,12c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3zM6,6h9v4L6,10z" />
</vector>
\ No newline at end of file
<!--
- Copyright © 2016,2021-2022 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
This file is derived from `security` and `5g`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="256"
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_disabled"
- android:pathData="M128,0 L23.273,46.545L23.273,116.364c-0,64.582 44.684,124.974 104.727,139.636 60.044,-14.662 104.727,-75.054 104.727,-139.636L232.727,46.545ZM54.852,76.633l48.656,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109l-40.547,0l0,24.327l32.437,0c8.92,0 16.219,7.298 16.219,16.219l0,24.328c0,8.92 -7.298,16.219 -16.219,16.219l-40.546,0c-4.541,0 -8.11,-3.569 -8.11,-8.11 0,-4.541 3.569,-8.109 8.11,-8.109l40.546,0l0,-24.328l-40.546,0c-4.541,0 -8.11,-3.568 -8.11,-8.109l0,-40.546c0,-4.541 3.569,-8.11 8.11,-8.11zM144.054,76.633l56.765,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109L144.054,92.852l0,64.874l48.656,0l0,-24.328l-24.328,0c-4.541,0 -8.109,-3.568 -8.109,-8.109 0,-4.541 3.568,-8.11 8.109,-8.11l32.437,0c4.541,0 8.109,3.569 8.109,8.11l0,32.437c0,8.92 -7.297,16.219 -16.218,16.219L144.054,173.945c-8.92,0 -16.219,-7.298 -16.219,-16.219L127.835,92.852c0,-8.92 7.298,-16.219 16.219,-16.219z" />
+ android:fillColor="@color/disabled_icon"
+ android:pathData="M128,0 L23.273,46.545L23.273,116.364c-0,64.582 44.684,124.974 104.727,139.636 60.044,-14.662 104.727,-75.054 104.727,-139.636L232.727,46.545ZM54.852,76.633l48.656,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109l-40.547,0l0,24.327l32.437,0c8.92,0 16.219,7.298 16.219,16.219l0,24.328c0,8.92 -7.298,16.219 -16.219,16.219l-40.546,0c-4.541,0 -8.11,-3.569 -8.11,-8.11 0,-4.541 3.569,-8.109 8.11,-8.109l40.546,0l0,-24.328l-40.546,0c-4.541,0 -8.11,-3.568 -8.11,-8.109l0,-40.546c0,-4.541 3.569,-8.11 8.11,-8.11zM144.054,76.633l56.765,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109L144.054,92.852l0,64.874l48.656,0l0,-24.328l-24.328,0c-4.541,0 -8.109,-3.568 -8.109,-8.109 0,-4.541 3.568,-8.11 8.109,-8.11l32.437,0c4.541,0 8.109,3.569 8.109,8.11l0,32.437c0,8.92 -7.297,16.219 -16.218,16.219L144.054,173.945c-8.92,0 -16.219,-7.298 -16.219,-16.219L127.835,92.852c0,-8.92 7.298,-16.219 16.219,-16.219z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
<!--
- Copyright © 2016,2021-2022 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
This file is derived from `security` and `5g`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="256"
<path
android:fillColor="@color/blue_icon"
- android:pathData="M128,0 L23.273,46.545L23.273,116.364c-0,64.582 44.684,124.974 104.727,139.636 60.044,-14.662 104.727,-75.054 104.727,-139.636L232.727,46.545ZM54.852,76.633l48.656,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109l-40.547,0l0,24.327l32.437,0c8.92,0 16.219,7.298 16.219,16.219l0,24.328c0,8.92 -7.298,16.219 -16.219,16.219l-40.546,0c-4.541,0 -8.11,-3.569 -8.11,-8.11 0,-4.541 3.569,-8.109 8.11,-8.109l40.546,0l0,-24.328l-40.546,0c-4.541,0 -8.11,-3.568 -8.11,-8.109l0,-40.546c0,-4.541 3.569,-8.11 8.11,-8.11zM144.054,76.633l56.765,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109L144.054,92.852l0,64.874l48.656,0l0,-24.328l-24.328,0c-4.541,0 -8.109,-3.568 -8.109,-8.109 0,-4.541 3.568,-8.11 8.109,-8.11l32.437,0c4.541,0 8.109,3.569 8.109,8.11l0,32.437c0,8.92 -7.297,16.219 -16.218,16.219L144.054,173.945c-8.92,0 -16.219,-7.298 -16.219,-16.219L127.835,92.852c0,-8.92 7.298,-16.219 16.219,-16.219z" />
+ android:pathData="M128,0 L23.273,46.545L23.273,116.364c-0,64.582 44.684,124.974 104.727,139.636 60.044,-14.662 104.727,-75.054 104.727,-139.636L232.727,46.545ZM54.852,76.633l48.656,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109l-40.547,0l0,24.327l32.437,0c8.92,0 16.219,7.298 16.219,16.219l0,24.328c0,8.92 -7.298,16.219 -16.219,16.219l-40.546,0c-4.541,0 -8.11,-3.569 -8.11,-8.11 0,-4.541 3.569,-8.109 8.11,-8.109l40.546,0l0,-24.328l-40.546,0c-4.541,0 -8.11,-3.568 -8.11,-8.109l0,-40.546c0,-4.541 3.569,-8.11 8.11,-8.11zM144.054,76.633l56.765,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109L144.054,92.852l0,64.874l48.656,0l0,-24.328l-24.328,0c-4.541,0 -8.109,-3.568 -8.109,-8.109 0,-4.541 3.568,-8.11 8.109,-8.11l32.437,0c4.541,0 8.109,3.569 8.109,8.11l0,32.437c0,8.92 -7.297,16.219 -16.218,16.219L144.054,173.945c-8.92,0 -16.219,-7.298 -16.219,-16.219L127.835,92.852c0,-8.92 7.298,-16.219 16.219,-16.219z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
<!--
- Copyright © 2016,2021-2022 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
This file is derived from `security` and `5g`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="256"
android:viewportWidth="256" >
<path
- android:fillColor="@color/icon_ghosted"
- android:pathData="M128,0 L23.273,46.545L23.273,116.364c-0,64.582 44.684,124.974 104.727,139.636 60.044,-14.662 104.727,-75.054 104.727,-139.636L232.727,46.545ZM54.852,76.633l48.656,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109l-40.547,0l0,24.327l32.437,0c8.92,0 16.219,7.298 16.219,16.219l0,24.328c0,8.92 -7.298,16.219 -16.219,16.219l-40.546,0c-4.541,0 -8.11,-3.569 -8.11,-8.11 0,-4.541 3.569,-8.109 8.11,-8.109l40.546,0l0,-24.328l-40.546,0c-4.541,0 -8.11,-3.568 -8.11,-8.109l0,-40.546c0,-4.541 3.569,-8.11 8.11,-8.11zM144.054,76.633l56.765,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109L144.054,92.852l0,64.874l48.656,0l0,-24.328l-24.328,0c-4.541,0 -8.109,-3.568 -8.109,-8.109 0,-4.541 3.568,-8.11 8.109,-8.11l32.437,0c4.541,0 8.109,3.569 8.109,8.11l0,32.437c0,8.92 -7.297,16.219 -16.218,16.219L144.054,173.945c-8.92,0 -16.219,-7.298 -16.219,-16.219L127.835,92.852c0,-8.92 7.298,-16.219 16.219,-16.219z" />
+ android:fillColor="@color/ghosted_icon"
+ android:pathData="M128,0 L23.273,46.545L23.273,116.364c-0,64.582 44.684,124.974 104.727,139.636 60.044,-14.662 104.727,-75.054 104.727,-139.636L232.727,46.545ZM54.852,76.633l48.656,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109l-40.547,0l0,24.327l32.437,0c8.92,0 16.219,7.298 16.219,16.219l0,24.328c0,8.92 -7.298,16.219 -16.219,16.219l-40.546,0c-4.541,0 -8.11,-3.569 -8.11,-8.11 0,-4.541 3.569,-8.109 8.11,-8.109l40.546,0l0,-24.328l-40.546,0c-4.541,0 -8.11,-3.568 -8.11,-8.109l0,-40.546c0,-4.541 3.569,-8.11 8.11,-8.11zM144.054,76.633l56.765,0c4.541,0 8.109,3.569 8.109,8.11 0,4.541 -3.568,8.109 -8.109,8.109L144.054,92.852l0,64.874l48.656,0l0,-24.328l-24.328,0c-4.541,0 -8.109,-3.568 -8.109,-8.109 0,-4.541 3.568,-8.11 8.109,-8.11l32.437,0c4.541,0 8.109,3.569 8.109,8.11l0,32.437c0,8.92 -7.297,16.219 -16.218,16.219L144.054,173.945c-8.92,0 -16.219,-7.298 -16.219,-16.219L127.835,92.852c0,-8.92 7.298,-16.219 16.219,-16.219z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:height="24dp"
android:width="24dp"
android:viewportHeight="24"
android:viewportWidth="24" >
<path
- android:fillColor="@color/icon_enabled"
- android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z" />
+ android:fillColor="@color/blue_icon"
+ android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"
+ tools:ignore="VectorPath" />
</vector>
\ No newline at end of file
<?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>.
android:orientation="vertical"
android:padding="15dp" >
- <!-- Stingray. -->
+ <!-- Overall status. -->
<LinearLayout
- android:id="@+id/stingray_linearlayout"
+ android:id="@+id/overall_status_linearlayout"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
tools:ignore="UseCompoundDrawables" >
<ImageView
- android:id="@+id/stingray_imageview"
+ android:id="@+id/overall_status_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
<!-- The text color primary is only displayed if the read phone state permission is not granted.
The default text is replaced if the permission is not granted or the device is connected to a cell phone network. -->
<TextView
- android:id="@+id/summary_textview"
+ android:id="@+id/overall_status_textview"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
android:layout_marginTop="30dp"
- android:textColor="@color/blue_text"
android:textSize="18sp"
android:textStyle="bold" />
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
- android:textColor="@color/blue_text"
android:textSize="18sp"
android:textStyle="bold" />
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
- android:textColor="@color/blue_text"
android:textSize="18sp"
android:textStyle="bold" />
android:layout_width="wrap_content"
android:layout_gravity="start"
app:menu="@menu/navigation_menu_bottom_appbar"
- app:itemIconTint="@color/icon_enabled" />
+ app:itemIconTint="@color/blue_icon" />
</androidx.drawerlayout.widget.DrawerLayout>
\ No newline at end of file
<?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>.
android:orientation="vertical"
android:padding="15dp" >
- <!-- Stingray. -->
+ <!-- Overall status. -->
<LinearLayout
- android:id="@+id/stingray_linearlayout"
+ android:id="@+id/overall_status_linearlayout"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
tools:ignore="UseCompoundDrawables" >
<ImageView
- android:id="@+id/stingray_imageview"
+ android:id="@+id/overall_status_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
<!-- The text color primary is only displayed if the read phone state permission is not granted.
The default text is replaced if the permission is not granted or the device is connected to a cell phone network. -->
<TextView
- android:id="@+id/summary_textview"
+ android:id="@+id/overall_status_textview"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
android:layout_marginTop="30dp"
- android:textColor="@color/blue_text"
android:textSize="18sp"
android:textStyle="bold" />
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
- android:textColor="@color/blue_text"
android:textSize="18sp"
android:textStyle="bold" />
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:textAlignment="center"
- android:textColor="@color/blue_text"
android:textSize="18sp"
android:textStyle="bold" />
android:layout_width="wrap_content"
android:layout_gravity="start"
app:menu="@menu/navigation_menu_top_appbar"
- app:itemIconTint="@color/icon_enabled" />
+ app:itemIconTint="@color/blue_icon" />
</androidx.drawerlayout.widget.DrawerLayout>
\ No newline at end of file
<?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>.
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"
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>
<?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>.
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>
<?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>.
<WebView
android:id="@+id/webview"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content" />
-</LinearLayout>
\ No newline at end of file
+ android:layout_height="match_parent"
+ android:layout_width="match_parent" />
+</LinearLayout>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright © 2016,2021-2022 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
-
- This file is derived from `security` and `5g`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
-
- 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/>. -->
-
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/white"/>
- <foreground android:drawable="@drawable/privacy_cell_foreground"/>
-</adaptive-icon>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Copyright © 2016,2021-2023 Soren Stoutner <soren@stoutner.com>. The resulting image is released under the GPLv3+ license.
+
+ This file is derived from `security` and `5g`, which are part of the Android Material icon set. They are released under the Apache License 2.0.
+
+ 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/>. -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/white" />
+ <foreground android:drawable="@drawable/privacy_cell_foreground" />
+ <monochrome android:drawable="@drawable/privacy_cell_monochrome" />
+</adaptive-icon>
<?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>.
<!-- Text views. The `\n\n` code inserts a line break and should be preserved in translations.
Android removes double spaces, but extra spaces can be manually specified with the Unicode `\u0020` formatting.
The `%1$s` code inserts variables into the displayed text and should be preserved in translation. -->
+ <string name="secure_protocols">Ihr Gerät ist mit einem Netzwerk verbunden, das sichere Protokolle verwendet.\n\nEs ist vor Stingray-IMSI-Man-in-the-middle-Angriffen geschützt.</string>
+ <string name="insecure_protocols">Ihr Gerät ist mit einem Netzwerk verbunden, das unsichere Protokolle verwendet.\n\nEs ist nicht vor Stingray-IMSI-Man-in-the-middle-Angriffen geschützt.</string>
+ <string name="antiquated_protocols">Ihr Gerät ist mit einem Netzwerk verbunden, das veraltete Protokolle verwendet.\n\nEs ist dadurch für etliche Sicherheits-Schwachstellen anfällig.</string>
<string name="voice_network">Sprach-Netzwerk: \u0020 %1$s</string>
<string name="data_network">Daten-Netzwerk: \u0020 %1$s</string>
<string name="additional_network_info">Zusätzliche Netzwerk-Information: \u0020 %1$s</string>
<string name="nr_advanced">NR Advanced – 5G</string>
<string name="nr_advanced_detail">New Radio Advanced</string>
- <!-- Phone permission dialog. -->
+ <!-- Permission dialogs. -->
<string name="phone_permission">Telefon-Berechtigung</string>
<string name="phone_permission_text">Privacy Cell benötigt lesenden Zugriff auf den Status Ihres Telefons, um das Sicherheits-Niveau Ihrer Mobilfunk-Verbindung zu ermitteln.</string>
+ <string name="notification_permission">Benachrichtigungs-Berechtigung</string>
+ <string name="notification_permission_text">Privacy Cell benötigt die Benachrichtigungs-Berechtigung, um Benachrichtigungen des Echtzeit-Monitorings anzeigen zu können.</string>
<string name="ok">OK</string>
<!-- Dialogs. -->
<string name="stingrays">Stingrays</string>
+ <string name="antiquated_network_title">Veraltetes Netzwerk</string>
<string name="close">Schließen</string>
<!-- Settings. -->
<string name="monitoring">Überwachung</string>
<string name="realtime_monitoring">Echtzeit-Überwachung</string>
<string name="realtime_monitoring_summary">Plaziert ein Icon in der Statusleiste, das die Überwachung der Mobilfunk-Verbindung anzeigt.</string>
+ <string name="notification_permission_denied">Die Benachrichtigungs-Berechtigung für Privacy Cell wurde abgelehnt. Daher werden derzeit keine Benachrichtigungen angezeigt.</string>
<string name="secure_network_notification">Benachrichtigung über sicheres Netzwerk</string>
<string name="insecure_network_notification">Benachrichtigung über unsicheres Netzwerk</string>
+ <string name="antiquated_network_notification">Benachrichtigung über veraltetes Netzwerk</string>
+ <string name="consider_3g_antiquated">3G als veraltet ansehen</string>
+ <string name="consider_3g_antiquated_summary">3G-Protokolle als veraltet ansehen. Zu einem späteren Zeitpunkt wird dies zur Standard-Einstellung werden.
+ Das Ändern dieser Einstellung startet Privacy Cell neu.</string>
<string name="interface_title">Anschluss</string>
<string name="bottom_app_bar">Anwendungs-Leiste unten</string>
<string name="bottom_app_bar_summary">Zeigt die Anwendungs-Leiste am unteren Bildschirmrand an. Nach Ändern dieser Einstellung wird Privacy Cell neu gestartet.</string>
<!-- Notifications. -->
<string name="secure">Sicher</string>
<string name="insecure">Unsicher</string>
+ <string name="antiquated">Veraltet</string>
<string name="secure_network">Sie sind mit einem sicheren Netzwerk verbunden.</string>
+ <string name="insecure_network">Sie sind mit einem unsicheren Netzwerk verbunden.</string>
+ <string name="antiquated_network">Sie sind mit einem veralteten Netzwerk verbunden.</string>
<string name="unknown_network">Der Sicherheits-Status des Netzwerks ist unbekannt.</string>
<string name="secure_network_channel">Sicheres Netzwerk</string>
<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>
<?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="nr_advanced">NR Avanzado – 5G</string>
<string name="nr_advanced_detail">Nueva Radio Avanzada</string>
- <!-- Phone permission dialog. -->
+ <!-- Permission dialogs. -->
<string name="phone_permission">Permiso telefónico</string>
<string name="phone_permission_text">Privacy Cell necesita el permiso del teléfono "Leer estado del teléfono" para determinar el nivel de seguridad de su conexión celular.</string>
+ <string name="notification_permission">Permiso de notificación</string>
+ <string name="notification_permission_text">Privacy Cell necesita el permiso Post Notification para mostrar las notificaciones de monitoreo en tiempo real.</string>
<string name="ok">OK</string>
<!-- Dialogs. -->
<string name="monitoring">Monitorización</string>
<string name="realtime_monitoring">Monitorización en tiempo real</string>
<string name="realtime_monitoring_summary">Coloca un icono en la barra de estado que monitoriza la red celular.</string>
+ <string name="notification_permission_denied">El permiso de publicación de notificaciones está actualmente denegado, por lo que no se mostrarán las notificaciones.</string>
<string name="secure_network_notification">Notificación de red segura</string>
<string name="insecure_network_notification">Notificación de red insegura</string>
<string name="antiquated_network_notification">Notificación de red obsoleta</string>
<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>
<?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="nr_advanced">NR Advanced – 5G</string>
<string name="nr_advanced_detail">New Radio Advanced</string>
- <!-- Phone permission dialog. -->
+ <!-- Permission dialogs. -->
<string name="phone_permission">Autorisations</string>
<string name="phone_permission_text">Privacy Cell a besoin de l\'autorisation READ PHONE STATE pour déterminer le niveau de sécurité de votre connexion cellulaire.</string>
+ <string name="notification_permission">Autorisation de notification</string>
+ <string name="notification_permission_text">Privacy Cell a besoin de l\'autorisation Post Notification pour afficher les notifications de surveillance en temps réel.</string>
<string name="ok">OK</string>
<!-- Dialogs. -->
<string name="monitoring">Supervision</string>
<string name="realtime_monitoring">Supervision en temps-réel</string>
<string name="realtime_monitoring_summary">Placez une icône dans la barre d\'état qui surveille le réseau cellulaire.</string>
+ <string name="notification_permission_denied">L\'autorisation d\'afficher les notifications est actuellement refusée, les notifications ne seront donc pas affichées.</string>
<string name="secure_network_notification">Notification de réseau sécurisé</string>
<string name="insecure_network_notification">Notification de réseau non sécurisé</string>
<string name="antiquated_network_notification">Notification de réseau obsolète</string>
<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>
<?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="nr_advanced">NR Advanced – 5G</string>
<string name="nr_advanced_detail">New Radio Advanced</string>
- <!-- Phone permission dialog. -->
+ <!-- Permission dialogs. -->
<string name="phone_permission">Autorizzazioni sul dispositivo</string>
<string name="phone_permission_text">Privacy Cell ha bisogno dell\'autorizzazione di lettura dello stato del telefono per poter determinare il livello si sicurezza della connessione.</string>
+ <string name="notification_permission">Autorizzazione per le notifiche</string>
+ <string name="notification_permission_text">Privacy Cell ha bisogno dell\'autorizzazione "Post Notification" per mostrare le notifiche del monitoraggio in tempo reale.</string>
<string name="ok">OK</string>
<!-- Dialogs. -->
<string name="monitoring">Monitoraggio</string>
<string name="realtime_monitoring">Monitoraggio in tempo reale</string>
<string name="realtime_monitoring_summary">Aggiunge un\'icona nella barra di stato che monitora la rete cellulare.</string>
+ <string name="notification_permission_denied">L\'autorizzazione "Post Notification" non è stata al momento concessa per cui le notifiche non saranno visualizzate.</string>
<string name="secure_network_notification">Notifica di rete sicura</string>
<string name="insecure_network_notification">Notifica di rete insicura</string>
<string name="antiquated_network_notification">Notifiche di Rete Antiquata</string>
<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>
<color name="additional_network_info">@color/gray_825</color>
<color name="blue_icon">@color/violet_500</color>
<color name="blue_text">@color/violet_500</color>
- <color name="icon_disabled">@color/gray_500</color>
- <color name="icon_enabled">@color/violet_500</color>
- <color name="icon_ghosted">@color/gray_700</color>
- <color name="logcat_icons">@color/white</color>
+ <color name="disabled_icon">@color/gray_500</color>
+ <color name="ghosted_icon">@color/gray_700</color>
+ <color name="logcat_icon">@color/white</color>
<color name="red_icon">@color/salmon</color>
<color name="red_notification_icon">@color/red_900</color>
<color name="red_text">@color/salmon</color>
<color name="yellow_notification_icon">@color/yellow_700</color>
+ <color name="yellow_text">@color/yellow_900</color>
</resources>
\ No newline at end of file
<?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 усовершенствованное – 5G</string>
<string name="nr_advanced_detail">Новое радио усовершенствованное</string>
- <!-- Phone permission dialog. -->
+ <!-- Permission dialogs. -->
<string name="phone_permission">Разрешение телефона</string>
<string name="phone_permission_text">Privacy Cell необходимо разрешение на чтение состояния телефона для определения степени безопасности вашего мобильного подключения.</string>
+ <string name="notification_permission">Разрешение на уведомления</string>
+ <string name="notification_permission_text">Privacy Cell требуется разрешение на отправку уведомлений для отображения уведомлений мониторинга в реальном времени.</string>
<string name="ok">OK</string>
<!-- Dialogs. -->
<string name="monitoring">Мониторинг</string>
<string name="realtime_monitoring">Мониторинг в реальном времени</string>
<string name="realtime_monitoring_summary">Поместить в строку состояния значок для отслеживания сотовой сети.</string>
+ <string name="notification_permission_denied">Разрешение на отправку уведомлений в настоящее время запрещено, поэтому уведомления отображаться не будут.</string>
<string name="secure_network_notification">Уведомление о безопасной сети</string>
<string name="insecure_network_notification">Уведомление о небезопасной сети</string>
<string name="antiquated_network_notification">Оповещение об устаревшей сети</string>
<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>
<color name="additional_network_info">@color/gray_200</color>
<color name="blue_icon">@color/blue_700</color>
<color name="blue_text">@color/blue_700</color>
- <color name="icon_disabled">@color/gray_600</color>
- <color name="icon_enabled">@color/blue_700</color>
- <color name="icon_ghosted">@color/gray_425</color>
- <color name="logcat_icons">@color/gray_925</color>
+ <color name="disabled_icon">@color/gray_600</color>
+ <color name="ghosted_icon">@color/gray_425</color>
+ <color name="logcat_icon">@color/gray_925</color>
<color name="red_icon">@color/red_700</color>
<color name="red_notification_icon">@color/red_700</color>
<color name="red_text">@color/red_700</color>
<color name="yellow_notification_icon">@color/yellow_700</color>
+ <color name="yellow_text">@color/yellow_900</color>
<!-- Raw colors. -->
<color name="amber_300">#FFFFD54F</color>
<?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 dialogs. -->
<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="monitoring">Monitoring</string>
<string name="realtime_monitoring">Realtime monitoring</string>
<string name="realtime_monitoring_summary">Place an icon in the status bar that monitors the cell network.</string>
+ <string name="notification_permission_denied">The Post Notification permission is currently denied, so notifications will not be displayed.</string>
<string name="secure_network_notification">Secure network notification</string>
<string name="insecure_network_notification">Insecure network notification</string>
<string name="antiquated_network_notification">Antiquated network notification</string>
<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>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ Copyright 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/>. -->
+
+<!-- https://developer.android.com/guide/topics/resources/app-languages#app-language-settings -->
+<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
+ <locale android:name="en"/> <!-- English. -->
+ <locale android:name="de"/> <!-- German. -->
+ <locale android:name="es"/> <!-- Spanish. -->
+ <locale android:name="fr"/> <!-- French. -->
+ <locale android:name="it"/> <!-- Italian. -->
+ <locale android:name="ru"/> <!-- Russian. -->
+</locale-config>
<?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>.
<SwitchPreferenceCompat
app:key="@string/realtime_monitoring_key"
app:title="@string/realtime_monitoring"
- app:summary="@string/realtime_monitoring_summary"
app:defaultValue="false" />
<Preference
app:summary="@string/bottom_app_bar_summary"
app:defaultValue="false" />
</PreferenceCategory>
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
/*
- * Copyright © 2021-2022 Soren Stoutner <soren@stoutner.com>.
+ * Copyright 2021-2023 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Cell <https://www.stoutner.com/privacy-cell>.
*
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.1.2'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
+ classpath 'com.android.tools.build:gradle:8.1.2'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.22"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
-task clean(type: Delete) {
+tasks.register('clean', Delete) {
delete rootProject.buildDir
-}
\ No newline at end of file
+}
--- /dev/null
+• Fehler behoben, durch den nach Änderung der Netzwerk-Verbindung Benachrichtigungen wieder aktiviert wurden.
+• Zweifarbig violetten Text zum Nachtmodus (Theme) hinzugefügt.
+• Erste komplette deutsche Übersetzung von Bernhard G. Keller.
\ No newline at end of file
--- /dev/null
+• Ziel-API auf 33 (Android 13) angehoben.
+• Wischgeste zum zum Ablehnen der Benachrichtigungen des Echtzeit-Monitorings unter Android 13 deaktiviert.
+• App-Sprachauswahl zur Auswahl der Sprache von Privacy Cell unter Android 13 hinzugefügt.
+• Scroll-Position im Einstellungs-Dialog wird nun bei Neustarts beibehalten.
+• Erste komplette deutsche Übersetzung von Bernhard G. Keller.
\ No newline at end of file
--- /dev/null
+• Der Sprach-Netzwerk-Status wird nun bei der Einschätzung der Gesamt-Sicherheit des Funknetzwerks berücksichtigt.
+• Fehler behoben, durch den gelegentlich Benachrichtigungen nicht abgeschaltet werden konnten.
+• Ziel-API auf 32 (Android 12L) angehoben.
+• Erste komplette deutsche Übersetzung von Bernhard G. Keller.
\ No newline at end of file
--- /dev/null
+Privacy Cell ist eine kleine App, die Informationen zu den genutzten Mobilfunk-Protokollen anzeigt.
+
+Zur Zeit wechseln viele Mobilfunk-Netzwerke von 4G (4. Generation) zu 5G-Protokollen. Die 5G-Netzwerk-Protokolle wurden mit besonderem Fokus auf bekannte Sicherheitslücken in älteren Protokollen entwickelt, zu denen Man-In-The-Middle-Attacken in Mobilfunknetzen mittels Stingrays (IMSI-Catchern) zählen. Um die Entwicklung und Rückwärtskompatibilität zu erleichtern, können 4G- und 5G-Netzwerke kombiniert verwendet werden. Dies wird als 5G NR (New Radio) NSA (Non-Standalone) -Modus bezeichnet. Dabei wird 4G für den Kontrollkanal und 5G für die Datenkommunikation genutzt. Allerdings schützt 5G NR NSA nicht gegen Stingray-Angriffe. Android hat grundsätzlich Zugriff auf alle notwendigen Informationen, wenn es mit einem 5G NR NSA oder 5G NR SA (Standalone) Netzwerk verbunden ist, zeigt diese Informationen jedoch dem Benutzer nicht an. Der Zweck von Privacy Cell ist, diese Informationen einfach verfügbar zu machen.
+
+Privacy Cell kann auch warnen, wenn Sie mit veralteten 2G- and 3G-Netzwerken verbunden sind.
\ No newline at end of file
--- /dev/null
+Überprüfen Sie, ob Ihr Mobiltelefon die sichersten Mobilfunk-Protokolle nutzt.
\ No newline at end of file
--- /dev/null
+Privacy Cell
\ No newline at end of file
--- /dev/null
+• Fix a bug that re-enabled notifications when the network changed.
+• Add dual-toned violet text to the Night Theme.
\ No newline at end of file
--- /dev/null
+• Bump the target API to 33 (Android 13).
+• Disable swiping to dismiss the realtime monitoring notification on Android 13.
+• Enable per-app language support on Android 13.
+• Preserve the Settings scroll location on restart.
\ No newline at end of file
--- /dev/null
+• Create an optional monochrome icon (can be used in Android >= 13).
+• Allow Privacy Cell to be included in system backups.
+• Bump the target API to 34 (Android 14).
+• Document permissions needed for newer versions of Android.
+• Repopulate the realtime monitoring notification every 15 minutes.
\ No newline at end of file
--- /dev/null
+• Include the voice network status in determining the overall security of the cell network.
+• Fix a bug that sometimes prevented notifications from being disabled.
+• Bump the target API to 32 (Android 12L).
+• First full German translation contributed by Bernhard G. Keller.
\ No newline at end of file
--- /dev/null
+• Corregir un error que volvía a activar las notificaciones cuando cambiaba la red.
+• Añadir un texto violeta de doble tonoal Tema Nocturno.
+• Traducción actualizada al español aportada por Jose A. León.
\ No newline at end of file
--- /dev/null
+• Subir la API de destino a 33 (Android 13).
+• Desactivar el deslizamiento para descartar la notificación de seguimiento en tiempo real en Android 13.
+• Habilitar el soporte de idiomas por aplicación en Android 13.
+• Preservar la localización de desplazamiento de los Ajustes al reiniciar.
+• Traducción actualizada al español aportada por Jose A. León.
\ No newline at end of file
--- /dev/null
+• Crear un icono monocromo opcional (puede usarse en Android >= 13).
+• Permitir que Privacy Cell se incluya en las copias de seguridad del sistema.
+• Subir la API objetivo a 34 (Android 14).
+• Documentar los permisos necesarios para las nuevas versiones de Android.
+• Repoblar la notificación de seguimiento en tiempo real cada 15 minutos.
+• Traducción actualizada al español aportada por Jose A. León.
\ No newline at end of file
--- /dev/null
+• Incluir el estado de la red de voz para determinar la seguridad general de la red celular.
+• Corregir un error que a veces impedía desactivar las notificaciones.
+• Aumentar la API de destino a 32 (Android 12L).
+• Primera traducción completa al alemán aportada por Bernhard G. Keller.
+• Traducción actualizada al español aportada por Jose A. León.
\ No newline at end of file
--- /dev/null
+• 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
--- /dev/null
+• Passage de l'API cible à 33 (Android 13).
+• Désactivation du glissement pour rejeter la notification de surveillance en temps réel sur Android 13.
+• Activation du support de la langue par application sur Android 13.
+• Conservation de l'emplacement du défilement des paramètres au redémarrage.
+• Mise à jour de la traduction française par Kévin L.
\ No newline at end of file
--- /dev/null
+• Ajout d'un ajout d'un avertissement lors de la connexion à des réseaux anciens et peu sûrs.
+• Ajout d'une entrée listant l'ensemble des protocoles.
+• Mise à jour de la traduction française par Kévin L.
\ No newline at end of file
--- /dev/null
+• Inclure l'état du réseau voix dans la détermination de la sécurité globale du réseau cellulaire.
+• Correction d'un bogue qui empêchait parfois la désactivation des notifications.
+• Passage de l'API cible à 32 (Android 12L).
+• Première traduction allemande complète réalisée par Bernhard G. Keller.
+• Mise à jour de la traduction française par Kévin L.
\ No newline at end of file
--- /dev/null
+• Correzione di un baco che riabilitava le notifiche quando la rete cambiava.
+• Aggiunta di un testo con doppio tono di viola al tema scuro.
+• Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.
\ No newline at end of file
--- /dev/null
+• Modifica della target API a 33 (Android 13).
+• Disabilitata la possibilità di effettuare lo swipe per eliminare la notifica di monitoraggio in tempo reale su Android 13.
+• Abilitato il supporto della lingua per-app su Android 13.
+• Mantenimento della posizione dello scorrimento delle impostazioni al riavvio.
+• Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.
\ No newline at end of file
--- /dev/null
+• Incluso lo stato della rete voce nella determinazione della sicurezza complessiva della rete.
+• Correzione di un baco che talvolta impediva di disabilitare le notifiche.
+• Spostamento della target API a 32 (Android 12L).
+• Prima traduzione completa in lingua tedesca fornita da Bernhard G. Keller.
+• Aggiornamento della traduzione in lingua Italiana fornito da Francesco Buratti.
\ No newline at end of file
--- /dev/null
+• Исправлена ошибка, из-за которой при изменении сети повторно включались уведомления.
+• Для ночной темы добавлен двухтоновый фиолетовый текст.
+• Первый полный перевод на русский язык.
\ No newline at end of file
--- /dev/null
+• Целевой API повышен до 33 (Android 13).
+• Отключен свайп уведомления о мониторинге в реальном времени на Android 13.
+• Включена поддержка языков для каждого приложения на Android 13.
+• При перезапуске сохраняется положение прокрутки настроек.
+• Первый полный перевод на русский язык.
\ No newline at end of file
--- /dev/null
+• Создан дополнительный монохромный значок (может использоваться в Android >= 13).
+• Разрешено включать Privacy Cell в системные резервные копии.
+• Целевой API повышен до 34 (Android 14).
+• Документированы необходимые разрешения для новых версий Android.
+• Повторное формирование уведомления о мониторинге в реальном времени каждые 15 минут.
\ No newline at end of file
--- /dev/null
+• Теперь при определении общей безопасности сотовой сети будет учитываться статус голосовой сети.
+• Исправлена ошибка, из-за которой иногда не удавалось отключить уведомления.
+• Повышен целевой API до 32 (Android 12L).
+• Первый полный перевод на немецкий язык, выполненный Бернхардом Г. Келлером (Bernhard G. Keller).
+• Первый полный перевод на русский язык.
\ No newline at end of file
+# Copyright 2023 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 Browser. If not, see <http://www.gnu.org/licenses/>.
+
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
+
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
+
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
+
# Kotlin code style for this project: "official" or "obsolete":
-kotlin.code.style=official
\ No newline at end of file
+kotlin.code.style=official
+
+# Enable the configuration cache, which improves build speed.
+org.gradle.unsafe.configuration-cache=true
+
+# Use non-transitive R classes, which speed up the build process when the configuration has not changed.
+android.nonTransitiveRClass=true
+
+# Use non-final resource IDs for faster incremental compilation.
+android.nonFinalResIds=true
+
+android.defaults.buildfeatures.buildconfig=true
\ No newline at end of file
+# Copyright 2023 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 Browser. If not, see <http://www.gnu.org/licenses/>.
+
#Thu Aug 12 09:15:13 MST 2021
distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME