diff --git a/res/menu/contact_list.xml b/res/menu/contact_list.xml
index 072990723..14e98e3e6 100644
--- a/res/menu/contact_list.xml
+++ b/res/menu/contact_list.xml
@@ -2,7 +2,12 @@
\ No newline at end of file
+
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index f55b6fa45..832d5a35f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -160,6 +160,7 @@
Sind Sie sicher, dass Sie \"%1$s\" löschen möchten?
Nachrichten löschen
Bild löschen
+ Kontakt löschen
Alle Standorte löschen?
Diesen Standort löschen?
Nachrichtendetails
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index f367b3d15..ad8a6f787 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -160,6 +160,7 @@
Sei sicuro di voler eliminare \"%1$s\"?
Elimina messaggi
Elimina immagine
+ Elimina contatto
Eliminare tutte le posizioni?
Elimino questa posizione?
Dettagli messaggio
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 65a4bf2cd..ccc4f8028 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -160,6 +160,7 @@
Weet je zeker dat je \'%1$s\' wilt verwijderen?
Berichten verwijderen
Afbeelding verwijderen
+ Contactpersoon verwijderen
Wil je alle locaties verwijderen?
Wil je deze locatie verwijderen?
Berichtinformatie
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 9eeff9ec3..3b5e54362 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -158,6 +158,7 @@
Jeni i sigurt se doni të fshihet \"%1$s\"?
Fshiji mesazhet
Fshije figurën
+ Fshije kontaktin
Të fshihen krejt vendndodhjet?
Të fshihet kjo vendndodhje?
Hollësi mesazhi
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 56edd41a6..faecf4d96 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -160,6 +160,7 @@
\"%1$s\" sohbetini silmek istediğinizden emin misiniz?
İletileri sil
Görseli sil
+ Kişiyi sil
Tüm konumlar silinsin mi?
Bu konum silinsin mi?
İleti ayrıntıları
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 4325197d1..927a8f4c8 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -154,6 +154,7 @@
您确定要删除“%1$s”吗?
删除消息
删除图像
+ 删除联系人
删除所有位置?
删除此位置?
消息详情
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 007c5c19f..ac1120048 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -160,6 +160,7 @@
Are you sure you want to delete \"%1$s\"?
Delete messages
Delete image
+ Delete contact
Delete all locations?
Delete this location?
Message details
@@ -593,6 +594,9 @@
Disappearing messages timer set to 1 week.
Disappearing messages timer set to 4 weeks.
+
+ Chat protection disabled.
+ Chat protection enabled.
Screen lock
diff --git a/src/com/b44t/messenger/DcMsg.java b/src/com/b44t/messenger/DcMsg.java
index ee816fdf8..7749373c5 100644
--- a/src/com/b44t/messenger/DcMsg.java
+++ b/src/com/b44t/messenger/DcMsg.java
@@ -152,10 +152,6 @@ public class DcMsg {
return getFromId() == DcContact.DC_CONTACT_ID_SELF;
}
- public boolean isGroupAction() {
- return false;
- }
-
public String getDisplayBody() {
return getText();
}
@@ -174,21 +170,12 @@ public class DcMsg {
public boolean isPreparing() {
return getState() == DC_STATE_OUT_PREPARING;
}
- public long getExpiresIn() {
- return -1; // never.
- }
- public long getExpireStarted() {
- return 0;
- }
public boolean isSecure() {
return showPadlock()!=0;
}
public boolean isPending() {
return getState() == DC_STATE_OUT_PENDING;
}
- public boolean isMediaPending() {
- return isPending();
- }
public boolean isDelivered() {
return getState() == DC_STATE_OUT_DELIVERED;
}
@@ -198,17 +185,7 @@ public class DcMsg {
public boolean isSeen() {
return getState() == DC_STATE_IN_SEEN;
}
- public boolean isMms() {
- return false;
- }
- // the following are probably system messages in delta-land
- public boolean isJoined() { return false; }
- public boolean isExpirationTimerUpdate() { return false; }
- public boolean isEndSession() { return false; }
- public boolean isIdentityUpdate() { return false; }
- public boolean isIdentityVerified() { return false; }
- public boolean isIdentityDefault() { return false; }
// working with raw c-data
private long msgCPtr; // CAVE: the name is referenced in the JNI
diff --git a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java
index 21e1c7123..e5ef082fb 100644
--- a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java
+++ b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java
@@ -19,6 +19,7 @@ package org.thoughtcrime.securesms;
import android.Manifest;
import android.annotation.SuppressLint;
+import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color;
@@ -64,6 +65,7 @@ import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
+import org.thoughtcrime.securesms.util.views.AdaptiveActionsToolbar;
import java.util.ArrayList;
import java.util.LinkedList;
@@ -148,6 +150,7 @@ public class ContactSelectionListFragment extends Fragment
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
+ setCorrectMenuVisibility(menu);
actionMode.setTitle("1");
return true;
}
@@ -163,6 +166,9 @@ public class ContactSelectionListFragment extends Fragment
case R.id.menu_select_all:
handleSelectAll();
return true;
+ case R.id.menu_view_profile:
+ handleViewProfile();
+ return true;
case R.id.menu_delete_selected:
handleDeleteSelected();
return true;
@@ -205,6 +211,26 @@ public class ContactSelectionListFragment extends Fragment
actionMode.setTitle(String.valueOf(getContactSelectionListAdapter().getActionModeSelection().size()));
}
+ private void setCorrectMenuVisibility(Menu menu) {
+ ContactSelectionListAdapter adapter = getContactSelectionListAdapter();
+ if (adapter.getActionModeSelection().size() > 1) {
+ menu.findItem(R.id.menu_view_profile).setVisible(false);
+ } else {
+ menu.findItem(R.id.menu_view_profile).setVisible(true);
+ }
+ }
+
+ private void handleViewProfile() {
+ ContactSelectionListAdapter adapter = getContactSelectionListAdapter();
+ if (adapter.getActionModeSelection().size() == 1) {
+ int contactId = adapter.getActionModeSelection().valueAt(0);
+
+ Intent intent = new Intent(getContext(), ProfileActivity.class);
+ intent.putExtra(ProfileActivity.CONTACT_ID_EXTRA, contactId);
+ getContext().startActivity(intent);
+ }
+ }
+
private void handleDeleteSelected() {
new AlertDialog.Builder(getActivity())
.setMessage(R.string.ask_delete_contacts)
@@ -365,6 +391,8 @@ public class ContactSelectionListFragment extends Fragment
{
if (handleActionMode) {
if (actionMode != null) {
+ Menu menu = actionMode.getMenu();
+ setCorrectMenuVisibility(menu);
updateActionModeTitle();
finishActionModeIfSelectionIsEmpty();
}
diff --git a/src/org/thoughtcrime/securesms/ConversationListItem.java b/src/org/thoughtcrime/securesms/ConversationListItem.java
index f6f3999bc..f9185ffe4 100644
--- a/src/org/thoughtcrime/securesms/ConversationListItem.java
+++ b/src/org/thoughtcrime/securesms/ConversationListItem.java
@@ -213,7 +213,7 @@ public class ConversationListItem extends RelativeLayout
deliveryStatusIndicator.setNone();
setBatchState(false);
- contactPhotoImage.setAvatar(glideRequests, recipient, true);
+ contactPhotoImage.setAvatar(glideRequests, recipient, false);
}
public void bind(@NonNull DcMsg messageResult,
@@ -244,7 +244,7 @@ public class ConversationListItem extends RelativeLayout
deliveryStatusIndicator.setNone();
setBatchState(false);
- contactPhotoImage.setAvatar(glideRequests, recipient, true);
+ contactPhotoImage.setAvatar(glideRequests, recipient, false);
}
@Override
diff --git a/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java b/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java
index 964b5c961..44505ec95 100644
--- a/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java
+++ b/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java
@@ -50,19 +50,19 @@ public abstract class PassphraseRequiredActionBarActivity extends BaseActionBarA
@Override
protected void onResume() {
- Log.w(TAG, "onResume()");
+ Log.i(TAG, "onResume()");
super.onResume();
}
@Override
protected void onPause() {
- Log.w(TAG, "onPause()");
+ Log.i(TAG, "onPause()");
super.onPause();
}
@Override
protected void onDestroy() {
- Log.w(TAG, "onDestroy()");
+ Log.i(TAG, "onDestroy()");
super.onDestroy();
}
diff --git a/src/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java b/src/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java
index 79088bdc3..90377832f 100644
--- a/src/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java
+++ b/src/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java
@@ -1,14 +1,15 @@
package org.thoughtcrime.securesms.audio;
import android.content.Context;
+import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import android.util.Log;
import android.util.Pair;
-import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DefaultLoadControl;
@@ -26,7 +27,7 @@ import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
-import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.AudioSlide;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.guava.Optional;
@@ -170,14 +171,16 @@ public class AudioSlidePlayer {
public void onPlayerError(ExoPlaybackException error) {
Log.w(TAG, "MediaPlayer Error: " + error);
- Toast.makeText(context, R.string.error, Toast.LENGTH_SHORT).show();
-
synchronized (AudioSlidePlayer.this) {
mediaPlayer = null;
}
notifyOnStop();
progressEventHandler.removeMessages(0);
+
+ // Failed to play media file, maybe another app can handle it
+ int msgId = getAudioSlide().getDcMsgId();
+ DcHelper.getContext(context).openForViewOrShare(context, msgId, Intent.ACTION_VIEW);
}
});
}
diff --git a/src/org/thoughtcrime/securesms/components/AvatarImageView.java b/src/org/thoughtcrime/securesms/components/AvatarImageView.java
index ef239777a..a80505398 100644
--- a/src/org/thoughtcrime/securesms/components/AvatarImageView.java
+++ b/src/org/thoughtcrime/securesms/components/AvatarImageView.java
@@ -49,7 +49,6 @@ public class AvatarImageView extends AppCompatImageView {
if (recipient != null) {
ContactPhoto contactPhoto = recipient.getContactPhoto(getContext());
requestManager.load(contactPhoto)
- .fallback(recipient.getFallbackAvatarDrawable(getContext()))
.error(recipient.getFallbackAvatarDrawable(getContext()))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.circleCrop()
@@ -59,7 +58,7 @@ public class AvatarImageView extends AppCompatImageView {
}
} else {
setImageDrawable(new GeneratedContactPhoto("+").asDrawable(getContext(), ThemeUtil.getDummyContactColor(getContext())));
- super.setOnClickListener(listener);
+ if (listener != null) super.setOnClickListener(listener);
}
}
diff --git a/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java b/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java
index 017720737..18b085f51 100644
--- a/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java
+++ b/src/org/thoughtcrime/securesms/connect/ApplicationDcContext.java
@@ -165,6 +165,8 @@ public class ApplicationDcContext extends DcContext {
setStockTranslation(82, context.getString(R.string.videochat_invitation));
setStockTranslation(83, context.getString(R.string.videochat_invitation_body));
setStockTranslation(84, context.getString(R.string.configuration_failed_with_error));
+ setStockTranslation(88, context.getString(R.string.systemmsg_chat_protection_enabled));
+ setStockTranslation(89, context.getString(R.string.systemmsg_chat_protection_disabled));
setStockTranslation(90, context.getString(R.string.reply_noun));
}
diff --git a/src/org/thoughtcrime/securesms/mms/AudioSlide.java b/src/org/thoughtcrime/securesms/mms/AudioSlide.java
index 7ba497f8a..4cbeac1c7 100644
--- a/src/org/thoughtcrime/securesms/mms/AudioSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/AudioSlide.java
@@ -47,10 +47,6 @@ public class AudioSlide extends Slide {
super(context, new UriAttachment(uri, null, contentType, AttachmentDatabase.TRANSFER_PROGRESS_STARTED, dataSize, 0, 0, null, null, voiceNote));
}
- public AudioSlide(Context context, Attachment attachment) {
- super(context, attachment);
- }
-
@Override
@Nullable
public Uri getThumbnailUri() {
diff --git a/src/org/thoughtcrime/securesms/mms/DocumentSlide.java b/src/org/thoughtcrime/securesms/mms/DocumentSlide.java
index 49eaf30c3..6328ff745 100644
--- a/src/org/thoughtcrime/securesms/mms/DocumentSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/DocumentSlide.java
@@ -14,12 +14,8 @@ import org.thoughtcrime.securesms.util.StorageUtil;
public class DocumentSlide extends Slide {
- public DocumentSlide(@NonNull Context context, @NonNull Attachment attachment) {
- super(context, attachment);
- }
-
public DocumentSlide(Context context, DcMsg dcMsg) {
- this(context, new DcAttachment(dcMsg));
+ super(context, new DcAttachment(dcMsg));
dcMsgId = dcMsg.getId();
}
diff --git a/src/org/thoughtcrime/securesms/mms/GifSlide.java b/src/org/thoughtcrime/securesms/mms/GifSlide.java
index badda3630..86815e775 100644
--- a/src/org/thoughtcrime/securesms/mms/GifSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/GifSlide.java
@@ -15,10 +15,6 @@ public class GifSlide extends ImageSlide {
super(context, dcMsg);
}
- public GifSlide(Context context, Attachment attachment) {
- super(context, attachment);
- }
-
public GifSlide(Context context, Uri uri, long size, int width, int height) {
super(context, constructAttachmentFromUri(context, uri, MediaUtil.IMAGE_GIF, size, width, height, uri, null, false));
}
diff --git a/src/org/thoughtcrime/securesms/mms/MmsSlide.java b/src/org/thoughtcrime/securesms/mms/MmsSlide.java
deleted file mode 100644
index fa8a6294e..000000000
--- a/src/org/thoughtcrime/securesms/mms/MmsSlide.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.thoughtcrime.securesms.mms;
-
-
-import android.content.Context;
-import androidx.annotation.NonNull;
-
-import com.b44t.messenger.DcMsg;
-
-import org.thoughtcrime.securesms.attachments.Attachment;
-
-public class MmsSlide extends ImageSlide {
-
- public MmsSlide(@NonNull Context context, @NonNull DcMsg dcMsg) {
- super(context, dcMsg);
- }
-
- public MmsSlide(@NonNull Context context, @NonNull Attachment attachment) {
- super(context, attachment);
- }
-}
diff --git a/src/org/thoughtcrime/securesms/mms/VideoSlide.java b/src/org/thoughtcrime/securesms/mms/VideoSlide.java
index 5e5eae5c1..f3dcf6cba 100644
--- a/src/org/thoughtcrime/securesms/mms/VideoSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/VideoSlide.java
@@ -49,10 +49,6 @@ public class VideoSlide extends Slide {
dcMsgId = dcMsg.getId();
}
- public VideoSlide(Context context, Attachment attachment) {
- super(context, attachment);
- }
-
@Override
public boolean hasPlayOverlay() {
return true;
diff --git a/src/org/thoughtcrime/securesms/util/MediaUtil.java b/src/org/thoughtcrime/securesms/util/MediaUtil.java
index a4c64fc43..ea2512ad2 100644
--- a/src/org/thoughtcrime/securesms/util/MediaUtil.java
+++ b/src/org/thoughtcrime/securesms/util/MediaUtil.java
@@ -16,14 +16,12 @@ import com.b44t.messenger.DcMsg;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.gif.GifDrawable;
-import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.mms.AudioSlide;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri;
import org.thoughtcrime.securesms.mms.DocumentSlide;
import org.thoughtcrime.securesms.mms.GifSlide;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.mms.ImageSlide;
-import org.thoughtcrime.securesms.mms.MmsSlide;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.mms.VideoSlide;
@@ -50,46 +48,22 @@ public class MediaUtil {
public static Slide getSlideForMsg(Context context, DcMsg dcMsg) {
Slide slide = null;
- if (isGif(dcMsg.getFilemime())) {
+ if (dcMsg.getType() == DcMsg.DC_MSG_GIF) {
slide = new GifSlide(context, dcMsg);
- } else if (isImageType(dcMsg.getFilemime())) {
+ } else if (dcMsg.getType() == DcMsg.DC_MSG_IMAGE) {
slide = new ImageSlide(context, dcMsg);
- } else if (isVideoType(dcMsg.getFilemime())) {
+ } else if (dcMsg.getType() == DcMsg.DC_MSG_VIDEO) {
slide = new VideoSlide(context, dcMsg);
- } else if (isAudioType(dcMsg.getFilemime())) {
+ } else if (dcMsg.getType() == DcMsg.DC_MSG_AUDIO
+ || dcMsg.getType() == DcMsg.DC_MSG_VOICE) {
slide = new AudioSlide(context, dcMsg);
- } else if (isMms(dcMsg.getFilemime())) {
- slide = new MmsSlide(context, dcMsg);
- } else if (dcMsg.getFilemime() != null) {
+ } else if (dcMsg.getType() == DcMsg.DC_MSG_FILE) {
slide = new DocumentSlide(context, dcMsg);
}
return slide;
}
- /**
- * @deprecated use getSlideForMsg instead.
- */
- @Deprecated
- public static Slide getSlideForAttachment(Context context, Attachment attachment) {
- Slide slide = null;
- if (isGif(attachment.getContentType())) {
- slide = new GifSlide(context, attachment);
- } else if (isImageType(attachment.getContentType())) {
- slide = new ImageSlide(context, attachment);
- } else if (isVideoType(attachment.getContentType())) {
- slide = new VideoSlide(context, attachment);
- } else if (isAudioType(attachment.getContentType())) {
- slide = new AudioSlide(context, attachment);
- } else if (isMms(attachment.getContentType())) {
- slide = new MmsSlide(context, attachment);
- } else if (attachment.getContentType() != null) {
- slide = new DocumentSlide(context, attachment);
- }
-
- return slide;
- }
-
public static @Nullable String getMimeType(Context context, Uri uri) {
if (uri == null) return null;
@@ -193,10 +167,6 @@ public class MediaUtil {
return dimens;
}
- public static boolean isMms(String contentType) {
- return !TextUtils.isEmpty(contentType) && contentType.trim().equals("application/mms");
- }
-
public static boolean isVideo(String contentType) {
return !TextUtils.isEmpty(contentType) && contentType.trim().startsWith("video/");
}