Detailed changes
  
  
    
    @@ -9,8 +9,8 @@
 	<item name="cornerFamily">rounded</item>
 	<item name="cornerSizeTopLeft">@dimen/image_radius</item>
 	<item name="cornerSizeTopRight">@dimen/image_radius</item>
-	<item name="cornerSizeBottomLeft">@dimen/image_radius</item>
-	<item name="cornerSizeBottomRight">@dimen/image_radius</item>
+	<item name="cornerSizeBottomLeft">0dp</item>
+	<item name="cornerSizeBottomRight">0dp</item>
 </style>
 
 <style name="ShapeAppearanceOverlay.IncomingCall" parent="ShapeAppearance.MaterialComponents.SmallComponent">
  
  
  
    
    @@ -23,6 +23,8 @@ import androidx.core.app.NotificationManagerCompat;
 import com.google.common.base.Charsets;
 import com.google.common.base.Stopwatch;
 import com.google.common.io.CountingInputStream;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonToken;
 
@@ -64,6 +66,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.WeakHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.regex.Pattern;
 import java.util.zip.GZIPInputStream;
@@ -73,6 +77,9 @@ import javax.crypto.BadPaddingException;
 
 public class ImportBackupService extends Service {
 
+    private static final ExecutorService BACKUP_FILE_READER_EXECUTOR =
+            Executors.newSingleThreadExecutor();
+
     private static final int NOTIFICATION_ID = 21;
     private static final AtomicBoolean running = new AtomicBoolean(false);
     private final ImportBackupServiceBinder binder = new ImportBackupServiceBinder();
@@ -433,6 +440,10 @@ public class ImportBackupService extends Service {
         }
     }
 
+    public static ListenableFuture<BackupFile> read(final Context context, final Uri uri) {
+        return Futures.submit(() -> BackupFile.read(context, uri), BACKUP_FILE_READER_EXECUTOR);
+    }
+
     @Override
     public IBinder onBind(Intent intent) {
         return this.binder;
@@ -475,7 +486,7 @@ public class ImportBackupService extends Service {
                 throw new FileNotFoundException();
             }
             final DataInputStream dataInputStream = new DataInputStream(inputStream);
-            BackupFileHeader backupFileHeader = BackupFileHeader.read(dataInputStream);
+            final BackupFileHeader backupFileHeader = BackupFileHeader.read(dataInputStream);
             inputStream.close();
             return new BackupFile(uri, backupFileHeader);
         }
  
  
  
    
    @@ -19,6 +19,7 @@ import android.view.View;
 
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.core.content.ContextCompat;
 import androidx.databinding.DataBindingUtil;
@@ -27,6 +28,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.android.material.snackbar.Snackbar;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
 
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
@@ -34,6 +37,7 @@ import eu.siacs.conversations.databinding.ActivityImportBackupBinding;
 import eu.siacs.conversations.databinding.DialogEnterPasswordBinding;
 import eu.siacs.conversations.services.ImportBackupService;
 import eu.siacs.conversations.ui.adapter.BackupFileAdapter;
+import eu.siacs.conversations.ui.util.MainThreadExecutor;
 import eu.siacs.conversations.utils.BackupFileHeader;
 
 import java.io.IOException;
@@ -182,21 +186,36 @@ public class ImportBackupActivity extends ActionBarActivity
     }
 
     private void openBackupFileFromUri(final Uri uri, final boolean finishOnCancel) {
-        try {
-            final ImportBackupService.BackupFile backupFile =
-                    ImportBackupService.BackupFile.read(this, uri);
-            showEnterPasswordDialog(backupFile, finishOnCancel);
-        } catch (final BackupFileHeader.OutdatedBackupFileVersion e) {
+        final var backupFileFuture = ImportBackupService.read(this, uri);
+        Futures.addCallback(
+                backupFileFuture,
+                new FutureCallback<>() {
+                    @Override
+                    public void onSuccess(final ImportBackupService.BackupFile backupFile) {
+                        showEnterPasswordDialog(backupFile, finishOnCancel);
+                    }
+
+                    @Override
+                    public void onFailure(@NonNull final Throwable throwable) {
+                        Log.d(Config.LOGTAG, "could not open backup file " + uri, throwable);
+                        showBackupThrowable(throwable);
+                    }
+                },
+                MainThreadExecutor.getInstance());
+    }
+
+    private void showBackupThrowable(final Throwable throwable) {
+        if (throwable instanceof BackupFileHeader.OutdatedBackupFileVersion) {
             Snackbar.make(
                             binding.coordinator,
                             R.string.outdated_backup_file_format,
                             Snackbar.LENGTH_LONG)
                     .show();
-        } catch (final IOException | IllegalArgumentException e) {
-            Log.d(Config.LOGTAG, "unable to open backup file " + uri, e);
+        } else if (throwable instanceof IOException
+                || throwable instanceof IllegalArgumentException) {
             Snackbar.make(binding.coordinator, R.string.not_a_backup_file, Snackbar.LENGTH_LONG)
                     .show();
-        } catch (final SecurityException e) {
+        } else if (throwable instanceof SecurityException e) {
             Snackbar.make(
                             binding.coordinator,
                             R.string.sharing_application_not_grant_permission,
@@ -243,16 +262,7 @@ public class ImportBackupActivity extends ActionBarActivity
                                                     getString(R.string.please_enter_password));
                                             return;
                                         }
-                                        final Uri uri = backupFile.getUri();
-                                        Intent intent = new Intent(this, ImportBackupService.class);
-                                        intent.setAction(Intent.ACTION_SEND);
-                                        intent.putExtra("password", password);
-                                        if ("file".equals(uri.getScheme())) {
-                                            intent.putExtra("file", uri.getPath());
-                                        } else {
-                                            intent.setData(uri);
-                                            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-                                        }
+                                        final Intent intent = getIntent(backupFile, password);
                                         setLoadingState(true);
                                         ContextCompat.startForegroundService(this, intent);
                                         d.dismiss();
@@ -261,6 +271,21 @@ public class ImportBackupActivity extends ActionBarActivity
         dialog.show();
     }
 
+    @NonNull
+    private Intent getIntent(ImportBackupService.BackupFile backupFile, String password) {
+        final Uri uri = backupFile.getUri();
+        Intent intent = new Intent(this, ImportBackupService.class);
+        intent.setAction(Intent.ACTION_SEND);
+        intent.putExtra("password", password);
+        if ("file".equals(uri.getScheme())) {
+            intent.putExtra("file", uri.getPath());
+        } else {
+            intent.setData(uri);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        }
+        return intent;
+    }
+
     private void setLoadingState(final boolean loadingState) {
         binding.coordinator.setVisibility(loadingState ? View.GONE : View.VISIBLE);
         binding.inProgress.setVisibility(loadingState ? View.VISIBLE : View.GONE);
  
  
  
    
    @@ -22,6 +22,7 @@ import com.cheogram.android.SpannedToXHTML;
 
 import com.google.common.io.ByteSource;
 import com.google.common.base.Strings;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.primitives.Longs;
 
@@ -831,7 +832,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
         this.transferable = transferable;
     }
 
-    public boolean addReadByMarker(ReadByMarker readByMarker) {
+    public boolean addReadByMarker(final ReadByMarker readByMarker) {
         if (readByMarker.getRealJid() != null) {
             if (readByMarker.getRealJid().asBareJid().equals(trueCounterpart)) {
                 return false;
@@ -861,6 +862,13 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
         return ImmutableSet.copyOf(this.readByMarkers);
     }
 
+    public Set<Jid> getReadyByTrue() {
+        return ImmutableSet.copyOf(
+                Collections2.transform(
+                        Collections2.filter(this.readByMarkers, m -> m.getRealJid() != null),
+                        ReadByMarker::getRealJid));
+    }
+
     boolean similar(Message message) {
         if (!isPrivateMessage() && this.serverMsgId != null && message.getServerMsgId() != null) {
             return this.serverMsgId.equals(message.getServerMsgId()) || Edit.wasPreviouslyEditedServerMsgId(edits, message.getServerMsgId());
  
  
  
    
    @@ -105,7 +105,7 @@ public abstract class AbstractGenerator {
         return Base64.encodeToString(sha1, Base64.NO_WRAP);
     }
 
-    public List<String> getFeatures(Account account) {
+    public List<String> getFeatures(final Account account) {
         final XmppConnection connection = account.getXmppConnection();
         final ArrayList<String> features = new ArrayList<>(Arrays.asList(STATIC_FEATURES));
         features.add("http://jabber.org/protocol/xhtml-im");
  
  
  
    
    @@ -7,6 +7,8 @@ import android.util.Pair;
 import com.cheogram.android.BobTransfer;
 import com.cheogram.android.WebxdcUpdate;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.io.File;
 import java.net.URISyntaxException;
 import java.text.SimpleDateFormat;
@@ -254,14 +256,27 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             final AxolotlService axolotlService = account.getAxolotlService();
             axolotlService.registerDevices(from, deviceIds);
         } else if (Namespace.BOOKMARKS.equals(node) && account.getJid().asBareJid().equals(from)) {
-            if (account.getXmppConnection().getFeatures().bookmarksConversion()) {
+            final var connection = account.getXmppConnection();
+            if (connection.getFeatures().bookmarksConversion()) {
+                if (connection.getFeatures().bookmarks2()) {
+                    Log.w(
+                            Config.LOGTAG,
+                            account.getJid().asBareJid()
+                                    + ": received storage:bookmark notification even though we opted into bookmarks:1");
+                }
                 final Element i = items.findChild("item");
-                final Element storage = i == null ? null : i.findChild("storage", Namespace.BOOKMARKS);
-                Map<Jid, Bookmark> bookmarks = Bookmark.parseFromStorage(storage, account);
+                final Element storage =
+                        i == null ? null : i.findChild("storage", Namespace.BOOKMARKS);
+                final Map<Jid, Bookmark> bookmarks = Bookmark.parseFromStorage(storage, account);
                 mXmppConnectionService.processBookmarksInitial(account, bookmarks, true);
-                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": processing bookmark PEP event");
+                Log.d(
+                        Config.LOGTAG,
+                        account.getJid().asBareJid() + ": processing bookmark PEP event");
             } else {
-                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": ignoring bookmark PEP event because bookmark conversion was not detected");
+                Log.d(
+                        Config.LOGTAG,
+                        account.getJid().asBareJid()
+                                + ": ignoring bookmark PEP event because bookmark conversion was not detected");
             }
         } else if (Namespace.BOOKMARKS2.equals(node) && account.getJid().asBareJid().equals(from)) {
             final Element item = items.findChild("item");
@@ -304,8 +319,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             Log.d(Config.LOGTAG, "parsing nick delete event from " + from);
             setNick(account, from, null);
         } else if (Namespace.BOOKMARKS2.equals(node) && account.getJid().asBareJid().equals(from)) {
-            account.setBookmarks(Collections.emptyMap());
             Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": deleted bookmarks node");
+            deleteAllBookmarks(account);
         } else if (Namespace.AVATAR_METADATA.equals(node) && account.getJid().asBareJid().equals(from)) {
             Log.d(Config.LOGTAG,account.getJid().asBareJid()+": deleted avatar metadata node");
         }
@@ -315,11 +330,17 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
         final Element purge = event.findChild("purge");
         final String node = purge == null ? null : purge.getAttribute("node");
         if (Namespace.BOOKMARKS2.equals(node) && account.getJid().asBareJid().equals(from)) {
-            account.setBookmarks(Collections.emptyMap());
             Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": purged bookmarks");
+            deleteAllBookmarks(account);
         }
     }
 
+    private void deleteAllBookmarks(final Account account) {
+        final var previous = account.getBookmarkedJids();
+        account.setBookmarks(Collections.emptyMap());
+        mXmppConnectionService.processDeletedBookmarks(account, previous);
+    }
+
     private void setNick(Account account, Jid user, String nick) {
         if (user.asBareJid().equals(account.getJid().asBareJid())) {
             account.setDisplayName(nick);
@@ -1207,6 +1228,16 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                     } else if (!counterpart.isBareJid() && trueJid != null) {
                         final ReadByMarker readByMarker = ReadByMarker.from(counterpart, trueJid);
                         if (message.addReadByMarker(readByMarker)) {
+                            final var mucOptions = conversation.getMucOptions();
+                            final var everyone = ImmutableSet.copyOf(mucOptions.getMembers(false));
+                            final var readyBy = message.getReadyByTrue();
+                            final var mStatus = message.getStatus();
+                            if (mucOptions.isPrivateAndNonAnonymous()
+                                    && (mStatus == Message.STATUS_SEND_RECEIVED
+                                            || mStatus == Message.STATUS_SEND)
+                                    && readyBy.containsAll(everyone)) {
+                                message.setStatus(Message.STATUS_SEND_DISPLAYED);
+                            }
                             mXmppConnectionService.updateMessage(message, false);
                         }
                     }
  
  
  
    
    @@ -36,11 +36,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 public class CallIntegration extends Connection {
 
-    private static final List<String> BROKEN_DEVICE_MODELS =
-            Arrays.asList(
-                    "OnePlus6" // OnePlus 6 (Android 8.1-11) Device is buggy and always starts the
-                    // OS call screen even though we want to be self managed
-                    );
+    /**
+     * OnePlus 6 (Android 8.1-11) Device is buggy and always starts the OS call screen even though
+     * we want to be self managed
+     *
+     * <p>Samsung Galaxy Tab A claims to have FEATURE_CONNECTION_SERVICE but then throws
+     * SecurityException when invoking placeCall(). Both Stock and LineageOS have this problem.
+     */
+    private static final List<String> BROKEN_DEVICE_MODELS = Arrays.asList("OnePlus6", "gtaxlwifi");
 
     public static final int DEFAULT_TONE_VOLUME = 60;
     private static final int DEFAULT_MEDIA_PLAYER_VOLUME = 90;
@@ -569,7 +572,6 @@ public class CallIntegration extends Connection {
         return this.isDestroyed.get();
     }
 
-    /** AudioDevice is the names of possible audio devices that we currently support. */
     public enum AudioDevice {
         NONE,
         SPEAKER_PHONE,
  
  
  
    
    @@ -254,7 +254,7 @@ public class NotificationService {
                 RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION),
                 new AudioAttributes.Builder()
                         .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
-                        .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
+                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                         .build());
         messagesChannel.setLightColor(LED_COLOR);
         final int dat = 70;
@@ -287,7 +287,7 @@ public class NotificationService {
                 RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION),
                 new AudioAttributes.Builder()
                         .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
-                        .setUsage(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT)
+                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                         .build());
         deliveryFailedChannel.setGroup("chats");
         notificationManager.createNotificationChannel(deliveryFailedChannel);
  
  
  
    
    @@ -2407,20 +2407,32 @@ public class XmppConnectionService extends Service {
             processModifiedBookmark(bookmark, pep);
         }
         if (pep) {
-            Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": " + previousBookmarks.size() + " bookmarks have been removed");
-            for (Jid jid : previousBookmarks) {
-                processDeletedBookmark(account, jid);
-            }
+            processDeletedBookmarks(account, previousBookmarks);
         }
         account.setBookmarks(bookmarks);
     }
 
-    public void processDeletedBookmark(Account account, Jid jid) {
+    public void processDeletedBookmarks(final Account account, final Collection<Jid> bookmarks) {
+        Log.d(
+                Config.LOGTAG,
+                account.getJid().asBareJid()
+                        + ": "
+                        + bookmarks.size()
+                        + " bookmarks have been removed");
+        for (final Jid bookmark : bookmarks) {
+            processDeletedBookmark(account, bookmark);
+        }
+    }
+
+    public void processDeletedBookmark(final Account account, final Jid jid) {
         final Conversation conversation = find(account, jid);
-        if (conversation != null && conversation.getMucOptions().getError() == MucOptions.Error.DESTROYED) {
-            Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": archiving destroyed conference (" + conversation.getJid() + ") after receiving pep");
-            archiveConversation(conversation, false);
+        if (conversation == null) {
+            return;
         }
+        Log.d(
+                Config.LOGTAG,
+                account.getJid().asBareJid() + ": archiving MUC " + jid + " after PEP update");
+        archiveConversation(conversation, false);
     }
 
     private void processModifiedBookmark(final Bookmark bookmark, final boolean pep) {
  
  
  
    
    @@ -69,9 +69,9 @@ public class JoinConferenceDialog extends DialogFragment implements OnBackendCon
 		builder.setNegativeButton(R.string.cancel, null);
 		AlertDialog dialog = builder.create();
 		dialog.show();
-		dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(view -> mListener.onJoinDialogPositiveClick(dialog, binding.account, binding.accountJidLayout, binding.jid, binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null, binding.bookmark.isChecked()));
+		dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(view -> mListener.onJoinDialogPositiveClick(dialog, binding.account, binding.accountJidLayout, binding.jid, binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null));
 		binding.jid.setOnEditorActionListener((v, actionId, event) -> {
-			mListener.onJoinDialogPositiveClick(dialog, binding.account, binding.accountJidLayout, binding.jid, binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null, binding.bookmark.isChecked());
+			mListener.onJoinDialogPositiveClick(dialog, binding.account, binding.accountJidLayout, binding.jid, binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null);
 			return true;
 		});
 		return dialog;
@@ -91,7 +91,7 @@ public class JoinConferenceDialog extends DialogFragment implements OnBackendCon
 	}
 
 	@Override
-	public void onAttach(Context context) {
+	public void onAttach(@NonNull final Context context) {
 		super.onAttach(context);
 		try {
 			mListener = (JoinConferenceDialogListener) context;
@@ -120,6 +120,6 @@ public class JoinConferenceDialog extends DialogFragment implements OnBackendCon
 	}
 
 	public interface JoinConferenceDialogListener {
-		void onJoinDialogPositiveClick(Dialog dialog, AutoCompleteTextView spinner, TextInputLayout jidLayout, AutoCompleteTextView jid, String password, boolean isBookmarkChecked);
+		void onJoinDialogPositiveClick(Dialog dialog, AutoCompleteTextView spinner, TextInputLayout jidLayout, AutoCompleteTextView jid, String password);
 	}
 }
  
  
  
    
    @@ -481,13 +481,13 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
         }
     }
 
-    protected void openConversationsForBookmark(Bookmark bookmark) {
+    protected void openConversationsForBookmark(final Bookmark bookmark) {
         final Jid jid = bookmark.getFullJid();
         if (jid == null) {
             Toast.makeText(this, R.string.invalid_jid, Toast.LENGTH_SHORT).show();
             return;
         }
-        Conversation conversation = xmppConnectionService.findOrCreateConversation(bookmark.getAccount(), jid, true, true, true);
+        final Conversation conversation = xmppConnectionService.findOrCreateConversation(bookmark.getAccount(), jid, true, true, true);
         bookmark.setConversation(conversation);
         if (!bookmark.autojoin()) {
             bookmark.setAutojoin(true);
@@ -1303,7 +1303,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
     }
 
     @Override
-    public void onJoinDialogPositiveClick(Dialog dialog, AutoCompleteTextView spinner, TextInputLayout layout, AutoCompleteTextView jid, String password, boolean isBookmarkChecked) {
+    public void onJoinDialogPositiveClick(Dialog dialog, AutoCompleteTextView spinner, TextInputLayout layout, AutoCompleteTextView jid, String password) {
         if (!xmppConnectionServiceBound) {
             return;
         }
@@ -1327,33 +1327,24 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
                 return;
             }
         }
-
-        if (isBookmarkChecked) {
-            Bookmark bookmark = account.getBookmark(conferenceJid);
-            if (bookmark != null) {
-                dialog.dismiss();
-                openConversationsForBookmark(bookmark);
-            } else {
-                bookmark = new Bookmark(account, conferenceJid.asBareJid());
-                if (password != null) bookmark.setPassword(password);
-                bookmark.setAutojoin(true);
-                final String nick = conferenceJid.getResource();
-                if (nick != null && !nick.isEmpty() && !nick.equals(MucOptions.defaultNick(account))) {
-                    bookmark.setNick(nick);
-                }
-                xmppConnectionService.createBookmark(account, bookmark);
-                final Conversation conversation = xmppConnectionService
-                        .findOrCreateConversation(account, conferenceJid, true, true, null, true, password);
-                bookmark.setConversation(conversation);
-                dialog.dismiss();
-                switchToConversation(conversation);
-            }
+        final var existingBookmark = account.getBookmark(conferenceJid);
+        if (existingBookmark != null) {
+            openConversationsForBookmark(existingBookmark);
         } else {
+            final var bookmark = new Bookmark(account, conferenceJid.asBareJid());
+            bookmark.setAutojoin(true);
+            final String nick = conferenceJid.getResource();
+            if (nick != null && !nick.isEmpty() && !nick.equals(MucOptions.defaultNick(account))) {
+                bookmark.setNick(nick);
+            }
+            xmppConnectionService.createBookmark(account, bookmark);
             final Conversation conversation = xmppConnectionService
                     .findOrCreateConversation(account, conferenceJid, true, true, null, true, password);
-            dialog.dismiss();
+
+            bookmark.setConversation(conversation);
             switchToConversation(conversation);
         }
+        dialog.dismiss();
     }
 
     @Override
  
  
  
    
    @@ -47,13 +47,17 @@ import androidx.annotation.Nullable;
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.ResourcesCompat;
+import androidx.core.widget.ImageViewCompat;
+
+import com.google.android.material.imageview.ShapeableImageView;
+import com.google.android.material.shape.CornerFamily;
+import com.google.android.material.shape.ShapeAppearanceModel;
 
 import com.cheogram.android.BobTransfer;
 import com.cheogram.android.MessageTextActionModeCallback;
 import com.cheogram.android.SwipeDetector;
 import com.cheogram.android.WebxdcPage;
 import com.cheogram.android.WebxdcUpdate;
-import androidx.core.widget.ImageViewCompat;
 
 import com.google.android.material.button.MaterialButton;
 import com.google.android.material.color.MaterialColors;
@@ -579,6 +583,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         setTextColor(viewHolder.messageBody, bubbleColor);
         setTextSize(viewHolder.messageBody, this.bubbleDesign.largeFont);
 
+        final ViewGroup.LayoutParams layoutParams = viewHolder.messageBody.getLayoutParams();
+        layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
+        viewHolder.messageBody.setLayoutParams(layoutParams);
+
         viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
 
         if (message.getBody() != null && !message.getBody().equals("")) {
@@ -739,7 +747,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             String text,
             final BubbleColor bubbleColor, final int type) {
         displayTextMessage(viewHolder, message, bubbleColor, type);
-        toggleWhisperInfo(viewHolder, message, bubbleColor);
         viewHolder.image.setVisibility(View.GONE);
         List<Element> thumbs = message.getFileParams() != null ? message.getFileParams().getThumbnails() : null;
         if (thumbs != null && !thumbs.isEmpty()) {
@@ -774,7 +781,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 if (height < 1) height = 1080;
 
                 viewHolder.image.setVisibility(View.VISIBLE);
-                imagePreviewLayout(width, height, viewHolder.image, message.getBody() != null && message.getBody().length() > 0);
+                imagePreviewLayout(width, height, viewHolder.image, true, type, viewHolder);
                 activity.loadBitmap(message, viewHolder.image);
                 viewHolder.image.setOnClickListener(v -> ConversationFragment.downloadFile(activity, message));
 
@@ -845,7 +852,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
     private void displayOpenableMessage(
             ViewHolder viewHolder, final Message message, final BubbleColor bubbleColor, final int type) {
         displayTextMessage(viewHolder, message, bubbleColor, type);
-        toggleWhisperInfo(viewHolder, message, bubbleColor);
         viewHolder.image.setVisibility(View.GONE);
         viewHolder.audioPlayer.setVisibility(View.GONE);
         viewHolder.download_button.setVisibility(View.VISIBLE);
@@ -862,7 +868,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
     private void displayLocationMessage(
             ViewHolder viewHolder, final Message message, final BubbleColor bubbleColor, final int type) {
         displayTextMessage(viewHolder, message, bubbleColor, type);
-        toggleWhisperInfo(viewHolder, message, bubbleColor);
         viewHolder.image.setVisibility(View.GONE);
         viewHolder.audioPlayer.setVisibility(View.GONE);
         viewHolder.download_button.setVisibility(View.VISIBLE);
@@ -876,7 +881,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
     private void displayAudioMessage(
             ViewHolder viewHolder, Message message, final BubbleColor bubbleColor, final int type) {
         displayTextMessage(viewHolder, message, bubbleColor, type);
-        toggleWhisperInfo(viewHolder, message, bubbleColor);
         viewHolder.image.setVisibility(View.GONE);
         viewHolder.download_button.setVisibility(View.GONE);
         final RelativeLayout audioPlayer = viewHolder.audioPlayer;
@@ -888,17 +892,16 @@ public class MessageAdapter extends ArrayAdapter<Message> {
     private void displayMediaPreviewMessage(
             ViewHolder viewHolder, final Message message, final BubbleColor bubbleColor, final int type) {
         displayTextMessage(viewHolder, message, bubbleColor, type);
-        toggleWhisperInfo(viewHolder, message, bubbleColor);
         viewHolder.download_button.setVisibility(View.GONE);
         viewHolder.audioPlayer.setVisibility(View.GONE);
         viewHolder.image.setVisibility(View.VISIBLE);
         final FileParams params = message.getFileParams();
-        imagePreviewLayout(params.width, params.height, viewHolder.image, message.getBody() != null && message.getBody().length() > 0);
+        imagePreviewLayout(params.width, params.height, viewHolder.image, viewHolder.messageBody.getVisibility() != View.GONE, type, viewHolder);
         activity.loadBitmap(message, viewHolder.image);
         viewHolder.image.setOnClickListener(v -> openDownloadable(message));
     }
 
-    private void imagePreviewLayout(int w, int h, ImageView image, boolean topMargin) {
+    private void imagePreviewLayout(int w, int h, ShapeableImageView image, boolean withOther, int type, ViewHolder viewHolder) {
         final float target = activity.getResources().getDimension(R.dimen.image_preview_width);
         final int scaledW;
         final int scaledH;
@@ -915,11 +918,30 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             scaledW = (int) target;
             scaledH = (int) (h / ((double) w / target));
         }
+        final var small = withOther ? scaledW < target : scaledW < 110 * metrics.density;
         final LinearLayout.LayoutParams layoutParams =
                 new LinearLayout.LayoutParams(scaledW, scaledH);
-        layoutParams.setMargins(0, topMargin ? (int) (metrics.density * 4) : 0, 0, (int) (metrics.density * 4));
-        layoutParams.gravity = Gravity.CENTER;
         image.setLayoutParams(layoutParams);
+
+        final var bubbleRadius = activity.getResources().getDimension(R.dimen.bubble_radius);
+        var shape = new ShapeAppearanceModel.Builder().setTopRightCorner(CornerFamily.ROUNDED, bubbleRadius);
+        if (type == SENT) {
+            shape = shape.setTopLeftCorner(CornerFamily.ROUNDED, bubbleRadius);
+        }
+        if (small) {
+            final var imageRadius = activity.getResources().getDimension(R.dimen.image_radius);
+            shape = shape.setAllCorners(CornerFamily.ROUNDED, imageRadius);
+            image.setPadding(0, (int)(8 * metrics.density), 0, 0);
+        } else {
+            image.setPadding(0, 0, 0, 0);
+        }
+        image.setShapeAppearanceModel(shape.build());
+
+        if (!small) {
+            final ViewGroup.LayoutParams blayoutParams = viewHolder.messageBody.getLayoutParams();
+            blayoutParams.width = (int) (target - (22 * metrics.density));
+            viewHolder.messageBody.setLayoutParams(blayoutParams);
+        }
     }
 
     private void toggleWhisperInfo(
@@ -1203,6 +1225,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             }
             return view;
         } else {
+            viewHolder.message_box.setClipToOutline(true);
             AvatarWorkerTask.loadAvatar(message, viewHolder.contact_picture, R.dimen.avatar);
         }
 
@@ -1619,7 +1642,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         protected LinearLayout message_box;
         protected View message_box_inner;
         protected MaterialButton download_button;
-        protected ImageView image;
+        protected ShapeableImageView image;
         protected ImageView indicator;
         protected ImageView indicatorReceived;
         protected TextView time;
  
  
  
    
    @@ -9,6 +9,7 @@ import android.view.LayoutInflater;
 import android.widget.TextView;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
 import androidx.core.view.ViewCompat;
@@ -18,6 +19,7 @@ import androidx.recyclerview.widget.ListAdapter;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.google.android.material.color.MaterialColors;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.Ints;
 
@@ -82,9 +84,20 @@ public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHo
         AvatarWorkerTask.loadAvatar(user, viewHolder.binding.contactPhoto, R.dimen.avatar);
         viewHolder.binding.getRoot().setOnClickListener(v -> {
             final XmppActivity activity = XmppActivity.find(v);
-            if (activity != null) {
-                activity.highlightInMuc(user.getConversation(), user.getNick());
+            if (activity == null) {
+                return;
             }
+            final var contact = user.getContact();
+            if (user.getRole() == MucOptions.Role.NONE && contact != null) {
+                Toast.makeText(
+                                activity,
+                                activity.getString(
+                                        R.string.user_has_left_conference,
+                                        contact.getDisplayName()),
+                                Toast.LENGTH_SHORT)
+                        .show();
+            }
+            activity.highlightInMuc(user.getConversation(), user.getName());
         });
         viewHolder.binding.getRoot().setTag(user);
         viewHolder.binding.getRoot().setOnCreateContextMenuListener(this);
@@ -104,7 +117,8 @@ public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHo
                 viewHolder.binding.contactJid.setText(name);
             }
         } else {
-            viewHolder.binding.contactDisplayName.setText(name == null ? "" : name);
+            viewHolder.binding.contactDisplayName.setText(Strings.nullToEmpty(name));
+            viewHolder.binding.contactJid.setText(ConferenceDetailsActivity.getStatus(viewHolder.binding.getRoot().getContext(), user, advancedMode));
         }
         if (advancedMode && user.getPgpKeyId() != 0) {
             viewHolder.binding.key.setVisibility(View.VISIBLE);
  
  
  
    
    @@ -4,6 +4,7 @@ import android.view.ContextMenu;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
 import androidx.databinding.DataBindingUtil;
@@ -47,9 +48,20 @@ public class UserPreviewAdapter extends ListAdapter<MucOptions.User, UserPreview
                 .setOnClickListener(
                         v -> {
                             final XmppActivity activity = XmppActivity.find(v);
-                            if (activity != null) {
-                                activity.highlightInMuc(user.getConversation(), user.getNick());
+                            if (activity == null) {
+                                return;
                             }
+                            final var contact = user.getContact();
+                            if (user.getRole() == MucOptions.Role.NONE && contact != null) {
+                                Toast.makeText(
+                                                activity,
+                                                activity.getString(
+                                                        R.string.user_has_left_conference,
+                                                        contact.getDisplayName()),
+                                                Toast.LENGTH_SHORT)
+                                        .show();
+                            }
+                            activity.highlightInMuc(user.getConversation(), user.getName());
                         });
         viewHolder.binding.getRoot().setOnCreateContextMenuListener(this);
         viewHolder.binding.getRoot().setTag(user);
  
  
  
    
    @@ -10,14 +10,14 @@
                 android:topRightRadius="@dimen/bubble_radius" />
             <padding
                 android:bottom="0dp"
-                android:left="5dp"
-                android:right="5dp"
+                android:left="0dp"
+                android:right="0dp"
                 android:top="0dp" />
             <size android:width="10dp" android:height="10dp" />
             <solid android:color="?colorSurfaceContainerHigh" />
         </shape>
     </item>
-    <item android:left="-5dp" android:gravity="top|left" android:width="7dp" android:height="7dp" android:top="0dp">
+    <item android:gravity="top|left" android:width="7dp" android:height="7dp" android:top="0dp">
         <vector
            android:width="24dp"
            android:height="24dp"
  
  
  
    
    @@ -10,14 +10,14 @@
                 android:topRightRadius="@dimen/bubble_radius" />
             <padding
                 android:bottom="0dp"
-                android:left="5dp"
-                android:right="5dp"
+                android:left="0dp"
+                android:right="0dp"
                 android:top="0dp" />
             <size android:width="10dp" android:height="10dp" />
             <solid android:color="?colorSurface" />
         </shape>
     </item>
-    <item android:bottom="0dp" android:right="-5dp" android:gravity="bottom|right" android:width="7dp" android:height="7dp">
+    <item android:bottom="0dp" android:gravity="bottom|right" android:width="7dp" android:height="7dp">
         <vector
            android:width="24dp"
            android:height="24dp"
  
  
  
    
    @@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
 
     <LinearLayout
         android:layout_width="match_parent"
@@ -31,20 +30,12 @@
             android:hint="@string/xmpp_address">
 
             <com.google.android.material.textfield.MaterialAutoCompleteTextView
-                android:padding="16dp"
                 android:id="@+id/jid"
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
                 android:imeOptions="actionDone|flagNoExtractUi"
-                android:inputType="textEmailAddress" />
+                android:inputType="textEmailAddress"
+                android:padding="16dp" />
         </com.google.android.material.textfield.TextInputLayout>
-
-        <CheckBox
-            android:id="@+id/bookmark"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:checked="true"
-            android:text="@string/save_as_group_chat" />
     </LinearLayout>
 </layout>
  
  
  
    
    @@ -4,30 +4,41 @@
 
     <merge>
 
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:orientation="horizontal">
+
+            <com.google.android.material.imageview.ShapeableImageView
+                android:id="@+id/message_image"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:adjustViewBounds="true"
+                android:background="@color/gray_800"
+                android:longClickable="true"
+                android:scaleType="centerCrop"
+                app:shapeAppearance="@style/ShapeAppearanceOverlay.MessageImage" />
+        </LinearLayout>
+
         <TextView
             android:id="@+id/message_body"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginHorizontal="10dp"
+            android:layout_marginTop="4dp"
             android:autoLink="web"
             android:longClickable="false"
             android:textAppearance="?textAppearanceBodyMedium" />
 
-        <ImageView
-            android:id="@+id/message_image"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="8dp"
-            android:layout_marginBottom="4dp"
-            android:adjustViewBounds="true"
-            android:background="@color/gray_800"
-            android:longClickable="true"
-            android:scaleType="centerCrop" />
-
         <com.google.android.material.button.MaterialButton
             android:id="@+id/download_button"
             style="@style/Widget.Material3.Button.ElevatedButton"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginHorizontal="10dp"
+            android:layout_marginTop="4dp"
+            android:layout_gravity="center"
             android:longClickable="true"
             android:visibility="gone"
             app:iconSize="24dp" />
@@ -45,6 +56,8 @@
             android:id="@+id/audio_player"
             android:layout_width="@dimen/audio_player_width"
             android:layout_height="wrap_content"
+            android:layout_marginHorizontal="10dp"
+            android:layout_marginVertical="4dp"
             android:visibility="gone">
 
             <ImageButton
  
  
  
    
    @@ -29,17 +29,15 @@
             android:background="@drawable/message_bubble_received"
             android:backgroundTint="?colorTertiaryContainer"
             android:longClickable="true"
-            android:minHeight="53dp"
-            android:paddingLeft="12dp"
-            android:paddingVertical="5dp">
+            android:paddingLeft="7dp"
+            android:minHeight="48dp">
 
             <LinearLayout
                 android:id="@+id/message_box_inner"
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:gravity="center_vertical"
-                android:orientation="vertical"
-                android:padding="2dp">
+                android:orientation="vertical">
 
                 <include
                     android:id="@+id/message_content"
@@ -50,7 +48,8 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="start"
-                    android:layout_marginVertical="1sp"
+                    android:layout_marginHorizontal="10dp"
+                    android:layout_marginVertical="4dp"
                     android:orientation="horizontal">
 
                     <TextView
  
  
  
    
    @@ -16,7 +16,7 @@
             android:layout_height="wrap_content"
             android:layout_alignParentEnd="true"
             android:layout_alignParentBottom="true"
-            android:layout_marginStart="0dp"
+            android:layout_marginStart="8dp"
             android:orientation="vertical">
 
         <com.google.android.material.imageview.ShapeableImageView
@@ -37,17 +37,15 @@
             android:background="@drawable/message_bubble_sent"
             android:backgroundTint="?colorSecondaryContainer"
             android:longClickable="true"
-            android:minHeight="53dp"
-            android:paddingRight="12dp"
-            android:paddingVertical="5dp">
+            android:paddingRight="7dp"
+            android:minHeight="48dp">
 
             <LinearLayout
                 android:id="@+id/message_box_inner"
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:gravity="center_vertical"
-                android:orientation="vertical"
-                android:padding="2dp">
+                android:orientation="vertical">
 
                 <include
                     android:id="@+id/message_content"
@@ -58,7 +56,9 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="end"
-                    android:layout_marginVertical="1sp"
+                    android:gravity="end"
+                    android:layout_marginHorizontal="10dp"
+                    android:layout_marginVertical="4dp"
                     android:orientation="horizontal">
 
                     <TextView
  
  
  
    
    @@ -649,7 +649,6 @@
     <string name="pref_prevent_screenshots">منع أخذ لقطات للشاشة</string>
     <string name="last_seen_day">آخِر ظهور البارحة</string>
     <string name="last_seen_hour">آخر ظهور منذ ساعة</string>
-    <string name="save_as_group_chat">احفظه كمحادثة جماعية</string>
     <string name="account_status_regis_invalid_token">رمز التسجيل غير صالح</string>
     <string name="bad_key_for_encryption">مفتاح تعمية خاطئ.</string>
     <string name="invalid_jid">هذا ليس عنوان XMPP صالح</string>
  
  
  
    
    @@ -971,7 +971,6 @@
     <string name="action_fix_to_location">Fixovat polohu</string>
     <string name="group_chats">Skupinové chaty</string>
     <string name="missed_calls_channel_name">Zmeškané hovory</string>
-    <string name="save_as_group_chat">Uložit jako skupinový chat</string>
     <string name="conference_technical_problems">Tento skupinový chat jste opustili z technických důvodů</string>
     <string name="reconnecting_call">Znovu spojuji hovor</string>
     <string name="blindly_trusted_omemo_keys">Slepě důvěřované klíče OMEMO, které mohou být někdo jiný nebo někým zasaženy.</string>
  
  
  
    
    @@ -988,7 +988,6 @@
     <string name="delete_from_server">Konto vom Server löschen</string>
     <string name="could_not_delete_account_from_server">Konto konnte nicht vom Server gelöscht werden</string>
     <string name="group_chats">Gruppenchats</string>
-    <string name="save_as_group_chat">Als Gruppenchat speichern</string>
     <string name="search_group_chats">Gruppenchats durchsuchen</string>
     <string name="restore_warning_continued">Versuche nicht, Backups wiederherzustellen, die du nicht selbst erstellt hast!</string>
     <string name="outdated_backup_file_format">Du versuchst, ein veraltetes Sicherungsdateiformat zu importieren</string>
@@ -1021,7 +1020,7 @@
     <string name="start_chat">Chat starten</string>
     <string name="no_certificate_selected">Kein Client-Zertifikat ausgewählt!</string>
     <string name="title_activity_new_chat">Neuer Chat</string>
-    <string name="archive_this_chat">Diesen Chat archivieren</string>
+    <string name="archive_this_chat">Chat anschließend löschen</string>
     <string name="corresponding_chats_closed">Entsprechende Chats werden archiviert.</string>
     <string name="switch_to_chat">Zum Chat wechseln</string>
     <string name="action_archive_chat">Chat archivieren</string>
@@ -1066,4 +1065,10 @@
     <string name="pref_large_font">Große Schrift</string>
     <string name="pref_accept_invites_from_strangers">Einladungen von Unbekannten</string>
     <string name="pref_accept_invites_from_strangers_summary">Einladungen zu Gruppenchats von Unbekannten annehmen</string>
+    <string name="pref_backup_summary">Einmalig erstellen, wiederkehrend planen</string>
+    <string name="pref_backup_recurring">Wiederkehrende Sicherung</string>
+    <string name="pref_fullscreen_notification">Benachrichtigungen im Vollbildmodus</string>
+    <string name="unsupported_operation">Nicht unterstützte Operation</string>
+    <string name="pref_fullscreen_notification_summary">Erlaube dieser App, Benachrichtigungen über eingehende Anrufe anzuzeigen, die den gesamten Bildschirm einnehmen, wenn das Gerät gesperrt ist.</string>
+    <string name="pref_create_backup_one_off_summary">Einmalige Sicherung erstellen</string>
 </resources>
  
  
  
    
    @@ -1003,7 +1003,6 @@
     <string name="could_not_delete_account_from_server">No se pudo eliminar la cuenta del servidor</string>
     <string name="group_chats">Chats en grupo</string>
     <string name="search_group_chats">Buscar un grupo de chats</string>
-    <string name="save_as_group_chat">Guardar como un chat en grupo</string>
     <string name="restore_warning_continued">¡No intentes restaurar las copias de seguridad que no creaste tu mismo!</string>
     <string name="outdated_backup_file_format">Estás intentando importar un formato de copia de seguridad obsoleto</string>
     <string name="audiobook">Audiolibro</string>
@@ -1080,4 +1079,10 @@
     <string name="pref_allow_screenshots_summary">Mostrar el contenido de la aplicación en el conmutador de aplicaciones y permitir la realización de capturas de pantalla</string>
     <string name="pref_accept_invites_from_strangers">Invitaciones de extraños</string>
     <string name="pref_accept_invites_from_strangers_summary">Aceptar invitaciones a chats grupales de extraños</string>
+    <string name="pref_backup_summary">Crear una sola vez, Programar recurrentes</string>
+    <string name="pref_create_backup_one_off_summary">Crear una copia de seguridad única</string>
+    <string name="pref_backup_recurring">Copia de seguridad periódica</string>
+    <string name="unsupported_operation">Operación no soportada</string>
+    <string name="pref_fullscreen_notification">Notificaciones a pantalla completa</string>
+    <string name="pref_fullscreen_notification_summary">Permite que esta aplicación muestre notificaciones de llamadas entrantes que ocupan toda la pantalla cuando el dispositivo está bloqueado.</string>
 </resources>
  
  
  
    
    @@ -481,7 +481,6 @@
     <string name="rtp_state_application_failure">خطای برنامه</string>
     <string name="send_private_message">فرستادن پیام خصوصی</string>
     <string name="notification_restored_backup_subtitle">فعالسازی حساب را فراموش نکنید.</string>
-    <string name="save_as_group_chat">ذخیره به عنوان گفتگوی گروهی</string>
     <string name="audiobook">کتاب صوتی</string>
     <string name="non_anonymous">نشانیهای XMPP را برای همه نمایان کن</string>
     <string name="account_status_connecting">وصل میشود…</string>
  
  
  
    
    @@ -78,7 +78,7 @@
     <string name="preparing_images">Préparation pour l\'envoi des images</string>
     <string name="sharing_files_please_wait">Partage des fichiers. Veuillez patienter…</string>
     <string name="action_clear_history">Vider l\'historique</string>
-    <string name="clear_conversation_history">Vider l\'historique de la conversation</string>
+    <string name="clear_conversation_history">Effacer l\'historique de la conversation</string>
     <string name="clear_histor_msg">Êtes-vous sûr de vouloir supprimer tous les messages de cette conversation ?
 \n
 \n <b>Avertissement :</b> Cela ne supprimera pas les copies des messages qui sont stockés sur d\'autres appareils ou serveurs.</string>
@@ -277,7 +277,7 @@
     <string name="ignore">Ignorer</string>
     <string name="without_mutual_presence_updates"><b>Attention :</b> peut poser problème si l\'un des deux correspondants n\'a pas activé les mises à jour de disponibilité.\n\n<small>Vérifiez dans « Détails du contact » que vous y avez bien souscrit.</small></string>
     <string name="pref_security_settings">Sécurité</string>
-    <string name="pref_allow_message_correction">Autoriser la correction</string>
+    <string name="pref_allow_message_correction">Correction des messages</string>
     <string name="pref_allow_message_correction_summary">Permet à vos contacts d\'éditer leurs messages rétroactivement</string>
     <string name="pref_expert_options">Paramètres avancés</string>
     <string name="pref_expert_options_summary">À utiliser avec précaution.</string>
@@ -466,8 +466,8 @@
     <string name="pref_dnd_on_silent_mode_summary">Occupé lorsque l\'appareil est en mode silencieux</string>
     <string name="pref_treat_vibrate_as_silent">Indisponible en mode vibreur</string>
     <string name="pref_treat_vibrate_as_dnd_summary">Occupé lorsque l\'appareil est en mode vibreur</string>
-    <string name="pref_show_connection_options">Paramètres de connexion avancés</string>
-    <string name="pref_show_connection_options_summary">Montrer le nom d\'hôte et le port lors du paramétrage d\'un compte</string>
+    <string name="pref_show_connection_options">Nom d\'hôte et port</string>
+    <string name="pref_show_connection_options_summary">Montrer les paramètres étendus de connexion lors du paramétrage d\'un compte</string>
     <string name="hostname_example">xmpp.example.com</string>
     <string name="action_add_account_with_certificate">Se connecter avec certificat</string>
     <string name="unable_to_parse_certificate">Impossible d\'analyser le certificat</string>
@@ -555,8 +555,8 @@
     <string name="gp_short">Courte</string>
     <string name="gp_medium">Moyenne</string>
     <string name="gp_long">Longue</string>
-    <string name="pref_broadcast_last_activity">Partage de l\'utilisation</string>
-    <string name="pref_broadcast_last_activity_summary">Informer vos contacts lorsque vous utilisez Conversations</string>
+    <string name="pref_broadcast_last_activity">Dernière connexion</string>
+    <string name="pref_broadcast_last_activity_summary">Informer vos contacts de la dernière fois que vous avez utilisé l\'application</string>
     <string name="pref_privacy">Confidentialité</string>
     <string name="pref_theme_options">Thème</string>
     <string name="pref_theme_options_summary">Choisir la palette de couleurs</string>
@@ -695,14 +695,14 @@
     <string name="error_trustkey_device_list">Impossible de récupérer la liste des appareils</string>
     <string name="error_trustkey_bundle">Impossible de récupérer les clés de chiffrement</string>
     <string name="error_trustkey_hint_mutual">Indication : Dans certains cas, cela peut être résolu en vous ajoutant respectivement dans votre liste de contacts.</string>
-    <string name="disable_encryption_message">Êtes-vous sûr de vouloir désactiver le chiffrement OMEMO pour cette discussion ?
+    <string name="disable_encryption_message">Êtes-vous sûr de vouloir désactiver le chiffrement OMEMO pour cette conversation ?
 \nCeci permettra à l\'administrateur de votre serveur de lire vos messages, mais cela peut être le seul moyen de communiquer avec des personnes utilisant un vieux client.</string>
     <string name="disable_now">Désactiver maintenant</string>
     <string name="draft">Brouillon :</string>
     <string name="pref_omemo_setting">Chiffrement OMEMO</string>
     <string name="pref_omemo_setting_summary_always">OMEMO sera toujours utilisé pour des discussions à deux ou les groupes privés.</string>
-    <string name="pref_omemo_setting_summary_default_on">OMEMO sera utilisé par défaut pour les nouvelles discussions.</string>
-    <string name="pref_omemo_setting_summary_default_off">OMEMO devra être activé manuellement pour chaque nouvelle discussion.</string>
+    <string name="pref_omemo_setting_summary_default_on">OMEMO sera utilisé par défaut pour les nouvelles conversations.</string>
+    <string name="pref_omemo_setting_summary_default_off">OMEMO devra être activé manuellement pour chaque nouvelle conversation.</string>
     <string name="create_shortcut">Créer un raccourci</string>
     <string name="default_on">Activé par défaut</string>
     <string name="default_off">Désactivé par défaut</string>
@@ -730,7 +730,7 @@
     <string name="copy_jabber_id">Copier l\'adresse XMPP</string>
     <string name="p1_s3_filetransfer">Partage de fichier HTTP pour S3</string>
     <string name="pref_start_search">Recherche directe</string>
-    <string name="pref_start_search_summary">Sur l\'écran de démarrage de Conversation, afficher le clavier et placer le curseur sur le champ recherche</string>
+    <string name="pref_start_search_summary">Lors de l\'ajout de conversations, afficher le clavier et placer le curseur sur le champ de recherche</string>
     <string name="group_chat_avatar">Avatar du groupe</string>
     <string name="host_does_not_support_group_chat_avatars">Le serveur ne prend pas en charge les avatars pour les groupes</string>
     <string name="only_the_owner_can_change_group_chat_avatar">Seul le propriétaire peut changer l\'avatar d\'un groupe</string>
@@ -785,8 +785,8 @@
     <string name="resend_sms">Renvoyer un SMS</string>
     <string name="resend_sms_in">Renvoyer SMS (%s)</string>
     <string name="wait_x">S\'il vous plaît, attendez (%s)</string>
-    <string name="back">retour</string>
-    <string name="possible_pin">Collage possible des broches possibles du presse-papiers.</string>
+    <string name="back">Retour</string>
+    <string name="possible_pin">Le code PIN du presse-papier a été automatiquement copié.</string>
     <string name="please_enter_pin">Veuillez entrer votre code PIN à 6 chiffres.</string>
     <string name="abort_registration_procedure">Êtes-vous sûr de vouloir quitter la procédure d\'inscription ?</string>
     <string name="yes">Oui</string>
@@ -970,10 +970,9 @@
     <string name="backup_started_message">La sauvegarde a débuté. Vous serez notifié une fois terminé.</string>
     <string name="conference_technical_problems">Vous avez quitté ce groupe pour des raisons techniques</string>
     <string name="delete_from_server">Supprimer le compte du serveur</string>
-    <string name="sync_with_contacts_long">%1$s souhaite obtenir la permission d\'accéder à votre carnet d\'adresses pour le faire correspondre à votre liste de contacts XMPP.
-\nCela affichera les noms complets et les avatars de vos contacts.
+    <string name="sync_with_contacts_long">%1$s traite votre liste de contacts sur votre appareil pour afficher les noms et les photo de profil des contacts correspondants sur XMPP.
 \n
-\n%1$s ne lira que votre carnet d\'adresses et le comparera localement sans rien télécharger sur votre serveur.</string>
+\nVotre liste de contacts ne quitte jamais votre appareil !</string>
     <string name="multimedia_file">ficher multimédia</string>
     <string name="search_group_chats">Rechercher des groupes</string>
     <string name="outgoing_call_duration_timestamp">Appel sortant (%s) · %s</string>
@@ -993,7 +992,6 @@
         <item quantity="other">%1$d appels manqués de %2$d contacts</item>
     </plurals>
     <string name="group_chats">Discussions de groupe</string>
-    <string name="save_as_group_chat">Enregistrer comme groupe</string>
     <string name="pref_autojoin">Synchroniser les favoris</string>
     <string name="pref_autojoin_summary">Activer \"Rejoindre automatiquement\" en entrant ou sortant d\'un groupe et réagir aux modifications apportées par d\'autres clients.</string>
     <string name="vector_graphic">graphique vectoriel</string>
@@ -1029,5 +1027,69 @@
     <string name="hide_notification">Cacher la notification</string>
     <string name="log_out">Se déconnecter</string>
     <string name="contact_list_integration_not_available">L\'intégration de la liste de contacts n\'est pas disponible</string>
-    <string name="delete_and_close">Supprimer & Fermer</string>
-</resources>
+    <string name="delete_and_close">Supprimer et archiver la conversation</string>
+    <string name="unverified_devices">Vous utilisez un appareil qui n\'est pas encore vérifié. Scannez le QR code sur votre autre appareil pour effectuer une vérification et éviter une attaque de l\'homme du milieu.</string>
+    <string name="call_integration_not_available">L\'intégration d\'appels n\'est pas diponible !</string>
+    <string name="pref_title_interface">Interface</string>
+    <string name="pref_light_dark_mode">Thème clair/sombre</string>
+    <string name="pref_allow_screenshots">Autoriser les captures d\'écran</string>
+    <string name="pref_category_e2ee">Chiffrement de bout en bout</string>
+    <string name="pref_allow_screenshots_summary">Afficher le contenu de l\'application dans le sélecteur d\'applications et autorise les captures d\'écran</string>
+    <string name="pref_title_trust_system_ca_store">Autorités de certification</string>
+    <string name="pref_title_trust_system_ca_store_summary">Faire confiance aux certificats de l\'autorité de certification du système</string>
+    <string name="detect_mim">Oblige la liaison du canal</string>
+    <string name="detect_mim_summary">La liaison du canal peut permettre de détecter les attaques de l\'homme du milieu</string>
+    <string name="pref_keyboard_options">Clavier</string>
+    <string name="pref_create_backup_one_off_summary">Créer une sauvegarde ponctuelle</string>
+    <string name="pref_backup_recurring">Créer une sauvegarde récurrente</string>
+    <string name="barcode_does_not_contain_fingerprints_for_this_chat">Le code-barre ne contient pas les empreintes pour cette conversation.</string>
+    <string name="corresponding_chats_closed">Les conversations correspondantes ont été archivés.</string>
+    <string name="title_activity_new_chat">Nouvelle conversation</string>
+    <string name="remove_bookmark_and_close">Voulez-vous supprimer le favori %s et archiver la conversation ?</string>
+    <string name="remove_bookmark">Voulez-vous supprimer le favori %s ?</string>
+    <string name="pref_send_crash_reports">Envoyer des rapports d\'incident</string>
+    <string name="welcome_header">Rejoignez la Conversation</string>
+    <string name="pref_summary_security">Chiffrement de bout en bout, confiance aveugle avant vérification, détection des attaques de l\'homme du milieu</string>
+    <string name="pref_category_operating_system">Système d\'exploitation</string>
+    <string name="unsupported_operation">Opération pas encore supportée</string>
+    <string name="pref_category_engagement_notifications">Notifications d\'utilisation</string>
+    <string name="pref_up_long_summary">En agissant en tant que distributeur UnifiedPush, la connexion XMPP persistante, fiable et économique en batterie sera utilisée pour communiquer avec d\'autres applications compatibles comme Tusky, Ltt.rs, FluffyChat et d\'autres encore.</string>
+    <string name="pref_fullscreen_notification">Notifications en plein écran</string>
+    <string name="pref_fullscreen_notification_summary">Autoriser cette application à afficher une notification en plein écran lors d\'un appel entrant lorsque l\'appareil est verrouillé.</string>
+    <string name="pref_backup_summary">Créer des sauvegardes ponctuelles ou récurrentes</string>
+    <string name="title_activity_share_with">Partager avec…</string>
+    <string name="pref_use_colorful_bubbles">Bulles de conversation colorées</string>
+    <string name="pref_use_colorful_bubbles_summary">Afficher un fond différent pour distinguer les messages envoyés et reçus</string>
+    <string name="pref_dynamic_colors">Couleurs dynamiques</string>
+    <string name="pref_dynamic_colors_summary">Couleurs systèmes (Material You)</string>
+    <string name="channel_discover_opt_in_message">La découverte de canaux utilise un service de tierce partie appelé <a href=https://search.jabber.network>search.jabber.network</a>.<br><br> Utiliser cette fonctionnalité va transmettre votre adresse IP et votre recherche à ce service. Voir leur <a href=https://search.jabber.network/privacy>Politique de confidentialité</a> pour plus d\'informations.</string>
+    <string name="action_archive_chat">Archiver la conversation</string>
+    <string name="archive_this_chat">Archiver cette conversation</string>
+    <string name="send_encrypted_message">Envoyer un message chiffré</string>
+    <string name="title_undo_swipe_out_chat">Conversation archivée</string>
+    <string name="switch_to_chat">Se rendre à la conversation</string>
+    <string name="contact_uses_unverified_keys">Votre contact utilise un appareil qui n\'est pas encore vérifié. Scannez son QR code pour effectuer une vérification et éviter une attaque de l\'homme du milieu.</string>
+    <string name="start_chat">Discuter</string>
+    <string name="no_certificate_selected">Aucun certificat client sélectionné !</string>
+    <string name="pref_summary_appearance">Thème, couleurs, captures d\'écran, saisie</string>
+    <string name="pref_title_security">Sécurité</string>
+    <string name="unified_push_summary">Relai de notifications pour les applications de tierce partie compatibles avec UnifiedPush</string>
+    <string name="notifications">Notifications</string>
+    <string name="pref_attachments_summary">Taille de fichier, compression des images, qualité des vidéos</string>
+    <string name="pref_notifications_summary">Période sans notifications, sonnerie, vibration, inconnus</string>
+    <string name="pref_category_sending">Envoi</string>
+    <string name="pref_category_receiving">Réception</string>
+    <string name="pref_automatic_download">Téléchargement automatique</string>
+    <string name="appearance">Apparence</string>
+    <string name="pref_category_server_connection">Connection au serveur</string>
+    <string name="pref_privacy_summary">Notifications d\'écriture, dernière connexion, disponibilité</string>
+    <string name="pref_connection_summary">Nom d\'hôte et port, Tor</string>
+    <string name="pref_connection_summary_w_cd">Nom d\'hôte et port, Tor et découverte des canaux</string>
+    <string name="pref_category_application">Application</string>
+    <string name="pref_category_interaction">Interaction</string>
+    <string name="pref_category_on_this_device">Sur l\'appareil</string>
+    <string name="pref_accept_invites_from_strangers">Invitations d\'inconnus</string>
+    <string name="pref_accept_invites_from_strangers_summary">Accepter les invitations aux conversations de groupes provenant d\'inconnus</string>
+    <string name="pref_large_font">Grande police</string>
+    <string name="pref_large_font_summary">Augmenter la taille de la police dans les bulles de message</string>
+</resources>
  
  
  
    
    @@ -989,7 +989,6 @@
     <string name="outgoing_call_timestamp">Chamada saínte · %s</string>
     <string name="delete_from_server">Eliminar a conta no servidor</string>
     <string name="could_not_delete_account_from_server">Non se puido eliminar a conta no servidor</string>
-    <string name="save_as_group_chat">Gardar como chat en grupo</string>
     <string name="search_group_chats">Buscar chats en grupo</string>
     <string name="group_chats">Chats en grupo</string>
     <string name="restore_warning_continued">Non intentes restablecer unha copia de apoio que non tiveses creado ti!</string>
@@ -1023,7 +1022,7 @@
     <string name="action_archive_chat">Arquivar conversa</string>
     <string name="title_activity_new_chat">Novo chat</string>
     <string name="start_chat">Inciar chat</string>
-    <string name="archive_this_chat">Arquivar este chat</string>
+    <string name="archive_this_chat">Eliminar o chat</string>
     <string name="welcome_header">Únete á Conversa</string>
     <string name="switch_to_chat">Cambiar ao chat</string>
     <string name="no_certificate_selected">Sen certificado cliente seleccionado!</string>
@@ -1066,4 +1065,10 @@
     <string name="send_encrypted_message">Enviar mensaxe cifrada</string>
     <string name="pref_large_font">Letra grande</string>
     <string name="pref_large_font_summary">Aumentar o tamaño da letra das mensaxes</string>
+    <string name="pref_backup_recurring">Copia de apoio regular</string>
+    <string name="unsupported_operation">Operación sen soporte</string>
+    <string name="pref_fullscreen_notification">Notificacións en pantalla completa</string>
+    <string name="pref_fullscreen_notification_summary">Permitir que a app mostre a notificación de chamada entrante a pantalla completa cando o dispositivo está bloqueado.</string>
+    <string name="pref_backup_summary">Crear única, Programar recurrentes</string>
+    <string name="pref_create_backup_one_off_summary">Crear unha copia de apoio</string>
 </resources>
  
  
  
    
    @@ -1002,7 +1002,6 @@
     <string name="delete_from_server">Rimuovi profilo dal server</string>
     <string name="could_not_delete_account_from_server">Impossibile eliminare il profilo dal server</string>
     <string name="group_chats">Chat di gruppo</string>
-    <string name="save_as_group_chat">Salva come chat di gruppo</string>
     <string name="search_group_chats">Cerca chat di gruppo</string>
     <string name="restore_warning_continued">Non tentare di ripristinare dei backup che non hai creato te stesso!</string>
     <string name="outdated_backup_file_format">Stai tentando di importare un formato di file di backup obsoleto</string>
  
  
  
    
    @@ -961,7 +961,7 @@
     <string name="reject_switch_to_video">ビデオ通話を拒否</string>
     <string name="incoming_call_duration_timestamp">着信中の通話 (%s) · %s</string>
     <string name="pref_up_push_account_title">XMPPアカウント</string>
-    <string name="group_chats">グループ</string>
+    <string name="group_chats">グループチャット</string>
     <string name="outdated_backup_file_format">選択したファイルは、旧式のファイル形式ので復元できません</string>
     <string name="search_group_chats">グループを検索</string>
     <string name="outgoing_call_duration_timestamp">発信中の通話 (%s) · %s</string>
@@ -976,7 +976,6 @@
     <string name="no_account_deactivated">なし(無効)</string>
     <string name="decline">拒否</string>
     <string name="pref_up_push_server_title">Pushサーバー</string>
-    <string name="save_as_group_chat">グループチャットとして保存</string>
     <string name="unified_push_distributor">UnifiedPushディストリビューター</string>
     <string name="report_spam">スパムを報告</string>
     <string name="pref_up_push_account_summary">Pushメッセージを受信する際に経由するアカウント。</string>
@@ -1037,4 +1036,12 @@
     <string name="pref_use_colorful_bubbles_summary">送受信メッセージの個別の背景色</string>
     <string name="pref_large_font_summary">メッセージの吹き出しのフォントサイズを大きくする</string>
     <string name="pref_large_font">大きなフォント</string>
+    <string name="title_activity_share_with">…で共有</string>
+    <string name="pref_dynamic_colors">ダイナミックカラー</string>
+    <string name="detect_mim">談話室束縛が必要です</string>
+    <string name="detect_mim_summary">談話室束縛はいくつかの中間機攻撃を検知できます</string>
+    <string name="barcode_does_not_contain_fingerprints_for_this_chat">バーコードにはこの会話の指紋が含まれていません。</string>
+    <string name="pref_fullscreen_notification">全画面通知</string>
+    <string name="pref_fullscreen_notification_summary">端末がロックされているとき、このアプリが全画面を占める着信通知を表示することを許可する。</string>
+    <string name="unified_push_summary">UnifiedPush互換サードパーティアプリの通知中継</string>
 </resources>
  
  
  
    
    @@ -1021,7 +1021,6 @@
     <string name="could_not_delete_account_from_server">Nie można usunąć konta z serwera</string>
     <string name="search_group_chats">Przeszukaj rozmowy grupowe</string>
     <string name="group_chats">Rozmowy grupowe</string>
-    <string name="save_as_group_chat">Zapisz jako rozmowę grupową</string>
     <string name="restore_warning_continued">Nie próbuj przywracać kopii zapasowych, których nie utworzono samodzielnie!</string>
     <string name="outdated_backup_file_format">Próbujesz zaimportować plik kopii zapasowej o przestarzałym formacie</string>
     <string name="audiobook">Audiobook</string>
@@ -1096,4 +1095,10 @@
     <string name="send_encrypted_message">Wyślij zaszyfrowaną wiadomość</string>
     <string name="welcome_header">Dołącz do rozmowy</string>
     <string name="channel_discover_opt_in_message">Odkrywanie kanałów używa usługi podmiotu trzeciego nazywanej <a href=https://search.jabber.network>search.jabber.network</a>.<br><br>Używanie tej funkcjonalności spowoduje wysłanie twojego adresu IP oraz kryteriów wyszukiwania. Sprawdź ich <a href=https://search.jabber.network/privacy>politykę prywatności</a> aby uzyskać więcej informacji.</string>
+    <string name="pref_backup_recurring">Regularna kopia zapasowa</string>
+    <string name="pref_backup_summary">Utwórz teraz, zaplanuj regularną</string>
+    <string name="pref_create_backup_one_off_summary">Utwórz teraz kopię zapasową</string>
+    <string name="pref_fullscreen_notification">Pełnoekranowe powiadomienia</string>
+    <string name="unsupported_operation">Nieobsługiwana operacja</string>
+    <string name="pref_fullscreen_notification_summary">Pozwól tej aplikacji na pokazywanie powiadomień o przychodzącym połączeniu, które zajmują cały ekran gdy urządzenie jest zablokowane.</string>
 </resources>
  
  
  
    
    @@ -1007,7 +1007,6 @@
     <string name="could_not_delete_account_from_server">Nu s-a putut șterge contul de pe server</string>
     <string name="delete_from_server">Șterge contul de pe server</string>
     <string name="group_chats">Discuții de grup</string>
-    <string name="save_as_group_chat">Salvare ca discuție de grup</string>
     <string name="search_group_chats">Caută discuții de grup</string>
     <string name="restore_warning_continued">Nu încercați să restaurați copii de rezervă pe care nu le-ați creat personal!</string>
     <string name="outdated_backup_file_format">Încercați să importați un fișier copie de rezervă format vechi</string>
@@ -1038,7 +1037,7 @@
     <string name="pref_dynamic_colors">Culori dinamice</string>
     <string name="pref_dynamic_colors_summary">Culori de sistem (Material You)</string>
     <string name="action_archive_chat">Arhivează discuția</string>
-    <string name="archive_this_chat">Arhivează această discuție</string>
+    <string name="archive_this_chat">Apoi șterge și discuția</string>
     <string name="title_undo_swipe_out_chat">Discuție arhivată</string>
     <string name="channel_discover_opt_in_message">Descoperirea de canale publice folosește un serviciu terț numit <a href=https://search.jabber.network>search.jabber.network</a>.<br><br>Folosind această funcție se va transmite adresa dumneavoastră IP și cuvintele căutate către acest serviciu. Pentru mai multe informații citiți <a href=https://search.jabber.network/privacy>Politica de confidențialitate</a> a serviciului.</string>
     <string name="switch_to_chat">Treci la discuție</string>
@@ -1083,4 +1082,10 @@
     <string name="send_encrypted_message">Trimite mesaj criptat</string>
     <string name="pref_large_font">Font mare</string>
     <string name="pref_large_font_summary">Mărește fontul pentru textul din mesaje</string>
+    <string name="pref_backup_summary">Creează o dată, Programează recurent</string>
+    <string name="pref_create_backup_one_off_summary">Creați o copie de rezervă unică</string>
+    <string name="pref_backup_recurring">Copie de rezervă recurentă</string>
+    <string name="pref_fullscreen_notification">Notificări pe tot ecranul</string>
+    <string name="unsupported_operation">Operațiune neacceptată</string>
+    <string name="pref_fullscreen_notification_summary">Atunci când dispozitivul este blocat permite aplicației să arate notificările apelurilor pe tot ecranul.</string>
 </resources>
  
  
  
    
    @@ -994,7 +994,6 @@
     <string name="decline">Отклонить</string>
     <string name="could_not_delete_account_from_server">Невозможно удалить учётную запись на сервере</string>
     <string name="delete_from_server">Удалить учётную запись на сервере</string>
-    <string name="save_as_group_chat">Сохранить как групповую беседу</string>
     <string name="pref_autojoin">Синхронизировать закладки</string>
     <string name="pref_autojoin_summary">Устанавливать флаг \"автоприсоединение\" при входе в- и выходе из MUC, и реагировать на изменения от других клиентов.</string>
     <string name="search_group_chats">Поиск по групповым беседам</string>
  
  
  
    
    @@ -978,7 +978,6 @@
     <string name="jabber_network">jabber.network</string>
     <string name="search_group_chats">kërkoni në fjalosje grupesh</string>
     <string name="group_chats">Fjalosje në grup</string>
-    <string name="save_as_group_chat">Ruaje si fjalosjeje grupi</string>
     <string name="unverified_devices">Po përdorni pajisje të paverifikuara. Që të kryhet verifikimi dhe të pengohen sulme MITM, skanoni Kodin QR në pajisjet tuaja të tjera.</string>
     <string name="title_activity_block_list">Listë bllokimesh</string>
     <string name="account_state_logged_out">I dalë</string>
@@ -1078,4 +1077,8 @@
     <string name="pref_accept_invites_from_strangers_summary">Prano ftesa për fjalosje në grup nga të panjohur</string>
     <string name="pref_large_font">Shkronja të mëdha</string>
     <string name="pref_large_font_summary">Rrit madhësi shkronja në flluska mesazhesh</string>
+    <string name="pref_fullscreen_notification">Njoftime sa krejt ekrani</string>
+    <string name="pref_fullscreen_notification_summary">Lejojeni këtë aplikacion të shfaqë njoftime për thirrje ardhëse që zënë krejt ekranin, kur pajisja është e kyçur.</string>
+    <string name="unsupported_operation">Veprim i pambuluar</string>
+    <string name="pref_backup_recurring">Kopjeruajtje ripërsëritëse</string>
 </resources>
  
  
  
    
    @@ -1016,7 +1016,6 @@
     <string name="account_state_logged_out">Utloggad</string>
     <string name="unverified_devices">Du använder overifierade enheter. Skanna QR-kod på dina andra enheter, för att utföra en verifiering och för att förhindra aktiva MITM-attacker.</string>
     <string name="outgoing_call_timestamp">Utgående samtal · %s</string>
-    <string name="save_as_group_chat">Spara som gruppchatt</string>
     <string name="audiobook">Ljudbok</string>
     <string name="report_spam">Rapportera spam</string>
     <string name="restore_warning_continued">Försök inte att återställa säkerhetskopior som du inte har skapat själv!</string>
  
  
  
    
    @@ -1017,7 +1017,6 @@
     <string name="rtp_state_content_add_video">Görüntülü aramaya geçilsin mi?</string>
     <string name="pref_allow_screenshots_summary">Uygulama değiştiricide içeriği göster ve ekran görüntüsü almaya izin ver</string>
     <string name="remove_bookmark_and_close">%s için yer imini kaldırmak ve sohbeti arşivlemek ister misiniz?</string>
-    <string name="save_as_group_chat">Grup olarak kaydet</string>
     <string name="audiobook">Sesli kitap</string>
     <string name="send_encrypted_message">Şifrelenmiş ileti gönder</string>
     <string name="group_chats">Gruplar</string>
  
  
  
    
    @@ -981,7 +981,6 @@
     <string name="omemo_fingerprint_x509_selected_message">Цифровий підпис v\\OMEMO (джерело повідомлення)</string>
     <string name="continue_btn">Продовжити</string>
     <string name="group_chats">Групові чати</string>
-    <string name="save_as_group_chat">Зберегти як групу</string>
     <string name="pref_autojoin">Синхронізувати закладки</string>
     <string name="conference_technical_problems">Ви залишили цю групу з технічних причин</string>
     <string name="vector_graphic">векторна графіка</string>
@@ -1073,7 +1072,7 @@
     <string name="pref_use_colorful_bubbles">Кольорові бульбашки в розмовах</string>
     <string name="title_activity_new_chat">Нова розмова</string>
     <string name="action_archive_chat">Архівувати розмову</string>
-    <string name="archive_this_chat">Архівувати цю розмову</string>
+    <string name="archive_this_chat">Після цього видалити розмову</string>
     <string name="title_undo_swipe_out_chat">Розмову заархівовано</string>
     <string name="switch_to_chat">Перемкнути на чат</string>
     <string name="start_chat">Почати розмову</string>
@@ -1112,4 +1111,10 @@
     <string name="send_encrypted_message">Зашифроване повідомлення</string>
     <string name="pref_large_font">Великий шрифт</string>
     <string name="pref_large_font_summary">Збільшити розмір шрифту повідомлень</string>
+    <string name="pref_fullscreen_notification">Повноекранні сповіщення</string>
+    <string name="pref_backup_recurring">Регулярне резервне копіювання</string>
+    <string name="unsupported_operation">Операція не підтримується</string>
+    <string name="pref_fullscreen_notification_summary">Показувати сповіщення про вхідні виклики на весь екран, коли пристрій заблоковано.</string>
+    <string name="pref_backup_summary">Створити резервну копію, запланувати повторюване резервування</string>
+    <string name="pref_create_backup_one_off_summary">Створити резервну копію</string>
 </resources>
  
  
  
    
    @@ -957,7 +957,6 @@
     <string name="pref_up_push_server_title">Máy chủ đẩy</string>
     <string name="no_account_deactivated">Không tồn tại (đã vô hiệu hóa)</string>
     <string name="decline">Từ chối</string>
-    <string name="save_as_group_chat">Lưu thành nhóm trò chuyện</string>
     <string name="conference_technical_problems">Bạn đã rời khỏi nhóm trò chuyện này vì lý do kỹ thuật</string>
     <string name="verifying_omemo_keys_trusted_source_account">Bạn chuẩn bị xác minh các khoá OMEMO cho tài khoản của chính bạn. Việc làm này chỉ an toàn nếu bạn đã đến liên kết này từ một nguồn đáng tin tưởng, chỉ có bạn mới có thể cho ra liên kết này trước đó.</string>
     <string name="continue_btn">Tiếp tục</string>
  
  
  
    
    @@ -530,9 +530,9 @@
     <string name="always">始终</string>
     <string name="large_images_only">仅限大图片</string>
     <string name="battery_optimizations_enabled">电池优化已启用</string>
-    <string name="battery_optimizations_enabled_explained">您的设备正在为 %1$s 使用重度电池优化,可能会导致通知延迟甚至消息丢失。
+    <string name="battery_optimizations_enabled_explained">您的设备正在对 %1$s 使用重度电池优化,可能会导致通知延迟甚至消息丢失。
 \n建议禁用此设置。</string>
-    <string name="battery_optimizations_enabled_dialog">您的设备正在为 %1$s 使用重度电池优化,可能会导致通知延迟甚至消息丢失。
+    <string name="battery_optimizations_enabled_dialog">您的设备正在对 %1$s 使用重度电池优化,可能会导致通知延迟甚至消息丢失。
 \n
 \n现在将要求您禁用此设置。</string>
     <string name="disable">禁用</string>
@@ -562,7 +562,7 @@
     <string name="presence_xa">没空</string>
     <string name="presence_dnd">忙碌</string>
     <string name="secure_password_generated">已生成安全密码</string>
-    <string name="device_does_not_support_battery_op">设备不支持退出电池优化</string>
+    <string name="device_does_not_support_battery_op">您的设备不支持选择退出电池优化</string>
     <string name="registration_please_wait">注册失败:稍后再试</string>
     <string name="registration_password_too_weak">注册失败:密码太弱</string>
     <string name="choose_participants">选择参与者</string>
@@ -993,7 +993,6 @@
     <string name="outgoing_call_timestamp">去电 · %s</string>
     <string name="could_not_delete_account_from_server">无法从服务器删除账号</string>
     <string name="group_chats">群聊</string>
-    <string name="save_as_group_chat">保存为群聊</string>
     <string name="search_group_chats">搜索群聊</string>
     <string name="delete_from_server">从服务器移除账号</string>
     <string name="restore_warning_continued">请勿尝试恢复您尚未自行创建的备份!</string>
@@ -1028,7 +1027,7 @@
     <string name="pref_dynamic_colors">动态色彩</string>
     <string name="pref_dynamic_colors_summary">系统色彩 (Material You)</string>
     <string name="title_activity_new_chat">新聊天</string>
-    <string name="archive_this_chat">存档此聊天</string>
+    <string name="archive_this_chat">之后删除聊天</string>
     <string name="title_undo_swipe_out_chat">聊天已存档</string>
     <string name="switch_to_chat">切换到聊天</string>
     <string name="action_archive_chat">存档聊天</string>
@@ -1070,4 +1069,10 @@
     <string name="send_encrypted_message">发送加密消息</string>
     <string name="pref_large_font">大字体</string>
     <string name="pref_large_font_summary">增加消息气泡中的字体大小</string>
+    <string name="pref_create_backup_one_off_summary">创建一次性备份</string>
+    <string name="pref_backup_recurring">定期备份</string>
+    <string name="pref_fullscreen_notification">全屏通知</string>
+    <string name="pref_fullscreen_notification_summary">当设备锁定时,允许此应用显示占据全屏的来电通知。</string>
+    <string name="unsupported_operation">不支持的操作</string>
+    <string name="pref_backup_summary">创建一次性、计划定期备份</string>
 </resources>
  
  
  
    
    @@ -994,7 +994,6 @@
     <string name="could_not_delete_account_from_server">無法從伺服器刪除帳戶</string>
     <string name="search_group_chats">搜尋群組聊天</string>
     <string name="group_chats">群組聊天</string>
-    <string name="save_as_group_chat">儲存為群組聊天</string>
     <string name="this_account_is_logged_out">您已登出此帳戶</string>
     <string name="log_in">登入</string>
     <string name="hide_notification">隱藏通知</string>
  
  
  
    
    @@ -89,7 +89,7 @@
     <string name="clear_histor_msg">Do you want to delete all messages in this chat?\n\n<b>Warning:</b> This will not influence messages stored on other devices or servers.</string>
     <string name="delete_file_dialog">Delete file</string>
     <string name="delete_file_dialog_msg">Are you sure you want to delete this file?\n\n<b>Warning:</b> This will not delete copies of this file that are stored on other devices or servers. </string>
-    <string name="archive_this_chat">Archive this chat</string>
+    <string name="archive_this_chat">Delete chat afterwards</string>
     <string name="choose_presence">Choose device</string>
     <string name="send_unencrypted_message">Send clear text message</string>
     <string name="send_message">Send message</string>
@@ -240,7 +240,6 @@
     <string name="channel_full_jid_example">channel@conference.example.com/nick</string>
     <string name="channel_bare_jid_example">channel@conference.example.com</string>
     <string name="save_as_bookmark">Save as bookmark</string>
-    <string name="save_as_group_chat">Save as group chat</string>
     <string name="delete_bookmark">Delete bookmark</string>
     <string name="destroy_room">Destroy group chat</string>
     <string name="destroy_channel">Destroy channel</string>