mirror of
https://github.com/oxen-io/session-android.git
synced 2025-04-21 11:31:30 +00:00
Merge branch 'dev' of https://github.com/oxen-io/session-android into message-details
This commit is contained in:
commit
0933429175
@ -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
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) }
|
||||||
|
@ -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)
|
||||||
|
@ -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() }
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user