diff --git a/app/build.gradle b/app/build.gradle index 0b50353383..7cdb64f84a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -143,7 +143,7 @@ dependencies { testImplementation 'org.robolectric:shadows-multidex:4.2' } -def canonicalVersionCode = 201 +def canonicalVersionCode = 203 def canonicalVersionName = "1.11.4" def postFixSize = 10 diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 289532ad3d..d4e0b3a1dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -861,17 +861,13 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe conversationRecyclerView.scrollToPosition(lastSeenItemPosition) } - override fun playNextAudioIfPossible(current: Int) { - if (current > 0) { - val nextVisibleMessageView = conversationRecyclerView[current - 1] as? VisibleMessageView - nextVisibleMessageView?.let { visibleMessageView -> - visibleMessageView.messageContentView.mainContainer.children.forEach { child -> - val nextVoiceMessageView = child as? VoiceMessageView - nextVoiceMessageView?.let { voiceMessageView -> - voiceMessageView.togglePlayback() - return@forEach - } - } + override fun playVoiceMessageAtIndexIfPossible(indexInAdapter: Int) { + if (indexInAdapter < 0 || indexInAdapter >= adapter.itemCount) { return } + val viewHolder = conversationRecyclerView.findViewHolderForAdapterPosition(indexInAdapter) as? ConversationAdapter.VisibleMessageViewHolder + val nextVisibleMessageView = viewHolder?.view ?: return + nextVisibleMessageView.messageContentView.mainContainer.children.forEach { view -> + if (view is VoiceMessageView) { + return@forEach view.togglePlayback() } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt index a4a5f1ba28..15de18a608 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.conversation.v2 import android.content.Context import android.database.Cursor -import android.graphics.Rect import android.view.MotionEvent import android.view.ViewGroup import androidx.core.view.isVisible @@ -72,7 +71,7 @@ class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPr view.snIsSelected = isSelected view.messageTimestampTextView.isVisible = isSelected val position = viewHolder.adapterPosition - view.viewHolderIndex = position + view.indexInAdapter = position view.bind(message, getMessageBefore(position, cursor), getMessageAfter(position, cursor), glide, searchQuery) view.onPress = { event -> onItemPress(message, viewHolder.adapterPosition, view, event) } view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt index 1d90f8475a..ec55af5427 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -22,7 +22,6 @@ import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat import androidx.core.text.getSpans import androidx.core.text.toSpannable -import kotlinx.android.synthetic.main.view_link_preview.view.* import kotlinx.android.synthetic.main.view_visible_message_content.view.* import network.loki.messenger.R import org.session.libsession.utilities.ThemeUtil @@ -49,7 +48,7 @@ class VisibleMessageContentView : LinearLayout { var onContentClick: ((event: MotionEvent) -> Unit)? = null var onContentDoubleTap: (() -> Unit)? = null var delegate: VisibleMessageContentViewDelegate? = null - var viewHolderIndex: Int = -1 + var indexInAdapter: Int = -1 // region Lifecycle constructor(context: Context) : super(context) { initialize() } @@ -111,7 +110,7 @@ class VisibleMessageContentView : LinearLayout { // Audio attachment if (contactIsTrusted || message.isOutgoing) { val voiceMessageView = VoiceMessageView(context) - voiceMessageView.index = viewHolderIndex + voiceMessageView.indexInAdapter = indexInAdapter voiceMessageView.delegate = context as? ConversationActivityV2 voiceMessageView.bind(message, isStartOfMessageCluster, isEndOfMessageCluster) mainContainer.addView(voiceMessageView) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 0fcbf685b4..0d54f345c6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -43,7 +43,7 @@ class VisibleMessageView : LinearLayout { private var longPressCallback: Runnable? = null private var onDownTimestamp = 0L private var onDoubleTap: (() -> Unit)? = null - var viewHolderIndex: Int = -1 + var indexInAdapter: Int = -1 var snIsSelected = false set(value) { field = value; handleIsSelectedChanged()} var onPress: ((event: MotionEvent) -> Unit)? = null @@ -52,7 +52,7 @@ class VisibleMessageView : LinearLayout { var contentViewDelegate: VisibleMessageContentViewDelegate? = null companion object { - const val swipeToReplyThreshold = 80.0f // dp + const val swipeToReplyThreshold = 64.0f // dp const val longPressMovementTreshold = 10.0f // dp const val longPressDurationThreshold = 250L // ms const val maxDoubleTapInterval = 200L @@ -149,7 +149,7 @@ class VisibleMessageView : LinearLayout { var maxWidth = screenWidth - startPadding - endPadding if (profilePictureContainer.visibility != View.GONE) { maxWidth -= profilePictureContainer.width } // Populate content view - messageContentView.viewHolderIndex = viewHolderIndex + messageContentView.indexInAdapter = indexInAdapter messageContentView.bind(message, isStartOfMessageCluster, isEndOfMessageCluster, glide, maxWidth, thread, searchQuery, isGroupThread || (contact?.isTrusted ?: false)) messageContentView.delegate = contentViewDelegate onDoubleTap = { messageContentView.onContentDoubleTap?.invoke() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt index 6498a1a472..31545ceace 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt @@ -32,7 +32,7 @@ class VoiceMessageView : LinearLayout, AudioSlidePlayer.Listener { private var duration = 0L private var player: AudioSlidePlayer? = null var delegate: VoiceMessageViewDelegate? = null - var index = -1 + var indexInAdapter = -1 // region Lifecycle constructor(context: Context) : super(context) { initialize() } @@ -85,7 +85,7 @@ class VoiceMessageView : LinearLayout, AudioSlidePlayer.Listener { if (progress == 1.0) { togglePlayback() handleProgressChanged(0.0) - delegate?.playNextAudioIfPossible(index) + delegate?.playVoiceMessageAtIndexIfPossible(indexInAdapter - 1) } else { handleProgressChanged(progress) } @@ -138,5 +138,5 @@ class VoiceMessageView : LinearLayout, AudioSlidePlayer.Listener { interface VoiceMessageViewDelegate { - fun playNextAudioIfPossible(current: Int) + fun playVoiceMessageAtIndexIfPossible(indexInAdapter: Int) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt index 608091b05f..6c6fd8e1ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt @@ -159,6 +159,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis override fun onResume() { super.onResume() + ApplicationContext.getInstance(this).messageNotifier.setHomeScreenVisible(true) if (TextSecurePreferences.getLocalNumber(this) == null) { return; } // This can be the case after a secondary device is auto-cleared IdentityKeyUtil.checkUpdate(this) profileButton.recycle() // clear cached image before update tje profilePictureView @@ -174,6 +175,11 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis } } + override fun onPause() { + super.onPause() + ApplicationContext.getInstance(this).messageNotifier.setHomeScreenVisible(false) + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == CreateClosedGroupActivity.closedGroupCreatedResultCode) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java index c5bf55d800..33f25c96b4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java @@ -96,6 +96,7 @@ public class DefaultMessageNotifier implements MessageNotifier { private static final long DESKTOP_ACTIVITY_PERIOD = TimeUnit.MINUTES.toMillis(1); private volatile static long visibleThread = -1; + private volatile static boolean homeScreenVisible = false; private volatile static long lastDesktopActivityTimestamp = -1; private volatile static long lastAudibleNotification = -1; private static final CancelableExecutor executor = new CancelableExecutor(); @@ -105,6 +106,11 @@ public class DefaultMessageNotifier implements MessageNotifier { visibleThread = threadId; } + @Override + public void setHomeScreenVisible(boolean isVisible) { + homeScreenVisible = isVisible; + } + @Override public void setLastDesktopActivityTimestamp(long timestamp) { lastDesktopActivityTimestamp = timestamp; @@ -234,7 +240,7 @@ public class DefaultMessageNotifier implements MessageNotifier { if (isVisible) { sendInThreadNotification(context, threads.getRecipientForThreadId(threadId)); - } else { + } else if (!homeScreenVisible) { updateNotification(context, signal, 0); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java index 4a72d7757c..5ca700cf66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java @@ -29,6 +29,11 @@ public class OptimizedMessageNotifier implements MessageNotifier { @Override public void setVisibleThread(long threadId) { wrapped.setVisibleThread(threadId); } + @Override + public void setHomeScreenVisible(boolean isVisible) { + wrapped.setHomeScreenVisible(isVisible); + } + @Override public void setLastDesktopActivityTimestamp(long timestamp) { wrapped.setLastDesktopActivityTimestamp(timestamp);} diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/MessageNotifier.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/MessageNotifier.kt index 4f820c4a9b..37480543b7 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/MessageNotifier.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/MessageNotifier.kt @@ -4,6 +4,7 @@ import android.content.Context import org.session.libsession.utilities.recipients.Recipient interface MessageNotifier { + fun setHomeScreenVisible(isVisible: Boolean) fun setVisibleThread(threadId: Long) fun setLastDesktopActivityTimestamp(timestamp: Long) fun notifyMessageDeliveryFailed(context: Context?, recipient: Recipient?, threadId: Long)