From fea14218a999d5731a7fa49a3cba9726dc2b0ed9 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 24 Sep 2020 12:11:40 -0400 Subject: [PATCH 01/14] Don't allow borderless images to have quotes attached. Fixes #9924 --- .../securesms/conversation/ConversationActivity.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 2a4e27584..ed7281a67 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -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 { From d9c15621f65732340c2cdf03a559347bc6a2b1f3 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 24 Sep 2020 12:26:02 -0400 Subject: [PATCH 02/14] Log more details around conversation fetch times. --- .../securesms/conversation/ConversationDataSource.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java index 5ebc3c940..0289b752a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationDataSource.java @@ -84,6 +84,8 @@ class ConversationDataSource extends PositionalDataSource { } } + long mentionStart = System.currentTimeMillis(); + mentionHelper.fetchMentions(context); if (!isInvalid()) { @@ -94,7 +96,7 @@ class ConversationDataSource extends PositionalDataSource { .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 { } } + long mentionStart = System.currentTimeMillis(); + mentionHelper.fetchMentions(context); List items = Stream.of(records) @@ -123,7 +127,7 @@ class ConversationDataSource extends PositionalDataSource { .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 { From 9cf7eec2478f70b40f8438d9718cef2b5b48c09a Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 24 Sep 2020 12:26:18 -0400 Subject: [PATCH 03/14] Log sent timestamps when hitting message processing errors. --- .../securesms/jobs/PushDecryptMessageJob.java | 14 +++++++------- .../securesms/jobs/PushProcessMessageJob.java | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java index 2ebb3e4bb..e87cef64d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptMessageJob.java @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java index 080f0c680..4a98b2809 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java @@ -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 + ")"); } } From 864a1d5e93b2e6f92ff0afd36a0419f55dc984e2 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 24 Sep 2020 12:41:31 -0400 Subject: [PATCH 04/14] Prefer remote value for profile sharing during storage sync. --- .../thoughtcrime/securesms/storage/ContactConflictMerger.java | 2 +- .../securesms/storage/ContactConflictMergerTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactConflictMerger.java b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactConflictMerger.java index 31481fed8..3e2a679ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactConflictMerger.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactConflictMerger.java @@ -84,7 +84,7 @@ class ContactConflictMerger implements StorageSyncHelper.ConflictMerger Date: Thu, 24 Sep 2020 16:51:15 -0400 Subject: [PATCH 05/14] Fix possible threading issues with attachment cleanup. The way things were ordered, it was possible for us to create an attachment file, but have it 'cleaned up' before we were able to link it to an attachment row. --- .../database/AttachmentDatabase.java | 149 +++++++++--------- .../securesms/database/ThreadDatabase.java | 4 +- 2 files changed, 80 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java index daf8f71c3..b17fb234c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 7c4651ef9..8a313b06e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -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(); From 20fe837022d78ca47fc6f0b5f4a3ae76b7dc164d Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 25 Sep 2020 12:32:48 -0300 Subject: [PATCH 06/14] Enable and disable group link options with first switch. --- .../ShareableGroupLinkDialogFragment.java | 10 ++++++++++ .../org/thoughtcrime/securesms/util/ViewUtil.java | 13 +++++++++++++ .../color/text_color_accent_enabled_selector.xml | 5 +++++ .../color/text_color_primary_enabled_selector.xml | 5 +++++ .../text_color_secondary_enabled_selector.xml | 5 +++++ .../shareable_group_link_dialog_fragment.xml | 15 +++++++++------ app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/themes.xml | 2 ++ 8 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/color/text_color_accent_enabled_selector.xml create mode 100644 app/src/main/res/color/text_color_primary_enabled_selector.xml create mode 100644 app/src/main/res/color/text_color_secondary_enabled_selector.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/ShareableGroupLinkDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/ShareableGroupLinkDialogFragment.java index 538edba88..81262831e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/ShareableGroupLinkDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/ShareableGroupLinkDialogFragment.java @@ -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)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java index 7c411a01c..97466dbb2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java @@ -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); + } + } + } } diff --git a/app/src/main/res/color/text_color_accent_enabled_selector.xml b/app/src/main/res/color/text_color_accent_enabled_selector.xml new file mode 100644 index 000000000..4a6da29d0 --- /dev/null +++ b/app/src/main/res/color/text_color_accent_enabled_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/text_color_primary_enabled_selector.xml b/app/src/main/res/color/text_color_primary_enabled_selector.xml new file mode 100644 index 000000000..2fad5b76e --- /dev/null +++ b/app/src/main/res/color/text_color_primary_enabled_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/text_color_secondary_enabled_selector.xml b/app/src/main/res/color/text_color_secondary_enabled_selector.xml new file mode 100644 index 000000000..199eca080 --- /dev/null +++ b/app/src/main/res/color/text_color_secondary_enabled_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/shareable_group_link_dialog_fragment.xml b/app/src/main/res/layout/shareable_group_link_dialog_fragment.xml index 241df3f25..72e6c7c6a 100644 --- a/app/src/main/res/layout/shareable_group_link_dialog_fragment.xml +++ b/app/src/main/res/layout/shareable_group_link_dialog_fragment.xml @@ -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" /> @@ -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" /> @@ -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" /> @@ -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" /> + android:textColor="@color/text_color_secondary_enabled_selector" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 6b7a0c486..8d75504ca 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -9,6 +9,7 @@ + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 2100fc805..0cf0466bc 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -172,6 +172,7 @@ @color/core_grey_90 @color/core_grey_60 + @color/core_grey_25 @style/Theme.Design.Light.BottomSheetDialog @@ -510,6 +511,7 @@ @color/core_grey_05 @color/core_grey_25 + @color/core_grey_60 @style/Theme.Design.BottomSheetDialog From ce5be2c1be810cafe83c5c03a253d823788306b5 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 25 Sep 2020 12:33:14 -0300 Subject: [PATCH 07/14] Share group link via signal to one recipient. --- .../GroupLinkBottomSheetDialogFragment.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/GroupLinkBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/GroupLinkBottomSheetDialogFragment.java index 7122e39e2..708f8195b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/GroupLinkBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/sharablegrouplink/GroupLinkBottomSheetDialogFragment.java @@ -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(); From 93d6ce40c3e713783615366257474439a5c059b1 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 25 Sep 2020 12:13:14 -0300 Subject: [PATCH 08/14] GV2 learn more copy update. --- app/src/main/res/layout/group_manage_fragment.xml | 2 +- .../main/res/layout/groups_learn_more_bottom_sheet.xml | 4 ++-- app/src/main/res/values/strings.xml | 8 ++++---- app/src/main/res/values/text_styles.xml | 4 ++++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/group_manage_fragment.xml b/app/src/main/res/layout/group_manage_fragment.xml index e02eef8a0..5028f579b 100644 --- a/app/src/main/res/layout/group_manage_fragment.xml +++ b/app/src/main/res/layout/group_manage_fragment.xml @@ -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" diff --git a/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml b/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml index 47d0953fa..4c99016e1 100644 --- a/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml +++ b/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml @@ -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" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 19e01e97a..532d81358 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -622,7 +622,7 @@ Edit name and picture Legacy Group - This is a Legacy Group. To access features like group admins, create a New Group. + This is a Legacy Group. Features like group admins are only available for New Groups. This is an insecure MMS Group. To chat privately and access features like group names, invite your contacts to Signal. Invite now @@ -2659,9 +2659,9 @@ Legacy vs. New Groups What are Legacy Groups? Legacy Groups are groups that are not compatible with New Group features like admins and more descriptive group updates. - How do I use New Groups? - Legacy Groups can’t be converted into New Groups, but you can create a New Group with the same members. - To create a New Group, all members should update to the latest version of Signal. + Can I upgrade a Legacy Group? + 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. + Signal will offer a way to upgrade Legacy Groups in the future. Share via Signal diff --git a/app/src/main/res/values/text_styles.xml b/app/src/main/res/values/text_styles.xml index f5acab0d8..951421cbe 100644 --- a/app/src/main/res/values/text_styles.xml +++ b/app/src/main/res/values/text_styles.xml @@ -118,6 +118,10 @@ + + From 6448b8443034a126bae32cb4fe7fc0990d57344d Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 25 Sep 2020 12:13:18 -0400 Subject: [PATCH 09/14] Fix various mention issues. Fixes #9960 --- .../securesms/components/ComposeText.java | 35 +++++++++++++------ .../conversation/ConversationActivity.java | 4 +-- .../conversation/ConversationItem.java | 2 +- .../ui/mentions/MentionsPickerFragment.java | 6 +++- .../ui/mentions/MentionsPickerViewModel.java | 4 +-- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index 2f4bf8846..6940262f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -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) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index ed7281a67..8ea5d57ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -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; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 714334c83..df74b7ea9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -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()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java index 2d55bdbbd..0467eee47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java @@ -30,6 +30,7 @@ public class MentionsPickerFragment extends LoggingFragment { private View bottomDivider; private BottomSheetBehavior 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); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java index 861f54053..8a50006db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java @@ -38,8 +38,8 @@ public class MentionsPickerViewModel extends ViewModel { LiveData recipient = Transformations.switchMap(liveRecipient, LiveRecipient::getLiveData); LiveData> fullMembers = Transformations.distinctUntilChanged(LiveDataUtil.mapAsync(recipient, mentionsPickerRepository::getMembers)); - LiveData query = Transformations.distinctUntilChanged(liveQuery); - LiveData mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m)); + + LiveData mentionQuery = LiveDataUtil.combineLatest(liveQuery, fullMembers, (q, m) -> new MentionQuery(q.query, m)); this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).>map(MentionViewState::new).toList()); } From 8dbc721c0870bebe3e6f1a00ef6837f0f9ad04c2 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 25 Sep 2020 13:39:30 -0400 Subject: [PATCH 10/14] Fix stale call preview state by finishing when leaving. --- .../java/org/thoughtcrime/securesms/WebRtcCallActivity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java index f0a3ef251..5194e57c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -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 From dc9370c32b8061c314d9a0bd54a03ae2b9f7ae7d Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 25 Sep 2020 14:46:38 -0300 Subject: [PATCH 11/14] Fix false group name and avatar updates. --- .../securesms/profiles/edit/EditProfileViewModel.java | 5 +++-- .../java/org/thoughtcrime/securesms/util/StringUtil.java | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java index 261037362..221da03ff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java @@ -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); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java index 64d206412..953ae88d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java @@ -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. From dfce9a34b8df3be4edfe80559d6132597de65d43 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 25 Sep 2020 14:58:50 -0300 Subject: [PATCH 12/14] Fix leave group crash. --- .../org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java index d22a63e3d..99bb0e7ac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/LeaveGroupDialog.java @@ -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); From 4b3151058933a6ee2bbd23e0297fb4087d8a9aff Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 25 Sep 2020 15:24:47 -0300 Subject: [PATCH 13/14] Updated language translations. --- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-bs/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-cy/strings.xml | 2 +- app/src/main/res/values-da/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-eo/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-et/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fa/strings.xml | 11 ++++--- app/src/main/res/values-fi/strings.xml | 8 ++--- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 3 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-ml/strings.xml | 2 +- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 8 ++--- app/src/main/res/values-nn/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 4 +-- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-sq/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-ta/strings.xml | 38 +++++++++++----------- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 4 ++- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 36 files changed, 69 insertions(+), 65 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index a697f43ec..afb1a3a83 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -2385,7 +2385,7 @@ المجموعات من الطراز القديم مقارنة بالمجموعات من الطراز القديم ماهي المجموعات من الطراز القديم؟ المجموعات من الطراز القديم هي المجموعات الغير متوائمة مع الميزات الجديدة الموجودة في الطراز الجديد مثل خاصية المشرفين وتحديثات وصف المجموعة. - كيف استعمل المجموعات من الطراز الجديد؟ + المجموعات من الطراز القديم لا يمكن تحويلها إلى الطراز الجديد، ولكن يمكنك أن تنشأ مجموعة جديدة بنفس الأعضاء ولكن من الطراز الجديد. عندما تنشئ مجموعة من الطراز الجديد، جميع الأعضاء يتوجب عليهم تحديث Signal لأحدث نسخة. diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index d79f149d1..b0172aba1 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -2292,7 +2292,7 @@ Stare spram novih grupa Šta su stare gurpe? Stare su one grupe koje nisu kompatibilne s novim grupnim opcijama poput administratora i detaljnih grupnih izvještaja. - Kako ću koristiti nove grupe? + Stare grupe ne mogu se preinačiti u nove, ali možete kreirati novu grupu sa istim članovima. Da biste mogli kreirati novu grupu, svi članovi moraju koristiti zadnju objavljenu verziju Signala. diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 96ca20d27..95dba3961 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -2224,7 +2224,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no Grups de llegat vs. grups nous Què són els grups de llegat? 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. - Com uso els grups nous? + Els grups de llegat no es poden convertir a grups nous, però podeu crear un grup nou amb els mateixos membres. Per crear un grup nou, tots els membres han d\'actualitzar el Signal a la darrera versió. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 46a203189..0f3a5e50c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -2353,7 +2353,7 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu. Starší a nové skupiny Co jsou starší skupiny? Starší skupiny neumí vlastnosti nových skupin, jako je nastavení administrátorů a popisnější aktualizace skupin, - Jak použít nové skupiny? + Starší skupiny nemohou být převedeny na nové, ale můžete vytvořit novou skupinu se stejnými členy. Pro vytvoření nové skupiny je třeba, aby všichni členové skupiny aktualizovali na poslední verzi Signal. diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 25bc64498..a66781ad4 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -2356,7 +2356,7 @@ Send neges heb ei ddiogelu? Hen Grŵp o\'i gymharu â Grŵp Newydd Beth yw Hen Grwpiau? Mae Hen Grwpiau yn grwpiau sydd ddim yn gydnaws â nodweddion Grŵp Newydd fel gweinyddwyr a diweddariadau grwpiau mwy disgrifiadol. - Sut mae defnyddio Grwpiau Newydd? + Nid oes modd trosi Hen Grwpiau yn Grwpiau Newydd, ond gallwch greu Grŵp Newydd gyda\'r un aelodau. I greu Grŵp Newydd, dylai\'r holl aelodau ddiweddaru i\'r fersiwn ddiweddaraf o Signal. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index eb697a094..f369eccac 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -2231,7 +2231,7 @@ Der er %d dage tilbage Forældede vs. nye grupper Hvad er forældede grupper? Forældede grupper, er grupper der ikke er kompatible med nye gruppefunktioner, som administratorer og mere beskrivende opdateringer af grupper - Hvordan bruger jeg nye grupper? + Forældede grupper kan ikke konverteres til nye grupper, men du kan oprette en ny gruppe med de samme medlemmer For at oprette en ny gruppe, skal alle medlemmer opdatere til den nyeste version af Signal diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 8d1946654..b7b714987 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2219,7 +2219,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangenAlt- vs. Neu-Gruppen Was sind Alt-Gruppen? Alt-Gruppen sind Gruppen, die nicht kompatibel sind mit Features von Neu-Gruppen wie Admins oder anschaulicheren Gruppenaktualisierungen. - Wie verwende ich Neu-Gruppen? + Alt-Gruppen können nicht in Neu-Gruppen umgewandelt werden, aber du kannst eine Neu-Gruppe mit denselben Mitgliedern erstellen. Zum Erstellen einer Neu-Gruppe sollten alle Mitglieder Signal auf die neueste Version aktualisieren. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9e3049040..432e4ec23 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -2226,7 +2226,7 @@ Ομάδες παλαιού τύπου και νέες ομάδες Τι είναι οι ομάδες παλαιού τύπου; Οι ομάδες παλαιού τύπου είναι ομάδες που δεν είναι συμβατές με χαρακτηριστικά των νέων ομαδών, όπως οι διαχειριστές και οι πιο περιγραφικές ανανεώσεις της ομάδας. - Πως χρησιμοποιώ τις νέες ομάδες; + Οι ομάδες παλαιού τύπου δεν μπορούν να μετατραπούν σε νέες ομάδες, αλλά μπορείς να δημιουργήσεις μια νέα ομάδα με τα ίδια μέλη. Για τη δημιουργία ομάδας νέου τύπου, όλα τα μέλη θα πρέπει να αναβαθμίσουν στην πιο πρόσφατη έκδοση του Signal. diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index f8785139c..623e6c692 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -2229,7 +2229,7 @@ Ricevis mesaĝon pri interŝanĝo de ŝlosiloj por nevalida protokola versio. Malnovtipaj kaj novtipaj grupoj Kio estas malnovtipaj grupoj? Malnovtipaj grupoj estas grupoj, kiuj ne kongruas kun trajtoj de Novtipaj grupoj kiel administrantoj kaj grupaj ĝisdatigoj. - Kiel uzi Novtipajn grupojn? + Malnovtipaj grupoj ne konverteblas al Novtipaj grupoj, sed vi povas krei novtipan grupon kun la samaj anoj. Por krei novtipan grupon, ĉiuj anoj devas ĝisdatigi ilian Signal-version al la lasta. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3d513cee6..a71a932ca 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -2231,7 +2231,7 @@ Se recibió un mensaje de intercambio de claves para una versión no válida del Chats en grupo nuevos y antiguos ¿Qué son los chats en grupo antiguos? 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. - ¿Cómo uso los nuevos chats en grupo? + Los chats en grupo antiguos no pueden convertirse en chats en grupo nuevos, pero puedes crear un grupo nuevo con la misma gente. Para crear un nuevo chat en grupo, tod*s l*s participantes deben tener su versión de Signal actualizada. diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index e24d3ab60..2c509a755 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -2119,7 +2119,7 @@ Vanad vs uued grupid Mis on vana tüüpi grupid? Vana tüüpi grupid on need grupid, mis pole ühilduvad uut tüüpi gruppide funktsionaalsustega nagu administraatorid ja rohkem kirjeldavad grupi muudatused. - Kuidas ma saan uusi gruppe kasutada? + Vana tüüpi gruppe ei saa uut tüüpi gruppideks teisendada, aga sa saad luua samade liikmetega uut tüüpi grupi. Uue grupi loomiseks peavad kõik liikmed uuendama enda Signal-i uusimale versioonile. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index ff0e1314d..2885d1f44 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -2231,7 +2231,7 @@ Inportatu \'SMSBackup and Restorekin\' bateragarria den enkriptatu gabeko babesk Jarauntsitako Taldeak vs. Talde Berriak Zer dira Jarauntsitako Taldeak? Jarauntsitako Taldeak ez dira taldeen ezaugarri berriekin bateragarriak; esate baterako, administratzaileak eta taldeen egunerapenei buruzko informazio zehatzagoa izateko aukerak. - Nola erabili dezaket Talde Berriak? + Jarauntsitako Taldeak ezin dira Talde Berri bihurtu, baina kide berak dituen Talde Berri bat sortu dezakezu. Talde Berri bat sortzeko, kide guztiek Signal-en azkenengo bertsioa izan behar dute. diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 0beefa695..0fda604ce 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -865,7 +865,7 @@ %1$s از طریق پیوند گروه به گروه پیوست. شما یک درخواست برای پیوستن به گروه ارسال کردید - %1$s درخواست برای پیوستن به گروه از طریق پیوند ارسال کرد. + %1$s درخواستی برای پیوستن به گروه از طریق پیوند ارسال کرد. %1$s با درخواست شما را برای پیوستن به گروه موافقت کرد. %1$s با درخواستی از %2$s برای پیوستن به گروه موافقت کرد. @@ -873,6 +873,7 @@ با درخواست شما برای پیوستن به گروه موافقت شد. با درخواستی از %1$s برای پیوستن به گروه موافقت شد. + درخواست شما برای پیوستن به گروه از طرف یک مدیر رد شد. %1$s درخواست %2$s برای پیوستن به گروه را رد کرد درخواست %1$s برای پیوستن به گروه رد شد. شما درخواست خود را برای پیوستن به گروه لغو کردید. @@ -1407,7 +1408,7 @@ سیم کارت %1$d ارسال نوشتن پیام - تعویض صفحه‌کلید شکلک‌ها + تعویض صفحه‌کلید ایموجی تصویر بندانگشتی پیوست تغییر وضعیت نگه دارنده پیوست دوربین سریع ضبط و ارسال پیوست صوتی @@ -1806,8 +1807,8 @@ %1$s پیام دلخواه - استفاده از شکلک‌های سیستم - غیرفعال کردن پشتیبانی از شکلک‌های داخل Signal + استفاده از ایموجی‌های سیستم + غیرفعال کردن پشتیبانی از ایموجی‌های درونی Signal گذراندن تمامی تماس‌ها از سرور Signal به منظور جلوگیری از آشکار شدن نشانی اینترنتی شما برای مخاطبانتان. فعال‌سازی این گزینه باعث کاهش کیفیت تماس می‌گردد. عبور تمامی تماس‌ها از سرور Signal چه کسی می‌تواند…. @@ -2227,7 +2228,7 @@ گروه‌های قدیمی در مقابل گروه‌های جدید گروه‌های قدیمی چیستند؟ گروه‌های قدیمی گروه‌هایی هستند که با قابلیت‌های گروه‌ جدید مثل مدیران و به‌روزرسانی‌های مشروح گروه سازگار نیستند. - چگونه از گروه‌های جدید استفاده کنم؟ + گروه‌های قدیمی نمی‌توانند به گروه‌های جدید تبدیل شوند، اما شما می‌توانید گروهی جدید با همان اعضا بسازید. برای ایجاد یک گروه جدید، همهٔ اعضا باید به آخرین نسخهٔ Signal به‌روزرسانی کنند. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 7b4d9c691..8946b0895 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -798,12 +798,12 @@ Et ole enää ylläpitäjä. Kutsuit käyttäjän %1$s ryhmään. - %1$s kutsui sinut ryhmään. + %1$s kutsui sinut liittymään ryhmään. %1$s kutsui 1 henkilön ryhmään. %1$s kutsui %2$d henkilöä ryhmään. - Sinut kutsuttiin ryhmään. + Sinut kutsuttiin liittymään ryhmään. 1 henkilö kutsuttiin ryhmään. %1$d henkilöä kutsuttiin ryhmään. @@ -811,7 +811,7 @@ Peruutit yhden kutsun ryhmään. - Peruutit %1$d kutsua ryhmään. + Peruutit %1$d kutsua liittyä ryhmään. %1$s perui yhden kutsun ryhmään. @@ -2224,7 +2224,7 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle Vanhan tyyliset vs. uudet ryhmät Mitä ovat vanhan tyylin ryhmät? Vanhan tyylin ryhmät ovat ryhmiä, jotka eivät ole yhteensopivia uusien ryhmien ominaisuuksien kanssa, kuten ylläpitäjyyden ja kuvaavien ryhmäpäivityksien. - Kuinka voin käyttää uusia ryhmiä? + Vanhan tyylin ryhmiä ei voida muuttaa uusiksi ryhmiksi, mutta voit luoda uuden ryhmän samoilla jäsenillä. Uuden ryhmän luomiseksi kaikkien jäsenten tulee päivittää Signalin uusimpaan versioon. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 29940bb5d..1810d1a61 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2220,7 +2220,7 @@ Les groupes hérités comparés aux nouveaux Que sont les groupes hérités ? 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. - Comment utiliser les nouveaux groupes ? + 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. Pour créer un nouveau groupe, tous les membres devraient mettre Signal à jour vers la version la plus récente. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3c7ba845f..05b4aabbf 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -2233,7 +2233,7 @@ Kulcs-csere üzenet érkezett érvénytelen protokoll verzióhoz. Régi vs. új csoportok Mik azok a régi típusú csoportok? 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. - Hogyan használhatóm az új típusú csoportokat? + 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. Az új típusú csoport létrehozásához az összes tagnak frissítenie kell a Signal legújabb verziójára. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d6a91385c..ddb25e6d1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -2230,7 +2230,7 @@ Gruppi Legacy vs. Nuovi Cos\'è un Gruppo Legacy? I Gruppi Legacy sono gruppi che non sono compatibili con le funzionalità dei Nuovi Gruppi come amministratori e aggiornamenti del gruppo più descrittivi. - Come si usano i Nuovi Gruppi? + I Gruppi Legacy non possono essere convertiti in Nuovi Gruppi, ma puoi creare un Nuovo Gruppo con gli stessi membri. Per creare un Nuovo Gruppo, tutti i membri devono eseguire l\'aggiornamento all\'ultima versione di Signal. diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 2327ad8fd..86d4386ff 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -924,6 +924,7 @@ מי יכול לערוך חברות קבוצה השתנה אל \"%1$s\". כיבית את קישור הקבוצה. + %1$s כיבה/כיבתה את קישור הקבוצה. איפסת את קישור הקבוצה. %1$s איפס/ה את קישור הקבוצה. @@ -2323,7 +2324,7 @@ קבוצות מיושנות לעומת חדשות מהן קבוצות מיושנות? קבוצות מיושנות הן קבוצות שאינן תואמות עם מאפיינים של קבוצה חדשה כמו מנהלנים ועדכוני קבוצה תיאוריים יותר. - איך אני משתמש בקבוצות חדשות? + קבוצות מיושנות אינן ניתנות להמרה אל קבוצות חדשות, אבל אתה יכול ליצור קבוצה חדשה עם אותם חברי קבוצה. כדי ליצור קבוצה חדשה, כל חברי הקבוצה צריכים לעדכן אל הגרסה האחרונה של Signal. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d6091eb16..f666a9863 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -2158,7 +2158,7 @@ レガシーグループと新グループ レガシーグループとは? レガシーグループは新グループとは互換性がなく、管理機能や詳細なグループ内の更新情報などの機能を使用できません。 - どうすれば新グループを使えますか? + レガシーグループを新グループに変換することはできませんが、同じメンバーで新グループを作成できます。 新グループを作成するには、すべてのメンバーが最新バージョンのSignalにアップデートしてください。 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 301bb664e..e23ee02dc 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -2354,7 +2354,7 @@ Pasenusios grupės lyginant su naujosiomis Kas yra pasenusios grupės? Pasenusios grupės – tai grupės, kurios yra nesuderinamos su naujųjų grupių ypatybėmis, tokiomis kaip administratoriai ir išsamesni grupių atnaujinimai. - Kaip naudoti naująsias grupes? + Pasenusios grupės negali būti pakeistos į naująsias grupes, bet galite sukurti naująją grupę su tais pačiais nariais. Norint sukurti naująją grupę, visi nariai turėtų atsinaujinti į naujausią Signal versiją. diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 72179b871..80550c0a3 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -2039,7 +2039,7 @@ grūpp ap‌ḍē ലെഗസി vs. പുതിയ ഗ്രൂപ്പുകൾ ലെഗസി ഗ്രൂപ്പുകൾ എന്താണ്? പുതിയ ഗ്രൂപ്പ് സവിശേഷതകളായ അഡ്‌മിനുകൾ, കൂടുതൽ വിവരണാത്മക ഗ്രൂപ്പ് അപ്‌ഡേറ്റുകൾ എന്നിവയുമായി പൊരുത്തപ്പെടാത്ത ഗ്രൂപ്പുകളാണ് ലെഗസി ഗ്രൂപ്പുകൾ. - പുതിയ ഗ്രൂപ്പുകൾ എങ്ങനെ ഉപയോഗിക്കാം? + ലെഗസി ഗ്രൂപ്പുകളെ പുതിയ ഗ്രൂപ്പുകളായി പരിവർത്തനം ചെയ്യാൻ കഴിയില്ല, എന്നാൽ സമാന അംഗങ്ങളുമായി നിങ്ങൾക്ക് ഒരു പുതിയ ഗ്രൂപ്പ് സൃഷ്ടിക്കാൻ കഴിയും. ഒരു പുതിയ ഗ്രൂപ്പ് സൃഷ്ടിക്കുന്നതിന്, എല്ലാ അംഗങ്ങൾക്കും Signalന്റെ ഏറ്റവും പുതിയ വേർഷൻ ഉണ്ടായിരിക്കണം diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 33c59c6de..57092e543 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -2062,7 +2062,7 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion. Legacy vs nye grupper Hva er \"legacy\" grupper? Legacy grupper er grupper som ikke er kompatible med nye gruppefunksjoner som administrator og mer beskrivende gruppeoppdateringer. - Hvordan bruker jeg nye grupper? + Legacy grupper kan ikke konverteres til nye grupper, men du kan lage en ny gruppe med de samme medlemmene. For å lage en ny gruppe, burde alle medlemmer oppdatere til den nyeste versjonen av Signal. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c1b5085be..643b5e4c9 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1543,7 +1543,7 @@ Tot slot moet Signal de telefoonstatus kunnen lezen om te voorkomen dat Signal-o Onversleuteld back-up-bestand importeren Importeer een onversleuteld back-up-bestand. Compatibel met ‘Sms back-up & Herstellen’. - Volledig gesprek bekijken + Volledig gesprek weergeven Aan het laden Geen media @@ -1797,7 +1797,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi Video\'s Documenten Audio - Alle bestanden bekijken + Alle bestanden weergeven Oude berichten wissen? Berichtengeschiedenis wissen? Dit zal pertinent alle gespreksgeschiedenis en media ouder dan %1$s van dit apparaat wissen. @@ -2215,7 +2215,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi Aan contactenlijst toevoegen Aan een groep toevoegen Aan nog een andere groep toevoegen - Veiligheidsnummer bekijken + Veiligheidsnummer weergeven Groepsbeheerder maken Beheerdersbevoegdheden intrekken Van de groep verwijderen @@ -2235,7 +2235,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi Verouderde groepen tegenover nieuwe groepen Wat zijn oude groepen? Verouderde groepen zijn groepen waarin je geen gebruik kunt maken van nieuwe functionaliteiten zoals beheerders en meer gedetailleerde meldingen. - Hoe kan ik de nieuwe groepen gebruiken? + Verouderde groepen kunnen niet worden omgezet in nieuwe groepen, maar je kunt wel een nieuwe groep aanmaken met dezelfde leden. Om een nieuwe groep aan te maken moeten alle leden hun Signal app bijwerken naar de meest recente versie. diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index f2e78e46a..de3c96700 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -2238,7 +2238,7 @@ Du er à jour! Eldre vs. Nye grupper Kva er Eldre grupper? Eldre grupper er grupper som ikkje er kompatible med funksjonane til Nye grupper, slik som administratorar og meir beskrivande gruppeoppdateringar. - Korleis bruker eg Nye grupper? + Eldre grupper kan ikkje konverterast til Nye grupper, men du kan oppretta ei Ny gruppe med same medlem. For å laga ei Ny gruppe bør alle medlem oppdatera til nyaste utgåve av Signal. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f1557311b..5952c6860 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -531,7 +531,7 @@ Prośby o przyjęcie i zaproszenia Dodaj członków Edytuj informacje o grupie - Wybierz kto może edytować nazwę i awatara grupy, oraz czas znikania wiadomości. + Kto może edytować nazwę i awatara grupy, i czas znikania wiadomości. Wybierz, kto może dodawać lub zapraszać nowych członków. Link do grupy Zablokuj grupę @@ -2346,7 +2346,7 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu. Stare vs. Nowe grupy Czym są Stare grupy? Stare grupy nie obsługują takich funkcji nowych grup jak administratorzy i dokładniejsze informacje o zmianach w grupach. - Jak skorzystać z Nowych grup? + Starych grup nie można przekonwertować na Nowe, ale możesz stworzyć Nową grupę z tymi samymi członkami. Aby utworzyć Nową grupę, wszyscy członkowie muszą zaktualizować Signal do najnowszej wersji. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index aec01903a..805a87aeb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -2230,7 +2230,7 @@ Legado vs Novos Grupos O que são Grupos Legados? 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. - Como utilizar Novos Grupos? + Grupos Legados não podem ser convertidos em Novos Grupos, mas você pode criar um Novo Grupo com os mesmos membros. Para criar um Novo Grupo, todos os membros devem atualizar para a versão do Signal mais recente. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 4f3fb2a08..156c9e825 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -2226,7 +2226,7 @@ Mensagem de troca de chaves inválida para esta versão do protocolo. Grupos legados vs Grupos novos O que são \'Grupos legados\'? 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. - Como utilizo os \'Grupos novos\'? + OS \'Grupos legados\' não podem ser convertidos em \'Grupos novos\', mas você pode criar um \'Grupo novo\' com os mesmos membros. Para criar um \'Grupo novo\', todos os membros deverão atualizar para a última versão do Signal. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 91fa922fe..2ca025688 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -2289,7 +2289,7 @@ Am primit mesajul conform căruia schimbul de chei a avut loc pentru o versiune Grupuri vechi vs. grupuri noi Ce sunt grupurile vechi? 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. - Cum folosesc noile grupuri? + Grupurile vechi nu pot fi convertite la Noul grup, dar puteți creea un nou grup cu aceeași membrii. Pentru a creea un grup nou, toți membrii ar trebui să se actualizeze la cea mai recentă versiune a Signal. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bcf90286a..66a82e0d9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -2347,7 +2347,7 @@ Сравнение Старых и Новых групп Что такое Старые группы? Старые группы — это группы, которые несовместимы с функциями Новых групп, например администраторами и более подробными описаниями изменений в группе. - Как я могу использовать Новые группы? + Старые группы не могут быть преобразованы в Новые, но вы можете создать Новую группу с теми же участниками. Для создания Новой группы все участники должны обновиться до новейшей версии Signal. diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index d54ac3cf9..eef675252 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -2345,7 +2345,7 @@ Prejeto sporočilo za izmenjavo ključev za napačno različico protokola.Stare in Nove skupine Kaj so stare skupine? Stare skupine so skupine, ki niso združljive z naprednimi funkcijami Novih skupin, kot so skrbniki in bolj natančno upravljanje. - Kako uporabljam Nove skupine? + Stare skupine ne morejo biti pretvorjene v Nove, lahko pa ustvarite Novo skupino z identičnim članstvom. Če želite ustvariti Novo skupino, morajo vsi člani nadgraditi Signal na zadnjo različico. diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index fd7ec6967..1bcaeb1df 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -2233,7 +2233,7 @@ spastrohet dhe krejt lënda do të fshihet. Grupe të Dikurshëm vs. Grupesh të Rinj Ç’janë Grupet e Dikurshëm? 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. - Si t’i përdor Grupet e Rinj? + Grupet e Dikurshëm s’mund të shndërrohen në Grupe të Rinj, por mund të krijoni një Grup të ri me të njëjtët anëtarë. Që të krijoni një Grup të Ri, krejt anëtarët duhet ta përditësojnë Signal-in me versionin më të ri. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3727efcf4..06f11d5b2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -2224,7 +2224,7 @@ Tog emot meddelande för nyckelutbyte för ogiltig protokollversion. Äldre vs. Nya grupper Vad är Äldre grupper? Äldre grupper är grupper som inte är kompatibla med nya gruppfunktioner som administratörer och mer beskrivande gruppuppdateringar. - Hur använder jag Nya grupper? + Äldre grupper kan inte konverteras till nya grupper, men du kan skapa en ny grupp med samma medlemmar. För att skapa en Ny grupp, bör alla medlemmar uppdatera till den senaste versionen av Signal. diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 40867d0ad..3ab6a29bd 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -332,7 +332,7 @@ சுயவிவர புகைப்படம் உங்கள் சுயவிவரத்தை அமைக்கவும் உங்கள் சுயவிவரம் முடிவிலிருந்து-முடிவுவரை மறையாக்கப்பட்டது. நீங்கள் புதிய உரையாடல்களைத் தொடங்கும்போது அல்லது ஏற்றுக்கொள்ளும்போது, புதிய குழுக்களில் சேரும்போது உங்கள் சுயவிவரமும் அதற்கான மாற்றங்களும் உங்கள் தொடர்புகளுக்குத் தெரியும். - அவதாரம் அமைக்கவும் + சின்னம் அமைக்கவும் பயன்படுத்தப்படும் வழக்கம் : %s பயன்படுத்தப்படும் இயல்புநிலை: %s @@ -472,20 +472,20 @@ இந்த குழுவிலிருந்து %1$s ஐ அகற்றவா? %d இந்த உறுப்பினர்கள் புதிய குழுக்களை ஆதரிக்கவில்லை, எனவே இந்த குழு ஒரு மரபு குழுவாக இருக்கும். - %d இந்த உறுப்பினர்கள் புதிய குழுக்களை ஆதரிக்கவில்லை, எனவே இந்த குழு ஒரு மரபு குழுவாக இருக்கும். + %d இந்த உறுப்பினர்கள் புதிய குழுக்களை ஆதரிக்கவில்லை, எனவே இந்த குழு ஒரு பழைய மரபு குழுவாக இருக்கும். - “%1$s” சிக்னலின் Signal பழைய பதிப்பைப் பயன்படுத்துவதால் ஒரு மரபு குழு உருவாக்கப்படும். அவர்கள் சிக்னலைப் Signal புதுப்பித்த பிறகு அவர்களுடன் ஒரு புதிய பாணி குழுவை உருவாக்கலாம் அல்லது குழுவை உருவாக்கும் முன் இந்த உறுப்பினர்களை அகற்றலாம். + “%1$s” பழைய Signal பதிப்பைப் பயன்படுத்துவதால் ஒரு பழைய மரபு குழு உருவாக்கப்படும். அவர்கள் Signal புதுப்பித்த பிறகு அவர்களுடன் ஒரு புதிய பாணி குழுவை உருவாக்கலாம் அல்லது குழுவை உருவாக்கும் முன் இந்த உறுப்பினரை அகற்றலாம். - %1$d உறுப்பினர்கள் சிக்னலின் பழைய பதிப்பைப் பயன்படுத்துவதால் ஒரு மரபு குழு உருவாக்கப்படும். அவர்கள் சிக்னலைப் புதுப்பித்த பிறகு அவர்களுடன் ஒரு புதிய பாணி குழுவை உருவாக்கலாம் அல்லது குழுவை உருவாக்கும் முன் அவற்றை அகற்றலாம். - %1$d உறுப்பினர்கள் Signal சிக்னலின் பழைய பதிப்பைப் பயன்படுத்துவதால் ஒரு மரபு குழு உருவாக்கப்படும். அவர்கள் Signal சிக்னலைப் புதுப்பித்த பிறகு அவர்களுடன் ஒரு புதிய பாணி குழுவை உருவாக்கலாம் அல்லது குழுவை உருவாக்கும் முன் அவற்றை அகற்றலாம். + %1$d உறுப்பினர் பழைய Signal பதிப்பைப் பயன்படுத்துவதால் பழைய மரபு குழு உருவாக்கப்படும். அவர்கள் Signal புதுப்பித்த பிறகு அவர்களுடன் புதிய பாணி குழுவை உருவாக்கலாம் அல்லது குழுவை உருவாக்கும் முன் அவரை அகற்றலாம். + %1$d உறுப்பினர்கள் பழைய Signal பதிப்பைப் பயன்படுத்துவதால் பழைய மரபு குழு உருவாக்கப்படும். அவர்கள் Signal புதுப்பித்த பிறகு அவர்களுடன் புதிய பாணி குழுவை உருவாக்கலாம் அல்லது குழுவை உருவாக்கும் முன் அவர்களை அகற்றலாம். காணாமல் போகும் செய்திகள் நிலுவையில் உள்ள குழு அழைப்புகள் - உறுப்பினர்களைச் சேர்க்கவும் - குழு தகவலைத் திருத்து - குழு பெயர், அவதாரம் மற்றும் மறைந்து வரும் செய்திகளை யார் திருத்தலாம் என்பதைத் தேர்வுசெய்க. + உறுப்பினர்களைச் சேர்தல் + குழு தகவலைத் திருத்தல் + குழு பெயர், சின்னம் மற்றும் காணாமல் போகும் செய்திகளை யார் திருத்தலாம் என்பதை தேர்வுசெய்க. புதிய உறுப்பினர்களை யார் சேர்க்கலாம் அல்லது அழைக்கலாம் என்பதைத் தேர்வுசெய்க. குழுவைத் தடு குழுவைத் தடைநீக்கு @@ -517,8 +517,8 @@ பழைய மரபு குழு இது ஒரு பழைய மரபு குழு. குழு நிர்வாகிகள் போன்ற புதிய அம்சங்களை அணுக, புதிய குழுவை உருவாக்கவும். - என் பெயர் குறிப்புகளுக்கு எனக்கு அறிவிக்கவும் - முடக்கிய அரட்டைகளில் மற்றவர்களால் நீங்கள் குறிப்பிடப்படும்போது அறிவிப்புகளைப் பெறவா? + என் பெயர் குறிப்புகளை எனக்கு அறிவி + முடக்கிய அரட்டைகளில் மற்றவர்களால் நீங்கள் குறிப்பிடப்படும்போது அறிவிப்புகள் பெறலாமா? இயல்புநிலை (எனக்கு அறிவிக்கவும்) இயல்புநிலை (எனக்கு அறிவிக்க வேண்டாம்) எப்போதும் எனக்கு அறிவிக்கவும் @@ -590,7 +590,7 @@ மறுக்க குழு சின்னம் - அவதாரம் + சின்னம் முகங்களை மங்கலாக்குங்கள் புதியது: முகங்களை மங்கலாக்குங்கள் அல்லது மங்கலாக்குவதற்கு வரையவும் @@ -804,7 +804,7 @@ %1$s அவர்கள் குழு பெயரை \"%2$s\" என மாற்றினர். குழுவின் பெயர் \"%1$s\" என்று மாற்றப்பட்டுள்ளது. - குழு அவதாரத்தை மாற்றியுள்ளீர்கள். + குழு சின்னத்தை மாற்றியுள்ளீர்கள். %1$s குழு அவதாரத்தை மாற்றினார். குழு அவதாரம் மாற்றப்பட்டுள்ளது. @@ -2020,7 +2020,7 @@ நாங்கள் உங்களுக்கு பின்னர் நினைவூட்டுவோம். PIN ஐ உருவாக்குவது %1$dநாட்களில் கட்டாயமாகிவிடும். நாங்கள் உங்களுக்கு பின்னர் நினைவூட்டுவோம்.%1$dநாட்களில் உங்கள் பின்னை உறுதிப்படுத்துவது கட்டாயமாகிவிடும். - + போக்குவரத்து குறும்படம் @@ -2153,7 +2153,7 @@ ஒரு குழுவில் சேர்க்கவும் மற்றொரு குழுவில் சேர்க்கவும் பாதுகாப்பு எண்ணைக் காண்பி - குழு நிர்வாகியை admin உருவாக்குங்கள் + குழு நிர்வாகியாக்கு நிர்வாகி நிலையிலிருந்து அகற்று குழுவிலிருந்து அகற்று செய்தி @@ -2165,14 +2165,14 @@ \"%2$s\" இலிருந்து %1$sஐ அகற்றவா? நீக்கு கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது - நிர்வாகம் + நிர்வாகி ஒப்புதல் மறுக்க - மரபு vs புதிய குழுக்கள் - மரபு குழுக்கள் என்றால் என்ன? - மரபு குழுக்கள் old legacy groups என்பது நிர்வாகிகள் admin மற்றும் புதிய விளக்கக் குழு புதுப்பிப்புகள் போன்ற புதிய குழு அம்சங்களுடன் பொருந்தாத குழுக்கள். - புதிய குழுக்களை எவ்வாறு பயன்படுத்துவது? + பழைய மரபு vs புதிய குழுக்கள் + பழைய மரபு குழுக்கள் என்றால் என்ன? + பழைய மரபு குழுக்கள் என்பது நிர்வாகிகள் மற்றும் மேம்பட்ட குழு புதுப்பிப்பு விளக்கங்கள் போன்ற புதிய குழு அம்சங்களுடன் பொருந்தாத குழுக்கள். + மரபு குழுக்களை புதிய குழுக்களாக மாற்ற முடியாது, ஆனால் அதே உறுப்பினர்களுடன் புதிய குழுவை உருவாக்கலாம். புதிய குழுவை உருவாக்க, அனைத்து உறுப்பினர்களும் சிக்னலின் சமீபத்திய பதிப்பிற்கு புதுப்பிக்க Signal Update வேண்டும். diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 7546de44a..9f24e87ed 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -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 Nhóm Mới và Nhóm Cũ Nhóm Cũ là gì? 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. - Làm thế nào tôi có thể sử dụng Nhóm Mới? + 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ũ. Để 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. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d43840e8e..83901d826 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -578,6 +578,7 @@ 设置阅后即焚消失时间为 %1$s。 %1$s 设置阅后即焚消失时间为 %2$s。 + %1$s 的个人资料名称已从 %2$s 更改为 %3$s。 您创建了群组 群组更新完成。 @@ -1144,7 +1145,7 @@ %d 天 - %d weeks + %d 周 %d 周 %1$s %2$s @@ -1371,6 +1372,7 @@ 缓慢 帮助 高级 + 捐赠 Signal 隐私 彩信用户代理 手动设置彩信 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d16285a67..81fd690cf 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -2165,7 +2165,7 @@ 舊版 vs. 新群組 什麼是舊版的群組? 舊版群組是與新群組功能,例如管理員和更具描述性的群組更新,不相容的群組。 - 我該如何使用新群組? + 舊版群組無法轉換為新群組,但是你可以建立具有相同成員的新群組。 要建立新群組,所有成員都應更新到Signal的最新版本。 From 810365d3340163741ce3f6b4034789969a553a4f Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 25 Sep 2020 15:29:36 -0300 Subject: [PATCH 14/14] Bump version to 4.72.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 22bd4daf3..aa04d0b93 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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,