Merge branch 'dev' of https://github.com/oxen-io/session-android into message-details

This commit is contained in:
ryanzhao 2021-07-14 13:52:24 +10:00
commit 0933429175
10 changed files with 36 additions and 24 deletions

View File

@ -143,7 +143,7 @@ dependencies {
testImplementation 'org.robolectric:shadows-multidex:4.2' testImplementation 'org.robolectric:shadows-multidex:4.2'
} }
def canonicalVersionCode = 201 def canonicalVersionCode = 203
def canonicalVersionName = "1.11.4" def canonicalVersionName = "1.11.4"
def postFixSize = 10 def postFixSize = 10

View File

@ -861,17 +861,13 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
conversationRecyclerView.scrollToPosition(lastSeenItemPosition) conversationRecyclerView.scrollToPosition(lastSeenItemPosition)
} }
override fun playNextAudioIfPossible(current: Int) { override fun playVoiceMessageAtIndexIfPossible(indexInAdapter: Int) {
if (current > 0) { if (indexInAdapter < 0 || indexInAdapter >= adapter.itemCount) { return }
val nextVisibleMessageView = conversationRecyclerView[current - 1] as? VisibleMessageView val viewHolder = conversationRecyclerView.findViewHolderForAdapterPosition(indexInAdapter) as? ConversationAdapter.VisibleMessageViewHolder
nextVisibleMessageView?.let { visibleMessageView -> val nextVisibleMessageView = viewHolder?.view ?: return
visibleMessageView.messageContentView.mainContainer.children.forEach { child -> nextVisibleMessageView.messageContentView.mainContainer.children.forEach { view ->
val nextVoiceMessageView = child as? VoiceMessageView if (view is VoiceMessageView) {
nextVoiceMessageView?.let { voiceMessageView -> return@forEach view.togglePlayback()
voiceMessageView.togglePlayback()
return@forEach
}
}
} }
} }
} }

View File

@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.conversation.v2
import android.content.Context import android.content.Context
import android.database.Cursor import android.database.Cursor
import android.graphics.Rect
import android.view.MotionEvent import android.view.MotionEvent
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -72,7 +71,7 @@ class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPr
view.snIsSelected = isSelected view.snIsSelected = isSelected
view.messageTimestampTextView.isVisible = isSelected view.messageTimestampTextView.isVisible = isSelected
val position = viewHolder.adapterPosition val position = viewHolder.adapterPosition
view.viewHolderIndex = position view.indexInAdapter = position
view.bind(message, getMessageBefore(position, cursor), getMessageAfter(position, cursor), glide, searchQuery) view.bind(message, getMessageBefore(position, cursor), getMessageAfter(position, cursor), glide, searchQuery)
view.onPress = { event -> onItemPress(message, viewHolder.adapterPosition, view, event) } view.onPress = { event -> onItemPress(message, viewHolder.adapterPosition, view, event) }
view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) } view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) }

View File

@ -22,7 +22,6 @@ import androidx.core.graphics.BlendModeColorFilterCompat
import androidx.core.graphics.BlendModeCompat import androidx.core.graphics.BlendModeCompat
import androidx.core.text.getSpans import androidx.core.text.getSpans
import androidx.core.text.toSpannable 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 kotlinx.android.synthetic.main.view_visible_message_content.view.*
import network.loki.messenger.R import network.loki.messenger.R
import org.session.libsession.utilities.ThemeUtil import org.session.libsession.utilities.ThemeUtil
@ -49,7 +48,7 @@ class VisibleMessageContentView : LinearLayout {
var onContentClick: ((event: MotionEvent) -> Unit)? = null var onContentClick: ((event: MotionEvent) -> Unit)? = null
var onContentDoubleTap: (() -> Unit)? = null var onContentDoubleTap: (() -> Unit)? = null
var delegate: VisibleMessageContentViewDelegate? = null var delegate: VisibleMessageContentViewDelegate? = null
var viewHolderIndex: Int = -1 var indexInAdapter: Int = -1
// region Lifecycle // region Lifecycle
constructor(context: Context) : super(context) { initialize() } constructor(context: Context) : super(context) { initialize() }
@ -111,7 +110,7 @@ class VisibleMessageContentView : LinearLayout {
// Audio attachment // Audio attachment
if (contactIsTrusted || message.isOutgoing) { if (contactIsTrusted || message.isOutgoing) {
val voiceMessageView = VoiceMessageView(context) val voiceMessageView = VoiceMessageView(context)
voiceMessageView.index = viewHolderIndex voiceMessageView.indexInAdapter = indexInAdapter
voiceMessageView.delegate = context as? ConversationActivityV2 voiceMessageView.delegate = context as? ConversationActivityV2
voiceMessageView.bind(message, isStartOfMessageCluster, isEndOfMessageCluster) voiceMessageView.bind(message, isStartOfMessageCluster, isEndOfMessageCluster)
mainContainer.addView(voiceMessageView) mainContainer.addView(voiceMessageView)

View File

@ -43,7 +43,7 @@ class VisibleMessageView : LinearLayout {
private var longPressCallback: Runnable? = null private var longPressCallback: Runnable? = null
private var onDownTimestamp = 0L private var onDownTimestamp = 0L
private var onDoubleTap: (() -> Unit)? = null private var onDoubleTap: (() -> Unit)? = null
var viewHolderIndex: Int = -1 var indexInAdapter: Int = -1
var snIsSelected = false var snIsSelected = false
set(value) { field = value; handleIsSelectedChanged()} set(value) { field = value; handleIsSelectedChanged()}
var onPress: ((event: MotionEvent) -> Unit)? = null var onPress: ((event: MotionEvent) -> Unit)? = null
@ -52,7 +52,7 @@ class VisibleMessageView : LinearLayout {
var contentViewDelegate: VisibleMessageContentViewDelegate? = null var contentViewDelegate: VisibleMessageContentViewDelegate? = null
companion object { companion object {
const val swipeToReplyThreshold = 80.0f // dp const val swipeToReplyThreshold = 64.0f // dp
const val longPressMovementTreshold = 10.0f // dp const val longPressMovementTreshold = 10.0f // dp
const val longPressDurationThreshold = 250L // ms const val longPressDurationThreshold = 250L // ms
const val maxDoubleTapInterval = 200L const val maxDoubleTapInterval = 200L
@ -149,7 +149,7 @@ class VisibleMessageView : LinearLayout {
var maxWidth = screenWidth - startPadding - endPadding var maxWidth = screenWidth - startPadding - endPadding
if (profilePictureContainer.visibility != View.GONE) { maxWidth -= profilePictureContainer.width } if (profilePictureContainer.visibility != View.GONE) { maxWidth -= profilePictureContainer.width }
// Populate content view // Populate content view
messageContentView.viewHolderIndex = viewHolderIndex messageContentView.indexInAdapter = indexInAdapter
messageContentView.bind(message, isStartOfMessageCluster, isEndOfMessageCluster, glide, maxWidth, thread, searchQuery, isGroupThread || (contact?.isTrusted ?: false)) messageContentView.bind(message, isStartOfMessageCluster, isEndOfMessageCluster, glide, maxWidth, thread, searchQuery, isGroupThread || (contact?.isTrusted ?: false))
messageContentView.delegate = contentViewDelegate messageContentView.delegate = contentViewDelegate
onDoubleTap = { messageContentView.onContentDoubleTap?.invoke() } onDoubleTap = { messageContentView.onContentDoubleTap?.invoke() }

View File

@ -32,7 +32,7 @@ class VoiceMessageView : LinearLayout, AudioSlidePlayer.Listener {
private var duration = 0L private var duration = 0L
private var player: AudioSlidePlayer? = null private var player: AudioSlidePlayer? = null
var delegate: VoiceMessageViewDelegate? = null var delegate: VoiceMessageViewDelegate? = null
var index = -1 var indexInAdapter = -1
// region Lifecycle // region Lifecycle
constructor(context: Context) : super(context) { initialize() } constructor(context: Context) : super(context) { initialize() }
@ -85,7 +85,7 @@ class VoiceMessageView : LinearLayout, AudioSlidePlayer.Listener {
if (progress == 1.0) { if (progress == 1.0) {
togglePlayback() togglePlayback()
handleProgressChanged(0.0) handleProgressChanged(0.0)
delegate?.playNextAudioIfPossible(index) delegate?.playVoiceMessageAtIndexIfPossible(indexInAdapter - 1)
} else { } else {
handleProgressChanged(progress) handleProgressChanged(progress)
} }
@ -138,5 +138,5 @@ class VoiceMessageView : LinearLayout, AudioSlidePlayer.Listener {
interface VoiceMessageViewDelegate { interface VoiceMessageViewDelegate {
fun playNextAudioIfPossible(current: Int) fun playVoiceMessageAtIndexIfPossible(indexInAdapter: Int)
} }

View File

@ -159,6 +159,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis
override fun onResume() { override fun onResume() {
super.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 if (TextSecurePreferences.getLocalNumber(this) == null) { return; } // This can be the case after a secondary device is auto-cleared
IdentityKeyUtil.checkUpdate(this) IdentityKeyUtil.checkUpdate(this)
profileButton.recycle() // clear cached image before update tje profilePictureView 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?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (resultCode == CreateClosedGroupActivity.closedGroupCreatedResultCode) { if (resultCode == CreateClosedGroupActivity.closedGroupCreatedResultCode) {

View File

@ -96,6 +96,7 @@ public class DefaultMessageNotifier implements MessageNotifier {
private static final long DESKTOP_ACTIVITY_PERIOD = TimeUnit.MINUTES.toMillis(1); private static final long DESKTOP_ACTIVITY_PERIOD = TimeUnit.MINUTES.toMillis(1);
private volatile static long visibleThread = -1; private volatile static long visibleThread = -1;
private volatile static boolean homeScreenVisible = false;
private volatile static long lastDesktopActivityTimestamp = -1; private volatile static long lastDesktopActivityTimestamp = -1;
private volatile static long lastAudibleNotification = -1; private volatile static long lastAudibleNotification = -1;
private static final CancelableExecutor executor = new CancelableExecutor(); private static final CancelableExecutor executor = new CancelableExecutor();
@ -105,6 +106,11 @@ public class DefaultMessageNotifier implements MessageNotifier {
visibleThread = threadId; visibleThread = threadId;
} }
@Override
public void setHomeScreenVisible(boolean isVisible) {
homeScreenVisible = isVisible;
}
@Override @Override
public void setLastDesktopActivityTimestamp(long timestamp) { public void setLastDesktopActivityTimestamp(long timestamp) {
lastDesktopActivityTimestamp = timestamp; lastDesktopActivityTimestamp = timestamp;
@ -234,7 +240,7 @@ public class DefaultMessageNotifier implements MessageNotifier {
if (isVisible) { if (isVisible) {
sendInThreadNotification(context, threads.getRecipientForThreadId(threadId)); sendInThreadNotification(context, threads.getRecipientForThreadId(threadId));
} else { } else if (!homeScreenVisible) {
updateNotification(context, signal, 0); updateNotification(context, signal, 0);
} }
} }

View File

@ -29,6 +29,11 @@ public class OptimizedMessageNotifier implements MessageNotifier {
@Override @Override
public void setVisibleThread(long threadId) { wrapped.setVisibleThread(threadId); } public void setVisibleThread(long threadId) { wrapped.setVisibleThread(threadId); }
@Override
public void setHomeScreenVisible(boolean isVisible) {
wrapped.setHomeScreenVisible(isVisible);
}
@Override @Override
public void setLastDesktopActivityTimestamp(long timestamp) { wrapped.setLastDesktopActivityTimestamp(timestamp);} public void setLastDesktopActivityTimestamp(long timestamp) { wrapped.setLastDesktopActivityTimestamp(timestamp);}

View File

@ -4,6 +4,7 @@ import android.content.Context
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
interface MessageNotifier { interface MessageNotifier {
fun setHomeScreenVisible(isVisible: Boolean)
fun setVisibleThread(threadId: Long) fun setVisibleThread(threadId: Long)
fun setLastDesktopActivityTimestamp(timestamp: Long) fun setLastDesktopActivityTimestamp(timestamp: Long)
fun notifyMessageDeliveryFailed(context: Context?, recipient: Recipient?, threadId: Long) fun notifyMessageDeliveryFailed(context: Context?, recipient: Recipient?, threadId: Long)