...
 
Commits (14)
......@@ -713,4 +713,10 @@
<item quantity="many">%d دقائق</item>
<item quantity="other">%d دقائق</item>
</plurals>
<string name="NotificationMmsMessageRecord_error_downloading_mms_message">خطأ أثناء تنزيل رسالة MMS المشفرة ، اضغط لإعادة المحاولة</string>
<string name="MmsMessageRecord_mms_message_encrypted_for_non_existing_session">رسالة MMS مشفرة لجلسة غير موجودة</string>
<string name="ConfirmIdentityDialog_accept">موافقة</string>
<string name="NotificationMmsMessageRecord_downloading_mms_message">جارٍ تنزيل رسالة MMS</string>
<string name="ImportFragment_import_plaintext_backup_elipse">جارٍ استيراد النسخة الإحتاطية غير المشفرة…</string>
<string name="ConversationActivity_the_gif_you_selected_was_too_big">حجم صورة GIF التي قمت باختيارها كبير جدًا!</string>
</resources>
\ No newline at end of file
......@@ -399,7 +399,7 @@ Ricevis ŝlosil-interŝanĝan mesaĝon por erara versio de protokolo.</string>
<!--contact_selection_activity-->
<string name="contact_selection_activity__enter_name_or_number">Enigu nomon aŭ numeron</string>
<!--contact_selection_group_activity-->
<string name="contact_selection_group_activity__no_contacts">Neniaj kontaktoj.</string>
<string name="contact_selection_group_activity__no_contacts">Neniu kontakto.</string>
<string name="contact_selection_group_activity__finding_contacts">Ŝargado de kontaktoj…</string>
<!--single_contact_selection_activity-->
<string name="SingleContactSelectionActivity_contact_photo">Kontakta Bildo</string>
......@@ -407,7 +407,7 @@ Ricevis ŝlosil-interŝanĝan mesaĝon por erara versio de protokolo.</string>
<string name="ContactSelectionlistFragment_select_for">Elekti por</string>
<string name="ContactSelectionListFragment_silence_requires_the_contacts_permission_in_order_to_display_your_contacts">Silence bezonas la permeson al kontaktoj por montri viajn kontaktojn, sed ĝi estas rifuzita. Bonvolu malfermi Androidan menuon de aplikaĵaj agordoj → permesoj, kaj aktivigu “kontaktojn”.</string>
<!--blocked_contacts_fragment-->
<string name="blocked_contacts_fragment__no_blocked_contacts">Neniuj blokitaj kontaktoj</string>
<string name="blocked_contacts_fragment__no_blocked_contacts">Neniu blokita kontakto</string>
<!--contact_selection_recent_activity-->
<string name="contact_selection_recent_activity__no_recent_calls">Ne lastatempaj alvokoj.</string>
<!--contact_selection_list_fragment-->
......@@ -811,5 +811,5 @@ Ricevis ŝlosil-interŝanĝan mesaĝon por erara versio de protokolo.</string>
<string name="conversation__menu_view_all_media">Ĉiuj aŭdvidaĵoj</string>
<string name="AndroidManifest__all_media_named">Ĉiuj aŭdvidaĵoj kun %1$s</string>
<string name="AndroidManifest__all_media">Ĉiuj aŭdvidaĵoj</string>
<string name="media_overview_activity__no_media">Neniuj aŭdvidaĵoj</string>
<string name="media_overview_activity__no_media">Neniu aŭdvidaĵo</string>
</resources>
\ No newline at end of file
......@@ -290,7 +290,7 @@ una nuova importazione creerà dei messaggi duplicati.</string>
firma di questa chiave è fidata, ma al momento hai lo scambio automatico della chiave disabilitato.</string>
<string name="ReceiveKeyActivity_processing">Elaborazione</string>
<string name="ReceiveKeyActivity_processing_key_exchange">Elaborazione scambio delle chiavi…</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_this_contact">Dovresti verificare l\'identità di questo contatto.</string>
<string name="ConfirmIdentityDialog_you_may_wish_to_verify_this_contact">Potresti voler verificare questo contatto.</string>
<!--RecipientPreferencesActivity-->
<string name="RecipientPreferenceActivity_block_this_contact_question">Bloccare questo contatto?</string>
<string name="RecipientPreferenceActivity_you_will_no_longer_see_messages_from_this_user">Non riceverai più messaggi di questo contatto.</string>
......@@ -803,4 +803,14 @@ Ricevuto un messaggio di scambio chiavi per una versione di protocollo non valid
<string name="NotificationChannel_locked_status">Stato bloccato</string>
<string name="NotificationChannel_failures">Errori</string>
<string name="NotificationChannel_messages">Messaggi</string>
<string name="NotificationMmsMessageRecord_downloading_mms_message">Scaricamento MMS…</string>
<string name="ConfirmIdentityDialog_accept">Accetta</string>
<string name="ConfirmIdentityDialog_the_signature_on_this_key_exchange_is_different">La chiave di identificazione di %1$s è cambiata. Può voler dire che qualcuno cerca di intercettare la vostra comunicazione o che %2$s ha solamente reinstallato Silence ed ha una nuova chiave di identitificazione.</string>
<string name="NotificationMmsMessageRecord_error_downloading_mms_message">Errore durante lo scaricamento MMS, tocca per riprovare</string>
<string name="media_preview_activity__media_content_description">Anteprima dei media</string>
<string name="media_preview__all_media_title">Tutti i media</string>
<string name="conversation__menu_view_all_media">Tutti i media</string>
<string name="AndroidManifest__all_media_named">Tutti i media condivisi con %1$s</string>
<string name="media_overview_activity__no_media">Nessun media</string>
<string name="AndroidManifest__all_media">Tutti i media</string>
</resources>
\ No newline at end of file
......@@ -796,4 +796,14 @@
<string name="ConversationItem_via_s">via %s</string>
<string name="AttachmentManager_silence_requires_contacts_permission_in_order_to_attach_contact_information">O Silence requer a permissão de Contactos a fim de anexar informações dos seus contactos, que foi permanentemente negada. Por favor navegue até ao menu de definições da aplicação, seleccione \"Permissões\" e active a permissão de \"Contactos\".</string>
<string name="AttachmentManager_silence_requires_the_external_storage_permission_in_order_to_attach_photos_videos_or_audio">O Silence requer a permissão de Armazenamento Externo para poder anexar fotos, vídeos ou áudio, que foi permanentemente negada. Por favor navegue até ao menu de definições da aplicação, seleccione \"Permissões\" e active a permissão de \"Armazenamento\".</string>
<string name="media_overview_activity__no_media">Sem mídia</string>
<string name="AndroidManifest__all_media_named">Toda a mídia com %1$s</string>
<string name="media_preview_activity__media_content_description">Visualização da mídia</string>
<string name="media_preview__all_media_title">Toda a mídia</string>
<string name="conversation__menu_view_all_media">Toda a mídia</string>
<string name="AndroidManifest__all_media">Toda a mídia</string>
<string name="ConfirmIdentityDialog_accept">Aceitar</string>
<string name="ConfirmIdentityDialog_the_signature_on_this_key_exchange_is_different">A chave de indentificação para %1$s foi alterada. Isto significa que ou alguém está a intercetar esta comunicação ou que %2$s simplesmente reinstalou Silence e que agora possui uma nova chave de identificação.</string>
<string name="NotificationMmsMessageRecord_error_downloading_mms_message">Erro ao descarregar MMS, toque para tentar novamente</string>
<string name="NotificationMmsMessageRecord_downloading_mms_message">A descarregar MMS</string>
</resources>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8'?>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="Distribution_title">Silence</string>
<string name="Distribution_tagline">Зашифрованное SMS/MMS-общение стало проще!</string>
<string name="Distribution_description">Silence - это SMS/MMS приложение, позволяющее защитить вашу конфиденциальность при общении с друзьями.</string>
<string name="Distribution_long_description">
Silence - это приложение SMS/MMS, позволяющее защитить вашу конфиденциальность при общении с друзьями.
Используя Silence, вы можете отправлять SMS-сообщения и обмениваться мультимедийными файлами или вложениями конфиденциально.
Особенности:
* Просто. Silence работает аналогично любому другому приложению для обмена SMS. Регистрация не потребуется ни вам, ни вашим друзьям.
* Надежно. Silence обменивается данными с использованием зашифрованных SMS-сообщений. Не требуются подключение к интернету и сервера.
* Конфиденциально. Silence обеспечивает сквозное шифрование ваших сообщений с использованием тщательно разработанного криптографического протокола Signal.
* Безопасно. Все сообщения шифруются локально, поэтому, если ваш телефон потерян или украден, ваши сообщения останутся надежно защищены.
* Открытый исходный код. Silence имеет свободный и открытый исходный код, что позволяет любому пользователю проверить его безопасность путем аудита кода.
Сообщите об ошибках, проблемах, запросите новые функции:
https://git.silence.dev/Silence/Silence-Android/issues
Исходный код можно найти по адресу:
https://git.silence.dev/Silence/Silence-Android
Подробнее:
https://silence.im
Политика конфиденциальности:
https://silence.im/privacy
</string>
</resources>
<string name="Distribution_title">Silence</string>
<string name="Distribution_tagline">Шифрованное SMS/MMS-общение стало проще!</string>
<string name="Distribution_description">Silence - это SMS/MMS-приложение, позволяющее защитить вашу конфиденциальность при общении с друзьями.</string>
<string name="Distribution_long_description">Silence - это SMS/MMS-приложение, позволяющее защитить вашу конфиденциальность при общении с друзьями. Используя Silence, вы можете приватно отправлять SMS-сообщения и обмениваться мультимедийными файлами или вложениями. Особенности: * Просто. Silence работает аналогично любому другому приложению для обмена SMS. Регистрация не потребуется ни вам, ни вашим друзьям. * Надежно. Silence обменивается данными с использованием зашифрованных SMS-сообщений. Не требуются подключение к интернету и сервера. * Конфиденциально. Silence обеспечивает сквозное шифрование ваших сообщений с использованием тщательно разработанного криптографического протокола Signal. * Безопасно. Все сообщения шифруются локально, поэтому, если ваш телефон потерян или украден, ваши сообщения останутся надежно защищены. * Открытый исходный код. Silence имеет свободный и открытый исходный код, что позволяет любому пользователю проверить его безопасность путем аудита кода. Сообщите об ошибках, проблемах, запросите новые функции: https://git.silence.dev/Silence/Silence-Android/issues Исходный код можно найти по адресу: https://git.silence.dev/Silence/Silence-Android Подробнее: https://silence.im Политика конфиденциальности: https://silence.im/privacy</string>
</resources>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -781,4 +781,14 @@
<string name="NotificationChannel_locked_status">锁定状态</string>
<string name="NotificationChannel_failures">失败</string>
<string name="NotificationChannel_messages">消息</string>
<string name="media_preview_activity__media_content_description">媒体预览</string>
<string name="media_preview__all_media_title">所有媒体</string>
<string name="conversation__menu_view_all_media">所有媒体</string>
<string name="AndroidManifest__all_media_named">所有带%1$s的媒体</string>
<string name="AndroidManifest__all_media">所有媒体</string>
<string name="media_overview_activity__no_media">无媒体</string>
<string name="ConfirmIdentityDialog_accept">接受</string>
<string name="ConfirmIdentityDialog_the_signature_on_this_key_exchange_is_different">%1$s的身份识别密钥已更改。这意味着有人试图拦截您的通讯,或者%2 $ s重新安装了Silence,现在有了新的身份密钥。</string>
<string name="NotificationMmsMessageRecord_error_downloading_mms_message">下载彩信出错,点击重试</string>
<string name="NotificationMmsMessageRecord_downloading_mms_message">下载彩信中</string>
</resources>
\ No newline at end of file
......@@ -460,6 +460,9 @@
<string name="SingleRecipientNotificationBuilder_silence" translatable="false">Silence</string>
<string name="SingleRecipientNotificationBuilder_new_message">New message</string>
<!-- VideoPlayer -->
<string name="VideoPlayer_error_playing_video">Error playing video</string>
<!-- SubscriptionInfoCompat -->
<string name="SubscriptionInfoCompat_slot">Slot %1$s</string>
<string name="SubscriptionInfoCompat_display_name">%1$s (slot %2$s)</string>
......
......@@ -15,6 +15,7 @@ import android.widget.TextView;
import org.smssecure.smssecure.crypto.IdentityKeyParcelable;
import org.smssecure.smssecure.crypto.MasterSecret;
import org.smssecure.smssecure.crypto.storage.SilenceSessionStore;
import org.smssecure.smssecure.database.DatabaseFactory;
import org.smssecure.smssecure.database.IdentityDatabase;
import org.smssecure.smssecure.database.MmsAddressDatabase;
......@@ -29,6 +30,8 @@ import org.smssecure.smssecure.recipients.RecipientFactory;
import org.smssecure.smssecure.recipients.Recipients;
import org.smssecure.smssecure.sms.MessageSender;
import org.smssecure.smssecure.util.Base64;
import org.smssecure.smssecure.util.InvalidNumberException;
import org.smssecure.smssecure.util.Util;
import java.io.IOException;
......@@ -44,21 +47,26 @@ public class ConfirmIdentityDialog extends AlertDialog {
IdentityKeyMismatch mismatch)
{
super(context);
Recipient recipient = RecipientFactory.getRecipientForId(context, mismatch.getRecipientId(), false);
String name = recipient.toShortString();
String introduction = String.format(context.getString(R.string.ConfirmIdentityDialog_the_signature_on_this_key_exchange_is_different), name, name);
SpannableString spannableString = new SpannableString(introduction + " " +
context.getString(R.string.ConfirmIdentityDialog_you_may_wish_to_verify_this_contact));
spannableString.setSpan(new VerifySpan(context, mismatch),
introduction.length()+1, spannableString.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
setTitle(name);
setMessage(spannableString);
setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.ConfirmIdentityDialog_accept), new AcceptListener(masterSecret, messageRecord, mismatch));
setButton(AlertDialog.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), new CancelListener());
try {
Recipient recipient = RecipientFactory.getRecipientForId(context, mismatch.getRecipientId(), false);
String name = recipient.toShortString();
String number = Util.canonicalizeNumber(context, recipient.getNumber());
String introduction = String.format(context.getString(R.string.ConfirmIdentityDialog_the_signature_on_this_key_exchange_is_different), name, name);
SpannableString spannableString = new SpannableString(introduction + " " +
context.getString(R.string.ConfirmIdentityDialog_you_may_wish_to_verify_this_contact));
spannableString.setSpan(new VerifySpan(context, mismatch),
introduction.length()+1, spannableString.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
setTitle(name);
setMessage(spannableString);
setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.ConfirmIdentityDialog_accept), new AcceptListener(masterSecret, messageRecord, mismatch, number));
setButton(AlertDialog.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), new CancelListener());
} catch (InvalidNumberException e) {
throw new AssertionError(e);
}
}
@Override
......@@ -77,11 +85,13 @@ public class ConfirmIdentityDialog extends AlertDialog {
private final MasterSecret masterSecret;
private final MessageRecord messageRecord;
private final IdentityKeyMismatch mismatch;
private final String number;
private AcceptListener(MasterSecret masterSecret, MessageRecord messageRecord, IdentityKeyMismatch mismatch) {
private AcceptListener(MasterSecret masterSecret, MessageRecord messageRecord, IdentityKeyMismatch mismatch, String number) {
this.masterSecret = masterSecret;
this.messageRecord = messageRecord;
this.mismatch = mismatch;
this.number = number;
}
@Override
......@@ -96,6 +106,8 @@ public class ConfirmIdentityDialog extends AlertDialog {
mismatch.getRecipientId(),
mismatch.getIdentityKey());
new SilenceSessionStore(getContext(), masterSecret, messageRecord.getSubscriptionId()).deleteAllSessions(number);
processMessageRecord(messageRecord);
return null;
......
......@@ -76,15 +76,17 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
{
private static final int MAX_CACHE_SIZE = 40;
private static final String TAG = ConversationAdapter.class.getName();
private static final String TAG = ConversationAdapter.class.getSimpleName();
private final Map<String,SoftReference<MessageRecord>> messageRecordCache =
Collections.synchronizedMap(new LRUCache<String, SoftReference<MessageRecord>>(MAX_CACHE_SIZE));
private static final int MESSAGE_TYPE_OUTGOING = 0;
private static final int MESSAGE_TYPE_INCOMING = 1;
private static final int MESSAGE_TYPE_UPDATE = 2;
private static final int MESSAGE_TYPE_AUDIO_OUTGOING = 3;
private static final int MESSAGE_TYPE_AUDIO_INCOMING = 4;
private static final int MESSAGE_TYPE_OUTGOING = 0;
private static final int MESSAGE_TYPE_INCOMING = 1;
private static final int MESSAGE_TYPE_UPDATE = 2;
private static final int MESSAGE_TYPE_AUDIO_OUTGOING = 3;
private static final int MESSAGE_TYPE_AUDIO_INCOMING = 4;
private static final int MESSAGE_TYPE_THUMBNAIL_OUTGOING = 5;
private static final int MESSAGE_TYPE_THUMBNAIL_INCOMING = 6;
private final Set<MessageRecord> batchSelected = Collections.synchronizedSet(new HashSet<MessageRecord>());
......@@ -219,8 +221,10 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
private @LayoutRes int getLayoutForViewType(int viewType) {
switch (viewType) {
case MESSAGE_TYPE_AUDIO_OUTGOING:
case MESSAGE_TYPE_THUMBNAIL_OUTGOING:
case MESSAGE_TYPE_OUTGOING: return R.layout.conversation_item_sent;
case MESSAGE_TYPE_AUDIO_INCOMING:
case MESSAGE_TYPE_THUMBNAIL_INCOMING:
case MESSAGE_TYPE_INCOMING: return R.layout.conversation_item_received;
case MESSAGE_TYPE_UPDATE: return R.layout.conversation_item_update;
default: throw new IllegalArgumentException("unsupported item view type given to ConversationAdapter");
......@@ -236,6 +240,9 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
} else if (hasAudio(messageRecord)) {
if (messageRecord.isOutgoing()) return MESSAGE_TYPE_AUDIO_OUTGOING;
else return MESSAGE_TYPE_AUDIO_INCOMING;
} else if (hasThumbnail(messageRecord)) {
if (messageRecord.isOutgoing()) return MESSAGE_TYPE_THUMBNAIL_OUTGOING;
else return MESSAGE_TYPE_THUMBNAIL_INCOMING;
} else if (messageRecord.isOutgoing()) {
return MESSAGE_TYPE_OUTGOING;
} else {
......@@ -404,4 +411,10 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
}
}
private boolean hasThumbnail(MessageRecord messageRecord) {
return messageRecord.isMms() &&
!messageRecord.isMmsNotification() &&
((MmsMessageRecord)messageRecord).getSlideDeck().getThumbnailSlide() != null;
}
}
......@@ -202,6 +202,7 @@ public class ConversationItem extends LinearLayout
this.recipient.addListener(this);
this.conversationRecipients.addListener(this);
setMediaAttributes(messageRecord);
setInteractionState(messageRecord);
setBodyText(messageRecord);
setBubbleState(messageRecord, recipient);
......@@ -210,7 +211,6 @@ public class ConversationItem extends LinearLayout
setGroupMessageStatus(messageRecord, recipient);
checkForAutoInitiate(messageRecord);
setMinimumWidth();
setMediaAttributes(messageRecord);
setSimInfo(messageRecord);
}
......
......@@ -4,6 +4,7 @@ import android.content.Context;
import org.smssecure.smssecure.crypto.IdentityKeyUtil;
import org.smssecure.smssecure.crypto.MasterSecret;
import org.smssecure.smssecure.crypto.SessionUtil;
import org.smssecure.smssecure.database.DatabaseFactory;
import org.smssecure.smssecure.recipients.RecipientFactory;
import org.smssecure.smssecure.util.SilencePreferences;
......@@ -58,8 +59,15 @@ public class SilenceIdentityKeyStore implements IdentityKeyStore {
public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
long recipientId = RecipientFactory.getRecipientsFromString(context, address.getName(), true).getPrimaryRecipient().getRecipientId();
return DatabaseFactory.getIdentityDatabase(context)
.isValidIdentity(masterSecret, recipientId, identityKey);
boolean trusted = DatabaseFactory.getIdentityDatabase(context)
.isValidIdentity(masterSecret, recipientId, identityKey);
if (!trusted) {
new SilenceSessionStore(context, masterSecret, subscriptionId).deleteAllSessions(address.getName());
}
return trusted;
}
@Override
......
......@@ -60,7 +60,7 @@ public class VideoPlayer extends FrameLayout {
Log.w(TAG, "Playing video directly from non-local Uri...");
this.videoView.setVideoURI(videoSource.getUri());
} else {
Toast.makeText(getContext(), "Error playing video...", Toast.LENGTH_LONG).show();
Toast.makeText(getContext(), getContext().getString(R.string.VideoPlayer_error_playing_video), Toast.LENGTH_LONG).show();
return;
}
......