diff --git a/CHANGELOG.md b/CHANGELOG.md index 02fa2b571b..01d546a750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,34 @@ -# Delta Chat Android Changelog +# ArcaneChat Android Changelog + +## v1.46.15 +2024-09 + +* new proxy settings screen available at "Advanced / Proxy" +* manage a list of HTTP(S), SOCKS5 or Shadowsocks proxies +* proxies icon shown on the chatlist if proxies are used +* improve profile deletion dialog: show name, size and avatar of the profile being deleted +* improve notification: allow to "Mark Read" from the notification +* automatic reconfiguration, e.g. switching to implicit TLS if STARTTLS port stops working +* parallelize IMAP and SMTP connection attempts +* always use preloaded DNS results +* always move auto-generated messages to DeltaChat folder +* ignore invalid securejoin messages silently +* delete messages from a chatmail server immediately by default +* make resending pending messages possible +* don't SMTP-send messages to self-chat if BccSelf is disabled +* HTTP(S) tunneling +* don't put displayname into From/To/Sender if it equals to address +* hide sync messages from INBOX (use IMAP APPEND command to upload sync messages) +* more verbose SMTP connection establishment errors +* log unexpected message state when resending fails +* fix: avoid app being killed when processing a PUSH notification +* fix crash when refreshing avatar +* fix crash in gallery +* fix: shorten message text in locally sent messages too +* fix: Set http I/O timeout to 1 minute rather than whole request timeout +* fix: don't sync QR code token before populating the group +* update to core 1.145.0 + ## v1.46.14 2024-09 diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index e20dab3938..ea7f6df3f2 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -276,6 +276,12 @@ JNIEXPORT void Java_com_b44t_messenger_DcAccounts_setPushDeviceToken(JNIEnv *env } +JNIEXPORT jboolean Java_com_b44t_messenger_DcAccounts_backgroundFetch(JNIEnv *env, jobject obj, jint timeout_seconds) +{ + return dc_accounts_background_fetch(get_dc_accounts(env, obj), timeout_seconds) != 0; +} + + JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_addAccount(JNIEnv *env, jobject obj) { return dc_accounts_add_account(get_dc_accounts(env, obj)); diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index 2aa5637bf4..f004ac68a4 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 2aa5637bf41a7af198b76f3f81d671dc9552bcac +Subproject commit f004ac68a49af70ea065f3f92399fd3589cad23b diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index c14416160d..ec145fb76f 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.BuildConfig; -import org.thoughtcrime.securesms.util.Prefs; +import org.thoughtcrime.securesms.service.FetchForegroundService; import org.thoughtcrime.securesms.util.Util; public class FcmReceiveService extends FirebaseMessagingService { @@ -92,18 +92,17 @@ public static String getToken() { return prefixedToken; } + @WorkerThread @Override public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); - // the app is running (again) now and fetching and notifications should be processed as usual. - // to support accounts that do not send PUSH notifications and for simplicity, - // we just let the app run as long as possible. + FetchForegroundService.start(this); } @Override public void onDeletedMessages() { Log.i(TAG, "FCM push notifications dropped"); - // nothing special to do as we're running now and notifications should be processed as usual. + FetchForegroundService.start(this); } @Override diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index b596667e39..f410c0a3f7 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -262,7 +262,7 @@ - @@ -393,6 +393,10 @@ android:name=".service.GenericForegroundService" android:foregroundServiceType="dataSync" /> + + How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Lze znovu použít můj stávající soukromý klíč?
  • +
  • Lze znovu použít můj stávající soukromý klíč?
  • Nemohu do ArcaneChatu zavést můj stávající PGP klíč.
  • Was ArcaneChat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • Proč můžu nastavit sledování složky Odeslané?
  • Proč mohu zvolit nesledovat složku DeltaChat?
  • Lze ArcaneChat používat s Protonmail / Tutanota / Criptext?
  • -
  • How can I delete my account?
  • +
  • How can I delete my account?
  • Mám zájem o technické podrobnosti. Kde najdu víc?
  • Jak je financován vývoj ArcaneChatu?
  • @@ -1146,10 +1146,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Lze znovu použít můj stávající soukromý klíč? + Lze znovu použít můj stávající soukromý klíč?

    @@ -1277,7 +1277,7 @@

    and wait a moment until a QR code is shown

  • -

    On the second device, install ArcaneChat

    +

    On the second device, install ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1379,7 +1379,7 @@

    významných obchodech (Google Play / iOS / Windows / macOS / Linux repositories) .

  • Pokud nemáš dostatečná práva instalovat programy na svůj pracovní počítač, můžeš použít přenosnou verzi pro Windows nebo AppImage pro Linux. -Všechny softwarové balíčky jsou na get.delta.chat.
  • +Všechny softwarové balíčky jsou na github.com/ArcaneChat.

    @@ -1791,7 +1791,7 @@

    programu (např. Thunderbird) spolu s ArcaneChatem, a chtít z tohoto programu také psát zprávy do hovorů ArcaneChatu.

    -

    Nicméně doporučujeme používat ArcaneChat Desktop Client; ten lze stáhnout z get.delta.chat. Možnost sledování složky “Odeslané” +

    Nicméně doporučujeme používat ArcaneChat Desktop Client; ten lze stáhnout z github.com/ArcaneChat. Možnost sledování složky “Odeslané” může být v budoucnu zrušena. Byla totiž vytvořena v době, kdy ArcaneChat Desktop nebyl dostupný na všech platformách.

    @@ -1829,22 +1829,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - How can I delete my account? + How can I delete my account?

    -

    As you use an e-mail account for ArcaneChat, +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    + +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; how you can delete your account depends on your e-mail provider. -We don’t have any control over your e-mail account, +We don’t have any control over e-mail accounts at those providers, so unfortunately we can’t help you with that.

    -

    If you want to keep the account, +

    If you want to continue using a classic e-mail account with other apps, but uninstall ArcaneChat, -it is recommended to leave any group chat before uninstalling ArcaneChat.

    +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/de/help.html b/src/main/assets/help/de/help.html index afc251f38f..6f5b470244 100644 --- a/src/main/assets/help/de/help.html +++ b/src/main/assets/help/de/help.html @@ -55,7 +55,7 @@
  • Wie kann ich Ende-zu-Ende-Verschlüsselung und Löschen von Nachrichten sicherstellen?
  • Unterstützt ArcaneChat “Perfect Forward Secrecy”?
  • Ist die Ende-zu-Ende-Verschlüsselung von ArcaneChat genauso sicher wie die von Signal?
  • -
  • Kann ich meinen existierenden privaten Schlüssel weiter verwenden?
  • +
  • Kann ich meinen existierenden privaten Schlüssel weiter verwenden?
  • Ich kann meinen existierenden PGP-Schlüssel nicht in ArcaneChat importieren.
  • Wurde ArcaneChat unabhängig auf Sicherheitslücken geprüft?
  • @@ -97,7 +97,7 @@
  • Warum gibt es die Funktion “Gesendet-Ordner beobachten”?
  • Warum kann ich “DeltaChat-Ordner beobachten” ausschalten?
  • Ist ArcaneChat kompatibel mit Protonmail / Tutanota / Criptext?
  • -
  • Wie kann ich mein Konto löschen?
  • +
  • Wie kann ich mein Konto löschen?
  • Ich bin an technischen Details interessiert. Gibt es hierzu weitere Infos?
  • Wie wird ArcaneChat finanziert?
  • @@ -1081,10 +1081,10 @@

    sichere Untermenge von OpenPGP das [unabhängig sicherheitsgeprüft] wurde (../assets/blog/2019-first-security-review.pdf).

    -

    +

    - Kann ich meinen existierenden privaten Schlüssel weiter verwenden? + Kann ich meinen existierenden privaten Schlüssel weiter verwenden?

    @@ -1186,7 +1186,7 @@

    Gehen Sie auf dem ersten Gerät zu Einstellungen → Zweites Gerät hinzufügen, entsperren Sie den Bildschirm, falls erforderlich und warten Sie einen Moment, bis ein QR-Code angezeigt wird

  • -

    Auf dem zweiten Gerät ArcaneChat installieren

    +

    Auf dem zweiten Gerät ArcaneChat installieren

  • Auf dem zweiten Gerät ArcaneChat starten, “Als Zweitgerät hinzufügen” wählen und den QR-Code vom ersten Gerät scannen

    @@ -1267,7 +1267,7 @@

    • Es gibt keine direkten Pläne, aber einige vorläufige Gedanken.
    • Es gibt 2-3 Möglichkeiten, einen ArcaneChat Web-Client einzuführen, aber sie bedeuten alle immense Arbeit. Im Moment fokussieren wir uns darauf, stabile native Apps in den Appstores (Google Play/iOS/Windows/macOS/Linux repositories) anzubieten.
    • -
    • Sollten Sie einen Web-Client benötigen, weil Sie auf Ihrem Arbeitsrechner keine Software installieren dürfen, können Sie den Windows Desktop-Client bzw. Applmage für Linux nutzen. Sie finden diese unter get.delta.chat.
    • +
    • Sollten Sie einen Web-Client benötigen, weil Sie auf Ihrem Arbeitsrechner keine Software installieren dürfen, können Sie den Windows Desktop-Client bzw. Applmage für Linux nutzen. Sie finden diese unter github.com/ArcaneChat.

    @@ -1612,7 +1612,7 @@

    Der einzige Grund, den Gesendet-Ordner zu beobachten, ist, wenn Sie ein weiteres E-Mail-Programm (wie Thunderbird) mit demselben E-Mail-Account verwenden und die von dort versendeten Nachrichten in der Chat-Historie aufgeführt werden sollen.

    -

    Wir empfehlen für diesen Zweck aber “ArcaneChat Desktop”; Sie können die App unter get.delta.chat herunterladen. Möglicherweise wird die Option “Gesendet-Ordner beobachten” zukünftig wegfallen; sie kommt aus einer Zeit, als ArcaneChat Desktop noch nicht auf allen Plattformen zur Verfügung stand.

    +

    Wir empfehlen für diesen Zweck aber “ArcaneChat Desktop”; Sie können die App unter github.com/ArcaneChat herunterladen. Möglicherweise wird die Option “Gesendet-Ordner beobachten” zukünftig wegfallen; sie kommt aus einer Zeit, als ArcaneChat Desktop noch nicht auf allen Plattformen zur Verfügung stand.

    @@ -1640,17 +1640,38 @@

    Autocrypt-fähige E-Mail-Anwendung herstellen

  • -

    +

    - Wie kann ich mein Konto löschen? + Wie kann ich mein Konto löschen?

    -

    Da Sie ein E-Mail-Konto für ArcaneChat verwenden, hängt von Ihrem E-Mail-Anbieter ab, wie Sie Ihr Konto löschen können. Wir haben keine Kontrolle über Ihr E-Mail-Konto, daher können wir Ihnen dabei leider nicht helfen.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Wenn Sie das Konto behalten, aber ArcaneChat deinstallieren möchten, ist es ratsam, aktive Gruppen zu verlassen, bevor Sie ArcaneChat deinstallieren.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/en/help.html b/src/main/assets/help/en/help.html index 6bccba5037..f4033afcb5 100644 --- a/src/main/assets/help/en/help.html +++ b/src/main/assets/help/en/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Can I reuse my existing private key?
  • +
  • Can I reuse my existing private key?
  • I can’t import my existing PGP key into ArcaneChat.
  • Was ArcaneChat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • Why can I choose to watch the “Sent” folder?
  • Why can I choose not to watch the DeltaChat folder?
  • Is ArcaneChat compatible with Protonmail / Tutanota / Criptext?
  • -
  • How can I delete my account?
  • +
  • How can I delete my account?
  • I’m interested in the technical details. Can you tell me more?
  • How are ArcaneChat developments funded?
  • @@ -1150,10 +1150,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Can I reuse my existing private key? + Can I reuse my existing private key?

    @@ -1283,7 +1283,7 @@

    and wait a moment until a QR code is shown

  • -

    On the second device, install ArcaneChat

    +

    On the second device, install ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1386,7 +1386,7 @@

  • If you need a Web Client, because you are not allowed to install software on the computer you work with, you can use the portable Windows Desktop Client, or the AppImage for Linux. You can find them on -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1800,7 +1800,7 @@

    to participate in chat conversations.

    However, we recommend using the ArcaneChat Desktop Client; you can download it -on get.delta.chat. The option to watch the “Sent” +on github.com/ArcaneChat. The option to watch the “Sent” folder might go away in the future. It was introduced at a time where there was no ArcaneChat Desktop client available on all platforms.

    @@ -1838,22 +1838,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - How can I delete my account? + How can I delete my account?

    -

    As you use an e-mail account for ArcaneChat, +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    + +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; how you can delete your account depends on your e-mail provider. -We don’t have any control over your e-mail account, +We don’t have any control over e-mail accounts at those providers, so unfortunately we can’t help you with that.

    -

    If you want to keep the account, +

    If you want to continue using a classic e-mail account with other apps, but uninstall ArcaneChat, -it is recommended to leave any group chat before uninstalling ArcaneChat.

    +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/es/help.html b/src/main/assets/help/es/help.html index da90c9b227..37d800b6cd 100644 --- a/src/main/assets/help/es/help.html +++ b/src/main/assets/help/es/help.html @@ -55,7 +55,7 @@
  • ¿Cómo puedo asegurar el cifrado de extremo a extremo y la eliminación de mensajes?
  • ¿Soporta ArcaneChat Perfect Forward Secrecy?
  • ¿Es el cifrado de extremo a extremo de ArcaneChat tan seguro como el de Signal?
  • -
  • ¿Puedo reutilizar mi clave privada existente?
  • +
  • ¿Puedo reutilizar mi clave privada existente?
  • No puedo importar mi clave PGP existente en ArcaneChat.
  • ¿Se auditó ArcaneChat de forma independiente en busca de vulnerabilidades de seguridad?
  • @@ -97,7 +97,7 @@
  • ¿Por qué puedo elegir monitorear la carpeta “Enviados”?
  • ¿Por qué puedo elegir no monitorear la carpeta DeltaChat?
  • ¿ArcaneChat es compatible con Protonmail / Tutanota / Criptext?
  • -
  • ¿Cómo puedo eliminar mi cuenta?
  • +
  • ¿Cómo puedo eliminar mi cuenta?
  • Estoy interesado en los detalles técnicos. ¿Pueden decirme más?
  • ¿Cómo se financia el desarrollo de ArcaneChat?
  • @@ -1110,10 +1110,10 @@

    secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - ¿Puedo reutilizar mi clave privada existente? + ¿Puedo reutilizar mi clave privada existente?

    @@ -1245,7 +1245,7 @@

    and wait a moment until a QR code is shown

  • -

    En el otro dispositivo, instala ArcaneChat

    +

    En el otro dispositivo, instala ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1348,7 +1348,7 @@

  • Si necesitas un cliente web, porque no tienes permiso para instalar software en el ordenador con que trabajas, puedes utilizar el cliente portátil Windows Desktop Client o el AppImage para Linux. Puedes encontrarlos en -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1746,7 +1746,7 @@

    también participe en conversaciones de chat.

    No obstante, recomendamos utilizar el cliente de escritorio ArcaneChat; puede descargarlo -en get.delta.chat. La opción de observar la carpeta “Enviados” +en github.com/ArcaneChat. La opción de observar la carpeta “Enviados” podría desaparecer en el futuro. Se introdujo en un momento en que no había cliente ArcaneChat Desktop disponible en todas las plataformas.

    @@ -1782,20 +1782,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - ¿Cómo puedo eliminar mi cuenta? + ¿Cómo puedo eliminar mi cuenta?

    -

    Al utilizar una cuenta de correo electrónico para ArcaneChat, -La forma de eliminar tu cuenta depende de tu proveedor de correo electrónico. -No tenemos ningún control sobre su cuenta de correo electrónico, -Lamentablemente no podemos ayudarte con eso.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Si quieres mantener la cuenta, pero desinstalar ArcaneChat, se recomienda salir de cualquier chat grupal antes de desinstalar ArcaneChat.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/fr/help.html b/src/main/assets/help/fr/help.html index a9b2a7ad8e..4ee4530e7a 100644 --- a/src/main/assets/help/fr/help.html +++ b/src/main/assets/help/fr/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Puis-je ré-utiliser ma clé privée existante ?
  • +
  • Puis-je ré-utiliser ma clé privée existante ?
  • Je n’arrive pas à importer ma clé PGP existante dans ArcaneChat.
  • Est-ce qu’un audit indépendant des failles de sécurité a été réalisé sur ArcaneChat ?
  • @@ -97,7 +97,7 @@
  • Pourquoi puis-je choisir de regarder le dossier “Envoyés”?
  • Pourquoi puis-je choisir de ne pas regarder le dossier ArcaneChat?
  • ArcaneChat est-il compatible avec Protonmail / Tutanota / Criptext ?
  • -
  • Comment supprimer mon compte ?
  • +
  • Comment supprimer mon compte ?
  • Les détails techniques m’intéressent. Pouvez-vous m’en dire plus ?
  • Comment est financé le développement de ArcaneChat ?
  • @@ -1124,10 +1124,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Puis-je ré-utiliser ma clé privée existante ? + Puis-je ré-utiliser ma clé privée existante ?

    @@ -1231,7 +1231,7 @@

    Sur le premier appareil, allez dans Paramètres → Ajouter un deuxième appareil, déverrouillez l’écran si nécessaire, et patientez un peu jusqu’à ce qu’un code QR s’affiche.

  • -

    Sur le deuxième appareil, installez ArcaneChat.

    +

    Sur le deuxième appareil, installez ArcaneChat.

  • Sur le deuxième appareil, ouvrez ArcaneChat, sélectionnez Ajouter comme deuxième appareil, et scannez le code QR du premier appareil.

    @@ -1329,7 +1329,7 @@

  • Il y a 2-3 façons d’introduire un client Web ArcaneChat, mais toutes représentent un travail conséquent. Pour l’instant, nous nous concentrons à sortir des versions stables dans tous les magasins d’applications (Google Play/iOS/Windows/macOS/centre de paquets Linux) en tant qu’applications natives.
  • Si vous avez besoin d’un client Web parce que vous n’êtes pas autorisé à installer des logiciels sur l’ordinateur sur lequel vous travaillez, vous pouvez utiliser le Client Portable pour bureaux Windows ou l’AppImage pour Linux. Vous pouvez les trouver sur -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1710,7 +1710,7 @@

    La seule raison de regarder le dossier Envoyés est si vous utilisez un autre programme de courriel (tel que Thunderbird) en parallèle de votre application ArcaneChat, et que vous voulez que votre client de messagerie participe aux discussions.

    -

    Cependant, nous recommandons d’utiliser le client de bureau ArcaneChat; vous pouvez le télécharger sur get.delta.chat. L’option de regarder le dossier “Envoyés” pourrait disparaître dans le futur. Elle a été introduite à une époque où il n’y avait pas de client de bureau ArcaneChat disponible sur toutes les plateformes.

    +

    Cependant, nous recommandons d’utiliser le client de bureau ArcaneChat; vous pouvez le télécharger sur github.com/ArcaneChat. L’option de regarder le dossier “Envoyés” pourrait disparaître dans le futur. Elle a été introduite à une époque où il n’y avait pas de client de bureau ArcaneChat disponible sur toutes les plateformes.

    @@ -1744,18 +1744,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - Comment supprimer mon compte ? + Comment supprimer mon compte ?

    -

    Étant donné que vous utilisez ArcaneChat à travers un compte courriel, la façon dont vous pouvez supprimer votre compte dépend de votre fournisseur de courriel. -Comme nous n’exerçons aucun contrôle sur votre compte courriel, nous ne sommes pas en mesure de vous aider à le supprimer.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Si vous souhaitez conserver votre compte mais désinstaller ArcaneChat, nous vous recommandons de quitter toutes les discussions de groupe avant de procéder à la désinstallation.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/id/help.html b/src/main/assets/help/id/help.html index 4b66f8eaad..90f3320217 100644 --- a/src/main/assets/help/id/help.html +++ b/src/main/assets/help/id/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Can I reuse my existing private key?
  • +
  • Can I reuse my existing private key?
  • I can’t import my existing PGP key into ArcaneChat.
  • Was ArcaneChat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • Why can I choose to watch the “Sent” folder?
  • Why can I choose not to watch the DeltaChat folder?
  • Is ArcaneChat compatible with Protonmail / Tutanota / Criptext?
  • -
  • How can I delete my account?
  • +
  • How can I delete my account?
  • I’m interested in the technical details. Can you tell me more?
  • How are ArcaneChat developments funded?
  • @@ -1150,10 +1150,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Can I reuse my existing private key? + Can I reuse my existing private key?

    @@ -1283,7 +1283,7 @@

    and wait a moment until a QR code is shown

  • -

    On the second device, install ArcaneChat

    +

    On the second device, install ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1386,7 +1386,7 @@

  • If you need a Web Client, because you are not allowed to install software on the computer you work with, you can use the portable Windows Desktop Client, or the AppImage for Linux. You can find them on -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1800,7 +1800,7 @@

    to participate in chat conversations.

    However, we recommend using the ArcaneChat Desktop Client; you can download it -on get.delta.chat. The option to watch the “Sent” +on github.com/ArcaneChat. The option to watch the “Sent” folder might go away in the future. It was introduced at a time where there was no ArcaneChat Desktop client available on all platforms.

    @@ -1838,22 +1838,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - How can I delete my account? + How can I delete my account?

    -

    As you use an e-mail account for ArcaneChat, +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    + +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; how you can delete your account depends on your e-mail provider. -We don’t have any control over your e-mail account, +We don’t have any control over e-mail accounts at those providers, so unfortunately we can’t help you with that.

    -

    If you want to keep the account, +

    If you want to continue using a classic e-mail account with other apps, but uninstall ArcaneChat, -it is recommended to leave any group chat before uninstalling ArcaneChat.

    +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/it/help.html b/src/main/assets/help/it/help.html index 0e0993d917..9d0afd6033 100644 --- a/src/main/assets/help/it/help.html +++ b/src/main/assets/help/it/help.html @@ -55,7 +55,7 @@
  • Come posso garantire la crittografia e l’eliminazione end-to-end dei messaggi?
  • ArcaneChat supporta Perfect Forward Secrecy?
  • La crittografia end-to-end di ArcaneChat è sicura quanto quella di Signal?
  • -
  • Posso riutilizzare la mia chiave privata esistente?
  • +
  • Posso riutilizzare la mia chiave privata esistente?
  • Non riesco a importare la mia chiave PGP esistente in ArcaneChat.
  • ArcaneChat è stata verificata in modo indipendente per le vulnerabilità di sicurezza?
  • @@ -97,7 +97,7 @@
  • Perché posso scegliere di guardare la cartella “Inviata”?
  • Perché posso scegliere di non guardare la cartella DeltaChat?
  • ArcaneChat è compatibile con Protonmail / Tutanota / Criptext?
  • -
  • Come posso eliminare il mio profilo?
  • +
  • Come posso eliminare il mio profilo?
  • Sono interessato ai dettagli tecnici. Mi puoi dire di più?
  • Come viene finanziato lo sviluppo di ArcaneChat?
  • @@ -1137,10 +1137,10 @@

    sottoinsieme sicuro di OpenPGP che è stato controllato in modo indipendente sulla sicurezza.

    -

    +

    - Posso riutilizzare la mia chiave privata esistente? + Posso riutilizzare la mia chiave privata esistente?

    @@ -1270,7 +1270,7 @@

    e attendere un attimo fino a quando non viene visualizzato un codice QR

  • -

    Sul secondo dispositivo, installare ArcaneChat

    +

    Sul secondo dispositivo, installare ArcaneChat

  • Sul secondo dispositivo, avviare ArcaneChat, selezionare Aggiungi Come Secondo Dispositivo e scansionare il codice QR del vecchio dispositivo.

    @@ -1370,7 +1370,7 @@

  • Se hai bisogno di un Client Web, perché non sei autorizzato a installare software sul computer con cui lavori, puoi utilizzare il client Desktop Windows Portatile, o l’AppImage per Linux. Le trovi su -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1762,7 +1762,7 @@

    per partecipare a conversazioni in chat.

    Tuttavia, consigliamo di utilizzare il client desktop ArcaneChat; puoi scaricarlo -su get.delta.chat. L’opzione per guardare la cartella +su github.com/ArcaneChat. L’opzione per guardare la cartella “Inviata” potrebbe scomparire in futuro. È stato introdotto in un momento in cui non c’era nessun client ArcaneChat Desktop disponibile su tutte le piattaforme.

    @@ -1800,22 +1800,38 @@

    App di posta elettronica abilitata per Autocrypt. -

    +

    - Come posso eliminare il mio profilo? + Come posso eliminare il mio profilo?

    -

    Poiché utilizzi un profilo e-mail per ArcaneChat, -il modo in cui puoi eliminare il tuo profilo dipende dal tuo provider e-mail. -Non abbiamo alcun controllo sul tuo profilo e-mail, -quindi purtroppo non possiamo aiutarti in questo.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Se vuoi mantenere il profilo, -ma disinstallare ArcaneChat, -si consiglia di uscire da qualsiasi chat di gruppo prima di disinstallare ArcaneChat.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/nl/help.html b/src/main/assets/help/nl/help.html index 2cbda7b957..fa0c6f3915 100644 --- a/src/main/assets/help/nl/help.html +++ b/src/main/assets/help/nl/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Kan ik mijn bestaande privésleutel hergebruiken?
  • +
  • Kan ik mijn bestaande privésleutel hergebruiken?
  • Ik kan mijn bestaande PGP-sleutel niet importeren
  • Heeft ArcaneChat ooit onafhankelijke beveiligingscontroles ondergaan?
  • @@ -97,7 +97,7 @@
  • Waarom kan ik kiezen om de map ‘Verzonden’ te controleren?
  • Waarom kan ik kiezen om de DeltaChat-map te negeren?
  • Is ArcaneChat compatibel met Protonmail/Tutanota/Criptext?
  • -
  • Hoe kan ik mijn account verwijderen?
  • +
  • Hoe kan ik mijn account verwijderen?
  • Ik wil graag meer weten over de gebruikte technieken. Waar kan ik meer informatie vinden?
  • Hoe wordt de ontwikkeling van ArcaneChat gefinancierd?
  • @@ -1143,10 +1143,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Kan ik mijn bestaande privésleutel hergebruiken? + Kan ik mijn bestaande privésleutel hergebruiken?

    @@ -1275,7 +1275,7 @@

    en wacht totdat de QR-code in beeld verschijnt.

  • -

    Installeer ArcaneChat op het tweede apparaat.

    +

    Installeer ArcaneChat op het tweede apparaat.

  • Start ArcaneChat op het tweede apparaat, kies Toevoegen als tweede apparaat en scan de QR-code met het eerste apparaat.

    @@ -1377,7 +1377,7 @@

  • Als je een webclient nodig hebt omdat je geen software mag installeren op je computer, dan kun je de meeneembare (portable) versie gebruiken van de Windows-client, of de AppImage van de Linux-client. Deze kun je downloaden op - get.delta.chat.
  • + github.com/ArcaneChat.

  • @@ -1785,7 +1785,7 @@

    ArcaneChat-app gebruikt en wilt dat je andere apparaten deel uitmaken van gesprekken.

    Wij raden echter aan om in dat geval de ArcaneChat-app te installeren op je computer: -get.delta.chat. De optie om de map ‘Verzonden’ te controleren +github.com/ArcaneChat. De optie om de map ‘Verzonden’ te controleren wordt in de toekomst mogelijk verwijderd. De functie deed zijn intrede toen er nog niet op alle platformen een ArcaneChat-client beschikbaar was.

    @@ -1823,22 +1823,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - Hoe kan ik mijn account verwijderen? + Hoe kan ik mijn account verwijderen?

    -

    ArcaneChat maakt gebruik van je e-mailaccount, -dus de verwijderprocedure is afhankelijk van je provider. -We hebben geen zeggenschap over je account, -dus helaas kunnen we je daar niet bij helpen.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Als je je account wilt behouden maar ArcaneChat -niet wilt verwijderen, verlaat dan groeps- -gesprekken voordat je ArcaneChat verwijdert.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/pl/help.html b/src/main/assets/help/pl/help.html index 9b99c90a32..888313cdb8 100644 --- a/src/main/assets/help/pl/help.html +++ b/src/main/assets/help/pl/help.html @@ -55,7 +55,7 @@
  • Jak mogę zapewnić kompleksowe szyfrowanie i usuwanie wiadomości?
  • Czy ArcaneChat obsługuje funkcję Perfect Forward Secrecy?
  • Czy szyfrowanie end-to-end ArcaneChat jest tak samo bezpieczne jak Signal?
  • -
  • Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?
  • +
  • Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?
  • Nie mogę zaimportować istniejącego klucza PGP do ArcaneChat.
  • Czy ArcaneChat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach?
  • @@ -97,7 +97,7 @@
  • Po co mam wybrać opcję oglądania folderu „Wysłane”?
  • Dlaczego mogę nie widzieć folderu DeltaChat?
  • Czy ArcaneChat jest kompatybilny z Protonmail / Tutanota / Criptext?
  • -
  • Jak mogę usunąć swoje konto?
  • +
  • Jak mogę usunąć swoje konto?
  • Interesują mnie szczegóły techniczne. Możesz powiedzieć mi coś więcej?
  • W jaki sposób finansowany jest rozwój ArcaneChat?
  • @@ -824,10 +824,10 @@

    bezpieczny podzbiór OpenPGP, który został poddany niezależnemu audytowi bezpieczeństwa.

    -

    +

    - Czy mogę ponownie wykorzystać mój istniejący klucz prywatny? + Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?

    @@ -914,7 +914,7 @@

    zainstaluj ArcaneChat

    +

    Na drugim urządzeniu zainstaluj ArcaneChat

  • Na drugim urządzeniu uruchom ArcaneChat, wybierz Dodaj jako kolejne urządzenie i zeskanuj kod QR z pierwszego urządzenia

    @@ -993,7 +993,7 @@

    • Nie ma bezpośrednich planów, ale wstępne przemyślenia.
    • Istnieją 2-3 możliwości wprowadzenia klienta Web ArcaneChat, ale wszystkie wymagają znaczącej pracy. Na razie skupiamy się na udostępnianiu stabilnych wersji we wszystkich sklepach z aplikacjami (repozytoria Google Play/iOS/Windows/macOS/Linux) jako aplikacji natywnych.
    • -
    • Jeśli potrzebujesz klienta Web, ponieważ nie możesz instalować oprogramowania na komputerze, na którym pracujesz, możesz użyć przenośnego klienta Windows Desktop lub AppImage dla Linuxa. Możesz je znaleźć na get.delta.chat.
    • +
    • Jeśli potrzebujesz klienta Web, ponieważ nie możesz instalować oprogramowania na komputerze, na którym pracujesz, możesz użyć przenośnego klienta Windows Desktop lub AppImage dla Linuxa. Możesz je znaleźć na github.com/ArcaneChat.

    @@ -1299,7 +1299,7 @@

    Jedynym powodem, dla którego ktoś chce oglądać folder Wysłane, jest to, że używa innego programu pocztowego (takiego jak Thunderbird) razem z aplikacją ArcaneChat i chce, aby jego program pocztowy „uczestniczył” w rozmowach na czacie.

    -

    Jednak zalecamy używanie klienta ArcaneChat Desktop; możesz go pobrać z get.delta.chat. Opcja oglądania folderu „Wysłane” może w przyszłości zniknąć. Została wprowadzona w czasie, gdy na żadnej platformie nie był dostępny klient ArcaneChat Desktop.

    +

    Jednak zalecamy używanie klienta ArcaneChat Desktop; możesz go pobrać z github.com/ArcaneChat. Opcja oglądania folderu „Wysłane” może w przyszłości zniknąć. Została wprowadzona w czasie, gdy na żadnej platformie nie był dostępny klient ArcaneChat Desktop.

    @@ -1326,18 +1326,38 @@

  • ArcaneChat może zaszyfrować metodą end-to-end za pośrednictwem dowolnego dostawcy poczty e-mail z dowolną aplikacją e-mail z włączoną funkcją Autocrypt.
  • -

    +

    - Jak mogę usunąć swoje konto? + Jak mogę usunąć swoje konto?

    -

    Gdy korzystasz z konta e-mail w ArcaneChat, sposób usunięcia konta zależy od dostawcy poczty e-mail. -Nie mamy żadnej kontroli nad twoim kontem e-mail, więc niestety nie możemy ci w tym pomóc.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Jeśli chcesz zachować konto, ale odinstalować ArcaneChat, zaleca się opuszczenie każdego czatu grupowego przed odinstalowaniem ArcaneChat.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/pt/help.html b/src/main/assets/help/pt/help.html index b1683b7c53..4c4b11af22 100644 --- a/src/main/assets/help/pt/help.html +++ b/src/main/assets/help/pt/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Posso reutilizar minha chave privada existente?
  • +
  • Posso reutilizar minha chave privada existente?
  • Eu não posso importar minha chave PGP existente para o ArcaneChat.
  • Was ArcaneChat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • Por que eu posso escolher assistir à pasta “Enviado”?
  • Por que eu posso escolher não observar a pasta DeltaChat?
  • O ArcaneChat é compatível com Protonmail / Tutanota / Criptext?
  • -
  • How can I delete my account?
  • +
  • How can I delete my account?
  • Estou interessado nos detalhes técnicos. Pode me dizer mais?
  • Como são os desenvolvimentos do ArcaneChat financiados?
  • @@ -1144,10 +1144,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Posso reutilizar minha chave privada existente? + Posso reutilizar minha chave privada existente?

    @@ -1277,7 +1277,7 @@

    and wait a moment until a QR code is shown

  • -

    On the second device, install ArcaneChat

    +

    On the second device, install ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1380,7 +1380,7 @@

    get.delta.chat.

  • +github.com/ArcaneChat.

    @@ -1786,7 +1786,7 @@

    para participar numa conversa de chat.

    No entanto, recomendamos o uso do ArcaneChat cliente Desktop; você pode baixá-lo -no get.delta.chat. A opção de observar o “Enviado +no github.com/ArcaneChat. A opção de observar o “Enviado pasta pode ir embora no futuro. Ela foi introduzida num momento em que havia nenhum cliente ArcaneChat no desktop disponível em todas as plataformas.

    @@ -1824,22 +1824,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - How can I delete my account? + How can I delete my account?

    -

    As you use an e-mail account for ArcaneChat, +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    + +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; how you can delete your account depends on your e-mail provider. -We don’t have any control over your e-mail account, +We don’t have any control over e-mail accounts at those providers, so unfortunately we can’t help you with that.

    -

    If you want to keep the account, +

    If you want to continue using a classic e-mail account with other apps, but uninstall ArcaneChat, -it is recommended to leave any group chat before uninstalling ArcaneChat.

    +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/ru/help.html b/src/main/assets/help/ru/help.html index 5a0f239d6f..da511a9414 100644 --- a/src/main/assets/help/ru/help.html +++ b/src/main/assets/help/ru/help.html @@ -55,7 +55,7 @@
  • Как я могу обеспечить сквозное шифрование и удаление сообщений?
  • Поддерживает ли ArcaneChat Совершенную Прямую Секретность?
  • Является ли сквозное шифрование ArcaneChat таким же безопасным как Signal?
  • -
  • Можно ли повторно использовать существующий секретный ключ?
  • +
  • Можно ли повторно использовать существующий секретный ключ?
  • Я не могу импортировать мой существующий ключ PGP в ArcaneChat.
  • Проходил ли ArcaneChat независимую проверку на наличие уязвимостей безопасности?
  • @@ -97,7 +97,7 @@
  • Для чего нужен параметр “следить за папкой Отправлено”?
  • Почему я могу отключить “следить за папкой ArcaneChat”?
  • Совместим ли ArcaneChat с Protonmail / Tutanota / Criptext?
  • -
  • Как я могу удалить аккаунт?
  • +
  • Как я могу удалить аккаунт?
  • Меня интересуют технические детали. Можете рассказать больше?
  • Как финансируются разработки ArcaneChat?
  • @@ -543,12 +543,12 @@

    chatmail profiles. -And no, there is no alternative on Apple’s phones to achieve instant message delivery -because Apple devices do not allow ArcaneChat to fetch data in the background. -Push notifications are automatically activated for iOS users because -ArcaneChat’s privacy-preserving Push Notification system -does not expose data to Apple that it doesn’t already have.

    +

    Да, ArcaneChat автоматически использует Push-уведомления для профилей chatmail. +И нет, на устройствах Apple нет альтернативы для обеспечения мгновенной доставки сообщений, +поскольку устройства Apple не позволяют ArcaneChat запрашивать данные в фоновом режиме. +Push-уведомления автоматически активируются для пользователей iOS, потому что +Система Push-уведомлений ArcaneChat, обеспечивающая конфиденциальность +не передает данные Apple, которых у нее еще нет.

    @@ -1150,10 +1150,10 @@

    безопасное подмножество OpenPGP которое прошло независимую проверку безопасности.

    -

    +

    - Можно ли повторно использовать существующий секретный ключ? + Можно ли повторно использовать существующий секретный ключ?

    @@ -1204,11 +1204,11 @@

    • -

      2024 March, we received a deep security analysis from the Applied Cryptography -research group at ETH Zuerich and addressed all raised issues. -See our blog post about Hardening Guaranteed End-to-End encryption for more detailed information and the +

      В марте 2024 года мы получили подробный анализ безопасности от исследовательской группы +Applied Cryptography в ETH Цюрихе и устранили все выявленные проблемы. +Читайте наш пост в блоге о Hardening Guaranteed End-to-End encryption для более подробной информации и Cryptographic Analysis of ArcaneChat -research paper published afterwards.

      +научной статьи, опубликованной позже.

    • В Апреле 2023 г. мы исправили проблемы безопасности и конфиденциальности в веб-интерфейсе, @@ -1279,7 +1279,7 @@

      установите ArcaneChat

      +

      На втором устройстве, установите ArcaneChat

    • На втором устройстве запустите ArcaneChat, выберите Добавить как второе устройство и отсканируйте QR-код со старого устройства

      @@ -1378,7 +1378,7 @@

      get.delta.chat.

    • +github.com/ArcaneChat.

    @@ -1767,7 +1767,7 @@

    get.delta.chat. Опция для слежения за папкой “Отправлено” +на github.com/ArcaneChat. Опция для слежения за папкой “Отправлено” может быть убрана в будущем. Эта функция была представлена в то время, когда не было настольного клиента ArcaneChat доступного на всех платформах.

    @@ -1803,22 +1803,38 @@

    Приложением эл.почты с поддержкой Autocrypt. -

    +

    - Как я могу удалить аккаунт? + Как я могу удалить аккаунт?

    -

    Поскольку вы используете учётную запись эл.почты для ArcaneChat, -способ удаления своей учетной записи зависит от вашего провайдера эл.почты. -Мы не имеем никакого контроля над вашей учётной записью эл.почты, -поэтому, к сожалению, мы не можем вам с этим помочь.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Если вы хотите сохранить учётную запись, -но удаляете ArcaneChat, -перед удалением ArcaneChat рекомендуется выйти из группового чата.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/sk/help.html b/src/main/assets/help/sk/help.html index b4c44612a1..31a2826416 100644 --- a/src/main/assets/help/sk/help.html +++ b/src/main/assets/help/sk/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • Môžem znova použiť svoj existujúci súkromný kľúč?
  • +
  • Môžem znova použiť svoj existujúci súkromný kľúč?
  • Nemôžem importovať môj existujúci PGP kľúč do ArcaneChat.
  • Was ArcaneChat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • Prečo si môžem vybrať sledovanie priečinka „Odoslané“?
  • Prečo sa môžem rozhodnúť nesledovať priečinok DeltaChat?
  • Je ArcaneChat kompatibilný s Protonmail / Tutanota / Criptext?
  • -
  • How can I delete my account?
  • +
  • How can I delete my account?
  • Zaujímajú ma technické detaily. Môžete mi povedať viac?
  • Ako sa financuje vývoj ArcaneChat?
  • @@ -1150,10 +1150,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - Môžem znova použiť svoj existujúci súkromný kľúč? + Môžem znova použiť svoj existujúci súkromný kľúč?

    @@ -1283,7 +1283,7 @@

    and wait a moment until a QR code is shown

  • -

    On the second device, install ArcaneChat

    +

    On the second device, install ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1386,7 +1386,7 @@

  • Ak potrebujete webového klienta, pretože nemáte povolené inštalovať softvér na počítač, s ktorým pracujete, môžete použiť prenosného klienta Windows Desktop Client, alebo AppImage pre Linux. Nájdete ich na -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1796,7 +1796,7 @@

    aby sa zúčastňoval chatových konverzácií.

    Odporúčame však použiť ArcaneChat Desktop Client; môžete si ho stiahnuť -na get.delta.chat. Možnosť sledovať „Odoslané“ +na github.com/ArcaneChat. Možnosť sledovať „Odoslané“ priečinok môže v budúcnosti zmiznúť. Bolo to zavedené v čase, kedy nebol ArcaneChat Desktop dostupný na všetkých platformách.

    @@ -1834,22 +1834,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - How can I delete my account? + How can I delete my account?

    -

    As you use an e-mail account for ArcaneChat, +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    + +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; how you can delete your account depends on your e-mail provider. -We don’t have any control over your e-mail account, +We don’t have any control over e-mail accounts at those providers, so unfortunately we can’t help you with that.

    -

    If you want to keep the account, +

    If you want to continue using a classic e-mail account with other apps, but uninstall ArcaneChat, -it is recommended to leave any group chat before uninstalling ArcaneChat.

    +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/sq/help.html b/src/main/assets/help/sq/help.html index d43d85c56e..8e9f9dc55a 100644 --- a/src/main/assets/help/sq/help.html +++ b/src/main/assets/help/sq/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • A mund të ripërdor kyçin tim ekzistues privat?
  • +
  • A mund të ripërdor kyçin tim ekzistues privat?
  • S’eksportoj dot kyçet e mi ekzistues PGP në ArcaneChat.
  • A është bërë auditim i pavarur i ArcaneChat-it për cenueshmëri sigurie?
  • @@ -97,7 +97,7 @@
  • Pse mund të zgjedh të vëzhgoj dosjen “Të dërguar”?
  • Pse mund të zgjedh të mos e vëzhgoj dosjen DeltaChat?
  • A është i përputhshëm ArcaneChat-i me Protonmail-in / Tutanota-n / Criptext-in?
  • -
  • Si mund ta fshij llogarinë time?
  • +
  • Si mund ta fshij llogarinë time?
  • Më interesojnë hollësitë teknike. Mund të më tregoni diçka më tepër?
  • Si financohet zhvillimi i ArcaneChat-it?
  • @@ -1151,10 +1151,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - A mund të ripërdor kyçin tim ekzistues privat? + A mund të ripërdor kyçin tim ekzistues privat?

    @@ -1283,7 +1283,7 @@

    instaloni ArcaneChat-in

    +

    Te pajisja e dytë, instaloni ArcaneChat-in

  • Në pajisjen e dytë, nisni ArcaneChat-in, përzgjidhni Shtoje si Pajisje të Dytë dhe skanoni kodin QR që nga pajisja e vjetër

    @@ -1388,7 +1388,7 @@

  • Nëse ju duhet një Klient Web, ngaqë s’keni leje të instaloni software në kompjuterin me të cilin punoni, mund të përdorni Klientin e bartshëm për Windows Desktop, ose AppImage për Linux. Mund t’i gjeni te -get.delta.chat.
  • +github.com/ArcaneChat.

  • @@ -1806,7 +1806,7 @@

    aplikacionit tuaj ArcaneChat, dhe doni që MUA juaj të marrë pjesë në biseda.

    Sidoqoftë, rekomandojmë të përdoret Klienti Desktop i ArcaneChat-it; mund ta -shkarkoni që nga get.delta.chat. Mundësia për vëzhgim +shkarkoni që nga github.com/ArcaneChat. Mundësia për vëzhgim të dosjes “Të dërguar” mund të hiqet në të ardhmen. Qe prurë në kohët kur s’kish klient Desktop ArcaneChat për krejt platformat.

    @@ -1845,22 +1845,38 @@

    Autocrypt-enabled e-mail app. -

    +

    - Si mund ta fshij llogarinë time? + Si mund ta fshij llogarinë time?

    -

    Ngaqë për ArcaneChat-in përdorni një llogari email, -se si mund të fshini llogarinë tuaj, varet nga shërbimi juaj email. -Nuk kemi fuqi mbi llogarinë tuaj email, -ndaj, mjerisht, s’mund t’ju ndihmojmë për këtë.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Nëse doni ta mbani llogarinë, -por të çinstaloni ArcaneChat-in, -rekomandohet të braktisni çfarëdo grupi fjalosjeje, para çinstalimit të ArcaneChat-it.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/uk/help.html b/src/main/assets/help/uk/help.html index 16216ec5f0..38f1a5d823 100644 --- a/src/main/assets/help/uk/help.html +++ b/src/main/assets/help/uk/help.html @@ -55,7 +55,7 @@
  • Як забезпечити наскрізне шифрування та видалення повідомлень?
  • Чи підтримує ArcaneChat цілковиту пряму секретність (Perfect Forward Secrecy)?
  • Чи є наскрізне шифрування ArcaneChat таким же безпечним, як Signal?
  • -
  • Чи можна повторно використовувати існуючий закритий ключ?
  • +
  • Чи можна повторно використовувати існуючий закритий ключ?
  • Я не можу імпортувати свій існуючий PGP ключ у ArcaneChat.
  • Чи проходив ArcaneChat незалежний аудит на наявність вразливостей у безпеці?
  • @@ -97,7 +97,7 @@
  • Чому я можу обрати стеження за папкою “Надіслані”?
  • Чому я можу відмовитись від стеження за папкою DeltaChat?
  • Чи сумісний ArcaneChat із Protonmail / Tutanota / Criptext?
  • -
  • Як мені видалити свій обліковий запис?
  • +
  • Як мені видалити свій обліковий запис?
  • Мене цікавлять технічні деталі. Можете розповісти більше?
  • Як фінансується розробка ArcaneChat?
  • @@ -831,10 +831,10 @@

    безпечну підмножину OpenPGP який пройшов незалежний аудит безпеки.

    -

    +

    - Чи можна повторно використовувати існуючий закритий ключ? + Чи можна повторно використовувати існуючий закритий ключ?

    @@ -917,7 +917,7 @@

    встановіть ArcaneChat

    +

    На другому пристрої встановіть ArcaneChat

  • На другому пристрої запустіть ArcaneChat, виберіть Додати як другий пристрій і відскануйте QR-код зі старого пристрою

    @@ -995,7 +995,7 @@

    get.delta.chat.

  • +
  • Якщо вам потрібен веб-клієнт, через заборону встановлювати програмне забезпечення на комп’ютері, з яким ви працюєте, ви можете використовувати портативний клієнт Windows Desktop або AppImage для Linux. Ви можете знайти їх на github.com/ArcaneChat.
  • @@ -1316,7 +1316,7 @@

    get.delta.chat. Можливість стеження папки “Надіслане” може зникнути в майбутньому. Вона був представлена у той час, коли на всіх платформах ще не було клієнта ArcaneChat Desktop.

    +

    Однак ми рекомендуємо використовувати клієнт ArcaneChat Desktop; Ви можете завантажити його на github.com/ArcaneChat. Можливість стеження папки “Надіслане” може зникнути в майбутньому. Вона був представлена у той час, коли на всіх платформах ще не було клієнта ArcaneChat Desktop.

    @@ -1344,17 +1344,38 @@

  • ArcaneChat може наскрізно шифрувати через будь-якого провайдера електронної пошти з будь-якою поштовою програмою з підтримкою автошифрування.
  • -

    +

    - Як мені видалити свій обліковий запис? + Як мені видалити свій обліковий запис?

    -

    Оскільки ви використовуєте обліковий запис електронної пошти для ArcaneChat, спосіб видалення облікового запису залежить від вашого постачальника послуг електронної пошти. Ми не маємо жодного контролю над вашим обліковим записом електронної пошти, тому, на жаль, ми не можемо вам у цьому допомогти.

    +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    -

    Якщо ви хочете зберегти обліковий запис, але видалити ArcaneChat, перед видаленням ArcaneChat рекомендується покинути будь-які групові чати.

    +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; +how you can delete your account depends on your e-mail provider. +We don’t have any control over e-mail accounts at those providers, +so unfortunately we can’t help you with that.

    + +

    If you want to continue using a classic e-mail account with other apps, +but uninstall ArcaneChat, +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/assets/help/zh_CN/help.html b/src/main/assets/help/zh_CN/help.html index 961f5bf1e2..bd0c87a467 100644 --- a/src/main/assets/help/zh_CN/help.html +++ b/src/main/assets/help/zh_CN/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does ArcaneChat support Perfect Forward Secrecy?
  • Is end-to-end encryption of ArcaneChat as safe as Signal?
  • -
  • 我可以重复使用现有的私钥吗?
  • +
  • 我可以重复使用现有的私钥吗?
  • 我无法将现有的 PGP 密钥导入 ArcaneChat。
  • Was ArcaneChat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • 为什么我可以选择监视“已发送”文件夹?
  • 为什么我可以选择不监视 DeltaChat 文件夹?
  • ArcaneChat 与 Protonmail / Tutanota / Criptext 兼容吗?
  • -
  • 如何删除我的账户?
  • +
  • 如何删除我的账户?
  • 我对技术细节很感兴趣。能告诉我更多吗?
  • ArcaneChat 的开发是如何被资助的?
  • @@ -1117,10 +1117,10 @@

    In any case, ArcaneChat’s end-to-end encryption uses a secure subset of OpenPGP which has been independently security-audited.

    -

    +

    - 我可以重复使用现有的私钥吗? + 我可以重复使用现有的私钥吗?

    @@ -1240,7 +1240,7 @@

    and wait a moment until a QR code is shown

  • -

    On the second device, install ArcaneChat

    +

    On the second device, install ArcaneChat

  • On the second device, start ArcaneChat, select Add as Second Device, and scan the QR code from the old device

    @@ -1338,7 +1338,7 @@

    • 目前没有计划,但有一些初步的想法。
    • 有 2-3 种途径来实现 ArcaneChat Web 客户端,但是它们都需要巨大的工作量。目前,我们专注于将稳定的版本作为本地应用程序发布到所有应用程序商店(Google Play/iOS/Windows/macOS/Linux 仓库)。
    • -
    • 如果是因为不能在工作的电脑上安装软件而需要一个 Web 客户端,您可以使用便携版的 Windows 桌面客户端,或者在 Linux 上使用 AppImage 版。您可以在 get.delta.chat 找到它们。
    • +
    • 如果是因为不能在工作的电脑上安装软件而需要一个 Web 客户端,您可以使用便携版的 Windows 桌面客户端,或者在 Linux 上使用 AppImage 版。您可以在 github.com/ArcaneChat 找到它们。

    @@ -1716,7 +1716,7 @@

    监视已发送文件夹的唯一原因是:您在使用ArcaneChat软件的同时也使用其他的邮件应用程序(比如 Thunderbird),并且想让邮件分发代理参与聊天对话。

    -

    不过,我们推荐使用 ArcaneChat 桌面客户端;您可以在 get.delta.chat 下载它。监视“已发送”文件夹的选项是在还没有 ArcaneChat 桌面客户端的时候引入的,这个选项可能会在未来消失。

    +

    不过,我们推荐使用 ArcaneChat 桌面客户端;您可以在 github.com/ArcaneChat 下载它。监视“已发送”文件夹的选项是在还没有 ArcaneChat 桌面客户端的时候引入的,这个选项可能会在未来消失。

    @@ -1749,22 +1749,38 @@

    Autocrypt-enabled e-mail app.

  • -

    +

    - 如何删除我的账户? + 如何删除我的账户?

    -

    As you use an e-mail account for ArcaneChat, +

    If you use a default chat profile +you can simply uninstall the app. +This will automatically trigger deletion of all associated account data on the chatmail server. +For more info, please refer to nine.testrun.org account-deletion for the default onboarding server, +or the respective page from your chosen 3rd party chatmail server.

    + +

    If you have set up your chat profile on multiple devices +you need to remove it from all devices.

    + +

    If you are using more than one account, +but don’t want to get rid of all of them, +you can remove it in the account switcher menu (on android and iOS), +or in the sidebar with a right click (in the desktop client).

    + +

    Accounts on classic e-mail providers +will not be deleted automatically; how you can delete your account depends on your e-mail provider. -We don’t have any control over your e-mail account, +We don’t have any control over e-mail accounts at those providers, so unfortunately we can’t help you with that.

    -

    If you want to keep the account, +

    If you want to continue using a classic e-mail account with other apps, but uninstall ArcaneChat, -it is recommended to leave any group chat before uninstalling ArcaneChat.

    +it is recommended to leave any group chat before uninstalling ArcaneChat. +Otherwise you might receive undecryptable messages from those group chats.

    diff --git a/src/main/java/com/b44t/messenger/DcAccounts.java b/src/main/java/com/b44t/messenger/DcAccounts.java index 04e25e9a1a..36d29dbc44 100644 --- a/src/main/java/com/b44t/messenger/DcAccounts.java +++ b/src/main/java/com/b44t/messenger/DcAccounts.java @@ -33,6 +33,7 @@ public void startIo () { public native void stopIo (); public native void maybeNetwork (); public native void setPushDeviceToken (String token); + public native boolean backgroundFetch (int timeoutSeconds); public native int addAccount (); public native int migrateAccount (String dbfile); diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index c6e4bdbe86..3e6209430a 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -31,6 +31,7 @@ public class DcContext { public final static int DC_EVENT_WEBXDC_STATUS_UPDATE = 2120; public final static int DC_EVENT_WEBXDC_INSTANCE_DELETED = 2121; public final static int DC_EVENT_WEBXDC_REALTIME_DATA = 2150; + public final static int DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE = 2200; public final static int DC_IMEX_EXPORT_SELF_KEYS = 1; public final static int DC_IMEX_IMPORT_SELF_KEYS = 2; @@ -55,6 +56,7 @@ public class DcContext { public final static int DC_QR_BACKUP = 251; public final static int DC_QR_BACKUP2 = 252; public final static int DC_QR_WEBRTC = 260; + public final static int DC_QR_PROXY = 271; public final static int DC_QR_ADDR = 320; public final static int DC_QR_TEXT = 330; public final static int DC_QR_URL = 332; diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index 801fc0c662..89e82b7cb7 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -20,7 +20,7 @@ import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ADDRESS; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SERVER_FLAGS; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_ENABLED; +import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId; import static org.thoughtcrime.securesms.util.RelayUtil.getSharedTitle; @@ -67,6 +67,7 @@ import org.thoughtcrime.securesms.connect.DirectShareUtil; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.permissions.Permissions; +import org.thoughtcrime.securesms.proxy.ProxySettingsActivity; import org.thoughtcrime.securesms.qr.QrActivity; import org.thoughtcrime.securesms.qr.QrCodeHandler; import org.thoughtcrime.securesms.recipients.Recipient; @@ -122,7 +123,7 @@ protected void onCreate(Bundle icicle, boolean ready) { // Util.copy(inputStream, new FileOutputStream(outputFile)); // msg.setFile(outputFile, "image/jpeg"); - msg.setText(getString(R.string.update_1_46_android, "https://get.delta.chat/#changelogs")); + msg.setText(getString(R.string.update_1_46_android, "https://raw.githubusercontent.com/ArcaneChat/android/refs/heads/main/CHANGELOG.md")); } dcContext.addDeviceMsg(deviceMsgLabel, msg); @@ -381,13 +382,8 @@ public boolean onPrepareOptionsMenu(Menu menu) { if (!isRelayingMessageContent(this)) { inflater.inflate(R.menu.text_secure_normal, menu); menu.findItem(R.id.menu_global_map).setVisible(Prefs.isLocationStreamingEnabled(this)); - menu.findItem(R.id.menu_proxy_settings).setVisible(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - MenuCompat.setGroupDividerEnabled(menu, true); - } else { - menu.setGroupVisible(R.id.extra_services, false); - } + menu.findItem(R.id.menu_proxy_settings).setVisible(!TextUtils.isEmpty(DcHelper.get(this, CONFIG_PROXY_URL))); + MenuCompat.setGroupDividerEnabled(menu, true); } super.onPrepareOptionsMenu(menu); diff --git a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java index d3ec685512..fde44d664c 100644 --- a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java @@ -5,7 +5,9 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.res.TypedArray; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; @@ -48,6 +50,7 @@ import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints; +import org.thoughtcrime.securesms.proxy.ProxySettingsActivity; import org.thoughtcrime.securesms.qr.RegistrationQrActivity; import org.thoughtcrime.securesms.scribbles.ScribbleActivity; import org.thoughtcrime.securesms.util.Prefs; @@ -330,7 +333,11 @@ private void updateProvider() { privacyPolicyBtn.setText(getString(R.string.qrlogin_ask_login, providerHost)); } else { signUpBtn.setText(R.string.instant_onboarding_create); - privacyPolicyBtn.setTextColor(getResources().getColor(R.color.def_accent)); + + try (TypedArray typedArray = obtainStyledAttributes(new int[]{R.attr.colorAccent})) { + privacyPolicyBtn.setTextColor(typedArray.getColor(0, Color.BLACK)); + } + if (DEFAULT_CHATMAIL_HOST.equals(providerHost)) { privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_default2, providerHost)); } else { diff --git a/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java b/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java index 17ce31e42c..2e18d1a7ec 100644 --- a/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/LogViewFragment.java @@ -257,9 +257,14 @@ private static String buildDescription(LogViewFragment fragment) { builder.append("rtl=").append(isRtl).append("\n"); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + boolean notifPermGranted = PermissionChecker.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PermissionChecker.PERMISSION_GRANTED; + builder.append("post-notifications-granted=").append(notifPermGranted).append("\n"); + } else { + builder.append("post-notifications-granted=").append("\n"); + } + final String token = FcmReceiveService.getToken(); - boolean notifPermGranted = PermissionChecker.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PermissionChecker.PERMISSION_GRANTED; - builder.append("post-notifications-granted=").append(notifPermGranted).append("\n"); builder.append("push-enabled=").append(Prefs.isPushEnabled(context)).append("\n"); builder.append("push-token=").append(token == null ? "" : token).append("\n"); } catch (Exception e) { diff --git a/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java b/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java deleted file mode 100644 index d88f66073b..0000000000 --- a/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java +++ /dev/null @@ -1,160 +0,0 @@ -package org.thoughtcrime.securesms; - -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_ENABLED; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_HOST; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PASSWORD; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PORT; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_USER; - -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Patterns; -import android.view.MenuItem; -import android.view.View; - -import androidx.annotation.IdRes; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.SwitchCompat; -import androidx.constraintlayout.widget.Group; - -import com.b44t.messenger.DcContext; -import com.google.android.material.textfield.TextInputEditText; - -import org.thoughtcrime.securesms.connect.DcHelper; -import org.thoughtcrime.securesms.util.DynamicTheme; - -public class ProxySettingsActivity extends BaseActionBarActivity { - - private enum VerificationType { - SERVER, - PORT, - } - - private final DynamicTheme dynamicTheme = new DynamicTheme(); - - private SwitchCompat proxySwitch; - private Group proxyGroup; - - @Override - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - dynamicTheme.onCreate(this); - setContentView(R.layout.proxy_settings_activity); - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setTitle(R.string.proxy_settings); - actionBar.setDisplayHomeAsUpEnabled(true); - } - - proxyGroup = findViewById(R.id.proxy_group); - - proxySwitch = findViewById(R.id.proxy_switch); - proxySwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { - proxyGroup.setVisibility(isChecked? View.VISIBLE : View.GONE); - }); - proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1); - - TextInputEditText proxyHostInput = findViewById(R.id.proxy_host_text); - proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER)); - proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST)); - - TextInputEditText proxyPortInput = findViewById(R.id.proxy_port_text); - proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT)); - proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT)); - - TextInputEditText proxyUserInput = findViewById(R.id.proxy_user_text); - proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER)); - - TextInputEditText proxyPasswordInput = findViewById(R.id.proxy_password_text); - proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD)); - } - - @Override - public void onResume() { - super.onResume(); - dynamicTheme.onResume(this); - } - - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onDestroy() { - super.onDestroy(); - saveConfig(); - } - - @Override - public void onPause() { - super.onPause(); - saveConfig(); - } - - private void focusListener(View view, boolean focused, VerificationType type) { - - if (!focused) { - TextInputEditText inputEditText = (TextInputEditText) view; - switch (type) { - case SERVER: - verifyServer(inputEditText); - break; - case PORT: - verifyPort(inputEditText); - break; - } - } - } - - private void verifyServer(TextInputEditText view) { - String server = view.getText().toString(); - if (!TextUtils.isEmpty(server) && !Patterns.DOMAIN_NAME.matcher(server).matches() - && !Patterns.IP_ADDRESS.matcher(server).matches() - && !Patterns.WEB_URL.matcher(server).matches() - && !"localhost".equals(server)) { - view.setError(getString(R.string.login_error_server)); - } - } - - private void verifyPort(TextInputEditText view) { - String portString = view.getText().toString(); - if (!portString.isEmpty()) { - String error = getString(R.string.login_error_port); - try { - int port = Integer.valueOf(portString); - if (port < 1 || port > 65535) { - view.setError(error); - } - } catch (NumberFormatException exception) { - view.setError(error); - } - } - } - - private void saveConfig() { - DcContext dcContext = DcHelper.getContext(this); - dcContext.setConfigInt(CONFIG_SOCKS5_ENABLED, proxySwitch.isChecked()? 1 : 0); - setConfig(R.id.proxy_host_text, CONFIG_SOCKS5_HOST, true); - setConfig(R.id.proxy_port_text, CONFIG_SOCKS5_PORT, true); - setConfig(R.id.proxy_user_text, CONFIG_SOCKS5_USER, true); - setConfig(R.id.proxy_password_text, CONFIG_SOCKS5_PASSWORD, false); - dcContext.stopIo(); - dcContext.startIo(); - } - - private void setConfig(@IdRes int viewId, String configTarget, boolean doTrim) { - TextInputEditText view = findViewById(viewId); - String value = view.getText().toString(); - if(doTrim) { - value = value.trim(); - } - DcHelper.getContext(this).setConfig(configTarget, value.isEmpty()? null : value); - } - -} diff --git a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java index 8a5eb6f9eb..f52eafffb2 100644 --- a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java @@ -12,11 +12,7 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_SERVER; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_USER; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SERVER_FLAGS; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_ENABLED; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_HOST; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PASSWORD; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PORT; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_USER; +import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED; import static org.thoughtcrime.securesms.connect.DcHelper.getContext; import static org.thoughtcrime.securesms.service.IPCAddAccountsService.ACCOUNT_DATA; @@ -59,6 +55,7 @@ import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.permissions.Permissions; +import org.thoughtcrime.securesms.proxy.ProxySettingsActivity; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.IntentUtils; import org.thoughtcrime.securesms.util.Util; @@ -162,7 +159,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { } String strVal; int intVal; - intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED); + intVal = DcHelper.getInt(this, CONFIG_PROXY_ENABLED); proxySwitch.setChecked(intVal == 1); expandAdvanced = expandAdvanced || intVal == 1; @@ -260,7 +257,7 @@ private void registerForEvents() { public void onResume() { super.onResume(); dynamicTheme.onResume(this); - proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1); + proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1); } private void showLog() { diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java b/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java index fe20ac10db..b1dd93bfcb 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java @@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.service.FetchForegroundService; import org.thoughtcrime.securesms.util.Util; import java.util.ArrayList; @@ -177,6 +178,10 @@ public long handleEvent(@NonNull DcEvent event) { DcHelper.getNotificationCenter(context).removeNotifications(accountId, event.getData1Int()); break; + case DcContext.DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE: + FetchForegroundService.stop(context); + break; + case DcContext.DC_EVENT_IMEX_PROGRESS: sendToCurrentAccountObservers(event); return 0; diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java index 8f412fb28a..47367dd2a0 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java @@ -75,11 +75,8 @@ public class DcHelper { public static final String CONFIG_SHOW_EMAILS = "show_emails"; public static final String CONFIG_MEDIA_QUALITY = "media_quality"; public static final String CONFIG_WEBRTC_INSTANCE = "webrtc_instance"; - public static final String CONFIG_SOCKS5_ENABLED = "socks5_enabled"; - public static final String CONFIG_SOCKS5_HOST = "socks5_host"; - public static final String CONFIG_SOCKS5_PORT = "socks5_port"; - public static final String CONFIG_SOCKS5_USER = "socks5_user"; - public static final String CONFIG_SOCKS5_PASSWORD = "socks5_password"; + public static final String CONFIG_PROXY_ENABLED = "proxy_enabled"; + public static final String CONFIG_PROXY_URL = "proxy_url"; public static final String CONFIG_VERIFIED_ONE_ON_ONE_CHATS = "verified_one_on_one_chats"; public static final String CONFIG_WEBXDC_REALTIME_ENABLED = "webxdc_realtime_enabled"; diff --git a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java index 683ada664e..7d5e7f341a 100644 --- a/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java +++ b/src/main/java/org/thoughtcrime/securesms/notifications/NotificationCenter.java @@ -168,6 +168,7 @@ private PendingIntent getMarkAsReadIntent(ChatData chatData, int msgId, boolean public static final int ID_PERMANENT = 1; public static final int ID_MSG_SUMMARY = 2; public static final int ID_GENERIC = 3; + public static final int ID_FETCH = 4; public static final int ID_MSG_OFFSET = 0; // msgId is added - as msgId start at 10, there are no conflicts with lower numbers diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 8fc8cf4063..3ff7a5ff70 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -35,7 +35,7 @@ import org.thoughtcrime.securesms.ApplicationPreferencesActivity; import org.thoughtcrime.securesms.ConversationActivity; import org.thoughtcrime.securesms.LogViewActivity; -import org.thoughtcrime.securesms.ProxySettingsActivity; +import org.thoughtcrime.securesms.proxy.ProxySettingsActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.RegistrationActivity; import org.thoughtcrime.securesms.connect.DcEventCenter; @@ -395,6 +395,7 @@ private void manageKeys() { } ) .setNegativeButton(R.string.cancel, null) + .setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(getActivity(), "#importkey")) .show(); }) .execute(); diff --git a/src/main/java/org/thoughtcrime/securesms/proxy/ProxyListAdapter.java b/src/main/java/org/thoughtcrime/securesms/proxy/ProxyListAdapter.java new file mode 100644 index 0000000000..01fe5c8326 --- /dev/null +++ b/src/main/java/org/thoughtcrime/securesms/proxy/ProxyListAdapter.java @@ -0,0 +1,172 @@ +package org.thoughtcrime.securesms.proxy; + +import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.b44t.messenger.DcContext; +import com.b44t.messenger.DcLot; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.connect.DcHelper; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class ProxyListAdapter extends BaseAdapter { + private enum ProxyState { + CONNECTED, + CONNECTING, + NOT_CONNECTED, + } + + @NonNull private final Context context; + @NonNull private final DcContext dcContext; + @NonNull private final List proxies = new LinkedList<>(); + @Nullable private ItemClickListener itemClickListener; + @Nullable private ProxyState proxyState; + @Nullable private String selectedProxy; + + public ProxyListAdapter(@NonNull Context context) + { + this.context = context; + this.dcContext = DcHelper.getContext(context); + } + + @Override + public int getCount() { + return proxies.size(); + } + + @Override + public Object getItem(int position) { + return proxies.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View v, final ViewGroup parent) { + if (v == null) { + v = LayoutInflater.from(context).inflate(R.layout.proxy_list_item, parent, false); + } + + TextView host = v.findViewById(R.id.host); + TextView protocol = v.findViewById(R.id.protocol); + ImageView checkmark = v.findViewById(R.id.checkmark); + TextView status = v.findViewById(R.id.status); + + final String proxyUrl = (String)getItem(position); + final DcLot qrParsed = dcContext.checkQr(proxyUrl); + if (qrParsed.getState() == DcContext.DC_QR_PROXY) { + host.setText(qrParsed.getText1()); + protocol.setText(proxyUrl.split(":", 2)[0]); + } else { + host.setText(proxyUrl); + protocol.setText(R.string.unknown); + } + if (proxyUrl.equals(selectedProxy)) { + checkmark.setVisibility(View.VISIBLE); + status.setVisibility(View.VISIBLE); + status.setText(getConnectivityString()); + } else { + checkmark.setVisibility(View.GONE); + status.setVisibility(View.GONE); + } + + v.setOnClickListener(view -> { + if (itemClickListener != null) { + itemClickListener.onItemClick(proxyUrl); + } + }); + v.findViewById(R.id.share).setOnClickListener(view -> { + if (itemClickListener != null) { + itemClickListener.onItemShare(proxyUrl); + } + }); + v.findViewById(R.id.delete).setOnClickListener(view -> { + if (itemClickListener != null) { + itemClickListener.onItemDelete(proxyUrl); + } + }); + + return v; + } + + public void changeData(String newProxies) { + proxies.clear(); + if (!TextUtils.isEmpty(newProxies)) { + Collections.addAll(proxies, newProxies.split("\n")); + } + selectedProxy = proxies.isEmpty()? null : proxies.get(0); + proxyState = null; // to force notifyDataSetChanged() in refreshConnectivity() + refreshConnectivity(); + } + + public void setSelectedProxy(String proxyUrl) { + selectedProxy = proxyUrl; + notifyDataSetChanged(); + } + + private String getConnectivityString() { + if (proxyState == ProxyState.CONNECTED) { + return context.getString(R.string.connectivity_connected); + } + if (proxyState == ProxyState.CONNECTING) { + return context.getString(R.string.connectivity_connecting); + } + return context.getString(R.string.connectivity_not_connected); + } + + public void refreshConnectivity() { + if (DcHelper.getInt(context, CONFIG_PROXY_ENABLED) != 1) { + if (proxyState != ProxyState.NOT_CONNECTED) { + proxyState = ProxyState.NOT_CONNECTED; + notifyDataSetChanged(); + } + return; + } + + int connectivity = dcContext.getConnectivity(); + if (connectivity >= DcContext.DC_CONNECTIVITY_WORKING) { + if (proxyState != ProxyState.CONNECTED) { + proxyState = ProxyState.CONNECTED; + notifyDataSetChanged(); + } + } else if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTING) { + if (proxyState != ProxyState.CONNECTING) { + proxyState = ProxyState.CONNECTING; + notifyDataSetChanged(); + } + } else if (proxyState != ProxyState.NOT_CONNECTED) { + proxyState = ProxyState.NOT_CONNECTED; + notifyDataSetChanged(); + } + } + + public void setItemClickListener(@Nullable ItemClickListener listener) { + itemClickListener = listener; + } + + public interface ItemClickListener { + void onItemClick(String proxyUrl); + void onItemShare(String proxyUrl); + void onItemDelete(String proxyUrl); + } + +} diff --git a/src/main/java/org/thoughtcrime/securesms/proxy/ProxySettingsActivity.java b/src/main/java/org/thoughtcrime/securesms/proxy/ProxySettingsActivity.java new file mode 100644 index 0000000000..3dcb023e37 --- /dev/null +++ b/src/main/java/org/thoughtcrime/securesms/proxy/ProxySettingsActivity.java @@ -0,0 +1,189 @@ +package org.thoughtcrime.securesms.proxy; + +import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED; +import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.SwitchCompat; + +import com.b44t.messenger.DcContext; +import com.b44t.messenger.DcEvent; +import com.b44t.messenger.DcLot; + +import org.thoughtcrime.securesms.BaseActionBarActivity; +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.connect.DcEventCenter; +import org.thoughtcrime.securesms.connect.DcHelper; +import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.Util; + +import java.util.LinkedList; + +public class ProxySettingsActivity extends BaseActionBarActivity + implements ProxyListAdapter.ItemClickListener, DcEventCenter.DcEventDelegate { + + private final DynamicTheme dynamicTheme = new DynamicTheme(); + private SwitchCompat proxySwitch; + private ProxyListAdapter adapter; + + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + dynamicTheme.onCreate(this); + setContentView(R.layout.proxy_settings_activity); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setTitle(R.string.proxy_settings); + actionBar.setDisplayHomeAsUpEnabled(true); + } + + adapter = new ProxyListAdapter(this); + adapter.setItemClickListener(this); + + proxySwitch = findViewById(R.id.proxy_switch); + proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1); + proxySwitch.setOnClickListener(l -> { + if (proxySwitch.isChecked() && adapter.getCount() == 0) { + showAddProxyDialog(); + } else { + DcHelper.set(this, CONFIG_PROXY_ENABLED, proxySwitch.isChecked()? "1" : "0"); + restartIO(); + } + }); + + ListView proxyList = findViewById(R.id.proxy_list); + proxyList.setAdapter(adapter); + proxyList.addHeaderView(View.inflate(this, R.layout.proxy_list_header, null), null, false); + View footer = View.inflate(this, R.layout.proxy_list_footer, null); + footer.setOnClickListener(l -> showAddProxyDialog()); + proxyList.addFooterView(footer); + adapter.changeData(DcHelper.get(this, CONFIG_PROXY_URL)); + DcHelper.getEventCenter(this).addObserver(DcContext.DC_EVENT_CONNECTIVITY_CHANGED, this); + } + + @Override + public void onResume() { + super.onResume(); + dynamicTheme.onResume(this); + } + + @Override + public void onDestroy() { + super.onDestroy(); + DcHelper.getEventCenter(this).removeObservers(this); + } + + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onItemClick(String proxyUrl) { + if (DcHelper.getContext(this).setConfigFromQr(proxyUrl)) { + restartIO(); + adapter.setSelectedProxy(proxyUrl); + proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1); + } else { + Toast.makeText(this, R.string.proxy_invalid, Toast.LENGTH_LONG).show(); + } + } + + @Override + public void onItemShare(String proxyUrl) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, proxyUrl); + startActivity(Intent.createChooser(intent, getString(R.string.chat_share_with_title))); + } + + @Override + public void onItemDelete(String proxyUrl) { + String host = DcHelper.getContext(this).checkQr(proxyUrl).getText1(); + AlertDialog dialog = new AlertDialog.Builder(this) + .setTitle(R.string.proxy_delete) + .setMessage(getString(R.string.proxy_delete_explain, host)) + .setPositiveButton(R.string.delete, (dlg, btn) -> deleteProxy(proxyUrl)) + .setNegativeButton(android.R.string.cancel, null) + .show(); + Util.redPositiveButton(dialog); + } + + private void deleteProxy(String proxyUrl) { + final LinkedList proxies = new LinkedList<>(); + for (String proxy: DcHelper.get(this, CONFIG_PROXY_URL).split("\n")) { + if (!proxy.equals(proxyUrl)) { + proxies.add(proxy); + } + } + if (proxies.isEmpty()) { + DcHelper.set(this, CONFIG_PROXY_ENABLED, "0"); + proxySwitch.setChecked(false); + } + String proxyUrls = String.join("\n", proxies); + DcHelper.set(this, CONFIG_PROXY_URL, proxyUrls); + restartIO(); + adapter.changeData(proxyUrls); + } + + private void showAddProxyDialog() { + View view = View.inflate(this, R.layout.single_line_input, null); + EditText inputField = view.findViewById(R.id.input_field); + inputField.setHint(R.string.proxy_add_url_hint); + + new AlertDialog.Builder(this) + .setTitle(R.string.proxy_add) + .setMessage(R.string.proxy_add_explain) + .setView(view) + .setPositiveButton(R.string.proxy_use_proxy, (dialog, whichButton) -> { + String newProxy = inputField.getText().toString().trim(); + DcContext dcContext = DcHelper.getContext(this); + final DcLot qrParsed = dcContext.checkQr(newProxy); + if (qrParsed.getState() == DcContext.DC_QR_PROXY) { + dcContext.setConfigFromQr(newProxy); + restartIO(); + adapter.changeData(DcHelper.get(this, CONFIG_PROXY_URL)); + } else { + Toast.makeText(this, R.string.proxy_invalid, Toast.LENGTH_LONG).show(); + } + proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1); + }) + .setNegativeButton(android.R.string.cancel, (dialog, whichButton) -> { + if (proxySwitch.isChecked() && adapter.getCount() == 0) { + // user enabled switch without having proxies yet, revert + proxySwitch.setChecked(false); + } + }) + .setCancelable(false) + .show(); + } + + private void restartIO() { + DcContext dcContext = DcHelper.getContext(this); + dcContext.stopIo(); + dcContext.startIo(); + } + + @Override + public void handleEvent(@NonNull DcEvent event) { + if (event.getId() == DcContext.DC_EVENT_CONNECTIVITY_CHANGED) { + adapter.refreshConnectivity(); + } + } + +} diff --git a/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java new file mode 100644 index 0000000000..71967f559e --- /dev/null +++ b/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java @@ -0,0 +1,74 @@ +package org.thoughtcrime.securesms.service; + +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; + +import org.thoughtcrime.securesms.ApplicationContext; +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.notifications.FcmReceiveService; +import org.thoughtcrime.securesms.notifications.NotificationCenter; +import org.thoughtcrime.securesms.util.Util; + +public final class FetchForegroundService extends Service { + private static final String TAG = FcmReceiveService.class.getSimpleName(); + private static final Object SERVICE_LOCK = new Object(); + private static Intent service; + + public static void start(Context context) { + GenericForegroundService.createFgNotificationChannel(context); + synchronized (SERVICE_LOCK) { + if (service == null) { + service = new Intent(context, FetchForegroundService.class); + ContextCompat.startForegroundService(context, service); + } + } + } + + public static void stop(Context context) { + synchronized (SERVICE_LOCK) { + if (service != null) { + context.stopService(service); + service = null; + } + } + } + + @Override + public void onCreate() { + Log.i(TAG, "Creating fetch service"); + super.onCreate(); + + Notification notification = new NotificationCompat.Builder(this, NotificationCenter.CH_GENERIC) + .setContentTitle(getString(R.string.connectivity_updating)) + .setSmallIcon(R.drawable.notification_permanent) + .build(); + + startForeground(NotificationCenter.ID_FETCH, notification); + + Util.runOnAnyBackgroundThread(() -> { + Log.i(TAG, "Starting fetch"); + if (!ApplicationContext.dcAccounts.backgroundFetch(300)) { // as startForeground() was called, there is time + FetchForegroundService.stop(this); + } // else we stop FetchForegroundService on DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE + }); + } + + @Override + public void onDestroy() { + stopForeground(true); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java index 60b5b912c4..5691533941 100644 --- a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java +++ b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java @@ -185,7 +185,7 @@ synchronized void replaceProgress(int id, int progressMax, int progress, boolean } @TargetApi(Build.VERSION_CODES.O) - static private void createFgNotificationChannel(Context context) { + static public void createFgNotificationChannel(Context context) { if(!CHANNEL_CREATED.get() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CHANNEL_CREATED.set(true); NotificationChannel channel = new NotificationChannel(NotificationCenter.CH_GENERIC, diff --git a/src/main/res/drawable/baseline_proxy_24.xml b/src/main/res/drawable/baseline_proxy_24.xml new file mode 100644 index 0000000000..5064d89209 --- /dev/null +++ b/src/main/res/drawable/baseline_proxy_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/src/main/res/layout/instant_onboarding_activity.xml b/src/main/res/layout/instant_onboarding_activity.xml index d64db20e29..ce95b61657 100644 --- a/src/main/res/layout/instant_onboarding_activity.xml +++ b/src/main/res/layout/instant_onboarding_activity.xml @@ -55,7 +55,7 @@ android:layout_gravity="start" android:layout_marginTop="16dp" android:text="" - android:textColor="@color/def_accent" + android:textColor="?attr/colorAccent" android:textSize="16sp"/>