From 08200d84433fcc9d828b935f747d2d1f09126b06 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Fri, 20 Sep 2024 15:49:21 +0200 Subject: [PATCH 01/22] refine post-notifications-granted logging saying post-notifications-granted=false on API that do not need this grant is misleading as it looks as some error or if the user has rejected sth. just stumbled upon that and was irritated when trying out things wrt https://github.com/deltachat/deltachat-android/issues/3281 on android7 --- .../java/org/thoughtcrime/securesms/LogViewFragment.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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) { From e17d37ebb7add33654255709a1ab4e97a4775486 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Fri, 20 Sep 2024 16:16:13 +0200 Subject: [PATCH 02/22] add backgroundFetch() api --- jni/dc_wrapper.c | 6 ++++++ src/main/java/com/b44t/messenger/DcAccounts.java | 1 + 2 files changed, 7 insertions(+) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 4c87009816..25a8e3ecd1 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/src/main/java/com/b44t/messenger/DcAccounts.java b/src/main/java/com/b44t/messenger/DcAccounts.java index de50793a92..c5a7df232c 100644 --- a/src/main/java/com/b44t/messenger/DcAccounts.java +++ b/src/main/java/com/b44t/messenger/DcAccounts.java @@ -25,6 +25,7 @@ public void unref() { 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); From 117f144858adc7748673185169de6f77dd3a107d Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Fri, 20 Sep 2024 16:16:26 +0200 Subject: [PATCH 03/22] call backgroundFetch() from FCM --- .../securesms/notifications/FcmReceiveService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index c14416160d..5ae2b3610f 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -95,9 +95,8 @@ public static String getToken() { @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. + ApplicationContext.dcAccounts.backgroundFetch(120); + Log.i(TAG, "background fetch done"); } @Override From df9e3007b2349a30ff8487ebabc524709bed762c Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sat, 21 Sep 2024 00:53:11 +0200 Subject: [PATCH 04/22] show a foreground service notification --- .../notifications/FcmReceiveService.java | 23 +++++++++++++++++-- .../java/com/b44t/messenger/DcContext.java | 1 + .../securesms/connect/DcEventCenter.java | 5 ++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index 5ae2b3610f..999b762f72 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -17,15 +17,20 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.BuildConfig; -import org.thoughtcrime.securesms.util.Prefs; +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.service.GenericForegroundService; +import org.thoughtcrime.securesms.service.NotificationController; import org.thoughtcrime.securesms.util.Util; public class FcmReceiveService extends FirebaseMessagingService { private static final String TAG = FcmReceiveService.class.getSimpleName(); private static final Object INIT_LOCK = new Object(); + private static final Object NOTIFICATION_CONTROLLER_LOCK = new Object(); + private static boolean initialized; private static volatile boolean triedRegistering; private static volatile String prefixedToken; + private static NotificationController notificationController; public static void register(Context context) { if (Build.VERSION.SDK_INT < 19) { @@ -92,13 +97,27 @@ public static String getToken() { return prefixedToken; } + @WorkerThread @Override public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); - ApplicationContext.dcAccounts.backgroundFetch(120); + synchronized (NOTIFICATION_CONTROLLER_LOCK) { + notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.connectivity_updating)); + if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { // we should complete within 20 seconds + notificationController.close(); + notificationController = null; + } + } Log.i(TAG, "background fetch done"); } + public static void backgroundFetchDone() { + synchronized (NOTIFICATION_CONTROLLER_LOCK) { + notificationController.close(); + notificationController = null; + } + } + @Override public void onDeletedMessages() { Log.i(TAG, "FCM push notifications dropped"); diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index df59a248d5..b02b4dc22b 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; diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java b/src/main/java/org/thoughtcrime/securesms/connect/DcEventCenter.java index fe20ac10db..72ec618d21 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.notifications.FcmReceiveService; 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: + FcmReceiveService.backgroundFetchDone(); + break; + case DcContext.DC_EVENT_IMEX_PROGRESS: sendToCurrentAccountObservers(event); return 0; From 4b9d521c13c5e0142dba1508d1b02e477b92f6fa Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sat, 21 Sep 2024 14:33:25 +0200 Subject: [PATCH 05/22] add pinActivity parameter to GenericForegroundService --- .../notifications/FcmReceiveService.java | 2 +- .../PassphraseRequiredActionBarActivity.java | 2 +- .../securesms/WelcomeActivity.java | 2 +- .../ListSummaryPreferenceFragment.java | 2 +- .../securesms/qr/BackupTransferActivity.java | 2 +- .../service/GenericForegroundService.java | 52 ++++++++----------- 6 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index 999b762f72..b52d2ca0a3 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -102,7 +102,7 @@ public static String getToken() { public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); synchronized (NOTIFICATION_CONTROLLER_LOCK) { - notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.connectivity_updating)); + notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.connectivity_updating), false); if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { // we should complete within 20 seconds notificationController.close(); notificationController = null; diff --git a/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java b/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java index c043a046b3..4ede775c53 100644 --- a/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java @@ -20,7 +20,7 @@ protected final void onCreate(Bundle savedInstanceState) { return; } - if (GenericForegroundService.isForegroundTaskStarted()) { + if (GenericForegroundService.hasPinnedActivity()) { // this does not prevent intent set by onNewIntent(), // however, at least during onboarding, // this catches a lot of situations with otherwise weird app states. diff --git a/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java b/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java index 54d45c075b..202a05db91 100644 --- a/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java @@ -202,7 +202,7 @@ private void startImportBackup() { private void startImport(@Nullable final String backupFile, final @Nullable Uri backupFileUri) { - notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.import_backup_title)); + notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.import_backup_title), true); if( progressDialog!=null ) { progressDialog.dismiss(); diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java index 361c427a18..d60df44f00 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java @@ -151,7 +151,7 @@ private void stopOngoingProcess() { } private void showProgressDialog() { - notificationController = GenericForegroundService.startForegroundTask(getContext(), getString(R.string.export_backup_desktop)); + notificationController = GenericForegroundService.startForegroundTask(getContext(), getString(R.string.export_backup_desktop), true); if( progressDialog!=null ) { progressDialog.dismiss(); progressDialog = null; diff --git a/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java b/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java index 1b203b3584..6d29fff0d5 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java @@ -67,7 +67,7 @@ protected void onCreate(Bundle icicle) { DcHelper.getAccounts(this).stopIo(); String title = getString(transferMode == TransferMode.RECEIVER_SCAN_QR ? R.string.multidevice_receiver_title : R.string.multidevice_title); - notificationController = GenericForegroundService.startForegroundTask(this, title); + notificationController = GenericForegroundService.startForegroundTask(this, title, true); setContentView(R.layout.backup_provider_activity); diff --git a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java index 60b5b912c4..96e6e67666 100644 --- a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java +++ b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java @@ -12,7 +12,6 @@ import android.os.IBinder; import android.util.Log; -import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat.Builder; @@ -38,7 +37,7 @@ public final class GenericForegroundService extends Service { private static final String EXTRA_TITLE = "extra_title"; private static final String EXTRA_CONTENT_TEXT = "extra_content_text"; private static final String EXTRA_CHANNEL_ID = "extra_channel_id"; - private static final String EXTRA_ICON_RES = "extra_icon_res"; + private static final String EXTRA_PIN_ACTIVITY = "extra_pin_activity"; private static final String EXTRA_ID = "extra_id"; private static final String EXTRA_PROGRESS = "extra_progress"; private static final String EXTRA_PROGRESS_MAX = "extra_progress_max"; @@ -50,11 +49,11 @@ public final class GenericForegroundService extends Service { private static final AtomicInteger NEXT_ID = new AtomicInteger(); private static final AtomicBoolean CHANNEL_CREATED = new AtomicBoolean(false); - private static int startedCounter = 0; + private static int pinnedActivityCounter = 0; private final LinkedHashMap allActiveMessages = new LinkedHashMap<>(); - private static final Entry DEFAULTS = new Entry("", "", NotificationCenter.CH_GENERIC, R.drawable.icon_notification, -1, 0, 0, false); + private static final Entry DEFAULTS = new Entry("", "", NotificationCenter.CH_GENERIC, true, -1, 0, 0, false); private @Nullable Entry lastPosted; @@ -92,28 +91,24 @@ private synchronized void updateNotification() { private synchronized void handleStart(@NonNull Intent intent) { Entry entry = Entry.fromIntent(intent); - - Log.i(TAG, String.format(Locale.ENGLISH, "handleStart() %s", entry)); - allActiveMessages.put(entry.id, entry); + if (entry.pinActivity) { + pinnedActivityCounter++; + } } private synchronized void handleStop(@NonNull Intent intent) { - Log.i(TAG, "handleStop()"); - int id = intent.getIntExtra(EXTRA_ID, -1); - Entry removed = allActiveMessages.remove(id); - - if (removed == null) { - Log.w(TAG, "Could not find entry to remove"); + if (removed != null && removed.pinActivity) { + pinnedActivityCounter = Math.max(pinnedActivityCounter-1, 0); } } private void postObligatoryForegroundNotification(@NonNull Entry active) { lastPosted = active; startForeground(NotificationCenter.ID_GENERIC, new Builder(this, active.channelId) - .setSmallIcon(active.iconRes) + .setSmallIcon(R.drawable.notification_permanent) .setContentTitle(active.title) .setTicker(active.contentText) .setContentText(active.contentText) @@ -127,9 +122,9 @@ public IBinder onBind(Intent intent) { return binder; } - - public static NotificationController startForegroundTask(@NonNull Context context, @NonNull String task) { - startedCounter++; + // pinActivity makes the recent activity stay on top + // and tries to avoid it being replaced eg. by the chatlist when tapping the app icon. + public static NotificationController startForegroundTask(@NonNull Context context, @NonNull String task, boolean pinActivity) { final int id = NEXT_ID.getAndIncrement(); createFgNotificationChannel(context); @@ -137,7 +132,7 @@ public static NotificationController startForegroundTask(@NonNull Context contex intent.setAction(ACTION_START); intent.putExtra(EXTRA_TITLE, task); intent.putExtra(EXTRA_CHANNEL_ID, NotificationCenter.CH_GENERIC); - intent.putExtra(EXTRA_ICON_RES, R.drawable.notification_permanent); + intent.putExtra(EXTRA_PIN_ACTIVITY, pinActivity); intent.putExtra(EXTRA_ID, id); ContextCompat.startForegroundService(context, intent); @@ -151,11 +146,10 @@ public static void stopForegroundTask(@NonNull Context context, int id) { intent.putExtra(EXTRA_ID, id); ContextCompat.startForegroundService(context, intent); - startedCounter = Math.max(startedCounter-1, 0); } - public static boolean isForegroundTaskStarted() { - return startedCounter > 0; + public static boolean hasPinnedActivity() { + return pinnedActivityCounter > 0; } synchronized void replaceProgress(int id, int progressMax, int progress, boolean indeterminate, String message) { @@ -170,7 +164,7 @@ synchronized void replaceProgress(int id, int progressMax, int progress, boolean message = oldEntry.contentText; } - Entry newEntry = new Entry(oldEntry.title, message, oldEntry.channelId, oldEntry.iconRes, oldEntry.id, progressMax, progress, indeterminate); + Entry newEntry = new Entry(oldEntry.title, message, oldEntry.channelId, oldEntry.pinActivity, oldEntry.id, progressMax, progress, indeterminate); if (oldEntry.equals(newEntry)) { Log.d(TAG, String.format("handleReplace() skip, no change %s", newEntry)); @@ -202,16 +196,16 @@ private static class Entry { final @NonNull String contentText; final @NonNull String channelId; final int id; - final @DrawableRes int iconRes; + final boolean pinActivity; final int progress; final int progressMax; final boolean indeterminate; - private Entry(@NonNull String title, @NonNull String contentText, @NonNull String channelId, @DrawableRes int iconRes, int id, int progressMax, int progress, boolean indeterminate) { + private Entry(@NonNull String title, @NonNull String contentText, @NonNull String channelId, boolean pinActivity, int id, int progressMax, int progress, boolean indeterminate) { this.title = title; this.contentText = contentText; this.channelId = channelId; - this.iconRes = iconRes; + this.pinActivity = pinActivity; this.id = id; this.progress = progress; this.progressMax = progressMax; @@ -230,12 +224,12 @@ private static Entry fromIntent(@NonNull Intent intent) { String channelId = intent.getStringExtra(EXTRA_CHANNEL_ID); if (channelId == null) channelId = DEFAULTS.channelId; - int iconRes = intent.getIntExtra(EXTRA_ICON_RES, DEFAULTS.iconRes); + boolean pinActivity = intent.getBooleanExtra(EXTRA_PIN_ACTIVITY, DEFAULTS.pinActivity); int progress = intent.getIntExtra(EXTRA_PROGRESS, DEFAULTS.progress); int progressMax = intent.getIntExtra(EXTRA_PROGRESS_MAX, DEFAULTS.progressMax); boolean indeterminate = intent.getBooleanExtra(EXTRA_PROGRESS_INDETERMINATE, DEFAULTS.indeterminate); - return new Entry(title, contentText, channelId, iconRes, id, progressMax, progress, indeterminate); + return new Entry(title, contentText, channelId, pinActivity, id, progressMax, progress, indeterminate); } @Override @@ -250,7 +244,7 @@ public boolean equals(Object o) { Entry entry = (Entry) o; return id == entry.id && - iconRes == entry.iconRes && + pinActivity == entry.pinActivity && progress == entry.progress && progressMax == entry.progressMax && indeterminate == entry.indeterminate && @@ -267,7 +261,7 @@ public int hashCode() { hashCode *= 31; hashCode += id; hashCode *= 31; - hashCode += iconRes; + hashCode += pinActivity ? 1 : 0; hashCode *= 31; hashCode += progress; hashCode *= 31; From 3a4c02c8cd2281b3b6696883ffcc19465f3176c2 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sat, 21 Sep 2024 22:39:27 +0200 Subject: [PATCH 06/22] Revert "add pinActivity parameter to GenericForegroundService" This reverts commit b7e5bee655bb839153a9229e0035eb6c711fb723. --- .../notifications/FcmReceiveService.java | 2 +- .../PassphraseRequiredActionBarActivity.java | 2 +- .../securesms/WelcomeActivity.java | 2 +- .../ListSummaryPreferenceFragment.java | 2 +- .../securesms/qr/BackupTransferActivity.java | 2 +- .../service/GenericForegroundService.java | 52 +++++++++++-------- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index b52d2ca0a3..999b762f72 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -102,7 +102,7 @@ public static String getToken() { public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); synchronized (NOTIFICATION_CONTROLLER_LOCK) { - notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.connectivity_updating), false); + notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.connectivity_updating)); if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { // we should complete within 20 seconds notificationController.close(); notificationController = null; diff --git a/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java b/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java index 4ede775c53..c043a046b3 100644 --- a/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java @@ -20,7 +20,7 @@ protected final void onCreate(Bundle savedInstanceState) { return; } - if (GenericForegroundService.hasPinnedActivity()) { + if (GenericForegroundService.isForegroundTaskStarted()) { // this does not prevent intent set by onNewIntent(), // however, at least during onboarding, // this catches a lot of situations with otherwise weird app states. diff --git a/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java b/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java index 202a05db91..54d45c075b 100644 --- a/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/WelcomeActivity.java @@ -202,7 +202,7 @@ private void startImportBackup() { private void startImport(@Nullable final String backupFile, final @Nullable Uri backupFileUri) { - notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.import_backup_title), true); + notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.import_backup_title)); if( progressDialog!=null ) { progressDialog.dismiss(); diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java index d60df44f00..361c427a18 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java @@ -151,7 +151,7 @@ private void stopOngoingProcess() { } private void showProgressDialog() { - notificationController = GenericForegroundService.startForegroundTask(getContext(), getString(R.string.export_backup_desktop), true); + notificationController = GenericForegroundService.startForegroundTask(getContext(), getString(R.string.export_backup_desktop)); if( progressDialog!=null ) { progressDialog.dismiss(); progressDialog = null; diff --git a/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java b/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java index 6d29fff0d5..1b203b3584 100644 --- a/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/qr/BackupTransferActivity.java @@ -67,7 +67,7 @@ protected void onCreate(Bundle icicle) { DcHelper.getAccounts(this).stopIo(); String title = getString(transferMode == TransferMode.RECEIVER_SCAN_QR ? R.string.multidevice_receiver_title : R.string.multidevice_title); - notificationController = GenericForegroundService.startForegroundTask(this, title, true); + notificationController = GenericForegroundService.startForegroundTask(this, title); setContentView(R.layout.backup_provider_activity); diff --git a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java index 96e6e67666..60b5b912c4 100644 --- a/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java +++ b/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java @@ -12,6 +12,7 @@ import android.os.IBinder; import android.util.Log; +import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat.Builder; @@ -37,7 +38,7 @@ public final class GenericForegroundService extends Service { private static final String EXTRA_TITLE = "extra_title"; private static final String EXTRA_CONTENT_TEXT = "extra_content_text"; private static final String EXTRA_CHANNEL_ID = "extra_channel_id"; - private static final String EXTRA_PIN_ACTIVITY = "extra_pin_activity"; + private static final String EXTRA_ICON_RES = "extra_icon_res"; private static final String EXTRA_ID = "extra_id"; private static final String EXTRA_PROGRESS = "extra_progress"; private static final String EXTRA_PROGRESS_MAX = "extra_progress_max"; @@ -49,11 +50,11 @@ public final class GenericForegroundService extends Service { private static final AtomicInteger NEXT_ID = new AtomicInteger(); private static final AtomicBoolean CHANNEL_CREATED = new AtomicBoolean(false); - private static int pinnedActivityCounter = 0; + private static int startedCounter = 0; private final LinkedHashMap allActiveMessages = new LinkedHashMap<>(); - private static final Entry DEFAULTS = new Entry("", "", NotificationCenter.CH_GENERIC, true, -1, 0, 0, false); + private static final Entry DEFAULTS = new Entry("", "", NotificationCenter.CH_GENERIC, R.drawable.icon_notification, -1, 0, 0, false); private @Nullable Entry lastPosted; @@ -91,24 +92,28 @@ private synchronized void updateNotification() { private synchronized void handleStart(@NonNull Intent intent) { Entry entry = Entry.fromIntent(intent); + + Log.i(TAG, String.format(Locale.ENGLISH, "handleStart() %s", entry)); + allActiveMessages.put(entry.id, entry); - if (entry.pinActivity) { - pinnedActivityCounter++; - } } private synchronized void handleStop(@NonNull Intent intent) { + Log.i(TAG, "handleStop()"); + int id = intent.getIntExtra(EXTRA_ID, -1); + Entry removed = allActiveMessages.remove(id); - if (removed != null && removed.pinActivity) { - pinnedActivityCounter = Math.max(pinnedActivityCounter-1, 0); + + if (removed == null) { + Log.w(TAG, "Could not find entry to remove"); } } private void postObligatoryForegroundNotification(@NonNull Entry active) { lastPosted = active; startForeground(NotificationCenter.ID_GENERIC, new Builder(this, active.channelId) - .setSmallIcon(R.drawable.notification_permanent) + .setSmallIcon(active.iconRes) .setContentTitle(active.title) .setTicker(active.contentText) .setContentText(active.contentText) @@ -122,9 +127,9 @@ public IBinder onBind(Intent intent) { return binder; } - // pinActivity makes the recent activity stay on top - // and tries to avoid it being replaced eg. by the chatlist when tapping the app icon. - public static NotificationController startForegroundTask(@NonNull Context context, @NonNull String task, boolean pinActivity) { + + public static NotificationController startForegroundTask(@NonNull Context context, @NonNull String task) { + startedCounter++; final int id = NEXT_ID.getAndIncrement(); createFgNotificationChannel(context); @@ -132,7 +137,7 @@ public static NotificationController startForegroundTask(@NonNull Context contex intent.setAction(ACTION_START); intent.putExtra(EXTRA_TITLE, task); intent.putExtra(EXTRA_CHANNEL_ID, NotificationCenter.CH_GENERIC); - intent.putExtra(EXTRA_PIN_ACTIVITY, pinActivity); + intent.putExtra(EXTRA_ICON_RES, R.drawable.notification_permanent); intent.putExtra(EXTRA_ID, id); ContextCompat.startForegroundService(context, intent); @@ -146,10 +151,11 @@ public static void stopForegroundTask(@NonNull Context context, int id) { intent.putExtra(EXTRA_ID, id); ContextCompat.startForegroundService(context, intent); + startedCounter = Math.max(startedCounter-1, 0); } - public static boolean hasPinnedActivity() { - return pinnedActivityCounter > 0; + public static boolean isForegroundTaskStarted() { + return startedCounter > 0; } synchronized void replaceProgress(int id, int progressMax, int progress, boolean indeterminate, String message) { @@ -164,7 +170,7 @@ synchronized void replaceProgress(int id, int progressMax, int progress, boolean message = oldEntry.contentText; } - Entry newEntry = new Entry(oldEntry.title, message, oldEntry.channelId, oldEntry.pinActivity, oldEntry.id, progressMax, progress, indeterminate); + Entry newEntry = new Entry(oldEntry.title, message, oldEntry.channelId, oldEntry.iconRes, oldEntry.id, progressMax, progress, indeterminate); if (oldEntry.equals(newEntry)) { Log.d(TAG, String.format("handleReplace() skip, no change %s", newEntry)); @@ -196,16 +202,16 @@ private static class Entry { final @NonNull String contentText; final @NonNull String channelId; final int id; - final boolean pinActivity; + final @DrawableRes int iconRes; final int progress; final int progressMax; final boolean indeterminate; - private Entry(@NonNull String title, @NonNull String contentText, @NonNull String channelId, boolean pinActivity, int id, int progressMax, int progress, boolean indeterminate) { + private Entry(@NonNull String title, @NonNull String contentText, @NonNull String channelId, @DrawableRes int iconRes, int id, int progressMax, int progress, boolean indeterminate) { this.title = title; this.contentText = contentText; this.channelId = channelId; - this.pinActivity = pinActivity; + this.iconRes = iconRes; this.id = id; this.progress = progress; this.progressMax = progressMax; @@ -224,12 +230,12 @@ private static Entry fromIntent(@NonNull Intent intent) { String channelId = intent.getStringExtra(EXTRA_CHANNEL_ID); if (channelId == null) channelId = DEFAULTS.channelId; - boolean pinActivity = intent.getBooleanExtra(EXTRA_PIN_ACTIVITY, DEFAULTS.pinActivity); + int iconRes = intent.getIntExtra(EXTRA_ICON_RES, DEFAULTS.iconRes); int progress = intent.getIntExtra(EXTRA_PROGRESS, DEFAULTS.progress); int progressMax = intent.getIntExtra(EXTRA_PROGRESS_MAX, DEFAULTS.progressMax); boolean indeterminate = intent.getBooleanExtra(EXTRA_PROGRESS_INDETERMINATE, DEFAULTS.indeterminate); - return new Entry(title, contentText, channelId, pinActivity, id, progressMax, progress, indeterminate); + return new Entry(title, contentText, channelId, iconRes, id, progressMax, progress, indeterminate); } @Override @@ -244,7 +250,7 @@ public boolean equals(Object o) { Entry entry = (Entry) o; return id == entry.id && - pinActivity == entry.pinActivity && + iconRes == entry.iconRes && progress == entry.progress && progressMax == entry.progressMax && indeterminate == entry.indeterminate && @@ -261,7 +267,7 @@ public int hashCode() { hashCode *= 31; hashCode += id; hashCode *= 31; - hashCode += pinActivity ? 1 : 0; + hashCode += iconRes; hashCode *= 31; hashCode += progress; hashCode *= 31; From ba3ea172e524db6553d2011de2d384429798005e Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sat, 21 Sep 2024 23:39:34 +0200 Subject: [PATCH 07/22] use explicit FetchForegroundService this avoids potential issues with GenericForegroundService which eg. may block app start. --- .../notifications/FcmReceiveService.java | 23 ++----- src/main/AndroidManifest.xml | 4 ++ .../securesms/connect/DcEventCenter.java | 4 +- .../notifications/NotificationCenter.java | 1 + .../service/FetchForegroundService.java | 61 +++++++++++++++++++ .../service/GenericForegroundService.java | 2 +- 6 files changed, 73 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index 999b762f72..ebaaf604cf 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -17,20 +17,15 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.BuildConfig; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.service.GenericForegroundService; -import org.thoughtcrime.securesms.service.NotificationController; +import org.thoughtcrime.securesms.service.FetchForegroundService; import org.thoughtcrime.securesms.util.Util; public class FcmReceiveService extends FirebaseMessagingService { private static final String TAG = FcmReceiveService.class.getSimpleName(); private static final Object INIT_LOCK = new Object(); - private static final Object NOTIFICATION_CONTROLLER_LOCK = new Object(); - private static boolean initialized; private static volatile boolean triedRegistering; private static volatile String prefixedToken; - private static NotificationController notificationController; public static void register(Context context) { if (Build.VERSION.SDK_INT < 19) { @@ -101,23 +96,13 @@ public static String getToken() { @Override public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); - synchronized (NOTIFICATION_CONTROLLER_LOCK) { - notificationController = GenericForegroundService.startForegroundTask(this, getString(R.string.connectivity_updating)); - if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { // we should complete within 20 seconds - notificationController.close(); - notificationController = null; - } + FetchForegroundService.start(this); + if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { // we should complete within 20 seconds + FetchForegroundService.stop(this); } Log.i(TAG, "background fetch done"); } - public static void backgroundFetchDone() { - synchronized (NOTIFICATION_CONTROLLER_LOCK) { - notificationController.close(); - notificationController = null; - } - } - @Override public void onDeletedMessages() { Log.i(TAG, "FCM push notifications dropped"); diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index ec201402cc..486980fcdc 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -380,6 +380,10 @@ android:name=".service.GenericForegroundService" android:foregroundServiceType="dataSync" /> + + = Build.VERSION_CODES.O) { CHANNEL_CREATED.set(true); NotificationChannel channel = new NotificationChannel(NotificationCenter.CH_GENERIC, From 1bc40837feafff957ed4a04082f14ec3b6dc57eb Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sun, 22 Sep 2024 12:22:01 +0200 Subject: [PATCH 08/22] add reference for the 20 seconds time span --- .../securesms/notifications/FcmReceiveService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index ebaaf604cf..85953bbf41 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -97,9 +97,13 @@ public static String getToken() { public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); FetchForegroundService.start(this); - if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { // we should complete within 20 seconds + + // we should complete within 20 seconds, + // see https://firebase.google.com/docs/cloud-messaging/android/receive + if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { FetchForegroundService.stop(this); } + Log.i(TAG, "background fetch done"); } From 9fc4bfb97020e1a4cb1f7fa8f3ae601957a072ca Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sun, 22 Sep 2024 12:37:01 +0200 Subject: [PATCH 09/22] move backgroundFetch() to FetchForegroundService --- .../notifications/FcmReceiveService.java | 8 -------- .../service/FetchForegroundService.java | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index 85953bbf41..8aecf54a8b 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -97,14 +97,6 @@ public static String getToken() { public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { Log.i(TAG, "FCM push notification received"); FetchForegroundService.start(this); - - // we should complete within 20 seconds, - // see https://firebase.google.com/docs/cloud-messaging/android/receive - if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { - FetchForegroundService.stop(this); - } - - Log.i(TAG, "background fetch done"); } @Override diff --git a/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java index ca10d3277e..ddb97310bb 100644 --- a/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java +++ b/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java @@ -5,15 +5,20 @@ 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; @@ -38,6 +43,7 @@ public static void stop(Context context) { @Override public void onCreate() { + Log.i(TAG, "Creating fetch service"); super.onCreate(); Notification notification = new NotificationCompat.Builder(this, NotificationCenter.CH_GENERIC) @@ -46,6 +52,18 @@ public void onCreate() { .build(); startForeground(NotificationCenter.ID_FETCH, notification); + + // Start explicit fetch only after we marked ourselves as requiring foreground; + // this may help we on getting network and time adequately + // Fetch is started in background to not block the UI. + // We then run not longer than the max. of 20 seconds, + // see https://firebase.google.com/docs/cloud-messaging/android/receive . + Util.runOnAnyBackgroundThread(() -> { + Log.i(TAG, "Starting fetch"); + if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { + FetchForegroundService.stop(this); + } + }); } @Override From 9ffa76c0f4c8f7f8da874fb197b003de59cdac9b Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 23 Sep 2024 13:29:03 +0200 Subject: [PATCH 10/22] as we called startForeground(), longer timeouts should be fine --- .../securesms/service/FetchForegroundService.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java b/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java index ddb97310bb..71967f559e 100644 --- a/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java +++ b/src/main/java/org/thoughtcrime/securesms/service/FetchForegroundService.java @@ -53,16 +53,11 @@ public void onCreate() { startForeground(NotificationCenter.ID_FETCH, notification); - // Start explicit fetch only after we marked ourselves as requiring foreground; - // this may help we on getting network and time adequately - // Fetch is started in background to not block the UI. - // We then run not longer than the max. of 20 seconds, - // see https://firebase.google.com/docs/cloud-messaging/android/receive . Util.runOnAnyBackgroundThread(() -> { Log.i(TAG, "Starting fetch"); - if (!ApplicationContext.dcAccounts.backgroundFetch(19)) { + 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 }); } From 8aa615157a64ecc6600ab946551663f18797b832 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Mon, 23 Sep 2024 14:57:12 +0200 Subject: [PATCH 11/22] Also start the FetchForegroundService in onDeletedMessages() (#3317) See https://firebase.google.com/docs/cloud-messaging/android/receive#override-ondeletedmessages Shouldn't happen very often, but if it does, it's good to connect, too. --- .../thoughtcrime/securesms/notifications/FcmReceiveService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java index 8aecf54a8b..ec145fb76f 100644 --- a/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java +++ b/src/gplay/java/org/thoughtcrime/securesms/notifications/FcmReceiveService.java @@ -102,7 +102,7 @@ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { @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 From bc6d676fcdcaab984404a0172265a5331d85d0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asiel=20D=C3=ADaz=20Ben=C3=ADtez?= Date: Thu, 26 Sep 2024 14:30:54 +0200 Subject: [PATCH 12/22] use new proxy_url list API (#3292) --- src/main/AndroidManifest.xml | 2 +- .../java/com/b44t/messenger/DcContext.java | 1 + .../securesms/ConversationListActivity.java | 5 +- .../securesms/InstantOnboardingActivity.java | 1 + .../securesms/ProxySettingsActivity.java | 160 --------------- .../securesms/RegistrationActivity.java | 11 +- .../securesms/connect/DcHelper.java | 7 +- .../AdvancedPreferenceFragment.java | 2 +- .../securesms/proxy/ProxyListAdapter.java | 172 ++++++++++++++++ .../proxy/ProxySettingsActivity.java | 189 ++++++++++++++++++ src/main/res/layout/proxy_list_footer.xml | 24 +++ src/main/res/layout/proxy_list_header.xml | 13 ++ src/main/res/layout/proxy_list_item.xml | 106 ++++++++++ .../res/layout/proxy_settings_activity.xml | 145 ++------------ src/main/res/values/strings.xml | 11 +- 15 files changed, 547 insertions(+), 302 deletions(-) delete mode 100644 src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java create mode 100644 src/main/java/org/thoughtcrime/securesms/proxy/ProxyListAdapter.java create mode 100644 src/main/java/org/thoughtcrime/securesms/proxy/ProxySettingsActivity.java create mode 100644 src/main/res/layout/proxy_list_footer.xml create mode 100644 src/main/res/layout/proxy_list_header.xml create mode 100644 src/main/res/layout/proxy_list_item.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 486980fcdc..143c3e3ea1 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -249,7 +249,7 @@ - diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index b02b4dc22b..003f62dd3f 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -56,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 10844d7289..c7ac6dc1a6 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; @@ -64,6 +64,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; @@ -361,7 +362,7 @@ 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); + menu.findItem(R.id.menu_proxy_settings).setVisible(!TextUtils.isEmpty(DcHelper.get(this, CONFIG_PROXY_URL))); } super.onPrepareOptionsMenu(menu); diff --git a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java index 7eee049ffa..3adaf56e77 100644 --- a/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/InstantOnboardingActivity.java @@ -48,6 +48,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; 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/DcHelper.java b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java index b3317dd7a6..a6d50e324e 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java @@ -72,11 +72,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/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index fbcf11397d..f5f095e4ae 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -37,7 +37,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; 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/res/layout/proxy_list_footer.xml b/src/main/res/layout/proxy_list_footer.xml new file mode 100644 index 0000000000..159ec0eb44 --- /dev/null +++ b/src/main/res/layout/proxy_list_footer.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/src/main/res/layout/proxy_list_header.xml b/src/main/res/layout/proxy_list_header.xml new file mode 100644 index 0000000000..1ec7175bb6 --- /dev/null +++ b/src/main/res/layout/proxy_list_header.xml @@ -0,0 +1,13 @@ + + diff --git a/src/main/res/layout/proxy_list_item.xml b/src/main/res/layout/proxy_list_item.xml new file mode 100644 index 0000000000..fc63285875 --- /dev/null +++ b/src/main/res/layout/proxy_list_item.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/res/layout/proxy_settings_activity.xml b/src/main/res/layout/proxy_settings_activity.xml index d3660855e9..4570f22f4d 100644 --- a/src/main/res/layout/proxy_settings_activity.xml +++ b/src/main/res/layout/proxy_settings_activity.xml @@ -1,128 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:orientation="vertical" + tools:context=".proxy.ProxySettingsActivity"> + + + + + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 07ac2131b4..c31bd6c1fb 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -608,13 +608,22 @@ Proxy Use Proxy - + Add Proxy + Supported proxy types: HTTP(S), SOCKS5 and Shadowsocks. + Enter proxy URL here + Invalid or unsupported proxy URL + Connections + Delete Proxy + Are you sure you want to delete \"%1$s\"? + + SOCKS5 Use SOCKS5 SOCKS5 Host SOCKS5 Port SOCKS5 User SOCKS5 Password + Continue with simplified setup? The entered e-mail address supports a simplified setup (OAuth 2.0).\n\nIn the next step, please allow Delta Chat to act as your Chat over E-mail app.\n\nDelta Chat does not collect user data, everything stays on your device. Certificate Checks From 0bef0b35012ae04ec230634790592a0d745232c7 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 26 Sep 2024 15:00:20 +0100 Subject: [PATCH 13/22] update deltachat-core-rust to 'chore(release): prepare for 1.144.0' of 'v1.144.0' --- jni/deltachat-core-rust | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index e4ebb91712..486ea3a358 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit e4ebb917126a1243c7180358a50e7d0af7742594 +Subproject commit 486ea3a358b4cd0518de7e11f2997ea463a50604 From ecf87c58e16692570f080d3216e3d3923eff9182 Mon Sep 17 00:00:00 2001 From: bjoern Date: Thu, 26 Sep 2024 17:09:39 +0100 Subject: [PATCH 14/22] tweak proxy UI (#3322) * use string 'Saved Proxies' as header for proxy settings 'Connections' is a bit broad, also there is only one connection. 'Saved Proxies' is also what Telegram is using. * move proxy settings in 'Advanced' down logically, this seems to be a better fit. Account/Password is still the most important bit, even if not directly needed in chatmail and Proxy is used more often. * add proxy settings icon to main screen * use 'cable' instead of 'shield'. things are rewired, but not more protected or secured. --- src/main/res/drawable/baseline_proxy_24.xml | 5 +++++ src/main/res/menu/text_secure_normal.xml | 14 ++++++++------ src/main/res/values/strings.xml | 2 +- src/main/res/xml/preferences_advanced.xml | 6 +++--- 4 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 src/main/res/drawable/baseline_proxy_24.xml 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/menu/text_secure_normal.xml b/src/main/res/menu/text_secure_normal.xml index 66d0a9e7f8..7d91be7182 100644 --- a/src/main/res/menu/text_secure_normal.xml +++ b/src/main/res/menu/text_secure_normal.xml @@ -5,12 +5,7 @@ - - + app:showAsAction="ifRoom"/> @@ -26,6 +21,13 @@ android:visible="false" /> + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index c31bd6c1fb..4b8e7042e9 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -612,7 +612,7 @@ Supported proxy types: HTTP(S), SOCKS5 and Shadowsocks. Enter proxy URL here Invalid or unsupported proxy URL - Connections + Saved Proxies Delete Proxy Are you sure you want to delete \"%1$s\"? diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml index 0c90f637d7..92e00fdbb9 100644 --- a/src/main/res/xml/preferences_advanced.xml +++ b/src/main/res/xml/preferences_advanced.xml @@ -90,12 +90,12 @@ - - + + Date: Thu, 26 Sep 2024 20:28:59 +0100 Subject: [PATCH 15/22] update translations --- src/main/res/values-bg/strings.xml | 4 +- src/main/res/values-ca/strings.xml | 2 +- src/main/res/values-da/strings.xml | 3 +- src/main/res/values-de/strings.xml | 12 +++++- src/main/res/values-el/strings.xml | 4 +- src/main/res/values-es/strings.xml | 4 +- src/main/res/values-fa/strings.xml | 4 +- src/main/res/values-fi/strings.xml | 4 +- src/main/res/values-fr/strings.xml | 4 +- src/main/res/values-gl/strings.xml | 4 +- src/main/res/values-hu/strings.xml | 51 ++++++++++++++------------ src/main/res/values-it/strings.xml | 6 ++- src/main/res/values-km/strings.xml | 3 +- src/main/res/values-ko/strings.xml | 4 +- src/main/res/values-lt/strings.xml | 4 +- src/main/res/values-nl/strings.xml | 4 +- src/main/res/values-pl/strings.xml | 4 +- src/main/res/values-pt-rBR/strings.xml | 4 +- src/main/res/values-ro/strings.xml | 3 +- src/main/res/values-ru/strings.xml | 10 +++-- src/main/res/values-sk/strings.xml | 4 +- src/main/res/values-sq/strings.xml | 4 +- src/main/res/values-sr/strings.xml | 4 +- src/main/res/values-sv/strings.xml | 4 +- src/main/res/values-tr/strings.xml | 6 ++- src/main/res/values-uk/strings.xml | 9 ++++- src/main/res/values-vi/strings.xml | 4 +- src/main/res/values-zh-rCN/strings.xml | 4 +- src/main/res/values-zh-rTW/strings.xml | 4 +- 29 files changed, 124 insertions(+), 57 deletions(-) diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml index 27a496ee51..77425f69c1 100644 --- a/src/main/res/values-bg/strings.xml +++ b/src/main/res/values-bg/strings.xml @@ -592,13 +592,14 @@ SMTP порт Сигурност на SMTP връзката Метод за оторизация - + SOCKS5 Да се използва SOCKS5 SOCKS5 хост SOCKS5 порт SOCKS5 потребител SOCKS5 парола + Да се продължи ли с опростената настройка? Въведеният адрес за електронна поща поддържа опростена настройка (OAuth 2.0).\n\nНа следващата стъпка, моля позволете на Delta Chat да действа в качеството си на избраното от Вас приложение за чат върху електронна поща.\n\nDelta Chat няма сървъри, Вашите данни стоят на Вашето устройство. Проверки на сертификатите @@ -975,6 +976,7 @@ Неуспешно декодиране на mailto връзка: %1$s + Затваряне Отговор Ново съобщение diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml index 697ff3f56d..7021d94eb7 100644 --- a/src/main/res/values-ca/strings.xml +++ b/src/main/res/values-ca/strings.xml @@ -511,7 +511,7 @@ Port SMTP Seguretat SMTP Mètode d\'autorització - + SOCKS5 Voleu continuar amb la configuració simplificada? L’adreça d\'e-mail que heu introduït admet una configuració simplificada. (OAuth2).\n\nEn el pas següent, permeteu que Delta Chat actuï com a xat amb l\'aplicació de correu electrònic..\n\nNo hi ha servidors de Delta Chat, les vostres dades romanen al vostre dispositiu! diff --git a/src/main/res/values-da/strings.xml b/src/main/res/values-da/strings.xml index c0347d7411..1bfaaea67d 100644 --- a/src/main/res/values-da/strings.xml +++ b/src/main/res/values-da/strings.xml @@ -398,13 +398,14 @@ SMTP port SMTP sikkerhed Autorisationsmetode - + SOCKS5 Brug SOCKS5 SOCKS5 Værtsnavn SOCKS5 Port SOCKS5 Brugernavn SOCKS5 adgangskode + Fortsæt med forenklet opsætning? Indtastet e-mail adresse understøtter simple opsætning (OAuth2).\n\nTillad i næste trin at Delta Chat agerer som samtale med e-mail program.\n\nDer er ingen Delta Chat servere, data forbliver på enhed. Certifikationstjek diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index dbcc76b7f7..e53e22d27f 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -608,13 +608,22 @@ Proxy Proxy verwenden - + Proxy hinzufügen + Unterstützte Typen: HTTP(S), SOCKS5 und Shadowsocks. + Proxy URL hier eingeben + Ungültige oder nicht unterstützte Proxy-URL + Proxies + Proxy löschen + \"%1$s\" löschen? + + SOCKS5 SOCKS5 verwenden SOCKS5-Host SOCKS5-Port SOCKS5-Anmeldename SOCKS5-Passwort + Weiter mit vereinfachter Einrichtung? Die eingegebene E-Mail-Adresse unterstützt eine vereinfachte Einrichtung (OAuth 2.0).\n\nBitte erlauben Sie Delta Chat im nächsten Schritt, als Chat-über-E-Mail-App zu arbeiten.\n\nDelta Chat sammelt keine Benutzerdaten, alles bleibt auf Ihrem Gerät. Zertifikatsüberprüfung @@ -994,6 +1003,7 @@ Mailto-Link konnte nicht dekodiert werden: %1$s + Verwerfen Antworten Neue Nachricht diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 7209daba56..cb09eaf499 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -492,13 +492,14 @@ Θύρα SMTP Ασφάλεια SMTP Μέθοδος Πιστοποίησης - + SOCKS5 Χρήση SOCKS5 SOCKS5 Κεντρικός Θύρα SOCKS5 Χρήστης SOCKS5 Κωδικός SOCKS5 + Συνέχεια με την απλοποιημένη ρύθμιση; Η εισαγόμενη διεύθυνση e-mail υποστηρίζει μια απλοποιημένη ρύθμιση (OAuth 2.0).\n\nΣτο επόμενο βήμα, επιτρέψτε στο Delta Chat να λειτουργεί ως η εφαρμογή Chat μέσω ηλεκτρονικού ταχυδρομείου.\n\nΔεν υπάρχουν διακομιστές Delta Chat, τα δεδομένα σας παραμένει στη συσκευή σας. Έλεγχοι Πιστοποιητικών @@ -829,6 +830,7 @@ Αδυναμία αποκωδικοποίησης του συνδέσμου mailto: %1$s + Απόρριψη Απάντηση Νέο μήνυμα diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 6ec4f3e1eb..85a6fb51b2 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -620,13 +620,14 @@ Puerto SMTP Seguridad SMTP Método de autorización - + SOCKS5 Usar SOCKS5 Servidor SOCKS5 Puerto SOCKS5 Usuario SOCKS5 Contraseña SOCKS5 + ¿Continuar con la configuración simplificada? La dirección de correo electrónico introducida admite una configuración simplificada (OAuth 2.0).\n\nEn el próximo paso, permita que Delta Chat actúe como su aplicación de chat por correo electrónico.\n\nNo hay servidores de Delta Chat, tus datos permanecen en tu dispositivo. Comprobaciones de certificados @@ -1006,6 +1007,7 @@ El enlace mailto no se pudo decodificar: %1$s + Descartar Responder Nuevo mensaje diff --git a/src/main/res/values-fa/strings.xml b/src/main/res/values-fa/strings.xml index 4e49859c3a..34f04597d7 100644 --- a/src/main/res/values-fa/strings.xml +++ b/src/main/res/values-fa/strings.xml @@ -573,13 +573,14 @@ https://meet.jit.si/$ROOM SMTP Port SMTP Security Authorization Method - + SOCKS5 استفاده از SOCKS5 SOCKS5 Host SOCKS5 Port SOCKS5 User SOCKS5 Password + با تنظیم‌ها ساده‌ شده ادامه می‌دهید؟ نشانی رایانامه وارد شده از تنظیم‌های ساده پشتیبانی می‌کند (OAuth 2.0).\n\nIn @@ -955,6 +956,7 @@ https://meet.jit.si/$ROOM امکان کدگشایی پیوند mailto وجود ندارد: %1$s + صرف نظر پاسخ پیام جدید diff --git a/src/main/res/values-fi/strings.xml b/src/main/res/values-fi/strings.xml index 58b3004827..da2da4e6c0 100644 --- a/src/main/res/values-fi/strings.xml +++ b/src/main/res/values-fi/strings.xml @@ -595,13 +595,14 @@ SMTP -portti SMTP -turvallisuusprotokolla Kirjautumismenetelmä - + SOCKS5 Käytä SOCKS5 SOCKS5 -isäntä SOCKS5 -portti SOCKS5 -käyttäjä SOCKS5 -salasana + Jatka yksinkertaistetulla käyttöönotolla? Annettu sähköpostiosoite tukee yksinkertaista käyttöönottoa (OAuth 2.0).\n\nSeuraavassa vaiheessa sinun tulisi antaa Delta Chatille oikeus toimia keskustelusovelluksena sähköpostia hyödyntäen.\n\nDelta Chat ei kerää käyttäjädataa, kaikki tallennetaan vain laitteellesi. Varmenteiden tarkastus @@ -978,6 +979,7 @@ mailto-linkkiä ei voitu selvittää: %1$s + Hylkää Vastaa Uusi viesti diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 3e7934725c..5e2d8e3c46 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -574,13 +574,14 @@ Port SMTP Sécurité SMTP Méthode d\'autorisation - + SOCKS5 Utiliser SOCKS5 Hôte SOCKS5 Port SOCKS5 Utilisateur SOCKS5 Mot de passe SOCKS5 + Continuer avec une configuration simplifiée ? L\'adresse de courriel saisie prend en charge une configuration simplifiée (OAuth2.0). \n\nDans l\'étape suivante, autorisez Delta Chat à agir comme votre application de Chat avec courriel . Il n\'y a pas de serveur Delta Chat, vos données restent sur votre appareil ! Vérification du certificat @@ -933,6 +934,7 @@ Le lien mailto n\'a pas pu être décodé: %1$s + Rejeter Répondre Nouveau message diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml index b67a67c206..974f300543 100644 --- a/src/main/res/values-gl/strings.xml +++ b/src/main/res/values-gl/strings.xml @@ -499,13 +499,14 @@ Porto SMTP Seguridade SMTP Método de autorización - + SOCKS5 Usar SOCKS5 Servidor SOCKS5 Porto SOCKS5 Usuaria SOCKS5 Contrasinal SOCKS5 + Continuar co axuste simplificado? O enderezo introducido soporta o axuste simplificado (OAuth 2.0).\n\nNo seguinte paso, permite a Delta Chat actuar como app de Conversa sobre Correo-e.\n\nNon hai servidores Delta Chat, os teus datos permanecen no dispositivo. Comprobacións do certificado @@ -805,6 +806,7 @@ a ligazón mailto non se puido descodificar: %1$s + Desbotar Responder Nova mensaxe diff --git a/src/main/res/values-hu/strings.xml b/src/main/res/values-hu/strings.xml index cab2e2b9e8..645e8aceda 100644 --- a/src/main/res/values-hu/strings.xml +++ b/src/main/res/values-hu/strings.xml @@ -86,7 +86,7 @@ Vágólapra másolva. Névjegyek E-mail-cím - Hibás E-mail-cím. + Hibás e-mail-cím. Jelszó Jelenlegi jelszó Most @@ -285,7 +285,7 @@ Piszkozat cseréje Helyszín megosztása a csoport összes tagjával Eszközüzenetek - Helyileg generált üzenetek + Helyileg előállított üzenetek Ebben a csevegésben üzenetek jelennek meg az eszközön, amelyek az alkalmazás frissítéseiről és a használat során felmerülő problémákról tájékoztatnak. Lépjen kapcsolatba az ismerőseivel!\n\n🙌 Koppintson a „QR-kódra” mind a két eszköz főképernyőjén. Válassza a „QR-kód beolvasása” lehetőséget az egyik eszközön, és irányítsa a másik eszközre\n\n🌍 Ha nem ugyanabban a szobában tartózkodnak az ismerősével, akkor szkenneljen videohíváson keresztül, vagy ossza meg a meghívó hivatkozást a „QR-kód bolvasása”-ból.\n\nMajd: Élvezze az üzenetküldés-élményt a valaha létezett legnagyobb decentralizált hálózaton keresztül, ami az e-mail és - más népszerű alkalmazásokkal ellentétben - központi kiszolgáló vagy nyomon követés nélkül, illetve anélkül, hogy önt, ismerőseit, kollégáit vagy családját nagy szervezeteknek adná el. Névjegy szerkesztése @@ -359,9 +359,9 @@ A mellékletek exportálása lehetővé teszi, hogy más alkalmazások is hozzáférjenek azokhoz az eszközön.\n\nFolytatja? Letiltja ezt az ismerősét? Többé nem fog üzeneteket kapni tőle. Feloldja ennek az ismerősének a letiltását? Ezután képes lesz üzeneteket fogadni tőle. - Ismerős törlése?\n\nA folyamatban lévő csevegésekkel rendelkező vagy a rendszer névjegyzékéből származó ismerősök nem törölhetőek véglegesen. - %1$s nevű ismerősének tölése?\n\nA folyamatban lévő csevegésekkel rendelkező vagy a rendszer névjegyzékéből származó ismerősök nem törölhetőek véglegesen. - A folyamatban lévő csevegésekkel rendelkező ismerősök nem törölhetőek. + Ismerős törlése?\n\nA folyamatban lévő csevegésekkel rendelkező vagy a rendszer névjegyzékéből származó ismerősök nem törölhetők véglegesen. + %1$s nevű ismerősének tölése?\n\nA folyamatban lévő csevegésekkel rendelkező vagy a rendszer névjegyzékéből származó ismerősök nem törölhetők véglegesen. + A folyamatban lévő csevegésekkel rendelkező ismerősök nem törölhetők. Csevegés vele: %1$s? %s törlése? @@ -373,8 +373,8 @@ Névjegyek - Adjon meg egy nevet vagy egy E-mail-címet - Írja be a fenti E-mail-címet + Adjon meg egy nevet vagy egy e-mail-címet + Írja be a fenti e-mail-címet Még nincsenek névjegyek. @@ -471,7 +471,7 @@ Csoport neve Csoport képe - Csoportkép törlése + Csoportkép eltávolítása Csoport képének megváltoztatása Csoport készítése Csoport nevének magaása. @@ -590,7 +590,7 @@ Jelentkezzen be az e-mail fiókjába - Bejelentkezés meglévő e-mail fiókkal + Bejelentkezés meglévő e-mail-fiókkal Az ismert e-mail szolgáltatók esetében a rendszer automatikus beállításokat hoz létre. Kivételes esetekben az IMAP-ot engedélyezni kell az e-mail szolgáltatójának webes beállításaiban. Forduljon az e-mail szolgáltatójához vagy ismerőseihez további segítségért. A Delta Chat nem gyűjt felhasználói adatokat, minden az ön eszközén marad. Bejövő @@ -605,25 +605,29 @@ SMTP port SMTP biztonság Jogosultság kezelési eljárás - + + Proxy + Proxy használata + SOCKS5 SOCKS5 használata SOCKS5 kiszolgáló SOCKS5 port SOCKS5 felhasználó SOCKS5 jelszó + Folytatja az egyszerűsített beállítást? - A megadott E-mail-cím támogatja az egyszerűsített beállítást (OAuth 2.0).\n\nA következő lépésben engedélyezze a Delta Chat számára, hogy az E-mailen keresztüli csevegés alkalmazásaként működjön.\n\nA Delta Chat nem gyűjt felhasználói adatokat, minden adat az eszközön marad. + A megadott E-mail-cím támogatja az egyszerűsített beállítást (OAuth 2.0).\n\nA következő lépésben engedélyezze a Delta Chat számára, hogy az e-mailen keresztüli csevegés alkalmazásaként működjön.\n\nA Delta Chat nem gyűjt felhasználói adatokat, minden adat az eszközön marad. Tanúsítvány ellenőrzése - Adjon meg egy érvényes E-mail-címet + Adjon meg egy érvényes e-mail-címet Adjon meg egy érvényes kiszolgáló- / IP-címet Adjon meg egy érvényes portot (1-65535) - Adjon meg egy érvényes E-mail-címet és egy jelszót + Adjon meg egy érvényes e-mail-címet és egy jelszót Biztonsági mentés visszaállítása A biztonsági mentés itt található: „%1$s”.\n\nAz összes adatot és beállítást szeretné importálni és használni belőle? A biztonsági mentés nem található.\n\nMásolja a biztonsági mentést ide: „%1$s” és próbálja újra. Másik lehetőségként nyomja meg az „Üzenetküldés indítása” gombot a normál beállítási folyamat folytatásához. - Nem lehetett bejelentkezni ide: „%1$s”. Ellenőrizze, hogy a megadott E-mail-cím és a jelszó helyes-e. + Nem lehetett bejelentkezni ide: „%1$s”. Ellenőrizze, hogy a megadott e-mail-cím és a jelszó helyes-e. Érvénytelen tanúsítványok elfogadása Profilváltás @@ -828,7 +832,7 @@ A beállításokat elküldtük önnek. Váltson a másik eszközre, és nyissa meg a beállítási üzenetet. Meg kell adnia a beállítási kódot. Írja be a következő számjegyeket: Végpontok közötti titkosítás előnyben részesítése Autocryptbeállító-üzenet - Ez az autocryptbeállító-üzenet a végpontok közötti beállítások kliensek közötti átvitelére szolgál.\n\nA beállítások visszafejtéséhez és használatához nyissa meg az üzenetet egy autocrypt-kompatibilis kliensben, és írja be a generáló eszközön megjelenő beállítási kódot. + Ez az autocryptbeállító-üzenet a végpontok közötti beállítások kliensek közötti átvitelére szolgál.\n\nA beállítások visszafejtéséhez és használatához nyissa meg az üzenetet egy autocrypt-kompatibilis kliensben, és írja be az előállító eszközön megjelenő beállítási kódot. Ez az Autocryptbeállító-üzenet, amelyet a végpontok közötti titkosítási beállítások átvitelére használnak a kliensek között.\n\n\nA beállítások visszafejtéséhez és használatához koppintson vagy kattintson erre az üzenetre. Autocryptbeállító-üzenet Adja meg a másik eszközön megjelenő beállítási kódot. @@ -860,9 +864,9 @@ %2$s hozzáadta %1$s nevű tagot. - Ön eltávolította %1$s nevű tagot. + Eltávolította őt: %1$s. - %2$s eltávolította %1$s nevű tagot. + %2$s eltávolította őt: %1$s. Ön elhagyta a csoportot. @@ -938,7 +942,7 @@ A QR-kódot nem sikerült értelmezni Biztosan csatlakozik a(z) „%1$s” nevű szobához? A beolvasott ujjlenyomat nem egyezik a(z) %1$s utoljára látott ujjlenyomatával. - Ez a QR-kód tartalmaz egy ujjlenyomatot, de nem tartalmaz E-mail-címet.\n\nA sávon kívüli ellenőrzéshez először hozzon létre titkosított kapcsolatot a címzetthez. + Ez a QR-kód tartalmaz egy ujjlenyomatot, de nem tartalmaz e-mail-címet.\n\nA sávon kívüli ellenőrzéshez először hozzon létre titkosított kapcsolatot a címzetthez. A beolvasott QR-kód szövege:\n\n%1$s A beolvasott QR-kód hivatkozás:\n\n%1$s Ujjlenyomat @@ -991,6 +995,7 @@ Nem sikerült dekódolni a mailto hivatkozást: %1$s + Elvetés Válasz Új üzenet @@ -1071,9 +1076,9 @@ Naplófájlok könyvtárának megnyitása Jelenlegi naplófájl megnyitása A tálca ikonja nem kapcsolható ki, mivel a Delta Chat a --minimized opcióval indult. - Nem találhatóak helyesírási javaslatok. + Nem találhatók helyesírási javaslatok. Ablak megjelenítése - A SOCKS5 támogatás jelenleg kísérleti jellegű. Használja saját felelősségére. Ha beír egy címet az E-mail-mezőbe, akkor lesz olyan DNS lekérés, ami nem fog átjutni a SOCKS5 csatornán. + A SOCKS5 támogatás jelenleg kísérleti jellegű. Használja saját felelősségére. Ha beír egy címet az e-mail-mezőbe, akkor lesz olyan DNS lekérés, ami nem fog átjutni a SOCKS5 csatornán. Billentyűkötések @@ -1127,7 +1132,7 @@ Válassza a „Hozzáadás a kezdőképernyőhöz” lehetőséget, hogy az alkalmazást hozzáadja a kezdőképernyőhöz. A Delta Chat az eszköze kameráját használja fényképek és videók készítésére és küldésére, valamint QR-kódok beolvasására. - A Delta Chat a névjegyek segítségével megjeleníti azon E-mail-címek listáját, amelyekkel cseveghet. A Delta Chatnek nincs központi kiszolgálója, a névjegyeit nem küldjük el sehova. + A Delta Chat a névjegyek segítségével megjeleníti azon e-mail-címek listáját, amelyekkel cseveghet. A Delta Chatnek nincs központi kiszolgálója, a névjegyeit nem küldjük el sehova. A Delta Chatnek engedélyre van szüksége ahhoz, hogy megoszthassa az ön tartózkodási helyszínét arra az időtartamra, ameddig engedélyezte a helyszínmegosztást. A Delta Chatnek engedélyre van szüksége ahhoz, hogy megoszthassa az ön tartózkodási helyszínét arra az időtartamra, ameddig engedélyezte a helyszínmegosztást. A Delta Chat az eszköze mikrofonját használja a hangüzenetek és a hangos videók rögzítésére, valamint küldésére. @@ -1138,11 +1143,11 @@ Azonnali kézbesítés Háttérkapcsolat használata - Figyelmen kívül hagyott akkumulátor-optimalizációt igényel, akkor használja, ha a Push szolgáltatás nem érhető el + Mellőzött akkumulátor-optimalizációt igényel, akkor használja, ha a Push szolgáltatás nem érhető el Kényszerített háttérkapcsolat Egy állandó értesítést jelenít meg - Az e-mail kiszolgálóval való kapcsolat fenntartásához és az üzenetek háttérben történő fogadásához hagyja figyelmen kívül az akkumulátor optimalizálását a következő lépésben.\n\nA Delta Chat kevés erőforrást használ, és ügyel arra, hogy ne merítse az akkumulátort. + Az e-mail kiszolgálóval való kapcsolat fenntartásához és az üzenetek háttérben történő fogadásához mellőzze az akkumulátor optimalizálását a következő lépésben.\n\nA Delta Chat kevés erőforrást használ, és ügyel arra, hogy ne merítse az akkumulátort. Koppintson ide az üzenetek fogadásához, miközben a Delta Chat a háttérben fut. Már engedélyezve van a Delta Chat számára, hogy a háttérben üzeneteket fogadjon.\n\nHa az üzenetek még mindig nem érkeznek meg a háttérben, ellenőrizze a rendszerbeállításokat is. diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index d2084b6d23..eef85f413b 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -56,7 +56,7 @@ Segna Tutti come Letti Segna come Letto - Leggi + Segna Letto Caricamento in Corso… Nascondi @@ -623,13 +623,14 @@ Proxy Usa Proxy - + SOCKS5 Usa SOCKS5 SOCKS5 Host SOCKS5 Porta SOCKS5 Utente SOCKS5 Password + Usare il setup semplificato? L\'indirizzo email inserito supporta l\'autenticazione semplificata (OAuth2.0).\n\nContinuando, puoi autorizzare Delta Chat a operare come app di messaggistica via e-mail.\n\nNon esistono server di Delta Chat, i tuoi dati restano nel tuo dispositivo! Controlli Certificato @@ -1009,6 +1010,7 @@ Il link mailto non può essere decodificato: %1$s + Ignora Rispondi Nuovo messaggio diff --git a/src/main/res/values-km/strings.xml b/src/main/res/values-km/strings.xml index e4fcd14ae8..407c811bb9 100644 --- a/src/main/res/values-km/strings.xml +++ b/src/main/res/values-km/strings.xml @@ -437,13 +437,14 @@ ច្រករបស SMTP សន្តិសុខ SMTP ការចុះបញ្ជី - + SOCKS5 ប្រើ SOCKS5 ម្ចាស់ SOCKS5 ច្រក SOCKS5 អ្នកប្រើប្រាស់ SOCKS5 ពាក្យសម្ងាត់ SOCKS5 + បន្តជាមួយការដំឡើងសាមញ្ញ? អស័យដ្ឋានអុីម៉េលដែលបានបញ្ចូល គាំទ្រការដំឡើងសាមញ្ញ (OAuth 2.0)\n\nនៅជំហានបន្ទាប់ សូមអនុញ្ញាតឲ្យសាហារីសង្ឃ ដើរតួជាការសន្ទនារបស់អ្នកនៅលើកម្មវិធីអុីម៉េល។\n\nមិនមាន ម៉ាសុីនមេ សាហារីសង្ឃទេ។ ទិន្ន័យរបស់អ្នកស្ថិតនៅលើឧបករណ៍របស់អ្នក។ ការត្រួតពិនិត្យលិខិតបញ្ជាក់ diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml index cd5dcd4b29..e3758f4fa9 100644 --- a/src/main/res/values-ko/strings.xml +++ b/src/main/res/values-ko/strings.xml @@ -471,13 +471,14 @@ SMTP 포트 SMTP 보안 권한 부여 방법 - + SOCKS5 SOCKS5 사용 SOCKS5 호스트 SOCKS5 포트 SOCKS5 사용자 SOCKS5 비밀번호 + 간소화된 설치를 계속하시겠습니까? 입력한 이메일 주소는 단순화된 설정(OAuth 2.0)을 지원합니다.\n\n다음 단계에서는 Delta Chat 이 이메일을 통한 채팅 앱 역할을 하도록 허용하십시오.\n\nDelta 채팅 서버가 없으며 데이터가 장치에 남아 있습니다. 인증서 확인 @@ -791,6 +792,7 @@ 링크로 보내는 메일을 디코딩할 수 없습니다: %1$s + 무시하기 답장하기 새 메시지 diff --git a/src/main/res/values-lt/strings.xml b/src/main/res/values-lt/strings.xml index c6fc2896b6..745c0ab766 100644 --- a/src/main/res/values-lt/strings.xml +++ b/src/main/res/values-lt/strings.xml @@ -470,13 +470,14 @@ SMTP prievadas SMTP saugumas Įgaliojimų suteikimo metodas - + SOCKS5 Naudoti SOCKS5 SOCKS5 serveris SOCKS5 prievadas SOCKS5 naudotojas SOCKS5 slaptažodis + Tęsti, naudojant supaprastintą sąranką? Liudijimų patikrinimai Įveskite teisingą el. pašto adresą. @@ -755,6 +756,7 @@ nepavyko dekoduoti mailto nuorodos: %1$s + Atmesti Atsakyti Nauja žinutė diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 9ec57065b4..fd01ba559c 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -608,13 +608,14 @@ Proxy Proxy gebruiken - + SOCKS5 SOCKS5 gebruiken SOCKS5-host SOCKS5-poort SOCKS5-gebruiker SOCKS5-wachtwoord + Wil je doorgaan met vereenvoudigd instellen? Het ingevoerde e-mailadres ondersteunt vereenvoudigd instellen (OAuth2).\n\nTijdens de volgende stap moet je Delta Chat toestaan te fungeren als je e-mailapp.\n\nDelta Chat heeft geen eigen servers; jóuw gegevens blijven op jóuw apparaat! Certificaatcontrole @@ -994,6 +995,7 @@ De mailto-link kan niet worden ontcijferd: %1$s + Verwerpen Beantwoorden Nieuw bericht diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index a5ca6d0fe4..6c51293efd 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -638,13 +638,14 @@ Proxy Użyj proxy - + SOCKS5 Użyj SOCKS5 Host SOCKS5 Port SOCKS5 Użytkownik SOCKS5 Hasło SOCKS5 + Kontynuuj w uproszczonej konfiguracji? Wprowadzony adres e-mail obsługuje uproszczoną konfigurację (OAuth2.0).\n\nW następnym kroku pozwól, aby Delta Chat działał jako czat z aplikacją e-mail.\n\nNie ma serwerów Delta Chat, Twoje dane pozostają na Twoim urządzeniu! Sprawdzanie certyfikatów @@ -1024,6 +1025,7 @@ link mailto nie mógł zostać odszyfrowany: %1$s + Odrzuć Odpowiedz Nowa wiadomość diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index f60f37598c..e9a3eeb8ef 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -551,13 +551,14 @@ Porta SMTP Segurança SMTP Método de autorização - + SOCKS5 Usar SOCKS5 Servidor SOCKS5 Porta SOCKS5 Usuário SOCKS5 Senha SOCKS5 + Prosseguir pela configuração simplificada? Seu servidor de e-mail aceita o método de configuração simplificada (OAuth 2.0).\n\n No próximo passo, por favor, permita que o Delta Chat seja seu aplicativo de e-mail.\n\nNão há servidor do Delta Chat. Seus dados ficam no seu aparelho. Verificações de certificado @@ -890,6 +891,7 @@ link mailto não pôde ser decodificado: %1$s + Descartar Responder Nova mensagem diff --git a/src/main/res/values-ro/strings.xml b/src/main/res/values-ro/strings.xml index 382c9b6f1e..b0086eb567 100644 --- a/src/main/res/values-ro/strings.xml +++ b/src/main/res/values-ro/strings.xml @@ -543,13 +543,14 @@ Portul SMTP Securitate SMTP Metoda de autorizare - + SOCKS5 Utilizați SOCKS5 Gazdă SOCKS5 Portul SOCKS5 Utilizator SOCKS5 Parolă SOCKS5 + Continuați cu configurația simplificată? Adresa de e-mail introdusă suportă o configurare simplificată (OAuth 2.0).\n\nÎn pasul următor, vă rugăm să permiteți ca Delta Chat să acționeze ca aplicație de chat prin e-mail.\n\nNu există servere Delta Chat, datele voastre rămân pe dispozitivul dumneavoastră. Verificări de certificate diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index d45afc3250..f3de6195ba 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -14,7 +14,7 @@ Выкл. По умолчанию По умолчанию (%1$s) - По умолчанию (как указано выше) + По умолчанию (так же, как выше) Персональная настройка Не задано Автоматически @@ -295,7 +295,7 @@ Сохранить журнал Больше настроек Запоминать правописание - Chat Audit Log + Журнал аудита чата Перейти к сообщению Копировать JSON Заменить черновик @@ -477,7 +477,7 @@ Здесь будут появляться системные сообщения этого чата - Chat Audit Log для %1$s + Журнал аудита чата для %1$s Здесь отображаются только системные и информационные сообщения. Полезно для поиска последних действий в чате без прокрутки множества обычных сообщений. @@ -638,13 +638,14 @@ Прокси Использовать прокси - + SOCKS5 Использовать SOCKS5 Сервер SOCKS5 Порт SOCKS5 Пользователь SOCKS5 Пароль SOCKS5 + Продолжить упрощенную настройку? Введённый адрес эл. почты поддерживает упрощённую настройку (OAuth 2.0).\n\nНа следующем шаге пожалуйста, разрешите Delta Chat выступать в качестве Вашего приложения для Чата по Эл. почте.\n\nDelta Chat не собирает данные пользователей, все данные остаются на вашем устройстве. Проверки сертификатов @@ -1024,6 +1025,7 @@ ссылка mailto не может быть декодирована: %1$s + Отклонить Ответить Новое сообщение diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index 757e5eaf5d..eeedb53ede 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -518,13 +518,14 @@ Port SMTP Zabezpečenie SMTP Metóda autorizácie - + SOCKS5 Použiť SOCKS5 SOCKS5 Host SOCKS5 Port SOCKS5 Používateľ SOCKS5 Heslo + Pokračovať v zjednodušenom nastavovaní? Zadaná e-mailová adresa podporuje zjednodušené nastavenie (OAuth 2.0).\n\nV ďalšom kroku povoľte aplikácii Delta Chat, aby fungovala ako vaša aplikácia Chat cez e-mail.\n\nNie sú k dispozícii servery Delta Chat, vaše dáta zostanú vo vašom zariadení . Osvedčovacie kontroly @@ -853,6 +854,7 @@ prepojenie mailto sa nepodarilo dekódovať: %1$s + Odmietnuť Odpovedať Nová správa diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index dbc0bb4f9c..17d06e3c29 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -602,13 +602,14 @@ Ndërmjetës Përdor Ndërmjetës - + SOCKS5 Përdor SOCKS5 Strehë SOCKS5 Portë SOCKS5 Përdorues SOCKS5 Fjalëkalim SOCKS5 + Të vazhdohet me rregullimin e thjeshtuar? Adresa email e dhënë mbulon një ujdisje të thjeshtuar (OAuth 2.0).\n\nNë hapin pasues, ju lutemi, lejojeni Delta Chat-in të veprojë si aplikacioni juaj për Fjalosje Përmes Email-i.\n\nS\’ka shërbyes Delta Chat, të dhënat tuaja rrinë në pajisjen tuaj! Kontrolle Dëshmish @@ -986,6 +987,7 @@ s’u shkodua dot lidhje mailto: %1$s + Hidhe tej Përgjigjuni Mesazh i ri diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index a6d72dbe2a..637fed8325 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -518,13 +518,14 @@ СМТП порт СМТП безбедност Начин овлашћења - + SOCKS5 Користи SOCKS5 SOCKS5 сервер SOCKS5 порт SOCKS5 корисник SOCKS5 лозинка + Наставите са поједностављеним поставкама? Унета е-адреса подржава поједностављено подешавање (OAuth 2.0).\n\nУ следећем кораку, дозволите Delta Chat-у да да дејствује као ваша апликација за ћаскање преко е-поште.\n\nDelta Chat нема сервере и ваши подаци остају на вашем уређају. Провери сертификате @@ -857,6 +858,7 @@ mailto веза не може бити декодирана: %1$s + Одбаци Одговори Нова порука diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index e4f99bc0de..69b954a254 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -601,13 +601,14 @@ SMTP port SMTP säkerhet Auktoriseringsmetod - + SOCKS5 Använd SOCKS5 SOCKS5-värd SOCKS5-port SOCKS5-användare SOCKS5-lösenord + Fortsätta med förenklad installation? Den angivna e-postadressen stödjer förenklad inställning (OAuth 2.0).\n\nLåt Delta Chat agera som ditt chatt-över-epost-program, i nästa steg.\n\nDet finns ingen Delta Chat-server, din data stannar på din enhet. Certifikatkontroller @@ -987,6 +988,7 @@ mailto-länken kunde inte avkodas: %1$s + Avvisa Svara Nytt meddelande diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index e32cc4830c..82e7d8eef0 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -56,7 +56,7 @@ Tümünü Okundu Olarak İmle Okundu Olarak İmle - Okundu + Okundu İmi Yükleniyor… Gizle @@ -608,13 +608,14 @@ Proxy Proxy Kullan - + SOCKS5 SOCKS5\'i Kullan SOCKS5 Ana Bilgisayarı SOCKS5 Bağlantı Noktası SOCKS5 Kullanıcısı SOCKS5 Parolası + Basitleştirilen ayarlamayla sürdürülsün mü? Girilen e-posta adresi basitleştirilen bir ayarlamayı (OAuth 2.0) destekliyor.\n\nSonraki adımda, lütfen Delta Chat\'in E-posta Üzerinden Sohbet uygulamanız olarak davranmasına izin verin.\n\nDelta Chat kullanıcı verisi toplamaz; her şey aygıtınızda kalır. Sertifika Denetimleri @@ -994,6 +995,7 @@ mailto bağlantısının kodu çözülemedi: %1$s + Kapat Yanıtla Yeni ileti diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml index 251c183fc9..5822f6c329 100644 --- a/src/main/res/values-uk/strings.xml +++ b/src/main/res/values-uk/strings.xml @@ -56,7 +56,7 @@ Позначити все як прочитане Позначити як прочитане - Прочитане + Позначити прочитаним Завантаження... Приховати @@ -635,13 +635,17 @@ SMTP-порт Налаштування безпеки SMTP Метод авторизації - + + Проксі + Використовувати проксі + SOCKS5 Використовувати SOCKS5 Хост SOCKS5 Порт SOCKS5 Ім\'я користувача SOCKS5 Пароль SOCKS5 + Продовжити спрощене налаштування? Введена адреса електронної пошти підтримує спрощене налаштування (OAuth 2.0).\n\nНа наступному кроці дозвольте, будь ласка, Delta Chat виступати в якості Вашого додатку для чату за допомогою електронної пошти.\n\nУ Delta Chat немає серверів, Ваші дані залишаються на Вашому пристрої! Перевірки сертифікатів @@ -1021,6 +1025,7 @@ неможливо декодувати посилання mailto: %1$s + Відхилити Відповісти Нове повідомлення diff --git a/src/main/res/values-vi/strings.xml b/src/main/res/values-vi/strings.xml index 8e04af8f12..00c59e81c8 100644 --- a/src/main/res/values-vi/strings.xml +++ b/src/main/res/values-vi/strings.xml @@ -546,13 +546,14 @@ Cổng SMTP Bảo mật SMTP Phương thức ủy quyền - + SOCKS5 Sử dụng SOCKS5 Máy chủ SOCKS5 Cổng SOCKS5 Người dùng SOCKS5 Mật khẩu SOCKS5 + Tiếp tục với thiết lập đơn giản hóa? Địa chỉ e-mail đã nhập hỗ trợ thiết lập đơn giản hóa (OAuth 2.0).\n\nTrong bước tiếp theo, vui lòng cho phép Delta Chat hoạt động như ứng dụng Trò chuyện qua E-mail của bạn.\n\nKhông có máy chủ Delta Chat, dữ liệu của bạn vẫn ở trên thiết bị của bạn. Kiểm tra chứng chỉ @@ -908,6 +909,7 @@ không thể giải mã được liên kết mailto: %1$s + Loại bỏ Trả lời Tin nhắn mới diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 09cd3adb0e..a4386fac47 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -593,13 +593,14 @@ 代理 使用代理 - + SOCKS5 使用 SOCKS5 代理 SOCKS5 主机 SOCKS5 端口 SOCKS5 用户名 SOCKS5 密码 + 使用简易设置继续? 输入的电子邮件地址支持简化设置(OAuth 2.0)。\n\n在下一步中,请允许 Delta Chat 充当您的“通过电子邮件聊天”应用程序。\n\n不存在 Delta Chat 服务器,您的数据保留于您的设备! 证书检查 @@ -979,6 +980,7 @@ 无法解码 mailto 链接:%1$s + 不予理会 回复 新消息 diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml index 340ba34e69..be9b7d608b 100644 --- a/src/main/res/values-zh-rTW/strings.xml +++ b/src/main/res/values-zh-rTW/strings.xml @@ -499,13 +499,14 @@ SMTP 埠 SMTP 安全 授權方式 - + SOCKS5 使用 SOCKS5 SOCKS5 主機 SOCKS5 通訊埠 SOCKS5 使用者 SOCKS5 密碼 + 繼續使用簡易設定? 輸入的電子郵件地址支援簡化設定(OAuth 2.0)。\n\n在下一步中,請允許 Delta Chat 充當你的電子郵件對話應用程式。\n\nDelta Chat 不會收集使用者資料,所有內容都保留在你的裝置上。 憑證檢查 @@ -715,6 +716,7 @@ 掃描 QRCode 以新增 %1$s 請輸入名稱。 + 忽視 回覆 新訊息 From a76762f32194f19b402a598714a40839a3991866 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 26 Sep 2024 20:31:57 +0100 Subject: [PATCH 16/22] update deltachat-core-rust to 'chore(release): prepare for 1.145.0' of 'v1.145.0' --- jni/deltachat-core-rust | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust index 486ea3a358..02db6bcb8e 160000 --- a/jni/deltachat-core-rust +++ b/jni/deltachat-core-rust @@ -1 +1 @@ -Subproject commit 486ea3a358b4cd0518de7e11f2997ea463a50604 +Subproject commit 02db6bcb8e7326e7da1789151841f1a4afc6cd9f From 1c0dc91f034458a05c4f882f36bf6eb9c8b76e0f Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 26 Sep 2024 23:07:35 +0100 Subject: [PATCH 17/22] update translations --- src/main/res/values-it/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index eef85f413b..4505b47629 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -623,6 +623,14 @@ Proxy Usa Proxy + Aggiungi Proxy + Tipi di proxy supportati: HTTP(S), SOCKS5 e Shadowsocks. + Inserisci qui l\'URL del proxy + URL proxy non valido o non supportato + Proxy Salvati + Elimina Proxy + Sei sicuro di voler eliminare \"%1$s\"? + SOCKS5 Usa SOCKS5 From 899b0753493f22f80dd7f0c9b1bf9bcf3b82b79e Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 26 Sep 2024 23:45:30 +0100 Subject: [PATCH 18/22] update changelog for 1.46.15 --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02fa2b571b..6d9752d867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,35 @@ # Delta Chat 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 From 5fd06f2b9d6eadda51ff71ee962408c13f29c4f5 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Thu, 26 Sep 2024 23:48:48 +0100 Subject: [PATCH 19/22] update changelog for 1.46.15 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index acde294573..e63f4ffa11 100644 --- a/build.gradle +++ b/build.gradle @@ -27,8 +27,8 @@ android { useLibrary 'org.apache.http.legacy' defaultConfig { - versionCode 696 - versionName "1.46.14" + versionCode 697 + versionName "1.46.15" applicationId "com.b44t.messenger" multiDexEnabled true From b72a1ec7d8ef8446f9affb1a9fce5d7b6ee6a0f8 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 2 Oct 2024 19:03:19 +0100 Subject: [PATCH 20/22] update local help --- src/main/assets/help/cs/help.html | 36 +++++++++++----- src/main/assets/help/de/help.html | 37 +++++++++++++---- src/main/assets/help/en/help.html | 36 +++++++++++----- src/main/assets/help/es/help.html | 40 +++++++++++++----- src/main/assets/help/fr/help.html | 38 +++++++++++++---- src/main/assets/help/id/help.html | 36 +++++++++++----- src/main/assets/help/it/help.html | 42 +++++++++++++------ src/main/assets/help/nl/help.html | 42 +++++++++++++------ src/main/assets/help/pl/help.html | 38 +++++++++++++---- src/main/assets/help/pt/help.html | 36 +++++++++++----- src/main/assets/help/ru/help.html | 62 +++++++++++++++++----------- src/main/assets/help/sk/help.html | 36 +++++++++++----- src/main/assets/help/sq/help.html | 42 +++++++++++++------ src/main/assets/help/uk/help.html | 37 +++++++++++++---- src/main/assets/help/zh_CN/help.html | 36 +++++++++++----- 15 files changed, 427 insertions(+), 167 deletions(-) diff --git a/src/main/assets/help/cs/help.html b/src/main/assets/help/cs/help.html index 47ab505919..8d327227c0 100644 --- a/src/main/assets/help/cs/help.html +++ b/src/main/assets/help/cs/help.html @@ -55,7 +55,7 @@
  • How can I ensure message end-to-end encryption and deletion?
  • Does Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chatu zavést můj stávající PGP klíč.
  • Was Delta Chat 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 Delta Chat 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 Delta Chatu?
  • @@ -1146,10 +1146,10 @@

    In any case, Delta Chat’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íč?

    @@ -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 Delta Chat, +

    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 Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat.

    +it is recommended to leave any group chat before uninstalling Delta Chat. +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 86725db4a5..efb3ca958e 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 Delta Chat “Perfect Forward Secrecy”?
  • Ist die Ende-zu-Ende-Verschlüsselung von Delta Chat 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 Delta Chat importieren.
  • Wurde Delta Chat 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 Delta Chat 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 Delta Chat 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?

    @@ -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 Delta Chat 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 Delta Chat deinstallieren möchten, ist es ratsam, aktive Gruppen zu verlassen, bevor Sie Delta Chat 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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 c432e2c78b..acbfc977c2 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chat.
  • Was Delta Chat 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 Delta Chat 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 Delta Chat developments funded?
  • @@ -1150,10 +1150,10 @@

    In any case, Delta Chat’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?

    @@ -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 Delta Chat, +

    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 Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat.

    +it is recommended to leave any group chat before uninstalling Delta Chat. +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 5271d06840..8cbc339f6f 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 Delta Chat Perfect Forward Secrecy?
  • ¿Es el cifrado de extremo a extremo de Delta Chat 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 Delta Chat.
  • ¿Se auditó Delta Chat 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?
  • ¿Delta Chat 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 Delta Chat?
  • @@ -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?

    @@ -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 Delta Chat, -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 Delta Chat, se recomienda salir de cualquier chat grupal antes de desinstalar Delta Chat.

    +

    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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 9b292848b0..064bd86029 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chat.
  • Est-ce qu’un audit indépendant des failles de sécurité a été réalisé sur Delta Chat ?
  • @@ -97,7 +97,7 @@
  • Pourquoi puis-je choisir de regarder le dossier “Envoyés”?
  • Pourquoi puis-je choisir de ne pas regarder le dossier Delta Chat?
  • Delta Chat 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 Delta Chat ?
  • @@ -1124,10 +1124,10 @@

    In any case, Delta Chat’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 ?

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

    Autocrypt-enabled e-mail app. -

    +

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

    -

    Étant donné que vous utilisez Delta Chat à 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 Delta Chat, 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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 d9b7d80359..7942b84e39 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chat.
  • Was Delta Chat 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 Delta Chat 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 Delta Chat developments funded?
  • @@ -1150,10 +1150,10 @@

    In any case, Delta Chat’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?

    @@ -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 Delta Chat, +

    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 Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat.

    +it is recommended to leave any group chat before uninstalling Delta Chat. +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 5c6ff7fc5a..190e20fa05 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?
  • Delta Chat supporta Perfect Forward Secrecy?
  • La crittografia end-to-end di Delta Chat è 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 Delta Chat.
  • Delta Chat è 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?
  • Delta Chat è 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 Delta Chat?
  • @@ -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?

    @@ -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 Delta Chat, -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 Delta Chat, -si consiglia di uscire da qualsiasi chat di gruppo prima di disinstallare Delta Chat.

    +

    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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 d902be3f9a..6df1dd8f0d 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chat 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 Delta Chat 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 Delta Chat gefinancierd?
  • @@ -1143,10 +1143,10 @@

    In any case, Delta Chat’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?

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

    Autocrypt-enabled e-mail app. -

    +

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

    -

    Delta Chat 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 Delta Chat -niet wilt verwijderen, verlaat dan groeps- -gesprekken voordat je Delta Chat 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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 35a8da2860..8647aeedce 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 Delta Chat obsługuje funkcję Perfect Forward Secrecy?
  • Czy szyfrowanie end-to-end Delta Chat 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 Delta Chat.
  • Czy Delta Chat 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 Delta Chat 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 Delta Chat?
  • @@ -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?

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

  • Delta Chat 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 Delta Chat, 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ć Delta Chat, zaleca się opuszczenie każdego czatu grupowego przed odinstalowaniem Delta Chat.

    +

    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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 6ec97c25c8..9cac0a734a 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chat.
  • Was Delta Chat 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 Delta Chat é 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 Delta Chat financiados?
  • @@ -1144,10 +1144,10 @@

    In any case, Delta Chat’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?

    @@ -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 Delta Chat, +

    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 Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat.

    +it is recommended to leave any group chat before uninstalling Delta Chat. +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 7fd6958447..7d2cb19544 100644 --- a/src/main/assets/help/ru/help.html +++ b/src/main/assets/help/ru/help.html @@ -55,7 +55,7 @@
  • Как я могу обеспечить сквозное шифрование и удаление сообщений?
  • Поддерживает ли Delta Chat Совершенную Прямую Секретность?
  • Является ли сквозное шифрование Delta Chat таким же безопасным как Signal?
  • -
  • Можно ли повторно использовать существующий секретный ключ?
  • +
  • Можно ли повторно использовать существующий секретный ключ?
  • Я не могу импортировать мой существующий ключ PGP в Delta Chat.
  • Проходил ли Delta Chat независимую проверку на наличие уязвимостей безопасности?
  • @@ -97,7 +97,7 @@
  • Для чего нужен параметр “следить за папкой Отправлено”?
  • Почему я могу отключить “следить за папкой Delta Chat”?
  • Совместим ли Delta Chat с Protonmail / Tutanota / Criptext?
  • -
  • Как я могу удалить аккаунт?
  • +
  • Как я могу удалить аккаунт?
  • Меня интересуют технические детали. Можете рассказать больше?
  • Как финансируются разработки Delta Chat?
  • @@ -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 Delta Chat to fetch data in the background. -Push notifications are automatically activated for iOS users because -Delta Chat’s privacy-preserving Push Notification system -does not expose data to Apple that it doesn’t already have.

    +

    Да, Delta Chat автоматически использует Push-уведомления для профилей chatmail. +И нет, на устройствах Apple нет альтернативы для обеспечения мгновенной доставки сообщений, +поскольку устройства Apple не позволяют Delta Chat запрашивать данные в фоновом режиме. +Push-уведомления автоматически активируются для пользователей iOS, потому что +Система Push-уведомлений Delta Chat, обеспечивающая конфиденциальность +не передает данные 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 Delta Chat -research paper published afterwards.

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

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

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

    -

    +

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

    -

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

    +

    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.

    -

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

    +

    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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 c134baa9d8..7a8739fc47 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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 Delta Chat.
  • Was Delta Chat 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 Delta Chat 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 Delta Chat?
  • @@ -1150,10 +1150,10 @@

    In any case, Delta Chat’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ľúč?

    @@ -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 Delta Chat, +

    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 Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat.

    +it is recommended to leave any group chat before uninstalling Delta Chat. +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 3d2ed20bb5..a722c06ec1 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat 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ë Delta Chat.
  • A është bërë auditim i pavarur i Delta Chat-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 Delta Chat-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 Delta Chat-it?
  • @@ -1151,10 +1151,10 @@

    In any case, Delta Chat’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?

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

    Autocrypt-enabled e-mail app. -

    +

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

    -

    Ngaqë për Delta Chat-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 Delta Chat-in, -rekomandohet të braktisni çfarëdo grupi fjalosjeje, para çinstalimit të Delta Chat-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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 cf967bc36a..de1f0f10aa 100644 --- a/src/main/assets/help/uk/help.html +++ b/src/main/assets/help/uk/help.html @@ -55,7 +55,7 @@
  • Як забезпечити наскрізне шифрування та видалення повідомлень?
  • Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)?
  • Чи є наскрізне шифрування Delta Chat таким же безпечним, як Signal?
  • -
  • Чи можна повторно використовувати існуючий закритий ключ?
  • +
  • Чи можна повторно використовувати існуючий закритий ключ?
  • Я не можу імпортувати свій існуючий PGP ключ у Delta Chat.
  • Чи проходив Delta Chat незалежний аудит на наявність вразливостей у безпеці?
  • @@ -97,7 +97,7 @@
  • Чому я можу обрати стеження за папкою “Надіслані”?
  • Чому я можу відмовитись від стеження за папкою DeltaChat?
  • Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext?
  • -
  • Як мені видалити свій обліковий запис?
  • +
  • Як мені видалити свій обліковий запис?
  • Мене цікавлять технічні деталі. Можете розповісти більше?
  • Як фінансується розробка Delta Chat?
  • @@ -831,10 +831,10 @@

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

    -

    +

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

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

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

    +

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

    -

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

    +

    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.

    -

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

    +

    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 Delta Chat, +it is recommended to leave any group chat before uninstalling Delta Chat. +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 3c0ac33625..5d094bbc08 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 Delta Chat support Perfect Forward Secrecy?
  • Is end-to-end encryption of Delta Chat as safe as Signal?
  • -
  • 我可以重复使用现有的私钥吗?
  • +
  • 我可以重复使用现有的私钥吗?
  • 我无法将现有的 PGP 密钥导入 Delta Chat。
  • Was Delta Chat independently audited for security vulnerabilities?
  • @@ -97,7 +97,7 @@
  • 为什么我可以选择监视“已发送”文件夹?
  • 为什么我可以选择不监视 DeltaChat 文件夹?
  • Delta Chat 与 Protonmail / Tutanota / Criptext 兼容吗?
  • -
  • 如何删除我的账户?
  • +
  • 如何删除我的账户?
  • 我对技术细节很感兴趣。能告诉我更多吗?
  • Delta Chat 的开发是如何被资助的?
  • @@ -1117,10 +1117,10 @@

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

    -

    +

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

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

    Autocrypt-enabled e-mail app. -

    +

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

    -

    As you use an e-mail account for Delta Chat, +

    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 Delta Chat, -it is recommended to leave any group chat before uninstalling Delta Chat.

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

    From 6a7c498481563013fe8be1be88c3b6316f89b774 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 2 Oct 2024 19:04:59 +0100 Subject: [PATCH 21/22] update translations --- src/main/res/values-fr/strings.xml | 48 +++++++++++++++++++++++- src/main/res/values-nl/strings.xml | 8 ++++ src/main/res/values-pl/strings.xml | 8 ++++ src/main/res/values-ru/strings.xml | 52 +++++++++++++++----------- src/main/res/values-sq/strings.xml | 8 ++++ src/main/res/values-tr/strings.xml | 8 ++++ src/main/res/values-uk/strings.xml | 8 ++++ src/main/res/values-zh-rCN/strings.xml | 8 ++++ 8 files changed, 125 insertions(+), 23 deletions(-) diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 5e2d8e3c46..910004e743 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -4,7 +4,9 @@ Delta Chat OK Annuler - Effacer la recherche + + ou + Effacer la recherche Oui Non Sélectionner @@ -52,6 +54,7 @@ Montrer le message complet... Marquer tout comme lu + Marquer comme lu Lu @@ -203,6 +206,8 @@ Nouveau contact + Ajouter le contact à la main + Les contacts ajoutés à la main peuvent être contactés par e-mail classique. Le chiffrement de bout en bout n\'est pas garanti. Nouvelle discussion Nouveau groupe Cloner la discussion @@ -437,6 +442,9 @@ Envoyer \"%1$s\" à Envoyer un message à + Canaux Webxdc temps réel + Enclenchez l\'API temps réel Webxdc pour créer des connexions entre les appareils. + Afficher les positions pour une période Afficher les traces @@ -554,6 +562,18 @@ %1$s sur %2$s utilisé + + + Créer un nouveau compte + + Je possède déjà un compte + + Votre compte + + Accepter et créer le compte + + Utiliser un autre serveur + Lister les serveurs de discussions Scanner le code d\'invitation Connexion @@ -574,6 +594,15 @@ Port SMTP Sécurité SMTP Méthode d\'autorisation + + Proxy + Utiliser le proxy + Ajouter un proxy + Types de proxy supportés: HTTP(S), SOCKS5 et Shadowsocks. + Entrez l\'URL du proxy ici + URL invalide ou non supportée + Sauver les proxy + Effacer le proxy SOCKS5 Utiliser SOCKS5 @@ -663,6 +692,8 @@ Demander que le clavier désactive l\'apprentissage personnalisé Accusés de lecture Si les accusés de lecture sont désactivés, vous ne pourrez pas voir les accusés de lecture des autres. + Serveur + Chiffrement Gérer les clés Utiliser les émojis système Désactiver la prise en charge des émojis intégrés de Delta Chat @@ -737,6 +768,9 @@ Édition du profil Désactiver IMAP IDLE N\'utilisez pas d\'extension IMAP IDLE, même si elle est prise en charge par votre serveur, car elle provoque des retards dans la récupération des messages. Activez cette option uniquement pour effectuer des tests. + Envoyer les statistiques aux développeurs Delta Chat + + Résultats de la recherche Pas d\'emoji trouvé @@ -796,6 +830,7 @@ Accusé de lecture Ceci est un accusé de lecture pour le message \"%1$s\".\n\nCela signifie que le message a été affiché sur l\'appareil du destinataire, pas forcément que le contenu ait été lu. + Ce message ne peut pas être déchiffré.\n\n• Essayez de demander à l\'expéditeur de vous l\'envoyer à nouveaux.\n\n• Si vous venez de réinstaller Delta Chat il serait bien de le reconfigurer en sélectionnant \"Ajouter un deuxième appareil\" ou d\'importer une sauvegarde. Expéditeur inconnu de cette discussion. Voir « Info » pour plus de détails. Message de %1$s Échec de l\'envoi du message à %1$s. @@ -865,6 +900,7 @@ Il n\'est pas garanti que tous les messages de cette discussion sont chiffrés de bout en bout.\n\nLe chiffrement de bout en bout assure la confidentialité des messages échangés par les membres d\'une discussion. Même votre fournisseur de courriel ne peut pas les lire. %1$s a envoyé un message depuis un nouvel appareil. Appuyez pour en savoir plus. Le chiffrement de bout en bout ne peut plus être garanti, probablement parce que %1$s a réinstallé Delta Chat ou envoyé un message depuis un nouvel appareil.\n\nVous pouvez convenir d\'une rencontre physique afin de scanner à nouveau son code QR pour ré-instaurer la garantie du chiffrement de bout en bout. + Pour établir un chiffrement de bout en bout vous pouvez rencontrer vos contacts en personne et scanner leur code QR. En savoir plus Vous avez supprimé la discussion \"Messages sauvegardés\".\n\nℹ️ Pour utiliser la fonctionnalité \"Message enregistrés\" à nouveau, commencez une nouvelle discussion avec vous-même. @@ -882,6 +918,7 @@ Charger le code QR comme une image Numériser le QR code Placez votre caméra au dessus du QR code + Placez le code QR devant la caméra Le code QR n\'a pas pu être décodé Voulez-vous rejoindre le groupe \"%1$s\" ? L\'empreinte digitale numérisée ne correspond pas à la dernière empreinte digitale vue depuis %1$s @@ -910,6 +947,7 @@ Pas de connexion Internet, ne peut pas effectuer la configuration du QR code. Créer une nouvelle adresse de courriel sur « %1$s » et se connecter ici ? Créer une nouvelle adresse de courriel sur « %1$s » et s\'y connecter ?\n\nVotre compte existant ne sera pas supprimé. Utilisez l\'élément de menu « Changer de compte » pour passer d\'un compte à l\'autre. + Choisissez un nom que vos contacts reconnaîtrons. Vous pouvez également définir une image pour votre profile. Le code QR scanné ne peut pas être utilisé pour ouvrir un nouveau compte. Se connecter au compte « %1$s » ? @@ -919,6 +957,8 @@ %1$s vous a invité à rejoindre ce groupe.\n\nEn attente de la réponse de l’appareil de %2$s… %1$s a répondu, en attente d’être ajouté au groupe… + Chiffrement de bout en bout en cours d\'établissement, merci de patienter... + Le chiffrement de bout en bout n\'est pas encore garanti, mais vous pouvez déjà envoyer un message. %1$s connu. Impossible de garantir le chiffrement de bout en bout avec %1$s. @@ -946,6 +986,8 @@ Pas de nom ou de message Notifications désactivées Nouveaux messages + + Vous avez de nouveaux messages %1$d messages dans %2$d discussions @@ -1077,6 +1119,10 @@ Delta Chat veut enregistrer les images dans votre bibliothèque photo. + + Envoi Immédiat + Utiliser une connexion en arrière plan + Forcer une connexion en arrière plan Pour maintenir une connexion à votre serveur de courriel et recevoir les messages en arrière-plan, ignorez l\'optimisation de la batterie à l\'étape suivante.\n\nDelta Chat utilise peu de ressources et prend garde à ne pas vider votre batterie. Touchez ici pour recevoir des messages pendant que DeltaChat est en arrière-plan. diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index fd01ba559c..14a3d38723 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -608,6 +608,14 @@ Proxy Proxy gebruiken + Proxy toevoegen + Ondersteunde proxytypes: http(s), socks5 en shadowsocks. + Voer een proxy-url in + Ongeldige of niet-ondersteunde proxy-url + Bewaarde proxy\'s + Proxy verwijderen + Weet je zeker dat je ‘%1$s’ wilt verwijderen? + SOCKS5 SOCKS5 gebruiken diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 6c51293efd..68efcc2453 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -638,6 +638,14 @@ Proxy Użyj proxy + Dodaj proxy + Obsługiwane typy serwerów proxy: HTTP(S), SOCKS5 i Shadowsocks. + Wpisz tu URL proxy + Nieprawidłowy lub nieobsługiwany URL proxy + Zapisane proxy + Usuń proxy + Na pewno chcesz usunąć „%1$s”? + SOCKS5 Użyj SOCKS5 diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index f3de6195ba..e6f02ba223 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -32,12 +32,12 @@ Вложение Назад Закрыть - Закрыть Окно + Закрыть окно Переслать Создать Позже - Переотправить + Отправить повторно В архив @@ -53,7 +53,7 @@ Начать чат Показать сообщение полностью… - Отметить Все как Прочитанные + Отметить все как прочитанные Отметить как прочитанное Прочитано @@ -61,23 +61,23 @@ Загрузка… Скрыть Активировать - Загружать удалённые изображения + Загрузка изображений из внешних источников - Удалённые изображения могут использоваться для отслеживания вас.\n\nЭта настройка также позволяет загружать удалённые шрифты и другое содержимое. Даже если она отключена, вы все равно сможете видеть встроенные или кешированные изображения.\n\nЗагружать удалённые изображения? + Изображения размещенные на внешних источниках можно использовать для слежки за вами.\n\nЭта настройка также позволяет загружать шрифты и другое содержимое. Если она отключена, вы сможете видеть встроенные или кешированные изображения.\n\nРазрешить загрузку из внешних источников? Всегда - Всегда Загружать Изображения с Удалённого Сервера + Всегда загружать изображения из внешних источников Только сейчас - Показывать Предупреждение + Показать предупреждение Показать пароль Скрыть пароль Не сейчас Никогда Один момент… - Выполнено + Готово Отмена Не в сети - Дальше + Далее Ошибка Ошибка: %1$s Приложение, позволяющее обрабатывать этот тип данных, не найдено. @@ -88,10 +88,10 @@ Адрес эл.почты Неправильный адрес эл.почты. Пароль - Пароль + Текущий пароль Сейчас - Опасность + Внимание Сегодня Вчера На этой неделе @@ -99,10 +99,10 @@ Прошлая неделя Прошлый месяц - Последний раз был(а) в %1$s + Последнее посещение: %1$s - Был %1$s - Последний раз был(а): Неизвестно + Последнее посещение: %1$s + Последнее посещение: Неизвестно %d минуту @@ -164,8 +164,8 @@ Стикер Добавить в Коллекцию Стикеров - Для добавления стикеров, нажмите \"Открыть Папку со Стикерами\", создайте подпапку для набора ваших стикеров и перетащите туда изображения и файлы стикеров - Открыть Папку со Стикерами + Для добавления стикеров, нажмите \"Открыть папку стикеров\", создайте подпапку для набора ваших стикеров и перетащите туда изображения и файлы стикеров + Открыть папку стикеров Изображения Аудио Голосовое сообщение @@ -235,7 +235,7 @@ Все Местоположения Архивировать чат Разархивировать чат - Прикрепить вложение + Добавить вложение Покинуть группу Удалить чат @@ -260,8 +260,8 @@ Ответить на сообщение Отключить уведомления Включить уведомления - Экспортировать вложение - Экспортировать вложения + Экспорт вложения + Экспорт вложений Все медиафайлы Показать в чате @@ -638,6 +638,14 @@ Прокси Использовать прокси + Добавить прокси + Поддерживаемые типы прокси: HTTP(S), SOCKS5 и Shadowsocks. + Введите URL прокси + Некорректный или неподдерживаемый URL прокси + Сохраненные прокси + Удалить прокси + Вы уверены, что хотите удалить \"%1$s\"? + SOCKS5 Использовать SOCKS5 @@ -741,8 +749,8 @@ Звуки в чате Размер шрифта сообщения Открыть журнал - Журнал сохранён в папку «Загрузки» - Ошибка при сохранении журнала + Журнал сохранён в папку \"Загрузки\" + Не удалось сохранить журнал Журнал Другое Резервное копирование @@ -844,7 +852,7 @@ Если включить удаление без запроса, вы не сможете использовать этот профиль на нескольких устройствах. Я понимаю, удалить все эти сообщения - Сразу + Сразу после загрузки Через 30 секунд Через 1 минуту Через 5 минут diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml index 17d06e3c29..d0d2c3d243 100644 --- a/src/main/res/values-sq/strings.xml +++ b/src/main/res/values-sq/strings.xml @@ -602,6 +602,14 @@ Ndërmjetës Përdor Ndërmjetës + Shtoni Ndërmjetës + Lloje ndërmjetësish që mbulohen: HTTP(S), SOCKS5 dhe Shadowsocks. + Jepni këtu URL-në e ndërmjetësit + URL ndërmjetësi e pavlefshme, ose që s’mbulohet + Ndërmjetës të Ruajtur + Fshije Ndërmjetësin + Jeni i sigurt se doni të fshihet “%1$s”? + SOCKS5 Përdor SOCKS5 diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index 82e7d8eef0..6c085c8a78 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -608,6 +608,14 @@ Proxy Proxy Kullan + Proxy Ekle + Desteklenen proxy türleri: HTTP(S), SOCKS5 ve Shadowsocks. + Buraya proxy URL\'sini girin + Geçersiz ya da desteklenmeyen proxy URL\'si + Kaydedilen Proxy\'ler + Proxy\'yi Sil + \"%1$s\" proxy\'sini silmek istediğinizden emin misiniz? + SOCKS5 SOCKS5\'i Kullan diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml index 5822f6c329..c9cc3b4108 100644 --- a/src/main/res/values-uk/strings.xml +++ b/src/main/res/values-uk/strings.xml @@ -638,6 +638,14 @@ Проксі Використовувати проксі + Додати проксі-сервер + Підтримувані типи проксі: HTTP(S), SOCKS5 і Shadowsocks. + Введіть URL проксі-сервера тут + Невірний або непідтримуваний URL проксі-сервера + Збережені проксі-сервери + Видалити проксі-сервер + Ви дійсно хочете видалити \"%1$s\"? + SOCKS5 Використовувати SOCKS5 diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index a4386fac47..d2b79d9d29 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -593,6 +593,14 @@ 代理 使用代理 + 添加代理 + 支持的代理类型:HTTP(S)、SOCKS5 和 Shadowsocks. + 在此输入代理 URL + 无效或不受支持的代理 URL + 已保存的代理 + 删除代理 + 你确定要删除 \"%1$s\"吗? + SOCKS5 使用 SOCKS5 代理 From f13251bc077603ddddb02a0e3b244858ecb37d21 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Wed, 2 Oct 2024 19:23:53 +0100 Subject: [PATCH 22/22] add 'learn more' button for managing keys --- .../securesms/preferences/AdvancedPreferenceFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index f5f095e4ae..72af72efe8 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -460,6 +460,7 @@ private void manageKeys() { } ) .setNegativeButton(R.string.cancel, null) + .setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(getActivity(), "#importkey")) .show(); }) .execute();