Copione merged onto master

master
blallo 2020-09-26 00:00:48 +02:00
commit 0ccd93f38d
66 changed files with 296 additions and 197 deletions

View File

@ -80,8 +80,8 @@ protobuf {
}
}
def canonicalVersionCode = 710
def canonicalVersionName = "4.72.1"
def canonicalVersionCode = 711
def canonicalVersionName = "4.72.2"
def postFixSize = 10
def abiPostFix = ['universal' : 0,

View File

@ -126,6 +126,11 @@ public class WebRtcCallActivity extends AppCompatActivity implements SafetyNumbe
if (!isInPipMode()) {
EventBus.getDefault().unregister(this);
}
CallParticipantsState state = viewModel.getCallParticipantsState().getValue();
if (state != null && state.getCallState() == WebRtcViewModel.State.CALL_PRE_JOIN) {
finish();
}
}
@Override

View File

@ -46,7 +46,8 @@ import static org.thoughtcrime.securesms.database.MentionUtil.MENTION_STARTER;
public class ComposeText extends EmojiEditText {
private CharSequence combinedHint;
private CharSequence hint;
private SpannableString subHint;
private MentionRendererDelegate mentionRendererDelegate;
private MentionValidatorWatcher mentionValidatorWatcher;
@ -84,8 +85,14 @@ public class ComposeText extends EmojiEditText {
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!TextUtils.isEmpty(combinedHint)) {
setHint(combinedHint);
if (!TextUtils.isEmpty(hint)) {
if (!TextUtils.isEmpty(subHint)) {
setHint(new SpannableStringBuilder().append(ellipsizeToWidth(hint))
.append("\n")
.append(ellipsizeToWidth(subHint)));
} else {
setHint(ellipsizeToWidth(hint));
}
}
}
@ -143,18 +150,24 @@ public class ComposeText extends EmojiEditText {
}
public void setHint(@NonNull String hint, @Nullable CharSequence subHint) {
if (subHint != null) {
Spannable subHintSpannable = new SpannableString(subHint);
subHintSpannable.setSpan(new RelativeSizeSpan(0.5f), 0, subHintSpannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
this.hint = hint;
combinedHint = new SpannableStringBuilder().append(ellipsizeToWidth(hint))
.append("\n")
.append(ellipsizeToWidth(subHintSpannable));
if (subHint != null) {
this.subHint = new SpannableString(subHint);
this.subHint.setSpan(new RelativeSizeSpan(0.5f), 0, subHint.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
} else {
combinedHint = ellipsizeToWidth(hint);
this.subHint = null;
}
super.setHint(combinedHint);
if (this.subHint != null) {
super.setHint(new SpannableStringBuilder().append(ellipsizeToWidth(this.hint))
.append("\n")
.append(ellipsizeToWidth(this.subHint)));
} else {
super.setHint(ellipsizeToWidth(this.hint));
}
super.setHint(hint);
}
public void appendInvite(String invite) {

View File

@ -1991,7 +1991,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
});
composeText.setMentionQueryChangedListener(query -> {
if (getRecipient().isPushV2Group()) {
if (getRecipient().isPushV2Group() && getRecipient().isActiveGroup()) {
if (!mentionsSuggestions.resolved()) {
mentionsSuggestions.get();
}
@ -2000,7 +2000,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
});
composeText.setMentionValidator(annotations -> {
if (!getRecipient().isPushV2Group()) {
if (!getRecipient().isPushV2Group() || !getRecipient().isActiveGroup()) {
return annotations;
}
@ -3334,7 +3334,6 @@ public class ConversationActivity extends PassphraseRequiredActivity
long expiresIn = recipient.get().getExpireMessages() * 1000L;
int subscriptionId = sendButton.getSelectedTransport().getSimSubscriptionId().or(-1);
boolean initiating = threadId == -1;
QuoteModel quote = inputPanel.getQuote().orNull();
SlideDeck slideDeck = new SlideDeck();
if (MediaUtil.isGif(contentType)) {
@ -3348,7 +3347,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
sendMediaMessage(isSmsForced(),
"",
slideDeck,
quote,
null,
Collections.emptyList(),
Collections.emptyList(),
composeText.getMentions(),
@ -3356,7 +3355,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
false,
subscriptionId,
initiating,
true);
false);
}
private class UnverifiedDismissedListener implements UnverifiedBannerView.DismissListener {

View File

@ -84,6 +84,8 @@ class ConversationDataSource extends PositionalDataSource<ConversationMessage> {
}
}
long mentionStart = System.currentTimeMillis();
mentionHelper.fetchMentions(context);
if (!isInvalid()) {
@ -94,7 +96,7 @@ class ConversationDataSource extends PositionalDataSource<ConversationMessage> {
.toList();
callback.onResult(items, params.requestedStartPosition, result.getTotal());
Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.requestedStartPosition + ", requestedSize: " + params.requestedLoadSize + ", actualSize: " + result.getItems().size() + ", totalCount: " + result.getTotal());
Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms (mentions: " + (System.currentTimeMillis() - mentionStart) + " ms) | thread: " + threadId + ", start: " + params.requestedStartPosition + ", requestedSize: " + params.requestedLoadSize + ", actualSize: " + result.getItems().size() + ", totalCount: " + result.getTotal());
} else {
Log.d(TAG, "[Initial Load] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.requestedStartPosition + ", requestedSize: " + params.requestedLoadSize + ", totalCount: " + totalCount + " -- invalidated");
}
@ -116,6 +118,8 @@ class ConversationDataSource extends PositionalDataSource<ConversationMessage> {
}
}
long mentionStart = System.currentTimeMillis();
mentionHelper.fetchMentions(context);
List<ConversationMessage> items = Stream.of(records)
@ -123,7 +127,7 @@ class ConversationDataSource extends PositionalDataSource<ConversationMessage> {
.toList();
callback.onResult(items);
Log.d(TAG, "[Update] " + (System.currentTimeMillis() - start) + " ms | thread: " + threadId + ", start: " + params.startPosition + ", size: " + params.loadSize + (isInvalid() ? " -- invalidated" : ""));
Log.d(TAG, "[Update] " + (System.currentTimeMillis() - start) + " ms (mentions: " + (System.currentTimeMillis() - mentionStart) + " ms) | thread: " + threadId + ", start: " + params.startPosition + ", size: " + params.loadSize + (isInvalid() ? " -- invalidated" : ""));
}
private static class MentionHelper {

View File

@ -1521,7 +1521,7 @@ public class ConversationItem extends LinearLayout implements BindableConversati
@Override
public void onClick(@NonNull View widget) {
if (eventListener != null && !Recipient.resolved(mentionedRecipientId).isLocalNumber()) {
if (eventListener != null) {
VibrateUtil.vibrateTick(context);
eventListener.onGroupMemberClicked(mentionedRecipientId, conversationRecipient.get().requireGroupId());
}

View File

@ -30,6 +30,7 @@ public class MentionsPickerFragment extends LoggingFragment {
private View bottomDivider;
private BottomSheetBehavior<View> behavior;
private MentionsPickerViewModel viewModel;
private Runnable lockSheetAfterListUpdate = () -> behavior.setHideable(false);
@Override
public @Nullable View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -62,6 +63,7 @@ public class MentionsPickerFragment extends LoggingFragment {
}
private void initializeBehavior() {
behavior.setHideable(true);
behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@ -69,6 +71,7 @@ public class MentionsPickerFragment extends LoggingFragment {
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
adapter.submitList(Collections.emptyList());
showDividers(false);
} else {
showDividers(true);
}
@ -109,9 +112,10 @@ public class MentionsPickerFragment extends LoggingFragment {
if (isShowing) {
list.scrollToPosition(0);
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
list.post(() -> behavior.setHideable(false));
list.post(lockSheetAfterListUpdate);
showDividers(true);
} else {
list.getHandler().removeCallbacks(lockSheetAfterListUpdate);
behavior.setHideable(true);
behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}

View File

@ -38,8 +38,8 @@ public class MentionsPickerViewModel extends ViewModel {
LiveData<Recipient> recipient = Transformations.switchMap(liveRecipient, LiveRecipient::getLiveData);
LiveData<List<RecipientId>> fullMembers = Transformations.distinctUntilChanged(LiveDataUtil.mapAsync(recipient, mentionsPickerRepository::getMembers));
LiveData<Query> query = Transformations.distinctUntilChanged(liveQuery);
LiveData<MentionQuery> mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m));
LiveData<MentionQuery> mentionQuery = LiveDataUtil.combineLatest(liveQuery, fullMembers, (q, m) -> new MentionQuery(q.query, m));
this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).<MappingModel<?>>map(MentionViewState::new).toList());
}

View File

@ -437,7 +437,7 @@ public class AttachmentDatabase extends Database {
public void trimAllAbandonedAttachments() {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
String selectAllMmsIds = "SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME;
String selectDataInUse = "SELECT DISTINCT " + DATA + " FROM " + TABLE_NAME + " WHERE " + QUOTE + " = 0 AND " + MMS_ID + " IN (" + selectAllMmsIds + ")";
String selectDataInUse = "SELECT DISTINCT " + DATA + " FROM " + TABLE_NAME + " WHERE " + QUOTE + " = 0 AND (" + MMS_ID + " IN (" + selectAllMmsIds + ") OR " + MMS_ID + " = " + PREUPLOAD_MESSAGE_ID + ")";
String where = MMS_ID + " NOT IN (" + selectAllMmsIds + ") AND " + DATA + " NOT IN (" + selectDataInUse + ")";
db.delete(TABLE_NAME, where, null);
@ -1209,87 +1209,94 @@ public class AttachmentDatabase extends Database {
throws MmsException
{
Log.d(TAG, "Inserting attachment for mms id: " + mmsId);
SQLiteDatabase database = databaseHelper.getWritableDatabase();
SQLiteDatabase database = databaseHelper.getWritableDatabase();
DataInfo dataInfo = null;
long uniqueId = System.currentTimeMillis();
database.beginTransaction();
try {
DataInfo dataInfo = null;
long uniqueId = System.currentTimeMillis();
if (attachment.getUri() != null) {
dataInfo = setAttachmentData(attachment.getUri(), null);
Log.d(TAG, "Wrote part to file: " + dataInfo.file.getAbsolutePath());
}
Attachment template = attachment;
if (dataInfo != null && dataInfo.hash != null) {
Attachment possibleTemplate = findTemplateAttachment(dataInfo.hash);
if (possibleTemplate != null) {
Log.i(TAG, "Found a duplicate attachment upon insertion. Using it as a template.");
template = possibleTemplate;
if (attachment.getUri() != null) {
dataInfo = setAttachmentData(attachment.getUri(), null);
Log.d(TAG, "Wrote part to file: " + dataInfo.file.getAbsolutePath());
}
}
boolean useTemplateUpload = template.getUploadTimestamp() > attachment.getUploadTimestamp() &&
template.getTransferState() == TRANSFER_PROGRESS_DONE &&
template.getTransformProperties().shouldSkipTransform() &&
!attachment.getTransformProperties().isVideoEdited();
Attachment template = attachment;
ContentValues contentValues = new ContentValues();
contentValues.put(MMS_ID, mmsId);
contentValues.put(CONTENT_TYPE, template.getContentType());
contentValues.put(TRANSFER_STATE, attachment.getTransferState());
contentValues.put(UNIQUE_ID, uniqueId);
contentValues.put(CDN_NUMBER, useTemplateUpload ? template.getCdnNumber() : attachment.getCdnNumber());
contentValues.put(CONTENT_LOCATION, useTemplateUpload ? template.getLocation() : attachment.getLocation());
contentValues.put(DIGEST, useTemplateUpload ? template.getDigest() : attachment.getDigest());
contentValues.put(CONTENT_DISPOSITION, useTemplateUpload ? template.getKey() : attachment.getKey());
contentValues.put(NAME, useTemplateUpload ? template.getRelay() : attachment.getRelay());
contentValues.put(FILE_NAME, StorageUtil.getCleanFileName(attachment.getFileName()));
contentValues.put(SIZE, template.getSize());
contentValues.put(FAST_PREFLIGHT_ID, attachment.getFastPreflightId());
contentValues.put(VOICE_NOTE, attachment.isVoiceNote() ? 1 : 0);
contentValues.put(BORDERLESS, attachment.isBorderless() ? 1 : 0);
contentValues.put(WIDTH, template.getWidth());
contentValues.put(HEIGHT, template.getHeight());
contentValues.put(QUOTE, quote);
contentValues.put(CAPTION, attachment.getCaption());
contentValues.put(UPLOAD_TIMESTAMP, useTemplateUpload ? template.getUploadTimestamp() : attachment.getUploadTimestamp());
if (attachment.getTransformProperties().isVideoEdited()) {
contentValues.putNull(VISUAL_HASH);
contentValues.put(TRANSFORM_PROPERTIES, attachment.getTransformProperties().serialize());
} else {
contentValues.put(VISUAL_HASH, getVisualHashStringOrNull(template));
contentValues.put(TRANSFORM_PROPERTIES, template.getTransformProperties().serialize());
}
if (dataInfo != null && dataInfo.hash != null) {
Attachment possibleTemplate = findTemplateAttachment(dataInfo.hash);
if (attachment.isSticker()) {
contentValues.put(STICKER_PACK_ID, attachment.getSticker().getPackId());
contentValues.put(STICKER_PACK_KEY, attachment.getSticker().getPackKey());
contentValues.put(STICKER_ID, attachment.getSticker().getStickerId());
contentValues.put(STICKER_EMOJI, attachment.getSticker().getEmoji());
}
if (possibleTemplate != null) {
Log.i(TAG, "Found a duplicate attachment upon insertion. Using it as a template.");
template = possibleTemplate;
}
}
if (dataInfo != null) {
contentValues.put(DATA, dataInfo.file.getAbsolutePath());
contentValues.put(SIZE, dataInfo.length);
contentValues.put(DATA_RANDOM, dataInfo.random);
boolean useTemplateUpload = template.getUploadTimestamp() > attachment.getUploadTimestamp() &&
template.getTransferState() == TRANSFER_PROGRESS_DONE &&
template.getTransformProperties().shouldSkipTransform() &&
!attachment.getTransformProperties().isVideoEdited();
ContentValues contentValues = new ContentValues();
contentValues.put(MMS_ID, mmsId);
contentValues.put(CONTENT_TYPE, template.getContentType());
contentValues.put(TRANSFER_STATE, attachment.getTransferState());
contentValues.put(UNIQUE_ID, uniqueId);
contentValues.put(CDN_NUMBER, useTemplateUpload ? template.getCdnNumber() : attachment.getCdnNumber());
contentValues.put(CONTENT_LOCATION, useTemplateUpload ? template.getLocation() : attachment.getLocation());
contentValues.put(DIGEST, useTemplateUpload ? template.getDigest() : attachment.getDigest());
contentValues.put(CONTENT_DISPOSITION, useTemplateUpload ? template.getKey() : attachment.getKey());
contentValues.put(NAME, useTemplateUpload ? template.getRelay() : attachment.getRelay());
contentValues.put(FILE_NAME, StorageUtil.getCleanFileName(attachment.getFileName()));
contentValues.put(SIZE, template.getSize());
contentValues.put(FAST_PREFLIGHT_ID, attachment.getFastPreflightId());
contentValues.put(VOICE_NOTE, attachment.isVoiceNote() ? 1 : 0);
contentValues.put(BORDERLESS, attachment.isBorderless() ? 1 : 0);
contentValues.put(WIDTH, template.getWidth());
contentValues.put(HEIGHT, template.getHeight());
contentValues.put(QUOTE, quote);
contentValues.put(CAPTION, attachment.getCaption());
contentValues.put(UPLOAD_TIMESTAMP, useTemplateUpload ? template.getUploadTimestamp() : attachment.getUploadTimestamp());
if (attachment.getTransformProperties().isVideoEdited()) {
contentValues.putNull(DATA_HASH);
contentValues.putNull(VISUAL_HASH);
contentValues.put(TRANSFORM_PROPERTIES, attachment.getTransformProperties().serialize());
} else {
contentValues.put(DATA_HASH, dataInfo.hash);
contentValues.put(VISUAL_HASH, getVisualHashStringOrNull(template));
contentValues.put(TRANSFORM_PROPERTIES, template.getTransformProperties().serialize());
}
if (attachment.isSticker()) {
contentValues.put(STICKER_PACK_ID, attachment.getSticker().getPackId());
contentValues.put(STICKER_PACK_KEY, attachment.getSticker().getPackKey());
contentValues.put(STICKER_ID, attachment.getSticker().getStickerId());
contentValues.put(STICKER_EMOJI, attachment.getSticker().getEmoji());
}
if (dataInfo != null) {
contentValues.put(DATA, dataInfo.file.getAbsolutePath());
contentValues.put(SIZE, dataInfo.length);
contentValues.put(DATA_RANDOM, dataInfo.random);
if (attachment.getTransformProperties().isVideoEdited()) {
contentValues.putNull(DATA_HASH);
} else {
contentValues.put(DATA_HASH, dataInfo.hash);
}
}
boolean notifyPacks = attachment.isSticker() && !hasStickerAttachments();
long rowId = database.insert(TABLE_NAME, null, contentValues);
AttachmentId attachmentId = new AttachmentId(rowId, uniqueId);
if (notifyPacks) {
notifyStickerPackListeners();
}
database.setTransactionSuccessful();
return attachmentId;
} finally {
database.endTransaction();
}
boolean notifyPacks = attachment.isSticker() && !hasStickerAttachments();
long rowId = database.insert(TABLE_NAME, null, contentValues);
AttachmentId attachmentId = new AttachmentId(rowId, uniqueId);
if (notifyPacks) {
notifyStickerPackListeners();
}
return attachmentId;
}
private @Nullable DatabaseAttachment findTemplateAttachment(@NonNull String dataHash) {

View File

@ -283,12 +283,12 @@ public class ThreadDatabase extends Database {
mmsSmsDatabase.deleteAbandonedMessages();
attachmentDatabase.trimAllAbandonedAttachments();
groupReceiptDatabase.deleteAbandonedRows();
attachmentDatabase.deleteAbandonedAttachmentFiles();
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
attachmentDatabase.deleteAbandonedAttachmentFiles();
notifyAttachmentListeners();
notifyStickerListeners();
@ -312,12 +312,12 @@ public class ThreadDatabase extends Database {
mmsSmsDatabase.deleteAbandonedMessages();
attachmentDatabase.trimAllAbandonedAttachments();
groupReceiptDatabase.deleteAbandonedRows();
attachmentDatabase.deleteAbandonedAttachmentFiles();
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
attachmentDatabase.deleteAbandonedAttachmentFiles();
notifyAttachmentListeners();
notifyStickerListeners();

View File

@ -91,7 +91,7 @@ public final class LeaveGroupDialog {
.setCancelable(true)
.setMessage(R.string.ConversationActivity_are_you_sure_you_want_to_leave_this_group)
.setPositiveButton(R.string.yes, (dialog, which) -> {
SimpleProgressDialog.DismissibleDialog progressDialog = SimpleProgressDialog.showDelayed(activity);
AlertDialog progressDialog = SimpleProgressDialog.show(activity);
SimpleTask.run(activity.getLifecycle(), this::leaveGroup, result -> {
progressDialog.dismiss();
handleLeaveGroupResult(result);

View File

@ -172,7 +172,7 @@ public final class PushDecryptMessageJob extends BaseJob {
return jobs;
} catch (ProtocolInvalidVersionException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.singletonList(new PushProcessMessageJob(PushProcessMessageJob.MessageState.INVALID_VERSION,
toExceptionMetadata(e),
messageId,
@ -180,7 +180,7 @@ public final class PushDecryptMessageJob extends BaseJob {
envelope.getTimestamp()));
} catch (ProtocolInvalidMessageException | ProtocolInvalidKeyIdException | ProtocolInvalidKeyException | ProtocolUntrustedIdentityException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.singletonList(new PushProcessMessageJob(PushProcessMessageJob.MessageState.CORRUPT_MESSAGE,
toExceptionMetadata(e),
messageId,
@ -188,7 +188,7 @@ public final class PushDecryptMessageJob extends BaseJob {
envelope.getTimestamp()));
} catch (ProtocolNoSessionException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.singletonList(new PushProcessMessageJob(PushProcessMessageJob.MessageState.NO_SESSION,
toExceptionMetadata(e),
messageId,
@ -196,7 +196,7 @@ public final class PushDecryptMessageJob extends BaseJob {
envelope.getTimestamp()));
} catch (ProtocolLegacyMessageException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.singletonList(new PushProcessMessageJob(PushProcessMessageJob.MessageState.LEGACY_MESSAGE,
toExceptionMetadata(e),
messageId,
@ -204,7 +204,7 @@ public final class PushDecryptMessageJob extends BaseJob {
envelope.getTimestamp()));
} catch (ProtocolDuplicateMessageException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.singletonList(new PushProcessMessageJob(PushProcessMessageJob.MessageState.DUPLICATE_MESSAGE,
toExceptionMetadata(e),
messageId,
@ -212,7 +212,7 @@ public final class PushDecryptMessageJob extends BaseJob {
envelope.getTimestamp()));
} catch (InvalidMetadataVersionException | InvalidMetadataMessageException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.emptyList();
} catch (SelfSendException e) {
@ -220,7 +220,7 @@ public final class PushDecryptMessageJob extends BaseJob {
return Collections.emptyList();
} catch (UnsupportedDataMessageException e) {
Log.w(TAG, e);
Log.w(TAG, String.valueOf(envelope.getTimestamp()), e);
return Collections.singletonList(new PushProcessMessageJob(PushProcessMessageJob.MessageState.UNSUPPORTED_DATA_MESSAGE,
toExceptionMetadata(e),
messageId,

View File

@ -458,37 +458,37 @@ public final class PushProcessMessageJob extends BaseJob {
switch (messageState) {
case INVALID_VERSION:
Log.w(TAG, "Handling invalid version");
Log.w(TAG, "Handling invalid version (" + timestamp + ")");
handleInvalidVersionMessage(e.sender, e.senderDevice, timestamp, smsMessageId);
break;
case CORRUPT_MESSAGE:
Log.w(TAG, "Handling corrupt message");
Log.w(TAG, "Handling corrupt message (" + timestamp + ")");
handleCorruptMessage(e.sender, e.senderDevice, timestamp, smsMessageId);
break;
case NO_SESSION:
Log.w(TAG, "Handling no session");
Log.w(TAG, "Handling no session (" + timestamp + ")");
handleNoSessionMessage(e.sender, e.senderDevice, timestamp, smsMessageId);
break;
case LEGACY_MESSAGE:
Log.w(TAG, "Handling legacy message");
Log.w(TAG, "Handling legacy message (" + timestamp + ")");
handleLegacyMessage(e.sender, e.senderDevice, timestamp, smsMessageId);
break;
case DUPLICATE_MESSAGE:
Log.w(TAG, "Handling duplicate message");
Log.w(TAG, "Handling duplicate message (" + timestamp + ")");
handleDuplicateMessage(e.sender, e.senderDevice, timestamp, smsMessageId);
break;
case UNSUPPORTED_DATA_MESSAGE:
Log.w(TAG, "Handling unsupported data message");
Log.w(TAG, "Handling unsupported data message (" + timestamp + ")");
handleUnsupportedDataMessage(e.sender, e.senderDevice, Optional.fromNullable(e.groupId), timestamp, smsMessageId);
break;
default:
throw new AssertionError("Not handled " + messageState);
throw new AssertionError("Not handled " + messageState + ". (" + timestamp + ")");
}
}

View File

@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.util.StringUtil;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.whispersystems.libsignal.util.guava.Optional;
import java.util.Arrays;
import java.util.Objects;
class EditProfileViewModel extends ViewModel {
@ -121,9 +122,9 @@ class EditProfileViewModel extends ViewModel {
repository.uploadProfile(profileName,
displayName,
!Objects.equals(oldDisplayName, displayName),
!Objects.equals(StringUtil.stripBidiProtection(oldDisplayName), displayName),
newAvatar,
oldAvatar != newAvatar,
!Arrays.equals(oldAvatar, newAvatar),
uploadResultConsumer);
}

View File

@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.recipients.ui.sharablegrouplink;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@ -19,6 +20,7 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.LiveGroup;
import org.thoughtcrime.securesms.recipients.ui.sharablegrouplink.qr.GroupLinkShareQrDialogFragment;
import org.thoughtcrime.securesms.sharing.ShareActivity;
import org.thoughtcrime.securesms.util.BottomSheetUtil;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.Util;
@ -68,8 +70,14 @@ public final class GroupLinkBottomSheetDialogFragment extends BottomSheetDialogF
return;
}
shareViaSignalButton.setOnClickListener(v -> dismiss()); // Todo [Alan] GV2 Add share within signal
shareViaSignalButton.setVisibility(View.GONE);
shareViaSignalButton.setOnClickListener(v -> {
Context context = requireContext();
Intent intent = new Intent(context, ShareActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, groupLink.getUrl());
context.startActivity(intent);
dismiss();
});
copyButton.setOnClickListener(v -> {
Context context = requireContext();

View File

@ -18,6 +18,7 @@ import androidx.lifecycle.ViewModelProviders;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
public final class ShareableGroupLinkDialogFragment extends DialogFragment {
@ -78,6 +79,8 @@ public final class ShareableGroupLinkDialogFragment extends DialogFragment {
View shareRow = view.findViewById(R.id.shareable_group_link_share_row);
View resetLinkRow = view.findViewById(R.id.shareable_group_link_reset_link_row);
View approveNewMembersRow = view.findViewById(R.id.shareable_group_link_approve_new_members_row);
View membersSectionHeader = view.findViewById(R.id.shareable_group_link_member_requests_section_header);
View descriptionRow = view.findViewById(R.id.shareable_group_link_display_row2);
Toolbar toolbar = view.findViewById(R.id.shareable_group_link_toolbar);
@ -87,6 +90,13 @@ public final class ShareableGroupLinkDialogFragment extends DialogFragment {
shareableGroupLinkSwitch.setChecked(groupLink.isEnabled());
approveNewMembersSwitch.setChecked(groupLink.isRequiresApproval());
shareableGroupLinkDisplay.setText(formatForFullWidthWrapping(groupLink.getUrl()));
ViewUtil.setEnabledRecursive(shareableGroupLinkDisplay, groupLink.isEnabled());
ViewUtil.setEnabledRecursive(shareRow, groupLink.isEnabled());
ViewUtil.setEnabledRecursive(resetLinkRow, groupLink.isEnabled());
ViewUtil.setEnabledRecursive(membersSectionHeader, groupLink.isEnabled());
ViewUtil.setEnabledRecursive(approveNewMembersRow, groupLink.isEnabled());
ViewUtil.setEnabledRecursive(descriptionRow, groupLink.isEnabled());
});
shareRow.setOnClickListener(v -> GroupLinkBottomSheetDialogFragment.show(requireFragmentManager(), groupId));

View File

@ -84,7 +84,7 @@ class ContactConflictMerger implements StorageSyncHelper.ConflictMerger<SignalCo
IdentityState identityState = remote.getIdentityState();
byte[] identityKey = remote.getIdentityKey().or(local.getIdentityKey()).orNull();
boolean blocked = remote.isBlocked();
boolean profileSharing = remote.isProfileSharingEnabled() || local.isProfileSharingEnabled();
boolean profileSharing = remote.isProfileSharingEnabled();
boolean archived = remote.isArchived();
boolean matchesRemote = doParamsMatch(remote, unknownFields, address, givenName, familyName, profileKey, username, identityState, identityKey, blocked, profileSharing, archived);
boolean matchesLocal = doParamsMatch(local, unknownFields, address, givenName, familyName, profileKey, username, identityState, identityKey, blocked, profileSharing, archived);

View File

@ -181,6 +181,12 @@ public final class StringUtil {
.toString();
}
public static @Nullable String stripBidiProtection(@Nullable String text) {
if (text == null) return null;
return text.replaceAll("[\\u2068\\u2069\\u202c]", "");
}
/**
* Trims a {@link CharSequence} of starting and trailing whitespace. Behavior matches
* {@link String#trim()} to preserve expectations around results.

View File

@ -263,4 +263,17 @@ public final class ViewUtil {
InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
/**
* Enables or disables a view and all child views recursively.
*/
public static void setEnabledRecursive(@NonNull View view, boolean enabled) {
view.setEnabled(enabled);
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
setEnabledRecursive(viewGroup.getChildAt(i), enabled);
}
}
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?title_text_color_disabled" android:state_enabled="false" />
<item android:color="?colorAccent" />
</selector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?title_text_color_disabled" android:state_enabled="false" />
<item android:color="?title_text_color_primary" />
</selector>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?title_text_color_disabled" android:state_enabled="false" />
<item android:color="?title_text_color_secondary" />
</selector>

View File

@ -66,7 +66,7 @@
android:paddingTop="10dp"
android:paddingEnd="12dp"
android:paddingBottom="10dp"
android:textAppearance="@style/TextAppearance.Signal.Caption"
android:textAppearance="@style/TextAppearance.Signal.Subtitle"
android:textColor="?title_text_color_secondary"
android:visibility="gone"
tools:text="@string/ManageGroupActivity_legacy_group_learn_more"

View File

@ -61,7 +61,7 @@
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_how_do_i_use_new_groups"
android:text="@string/GroupsLearnMore_can_i_upgrade_a_legacy_group"
android:textAppearance="@style/TextAppearance.Signal.Body2.Bold"
android:textColor="?title_text_color_primary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_2_a"
@ -94,7 +94,7 @@
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_paragraph_3"
android:textAppearance="@style/TextAppearance.Signal.Body2.Bold"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_secondary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_1"
app:layout_constraintEnd_toEndOf="parent"

View File

@ -90,7 +90,7 @@
android:text="@string/ShareableGroupLinkDialogFragment__share"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_secondary"
android:textColor="@color/text_color_secondary_enabled_selector"
tools:text="https://signal.group/#CjQKIKUBM1ER-gTjdWwktuuHJk4t-2Iujh0zkXl2VBB3bASIEhDwi34i-5OMAl5sFYt9VElW" />
</LinearLayout>
@ -115,12 +115,13 @@
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:drawablePadding="8dp"
android:drawableTint="@color/text_color_primary_enabled_selector"
android:enabled="false"
android:gravity="center_vertical|start"
android:text="@string/ShareableGroupLinkDialogFragment__share"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_primary"
android:textColor="@color/text_color_primary_enabled_selector"
app:drawableStartCompat="?share_icon" />
</LinearLayout>
@ -145,12 +146,13 @@
android:layout_gravity="center"
android:layout_weight="1"
android:drawablePadding="8dp"
android:drawableTint="@color/text_color_primary_enabled_selector"
android:enabled="false"
android:gravity="center_vertical|start"
android:text="@string/ShareableGroupLinkDialogFragment__reset_link"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_primary"
android:textColor="@color/text_color_primary_enabled_selector"
app:drawableStartCompat="?reset_link_icon" />
</LinearLayout>
@ -163,7 +165,7 @@
android:layout_marginTop="36dp"
android:text="@string/ShareableGroupLinkDialogFragment__member_requests"
android:textAppearance="@style/TextAppearance.Signal.Body2.Bold"
android:textColor="?attr/colorAccent"
android:textColor="@color/text_color_accent_enabled_selector"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/shareable_group_link_reset_link_row" />
@ -189,7 +191,8 @@
android:gravity="center_vertical|start"
android:text="@string/ShareableGroupLinkDialogFragment__approve_new_members"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.Signal.Body2" />
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="@color/text_color_primary_enabled_selector" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/shareable_group_link_approve_new_members_switch"
@ -226,7 +229,7 @@
android:text="@string/ShareableGroupLinkDialogFragment__require_an_admin_to_approve_new_members_joining_via_the_group_link"
android:textAlignment="viewStart"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_secondary" />
android:textColor="@color/text_color_secondary_enabled_selector" />
</LinearLayout>

View File

@ -2385,7 +2385,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">المجموعات من الطراز القديم مقارنة بالمجموعات من الطراز القديم</string>
<string name="GroupsLearnMore_what_are_legacy_groups">ماهي المجموعات من الطراز القديم؟</string>
<string name="GroupsLearnMore_paragraph_1">المجموعات من الطراز القديم هي المجموعات الغير متوائمة مع الميزات الجديدة الموجودة في الطراز الجديد مثل خاصية المشرفين وتحديثات وصف المجموعة.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">كيف استعمل المجموعات من الطراز الجديد؟</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">كيف استعمل المجموعات من الطراز الجديد؟</string> -->
<string name="GroupsLearnMore_paragraph_2">المجموعات من الطراز القديم لا يمكن تحويلها إلى الطراز الجديد، ولكن يمكنك أن تنشأ مجموعة جديدة بنفس الأعضاء ولكن من الطراز الجديد.</string>
<string name="GroupsLearnMore_paragraph_3">عندما تنشئ مجموعة من الطراز الجديد، جميع الأعضاء يتوجب عليهم تحديث Signal لأحدث نسخة.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2292,7 +2292,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Stare spram novih grupa</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Šta su stare gurpe?</string>
<string name="GroupsLearnMore_paragraph_1">Stare su one grupe koje nisu kompatibilne s novim grupnim opcijama poput administratora i detaljnih grupnih izvještaja.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Kako ću koristiti nove grupe?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Kako ću koristiti nove grupe?</string> -->
<string name="GroupsLearnMore_paragraph_2">Stare grupe ne mogu se preinačiti u nove, ali možete kreirati novu grupu sa istim članovima.</string>
<string name="GroupsLearnMore_paragraph_3">Da biste mogli kreirati novu grupu, svi članovi moraju koristiti zadnju objavljenu verziju Signala.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2224,7 +2224,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="GroupsLearnMore_legacy_vs_new_groups">Grups de llegat vs. grups nous</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Què són els grups de llegat?</string>
<string name="GroupsLearnMore_paragraph_1">Els grups de llegat són grups que no són compatibles amb les funcions dels grups nous com ara els administradors i les actualitzacions més descriptives.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Com uso els grups nous?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Com uso els grups nous?</string> -->
<string name="GroupsLearnMore_paragraph_2">Els grups de llegat no es poden convertir a grups nous, però podeu crear un grup nou amb els mateixos membres.</string>
<string name="GroupsLearnMore_paragraph_3">Per crear un grup nou, tots els membres han d\'actualitzar el Signal a la darrera versió.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2353,7 +2353,7 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
<string name="GroupsLearnMore_legacy_vs_new_groups">Starší a nové skupiny</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Co jsou starší skupiny?</string>
<string name="GroupsLearnMore_paragraph_1">Starší skupiny neumí vlastnosti nových skupin, jako je nastavení administrátorů a popisnější aktualizace skupin,</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Jak použít nové skupiny?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Jak použít nové skupiny?</string> -->
<string name="GroupsLearnMore_paragraph_2">Starší skupiny nemohou být převedeny na nové, ale můžete vytvořit novou skupinu se stejnými členy.</string>
<string name="GroupsLearnMore_paragraph_3">Pro vytvoření nové skupiny je třeba, aby všichni členové skupiny aktualizovali na poslední verzi Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2356,7 +2356,7 @@ Send neges heb ei ddiogelu?</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">Hen Grŵp o\'i gymharu â Grŵp Newydd</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Beth yw Hen Grwpiau?</string>
<string name="GroupsLearnMore_paragraph_1">Mae Hen Grwpiau yn grwpiau sydd ddim yn gydnaws â nodweddion Grŵp Newydd fel gweinyddwyr a diweddariadau grwpiau mwy disgrifiadol.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Sut mae defnyddio Grwpiau Newydd?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Sut mae defnyddio Grwpiau Newydd?</string> -->
<string name="GroupsLearnMore_paragraph_2">Nid oes modd trosi Hen Grwpiau yn Grwpiau Newydd, ond gallwch greu Grŵp Newydd gyda\'r un aelodau.</string>
<string name="GroupsLearnMore_paragraph_3">I greu Grŵp Newydd, dylai\'r holl aelodau ddiweddaru i\'r fersiwn ddiweddaraf o Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2231,7 +2231,7 @@ Der er %d dage tilbage</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">Forældede vs. nye grupper</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Hvad er forældede grupper?</string>
<string name="GroupsLearnMore_paragraph_1">Forældede grupper, er grupper der ikke er kompatible med nye gruppefunktioner, som administratorer og mere beskrivende opdateringer af grupper</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Hvordan bruger jeg nye grupper?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Hvordan bruger jeg nye grupper?</string> -->
<string name="GroupsLearnMore_paragraph_2">Forældede grupper kan ikke konverteres til nye grupper, men du kan oprette en ny gruppe med de samme medlemmer</string>
<string name="GroupsLearnMore_paragraph_3">For at oprette en ny gruppe, skal alle medlemmer opdatere til den nyeste version af Signal</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2219,7 +2219,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangen</s
<string name="GroupsLearnMore_legacy_vs_new_groups">Alt- vs. Neu-Gruppen</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Was sind Alt-Gruppen?</string>
<string name="GroupsLearnMore_paragraph_1">Alt-Gruppen sind Gruppen, die nicht kompatibel sind mit Features von Neu-Gruppen wie Admins oder anschaulicheren Gruppenaktualisierungen.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Wie verwende ich Neu-Gruppen?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Wie verwende ich Neu-Gruppen?</string> -->
<string name="GroupsLearnMore_paragraph_2">Alt-Gruppen können nicht in Neu-Gruppen umgewandelt werden, aber du kannst eine Neu-Gruppe mit denselben Mitgliedern erstellen.</string>
<string name="GroupsLearnMore_paragraph_3">Zum Erstellen einer Neu-Gruppe sollten alle Mitglieder Signal auf die neueste Version aktualisieren.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2226,7 +2226,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Ομάδες παλαιού τύπου και νέες ομάδες</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Τι είναι οι ομάδες παλαιού τύπου;</string>
<string name="GroupsLearnMore_paragraph_1">Οι ομάδες παλαιού τύπου είναι ομάδες που δεν είναι συμβατές με χαρακτηριστικά των νέων ομαδών, όπως οι διαχειριστές και οι πιο περιγραφικές ανανεώσεις της ομάδας.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Πως χρησιμοποιώ τις νέες ομάδες;</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Πως χρησιμοποιώ τις νέες ομάδες;</string> -->
<string name="GroupsLearnMore_paragraph_2">Οι ομάδες παλαιού τύπου δεν μπορούν να μετατραπούν σε νέες ομάδες, αλλά μπορείς να δημιουργήσεις μια νέα ομάδα με τα ίδια μέλη.</string>
<string name="GroupsLearnMore_paragraph_3">Για τη δημιουργία ομάδας νέου τύπου, όλα τα μέλη θα πρέπει να αναβαθμίσουν στην πιο πρόσφατη έκδοση του Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2229,7 +2229,7 @@ Ricevis mesaĝon pri interŝanĝo de ŝlosiloj por nevalida protokola versio.
<string name="GroupsLearnMore_legacy_vs_new_groups">Malnovtipaj kaj novtipaj grupoj</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Kio estas malnovtipaj grupoj?</string>
<string name="GroupsLearnMore_paragraph_1">Malnovtipaj grupoj estas grupoj, kiuj ne kongruas kun trajtoj de Novtipaj grupoj kiel administrantoj kaj grupaj ĝisdatigoj.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Kiel uzi Novtipajn grupojn?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Kiel uzi Novtipajn grupojn?</string> -->
<string name="GroupsLearnMore_paragraph_2">Malnovtipaj grupoj ne konverteblas al Novtipaj grupoj, sed vi povas krei novtipan grupon kun la samaj anoj.</string>
<string name="GroupsLearnMore_paragraph_3">Por krei novtipan grupon, ĉiuj anoj devas ĝisdatigi ilian Signal-version al la lasta.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2231,7 +2231,7 @@ Se recibió un mensaje de intercambio de claves para una versión no válida del
<string name="GroupsLearnMore_legacy_vs_new_groups">Chats en grupo nuevos y antiguos</string>
<string name="GroupsLearnMore_what_are_legacy_groups">¿Qué son los chats en grupo antiguos?</string>
<string name="GroupsLearnMore_paragraph_1">Los chats en grupo antiguos no son compatibles con las características de los chats en grupo nuevos como admins o actualizaciones más descriptivas.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">¿Cómo uso los nuevos chats en grupo?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">¿Cómo uso los nuevos chats en grupo?</string> -->
<string name="GroupsLearnMore_paragraph_2">Los chats en grupo antiguos no pueden convertirse en chats en grupo nuevos, pero puedes crear un grupo nuevo con la misma gente.</string>
<string name="GroupsLearnMore_paragraph_3">Para crear un nuevo chat en grupo, tod*s l*s participantes deben tener su versión de Signal actualizada.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2119,7 +2119,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Vanad vs uued grupid</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Mis on vana tüüpi grupid?</string>
<string name="GroupsLearnMore_paragraph_1">Vana tüüpi grupid on need grupid, mis pole ühilduvad uut tüüpi gruppide funktsionaalsustega nagu administraatorid ja rohkem kirjeldavad grupi muudatused.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Kuidas ma saan uusi gruppe kasutada?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Kuidas ma saan uusi gruppe kasutada?</string> -->
<string name="GroupsLearnMore_paragraph_2">Vana tüüpi gruppe ei saa uut tüüpi gruppideks teisendada, aga sa saad luua samade liikmetega uut tüüpi grupi.</string>
<string name="GroupsLearnMore_paragraph_3">Uue grupi loomiseks peavad kõik liikmed uuendama enda Signal-i uusimale versioonile.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2231,7 +2231,7 @@ Inportatu \'SMSBackup and Restorekin\' bateragarria den enkriptatu gabeko babesk
<string name="GroupsLearnMore_legacy_vs_new_groups">Jarauntsitako Taldeak vs. Talde Berriak</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Zer dira Jarauntsitako Taldeak?</string>
<string name="GroupsLearnMore_paragraph_1">Jarauntsitako Taldeak ez dira taldeen ezaugarri berriekin bateragarriak; esate baterako, administratzaileak eta taldeen egunerapenei buruzko informazio zehatzagoa izateko aukerak.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Nola erabili dezaket Talde Berriak?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Nola erabili dezaket Talde Berriak?</string> -->
<string name="GroupsLearnMore_paragraph_2">Jarauntsitako Taldeak ezin dira Talde Berri bihurtu, baina kide berak dituen Talde Berri bat sortu dezakezu.</string>
<string name="GroupsLearnMore_paragraph_3">Talde Berri bat sortzeko, kide guztiek Signal-en azkenengo bertsioa izan behar dute.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -865,7 +865,7 @@
<string name="MessageRecord_s_joined_the_group_via_the_group_link">%1$s از طریق پیوند گروه به گروه پیوست.</string>
<!--GV2 group link requests-->
<string name="MessageRecord_you_sent_a_request_to_join_the_group">شما یک درخواست برای پیوستن به گروه ارسال کردید</string>
<string name="MessageRecord_s_requested_to_join_via_the_group_link">%1$s درخواست برای پیوستن به گروه از طریق پیوند ارسال کرد.</string>
<string name="MessageRecord_s_requested_to_join_via_the_group_link">%1$s درخواستی برای پیوستن به گروه از طریق پیوند ارسال کرد.</string>
<!--GV2 group link approvals-->
<string name="MessageRecord_s_approved_your_request_to_join_the_group">%1$s با درخواست شما را برای پیوستن به گروه موافقت کرد.</string>
<string name="MessageRecord_s_approved_a_request_to_join_the_group_from_s">%1$s با درخواستی از %2$s برای پیوستن به گروه موافقت کرد.</string>
@ -873,6 +873,7 @@
<string name="MessageRecord_your_request_to_join_the_group_has_been_approved">با درخواست شما برای پیوستن به گروه موافقت شد.</string>
<string name="MessageRecord_a_request_to_join_the_group_from_s_has_been_approved">با درخواستی از %1$s برای پیوستن به گروه موافقت شد.</string>
<!--GV2 group link deny-->
<string name="MessageRecord_your_request_to_join_the_group_has_been_denied_by_an_admin">درخواست شما برای پیوستن به گروه از طرف یک مدیر رد شد.</string>
<string name="MessageRecord_s_denied_a_request_to_join_the_group_from_s">%1$s درخواست %2$s برای پیوستن به گروه را رد کرد</string>
<string name="MessageRecord_a_request_to_join_the_group_from_s_has_been_denied">درخواست %1$s برای پیوستن به گروه رد شد.</string>
<string name="MessageRecord_you_canceled_your_request_to_join_the_group">شما درخواست خود را برای پیوستن به گروه لغو کردید.</string>
@ -1407,7 +1408,7 @@
<string name="conversation_activity__sim_n">سیم کارت %1$d</string>
<string name="conversation_activity__send">ارسال</string>
<string name="conversation_activity__compose_description">نوشتن پیام</string>
<string name="conversation_activity__emoji_toggle_description">تعویض صفحه‌کلید شکلک‌ها</string>
<string name="conversation_activity__emoji_toggle_description">تعویض صفحه‌کلید ایموجی</string>
<string name="conversation_activity__attachment_thumbnail">تصویر بندانگشتی پیوست</string>
<string name="conversation_activity__quick_attachment_drawer_toggle_camera_description">تغییر وضعیت نگه دارنده پیوست دوربین سریع</string>
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">ضبط و ارسال پیوست صوتی</string>
@ -1806,8 +1807,8 @@
<string name="preferences_storage__s_messages">%1$s پیام</string>
<string name="preferences_storage__custom">دلخواه</string>
<!-- Removed by excludeNonTranslatables <string name="preferences_Storage__custom_conversation_length_limit">محدودیت طول مکالمه سفارشی</string> -->
<string name="preferences_advanced__use_system_emoji">استفاده از شکلک‌های سیستم</string>
<string name="preferences_advanced__disable_signal_built_in_emoji_support">غیرفعال کردن پشتیبانی از شکلک‌های داخل Signal</string>
<string name="preferences_advanced__use_system_emoji">استفاده از ایموجی‌های سیستم</string>
<string name="preferences_advanced__disable_signal_built_in_emoji_support">غیرفعال کردن پشتیبانی از ایموجی‌های درونی Signal</string>
<string name="preferences_advanced__relay_all_calls_through_the_signal_server_to_avoid_revealing_your_ip_address">گذراندن تمامی تماس‌ها از سرور Signal به منظور جلوگیری از آشکار شدن نشانی اینترنتی شما برای مخاطبانتان. فعال‌سازی این گزینه باعث کاهش کیفیت تماس می‌گردد.</string>
<string name="preferences_advanced__always_relay_calls">عبور تمامی تماس‌ها از سرور Signal</string>
<string name="preferences_app_protection__who_can">چه کسی می‌تواند….</string>
@ -2227,7 +2228,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">گروه‌های قدیمی در مقابل گروه‌های جدید</string>
<string name="GroupsLearnMore_what_are_legacy_groups">گروه‌های قدیمی چیستند؟</string>
<string name="GroupsLearnMore_paragraph_1">گروه‌های قدیمی گروه‌هایی هستند که با قابلیت‌های گروه‌ جدید مثل مدیران و به‌روزرسانی‌های مشروح گروه سازگار نیستند.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">چگونه از گروه‌های جدید استفاده کنم؟</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">چگونه از گروه‌های جدید استفاده کنم؟</string> -->
<string name="GroupsLearnMore_paragraph_2">گروه‌های قدیمی نمی‌توانند به گروه‌های جدید تبدیل شوند، اما شما می‌توانید گروهی جدید با همان اعضا بسازید.</string>
<string name="GroupsLearnMore_paragraph_3">برای ایجاد یک گروه جدید، همهٔ اعضا باید به آخرین نسخهٔ Signal به‌روزرسانی کنند.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -798,12 +798,12 @@
<string name="MessageRecord_you_are_no_longer_an_admin">Et ole enää ylläpitäjä.</string>
<!--GV2 invitations-->
<string name="MessageRecord_you_invited_s_to_the_group">Kutsuit käyttäjän %1$s ryhmään.</string>
<string name="MessageRecord_s_invited_you_to_the_group">%1$s kutsui sinut ryhmään.</string>
<string name="MessageRecord_s_invited_you_to_the_group">%1$s kutsui sinut liittymään ryhmään.</string>
<plurals name="MessageRecord_s_invited_members">
<item quantity="one">%1$s kutsui 1 henkilön ryhmään.</item>
<item quantity="other">%1$s kutsui %2$d henkilöä ryhmään.</item>
</plurals>
<string name="MessageRecord_you_were_invited_to_the_group">Sinut kutsuttiin ryhmään.</string>
<string name="MessageRecord_you_were_invited_to_the_group">Sinut kutsuttiin liittymään ryhmään.</string>
<plurals name="MessageRecord_d_people_were_invited_to_the_group">
<item quantity="one">1 henkilö kutsuttiin ryhmään.</item>
<item quantity="other">%1$d henkilöä kutsuttiin ryhmään.</item>
@ -811,7 +811,7 @@
<!--GV2 invitation revokes-->
<plurals name="MessageRecord_you_revoked_invites">
<item quantity="one">Peruutit yhden kutsun ryhmään.</item>
<item quantity="other">Peruutit %1$d kutsua ryhmään.</item>
<item quantity="other">Peruutit %1$d kutsua liittyä ryhmään.</item>
</plurals>
<plurals name="MessageRecord_s_revoked_invites">
<item quantity="one">%1$s perui yhden kutsun ryhmään.</item>
@ -2224,7 +2224,7 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
<string name="GroupsLearnMore_legacy_vs_new_groups">Vanhan tyyliset vs. uudet ryhmät</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Mitä ovat vanhan tyylin ryhmät?</string>
<string name="GroupsLearnMore_paragraph_1">Vanhan tyylin ryhmät ovat ryhmiä, jotka eivät ole yhteensopivia uusien ryhmien ominaisuuksien kanssa, kuten ylläpitäjyyden ja kuvaavien ryhmäpäivityksien.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Kuinka voin käyttää uusia ryhmiä?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Kuinka voin käyttää uusia ryhmiä?</string> -->
<string name="GroupsLearnMore_paragraph_2">Vanhan tyylin ryhmiä ei voida muuttaa uusiksi ryhmiksi, mutta voit luoda uuden ryhmän samoilla jäsenillä.</string>
<string name="GroupsLearnMore_paragraph_3">Uuden ryhmän luomiseksi kaikkien jäsenten tulee päivittää Signalin uusimpaan versioon.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2220,7 +2220,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Les groupes hérités comparés aux nouveaux</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Que sont les groupes hérités?</string>
<string name="GroupsLearnMore_paragraph_1">Les groupes hérités sont des groupes qui ne sont pas compatibles avec les fonctions des nouveaux groupes, telles que les administrateurs et les mises à jour plus descriptives des groupes.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Comment utiliser les nouveaux groupes?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Comment utiliser les nouveaux groupes?</string> -->
<string name="GroupsLearnMore_paragraph_2">Les groupes hérités ne peuvent pas être convertis en nouveaux groupes, mais vous pouvez créer un nouveau groupe avec les mêmes membres.</string>
<string name="GroupsLearnMore_paragraph_3">Pour créer un nouveau groupe, tous les membres devraient mettre Signal à jour vers la version la plus récente.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2233,7 +2233,7 @@ Kulcs-csere üzenet érkezett érvénytelen protokoll verzióhoz.
<string name="GroupsLearnMore_legacy_vs_new_groups">Régi vs. új csoportok</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Mik azok a régi típusú csoportok?</string>
<string name="GroupsLearnMore_paragraph_1">A régi típusú csoportok olyan csoportok, amelyek nem kompatibilisek az új típusú csoportokban rendelkezésre álló újabb funkciókkal, mint amilyen pl. a csoport-adminok kijelölése vagy a részletesebb csoportfrissítések használata.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Hogyan használhatóm az új típusú csoportokat?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Hogyan használhatóm az új típusú csoportokat?</string> -->
<string name="GroupsLearnMore_paragraph_2">A régi típusú csoportokat nem lehet új típusúvá alakítani, viszont lehetőséged van egy új típusú csoport létrehozására a régivel megegyező csoporttagsággal.</string>
<string name="GroupsLearnMore_paragraph_3">Az új típusú csoport létrehozásához az összes tagnak frissítenie kell a Signal legújabb verziójára.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2230,7 +2230,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Gruppi Legacy vs. Nuovi</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Cos\'è un Gruppo Legacy?</string>
<string name="GroupsLearnMore_paragraph_1">I Gruppi Legacy sono gruppi che non sono compatibili con le funzionalità dei Nuovi Gruppi come amministratori e aggiornamenti del gruppo più descrittivi.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Come si usano i Nuovi Gruppi?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Come si usano i Nuovi Gruppi?</string> -->
<string name="GroupsLearnMore_paragraph_2">I Gruppi Legacy non possono essere convertiti in Nuovi Gruppi, ma puoi creare un Nuovo Gruppo con gli stessi membri.</string>
<string name="GroupsLearnMore_paragraph_3">Per creare un Nuovo Gruppo, tutti i membri devono eseguire l\'aggiornamento all\'ultima versione di Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -924,6 +924,7 @@
<string name="MessageRecord_who_can_edit_group_membership_has_been_changed_to_s">מי יכול לערוך חברות קבוצה השתנה אל \"%1$s\".</string>
<!--GV2 group link invite access level change-->
<string name="MessageRecord_you_turned_off_the_group_link">כיבית את קישור הקבוצה.</string>
<string name="MessageRecord_s_turned_off_the_group_link">%1$s כיבה/כיבתה את קישור הקבוצה.</string>
<!--GV2 group link reset-->
<string name="MessageRecord_you_reset_the_group_link">איפסת את קישור הקבוצה.</string>
<string name="MessageRecord_s_reset_the_group_link">%1$s איפס/ה את קישור הקבוצה.</string>
@ -2323,7 +2324,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">קבוצות מיושנות לעומת חדשות</string>
<string name="GroupsLearnMore_what_are_legacy_groups">מהן קבוצות מיושנות?</string>
<string name="GroupsLearnMore_paragraph_1">קבוצות מיושנות הן קבוצות שאינן תואמות עם מאפיינים של קבוצה חדשה כמו מנהלנים ועדכוני קבוצה תיאוריים יותר.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">איך אני משתמש בקבוצות חדשות?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">איך אני משתמש בקבוצות חדשות?</string> -->
<string name="GroupsLearnMore_paragraph_2">קבוצות מיושנות אינן ניתנות להמרה אל קבוצות חדשות, אבל אתה יכול ליצור קבוצה חדשה עם אותם חברי קבוצה.</string>
<string name="GroupsLearnMore_paragraph_3">כדי ליצור קבוצה חדשה, כל חברי הקבוצה צריכים לעדכן אל הגרסה האחרונה של Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2158,7 +2158,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">レガシーグループと新グループ</string>
<string name="GroupsLearnMore_what_are_legacy_groups">レガシーグループとは?</string>
<string name="GroupsLearnMore_paragraph_1">レガシーグループは新グループとは互換性がなく、管理機能や詳細なグループ内の更新情報などの機能を使用できません。</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">どうすれば新グループを使えますか?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">どうすれば新グループを使えますか?</string> -->
<string name="GroupsLearnMore_paragraph_2">レガシーグループを新グループに変換することはできませんが、同じメンバーで新グループを作成できます。</string>
<string name="GroupsLearnMore_paragraph_3">新グループを作成するには、すべてのメンバーが最新バージョンのSignalにアップデートしてください。</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2354,7 +2354,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Pasenusios grupės lyginant su naujosiomis</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Kas yra pasenusios grupės?</string>
<string name="GroupsLearnMore_paragraph_1">Pasenusios grupės tai grupės, kurios yra nesuderinamos su naujųjų grupių ypatybėmis, tokiomis kaip administratoriai ir išsamesni grupių atnaujinimai.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Kaip naudoti naująsias grupes?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Kaip naudoti naująsias grupes?</string> -->
<string name="GroupsLearnMore_paragraph_2">Pasenusios grupės negali būti pakeistos į naująsias grupes, bet galite sukurti naująją grupę su tais pačiais nariais.</string>
<string name="GroupsLearnMore_paragraph_3">Norint sukurti naująją grupę, visi nariai turėtų atsinaujinti į naujausią Signal versiją.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2039,7 +2039,7 @@ grūpp apḍē</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">ലെഗസി vs. പുതിയ ഗ്രൂപ്പുകൾ</string>
<string name="GroupsLearnMore_what_are_legacy_groups">ലെഗസി ഗ്രൂപ്പുകൾ എന്താണ്?</string>
<string name="GroupsLearnMore_paragraph_1">പുതിയ ഗ്രൂപ്പ് സവിശേഷതകളായ അഡ്‌മിനുകൾ, കൂടുതൽ വിവരണാത്മക ഗ്രൂപ്പ് അപ്‌ഡേറ്റുകൾ എന്നിവയുമായി പൊരുത്തപ്പെടാത്ത ഗ്രൂപ്പുകളാണ് ലെഗസി ഗ്രൂപ്പുകൾ.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">പുതിയ ഗ്രൂപ്പുകൾ എങ്ങനെ ഉപയോഗിക്കാം?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">പുതിയ ഗ്രൂപ്പുകൾ എങ്ങനെ ഉപയോഗിക്കാം?</string> -->
<string name="GroupsLearnMore_paragraph_2">ലെഗസി ഗ്രൂപ്പുകളെ പുതിയ ഗ്രൂപ്പുകളായി പരിവർത്തനം ചെയ്യാൻ കഴിയില്ല, എന്നാൽ സമാന അംഗങ്ങളുമായി നിങ്ങൾക്ക് ഒരു പുതിയ ഗ്രൂപ്പ് സൃഷ്ടിക്കാൻ കഴിയും.</string>
<string name="GroupsLearnMore_paragraph_3">ഒരു പുതിയ ഗ്രൂപ്പ് സൃഷ്ടിക്കുന്നതിന്, എല്ലാ അംഗങ്ങൾക്കും Signalന്റെ ഏറ്റവും പുതിയ വേർഷൻ ഉണ്ടായിരിക്കണം</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2062,7 +2062,7 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion.</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">Legacy vs nye grupper</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Hva er \"legacy\" grupper?</string>
<string name="GroupsLearnMore_paragraph_1">Legacy grupper er grupper som ikke er kompatible med nye gruppefunksjoner som administrator og mer beskrivende gruppeoppdateringer.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Hvordan bruker jeg nye grupper?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Hvordan bruker jeg nye grupper?</string> -->
<string name="GroupsLearnMore_paragraph_2">Legacy grupper kan ikke konverteres til nye grupper, men du kan lage en ny gruppe med de samme medlemmene.</string>
<string name="GroupsLearnMore_paragraph_3">For å lage en ny gruppe, burde alle medlemmer oppdatere til den nyeste versjonen av Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -1543,7 +1543,7 @@ Tot slot moet Signal de telefoonstatus kunnen lezen om te voorkomen dat Signal-o
<string name="import_fragment__import_plaintext_backup">Onversleuteld back-up-bestand importeren</string>
<string name="import_fragment__import_a_plaintext_backup_file">Importeer een onversleuteld back-up-bestand. Compatibel met Sms back-up &amp; Herstellen.</string>
<!--load_more_header-->
<string name="load_more_header__see_full_conversation">Volledig gesprek bekijken</string>
<string name="load_more_header__see_full_conversation">Volledig gesprek weergeven</string>
<string name="load_more_header__loading">Aan het laden</string>
<!--media_overview_activity-->
<string name="media_overview_activity__no_media">Geen media</string>
@ -1797,7 +1797,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
<string name="preferences_storage__videos">Video\'s</string>
<string name="preferences_storage__files">Documenten</string>
<string name="preferences_storage__audio">Audio</string>
<string name="preferences_storage__review_storage">Alle bestanden bekijken</string>
<string name="preferences_storage__review_storage">Alle bestanden weergeven</string>
<string name="preferences_storage__delete_older_messages">Oude berichten wissen?</string>
<string name="preferences_storage__clear_message_history">Berichtengeschiedenis wissen?</string>
<string name="preferences_storage__this_will_permanently_delete_all_message_history_and_media">Dit zal pertinent alle gespreksgeschiedenis en media ouder dan %1$s van dit apparaat wissen.</string>
@ -2215,7 +2215,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
<string name="RecipientBottomSheet_add_to_contacts">Aan contactenlijst toevoegen</string>
<string name="RecipientBottomSheet_add_to_a_group">Aan een groep toevoegen</string>
<string name="RecipientBottomSheet_add_to_another_group">Aan nog een andere groep toevoegen</string>
<string name="RecipientBottomSheet_view_safety_number">Veiligheidsnummer bekijken</string>
<string name="RecipientBottomSheet_view_safety_number">Veiligheidsnummer weergeven</string>
<string name="RecipientBottomSheet_make_group_admin">Groepsbeheerder maken</string>
<string name="RecipientBottomSheet_remove_as_admin">Beheerdersbevoegdheden intrekken</string>
<string name="RecipientBottomSheet_remove_from_group">Van de groep verwijderen</string>
@ -2235,7 +2235,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
<string name="GroupsLearnMore_legacy_vs_new_groups">Verouderde groepen tegenover nieuwe groepen</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Wat zijn oude groepen?</string>
<string name="GroupsLearnMore_paragraph_1">Verouderde groepen zijn groepen waarin je geen gebruik kunt maken van nieuwe functionaliteiten zoals beheerders en meer gedetailleerde meldingen.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Hoe kan ik de nieuwe groepen gebruiken?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Hoe kan ik de nieuwe groepen gebruiken?</string> -->
<string name="GroupsLearnMore_paragraph_2">Verouderde groepen kunnen niet worden omgezet in nieuwe groepen, maar je kunt wel een nieuwe groep aanmaken met dezelfde leden.</string>
<string name="GroupsLearnMore_paragraph_3">Om een nieuwe groep aan te maken moeten alle leden hun Signal app bijwerken naar de meest recente versie.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2238,7 +2238,7 @@ Du er à jour!</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">Eldre vs. Nye grupper</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Kva er Eldre grupper?</string>
<string name="GroupsLearnMore_paragraph_1">Eldre grupper er grupper som ikkje er kompatible med funksjonane til Nye grupper, slik som administratorar og meir beskrivande gruppeoppdateringar.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Korleis bruker eg Nye grupper?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Korleis bruker eg Nye grupper?</string> -->
<string name="GroupsLearnMore_paragraph_2">Eldre grupper kan ikkje konverterast til Nye grupper, men du kan oppretta ei Ny gruppe med same medlem.</string>
<string name="GroupsLearnMore_paragraph_3">For å laga ei Ny gruppe bør alle medlem oppdatera til nyaste utgåve av Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -531,7 +531,7 @@
<string name="ManageGroupActivity_member_requests_and_invites">Prośby o przyjęcie i zaproszenia</string>
<string name="ManageGroupActivity_add_members">Dodaj członków</string>
<string name="ManageGroupActivity_edit_group_info">Edytuj informacje o grupie</string>
<string name="ManageGroupActivity_choose_who_can_edit_the_group_name_avatar_and_disappearing_messages">Wybierz kto może edytować nazwę i awatara grupy, oraz czas znikania wiadomości.</string>
<string name="ManageGroupActivity_choose_who_can_edit_the_group_name_avatar_and_disappearing_messages">Kto może edytować nazwę i awatara grupy, i czas znikania wiadomości.</string>
<string name="ManageGroupActivity_choose_who_can_add_or_invite_new_members">Wybierz, kto może dodawać lub zapraszać nowych członków.</string>
<string name="ManageGroupActivity_group_link">Link do grupy</string>
<string name="ManageGroupActivity_block_group">Zablokuj grupę</string>
@ -2346,7 +2346,7 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu.</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">Stare vs. Nowe grupy</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Czym są Stare grupy?</string>
<string name="GroupsLearnMore_paragraph_1">Stare grupy nie obsługują takich funkcji nowych grup jak administratorzy i dokładniejsze informacje o zmianach w grupach.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Jak skorzystać z Nowych grup?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Jak skorzystać z Nowych grup?</string> -->
<string name="GroupsLearnMore_paragraph_2">Starych grup nie można przekonwertować na Nowe, ale możesz stworzyć Nową grupę z tymi samymi członkami.</string>
<string name="GroupsLearnMore_paragraph_3">Aby utworzyć Nową grupę, wszyscy członkowie muszą zaktualizować Signal do najnowszej wersji.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2230,7 +2230,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Legado vs Novos Grupos</string>
<string name="GroupsLearnMore_what_are_legacy_groups">O que são Grupos Legados?</string>
<string name="GroupsLearnMore_paragraph_1">Grupos Legados são grupos que não são compatíveis com recursos dos Novos grupos como admins e atualizações de grupo mais descritivas.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Como utilizar Novos Grupos?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Como utilizar Novos Grupos?</string> -->
<string name="GroupsLearnMore_paragraph_2">Grupos Legados não podem ser convertidos em Novos Grupos, mas você pode criar um Novo Grupo com os mesmos membros.</string>
<string name="GroupsLearnMore_paragraph_3">Para criar um Novo Grupo, todos os membros devem atualizar para a versão do Signal mais recente.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2226,7 +2226,7 @@ Mensagem de troca de chaves inválida para esta versão do protocolo.
<string name="GroupsLearnMore_legacy_vs_new_groups">Grupos legados vs Grupos novos</string>
<string name="GroupsLearnMore_what_are_legacy_groups">O que são \'Grupos legados\'?</string>
<string name="GroupsLearnMore_paragraph_1">Os \'Grupos legados\' são grupos que não são compatíveis com os recursos de \'Grupo novo\' tais como administradores e atualizações mais descritivas do grupo.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Como utilizo os \'Grupos novos\'?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Como utilizo os \'Grupos novos\'?</string> -->
<string name="GroupsLearnMore_paragraph_2">OS \'Grupos legados\' não podem ser convertidos em \'Grupos novos\', mas você pode criar um \'Grupo novo\' com os mesmos membros.</string>
<string name="GroupsLearnMore_paragraph_3">Para criar um \'Grupo novo\', todos os membros deverão atualizar para a última versão do Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2289,7 +2289,7 @@ Am primit mesajul conform căruia schimbul de chei a avut loc pentru o versiune
<string name="GroupsLearnMore_legacy_vs_new_groups">Grupuri vechi vs. grupuri noi</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Ce sunt grupurile vechi?</string>
<string name="GroupsLearnMore_paragraph_1">Grupurile vechi sunt grupuri care nu sunt compatibile cu funcționalitățiile Grupului nou, cum ar fi administratorii și actualizări mai descriptive ale grupului.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Cum folosesc noile grupuri?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Cum folosesc noile grupuri?</string> -->
<string name="GroupsLearnMore_paragraph_2">Grupurile vechi nu pot fi convertite la Noul grup, dar puteți creea un nou grup cu aceeași membrii.</string>
<string name="GroupsLearnMore_paragraph_3">Pentru a creea un grup nou, toți membrii ar trebui să se actualizeze la cea mai recentă versiune a Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2347,7 +2347,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Сравнение Старых и Новых групп</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Что такое Старые группы?</string>
<string name="GroupsLearnMore_paragraph_1">Старые группы — это группы, которые несовместимы с функциями Новых групп, например администраторами и более подробными описаниями изменений в группе.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Как я могу использовать Новые группы?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Как я могу использовать Новые группы?</string> -->
<string name="GroupsLearnMore_paragraph_2">Старые группы не могут быть преобразованы в Новые, но вы можете создать Новую группу с теми же участниками.</string>
<string name="GroupsLearnMore_paragraph_3">Для создания Новой группы все участники должны обновиться до новейшей версии Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2345,7 +2345,7 @@ Prejeto sporočilo za izmenjavo ključev za napačno različico protokola.</stri
<string name="GroupsLearnMore_legacy_vs_new_groups">Stare in Nove skupine</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Kaj so stare skupine?</string>
<string name="GroupsLearnMore_paragraph_1">Stare skupine so skupine, ki niso združljive z naprednimi funkcijami Novih skupin, kot so skrbniki in bolj natančno upravljanje.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Kako uporabljam Nove skupine?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Kako uporabljam Nove skupine?</string> -->
<string name="GroupsLearnMore_paragraph_2">Stare skupine ne morejo biti pretvorjene v Nove, lahko pa ustvarite Novo skupino z identičnim članstvom.</string>
<string name="GroupsLearnMore_paragraph_3">Če želite ustvariti Novo skupino, morajo vsi člani nadgraditi Signal na zadnjo različico.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2233,7 +2233,7 @@ spastrohet dhe krejt lënda do të fshihet.</item>
<string name="GroupsLearnMore_legacy_vs_new_groups">Grupe të Dikurshëm vs. Grupesh të Rinj</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Çjanë Grupet e Dikurshëm?</string>
<string name="GroupsLearnMore_paragraph_1">Grupet e dikurshëm janë grupe që nuk janë të përputhshëm me veçori Grupesh të Rinj, bie fjala, përgjegjës dhe përditësime grupi më përshkruese.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Si ti përdor Grupet e Rinj?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Si ti përdor Grupet e Rinj?</string> -->
<string name="GroupsLearnMore_paragraph_2">Grupet e Dikurshëm smund të shndërrohen në Grupe të Rinj, por mund të krijoni një Grup të ri me të njëjtët anëtarë.</string>
<string name="GroupsLearnMore_paragraph_3">Që të krijoni një Grup të Ri, krejt anëtarët duhet ta përditësojnë Signal-in me versionin më të ri.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -2224,7 +2224,7 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion.</string>
<string name="GroupsLearnMore_legacy_vs_new_groups">Äldre vs. Nya grupper</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Vad är Äldre grupper?</string>
<string name="GroupsLearnMore_paragraph_1">Äldre grupper är grupper som inte är kompatibla med nya gruppfunktioner som administratörer och mer beskrivande gruppuppdateringar.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Hur använder jag Nya grupper?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Hur använder jag Nya grupper?</string> -->
<string name="GroupsLearnMore_paragraph_2">Äldre grupper kan inte konverteras till nya grupper, men du kan skapa en ny grupp med samma medlemmar.</string>
<string name="GroupsLearnMore_paragraph_3">För att skapa en Ny grupp, bör alla medlemmar uppdatera till den senaste versionen av Signal.</string>
<!--GroupLinkBottomSheetDialogFragment-->

File diff suppressed because one or more lines are too long

View File

@ -2156,7 +2156,7 @@ Nhận thông tin trao đổi mã khóa về phiên bản giao thức không h
<string name="GroupsLearnMore_legacy_vs_new_groups">Nhóm Mới và Nhóm Cũ</string>
<string name="GroupsLearnMore_what_are_legacy_groups">Nhóm Cũ là gì?</string>
<string name="GroupsLearnMore_paragraph_1">Nhóm Cũ là nhóm không tương thích với các tính năng mới như quản trị viên hay cập nhật cụ thể thông tin nhóm.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">Làm thế nào tôi có thể sử dụng Nhóm Mới?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">Làm thế nào tôi có thể sử dụng Nhóm Mới?</string> -->
<string name="GroupsLearnMore_paragraph_2">Nhóm Cũ không thể được chuyển đổi thành Nhóm Mới, nhưng bạn có thể tạo một Nhóm Mới với những thành viên cũ.</string>
<string name="GroupsLearnMore_paragraph_3">Để tạo Nhóm Mới, tất cả thành viên cần phải cập nhật lên phiên bản Signal mới nhất.</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -578,6 +578,7 @@
<string name="MessageRecord_you_set_disappearing_message_time_to_s">设置阅后即焚消失时间为 %1$s。</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s 设置阅后即焚消失时间为 %2$s。</string>
<!--Profile change updates-->
<string name="MessageRecord_changed_their_profile_name_from_to">%1$s 的个人资料名称已从 %2$s 更改为 %3$s。</string>
<!--GV2 specific-->
<string name="MessageRecord_you_created_the_group">您创建了群组</string>
<string name="MessageRecord_group_updated">群组更新完成。</string>
@ -1144,7 +1145,7 @@
</plurals>
<string name="expiration_days_abbreviated">%d 天</string>
<plurals name="expiration_weeks">
<item quantity="other">%d weeks</item>
<item quantity="other">%d </item>
</plurals>
<string name="expiration_weeks_abbreviated">%d 周</string>
<string name="expiration_combined">%1$s %2$s</string>
@ -1371,6 +1372,7 @@
<string name="preferences__slow">缓慢</string>
<string name="preferences__help">帮助</string>
<string name="preferences__advanced">高级</string>
<string name="preferences__donate_to_signal">捐赠 Signal</string>
<string name="preferences__privacy">隐私</string>
<string name="preferences__mms_user_agent">彩信用户代理</string>
<string name="preferences__advanced_mms_access_point_names">手动设置彩信</string>

View File

@ -2165,7 +2165,7 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">舊版 vs. 新群組</string>
<string name="GroupsLearnMore_what_are_legacy_groups">什麼是舊版的群組?</string>
<string name="GroupsLearnMore_paragraph_1">舊版群組是與新群組功能,例如管理員和更具描述性的群組更新,不相容的群組。</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">我該如何使用新群組?</string>
<!-- Removed by excludeNonTranslatables <string name="GroupsLearnMore_how_do_i_use_new_groups">我該如何使用新群組?</string> -->
<string name="GroupsLearnMore_paragraph_2">舊版群組無法轉換為新群組,但是你可以建立具有相同成員的新群組。</string>
<string name="GroupsLearnMore_paragraph_3">要建立新群組所有成員都應更新到Signal的最新版本。</string>
<!--GroupLinkBottomSheetDialogFragment-->

View File

@ -9,6 +9,7 @@
<attr name="title_text_color_primary" format="color"/>
<attr name="title_text_color_secondary" format="color"/>
<attr name="title_text_color_disabled" format="color"/>
<attr name="attachment_type_selector_background" format="color"/>
<attr name="attachment_document_icon_small" format="reference" />

View File

@ -622,7 +622,7 @@
<string name="ManageGroupActivity_edit_name_and_picture">Edit name and picture</string>
<string name="ManageGroupActivity_legacy_group">Legacy Group</string>
<string name="ManageGroupActivity_legacy_group_learn_more">This is a Legacy Group. To access features like group admins, create a New Group.</string>
<string name="ManageGroupActivity_legacy_group_learn_more">This is a Legacy Group. Features like group admins are only available for New Groups.</string>
<string name="ManageGroupActivity_this_is_an_insecure_mms_group">This is an insecure MMS Group. To chat privately and access features like group names, invite your contacts to Signal.</string>
<string name="ManageGroupActivity_invite_now">Invite now</string>
@ -2659,9 +2659,9 @@
<string name="GroupsLearnMore_legacy_vs_new_groups">Legacy vs. New Groups</string>
<string name="GroupsLearnMore_what_are_legacy_groups">What are Legacy Groups?</string>
<string name="GroupsLearnMore_paragraph_1">Legacy Groups are groups that are not compatible with New Group features like admins and more descriptive group updates.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">How do I use New Groups?</string>
<string name="GroupsLearnMore_paragraph_2">Legacy Groups cant be converted into New Groups, but you can create a New Group with the same members.</string>
<string name="GroupsLearnMore_paragraph_3">To create a New Group, all members should update to the latest version of Signal.</string>
<string name="GroupsLearnMore_can_i_upgrade_a_legacy_group">Can I upgrade a Legacy Group?</string>
<string name="GroupsLearnMore_paragraph_2">Legacy Groups can\'t yet be upgraded to New Groups, but you can create a New Group with the same members if they\'re on the latest version of Signal.</string>
<string name="GroupsLearnMore_paragraph_3">Signal will offer a way to upgrade Legacy Groups in the future.</string>
<!-- GroupLinkBottomSheetDialogFragment -->
<string name="GroupLinkBottomSheet_share_via_signal">Share via Signal</string>

View File

@ -118,6 +118,10 @@
<style name="TextAppearance.Signal.Caption" parent="@style/TextAppearance.AppCompat.Caption">
</style>
<style name="TextAppearance.Signal.Subtitle" parent="TextAppearance.Signal.Caption">
<item name="android:textSize">13sp</item>
</style>
<style name="TextAppearance.Signal.Subtitle2" parent="@style/TextAppearance.MaterialComponents.Subtitle2">
</style>

View File

@ -172,6 +172,7 @@
<item name="title_text_color_primary">@color/core_grey_90</item>
<item name="title_text_color_secondary">@color/core_grey_60</item>
<item name="title_text_color_disabled">@color/core_grey_25</item>
<item name="bottomSheetDialogTheme">@style/Theme.Design.Light.BottomSheetDialog</item>
@ -510,6 +511,7 @@
<item name="title_text_color_primary">@color/core_grey_05</item>
<item name="title_text_color_secondary">@color/core_grey_25</item>
<item name="title_text_color_disabled">@color/core_grey_60</item>
<item name="bottomSheetDialogTheme">@style/Theme.Design.BottomSheetDialog</item>

View File

@ -44,7 +44,7 @@ public class ContactConflictMergerTest {
}
@Test
public void merge_alwaysPreferRemote_exceptProfileSharingIsEitherOr() {
public void merge_alwaysPreferRemote() {
SignalContactRecord remote = new SignalContactRecord.Builder(byteArray(1), new SignalServiceAddress(UUID_A, E164_A))
.setBlocked(true)
.setIdentityKey(byteArray(2))
@ -79,7 +79,7 @@ public class ContactConflictMergerTest {
assertEquals("AFirst", merged.getGivenName().get());
assertEquals("ALast", merged.getFamilyName().get());
assertEquals("username A", merged.getUsername().get());
assertTrue(merged.isProfileSharingEnabled());
assertFalse(merged.isProfileSharingEnabled());
assertFalse(merged.isArchived());
}