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 @@ - + + @@ -11,4 +16,4 @@ android:id="@+id/menu_select_all" app:showAsAction="never"/> - \ 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/"); }