Fix timer color
This commit is contained in:
parent
61c51ecf64
commit
7b533f3676
|
@ -1,10 +1,10 @@
|
||||||
package org.thoughtcrime.securesms.conversation.v2.components;
|
package org.thoughtcrime.securesms.conversation.v2.components;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.util.AttributeSet;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.appcompat.content.res.AppCompatResources;
|
||||||
|
|
||||||
import org.session.libsession.utilities.Util;
|
import org.session.libsession.utilities.Util;
|
||||||
|
|
||||||
|
@ -13,8 +13,10 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import network.loki.messenger.R;
|
import network.loki.messenger.R;
|
||||||
|
|
||||||
public class ExpirationTimerView extends androidx.appcompat.widget.AppCompatImageView {
|
public class ExpirationTimerView {
|
||||||
|
|
||||||
|
private final ImageView imageView;
|
||||||
|
private final Integer iconColor;
|
||||||
private long startedAt;
|
private long startedAt;
|
||||||
private long expiresIn;
|
private long expiresIn;
|
||||||
|
|
||||||
|
@ -35,18 +37,9 @@ public class ExpirationTimerView extends androidx.appcompat.widget.AppCompatImag
|
||||||
R.drawable.timer55,
|
R.drawable.timer55,
|
||||||
R.drawable.timer60 };
|
R.drawable.timer60 };
|
||||||
|
|
||||||
public ExpirationTimerView(Context context) {
|
public ExpirationTimerView(ImageView imageView, Integer iconColor) {
|
||||||
super(context);
|
this.imageView = imageView;
|
||||||
}
|
this.iconColor = iconColor;
|
||||||
|
|
||||||
public ExpirationTimerView(Context context, @Nullable AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ExpirationTimerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
|
|
||||||
setContentDescription(context.getString(R.string.AccessibilityId_timer_icon));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExpirationTime(long startedAt, long expiresIn) {
|
public void setExpirationTime(long startedAt, long expiresIn) {
|
||||||
|
@ -60,7 +53,10 @@ public class ExpirationTimerView extends androidx.appcompat.widget.AppCompatImag
|
||||||
int frame = (int) Math.ceil(percentFull * (frames.length - 1));
|
int frame = (int) Math.ceil(percentFull * (frames.length - 1));
|
||||||
|
|
||||||
frame = Math.max(0, Math.min(frame, frames.length - 1));
|
frame = Math.max(0, Math.min(frame, frames.length - 1));
|
||||||
setImageResource(frames[frame]);
|
|
||||||
|
Drawable drawable = AppCompatResources.getDrawable(imageView.getContext(), frames[frame]).mutate();
|
||||||
|
if (iconColor != null) drawable.setTint(iconColor);
|
||||||
|
imageView.setImageDrawable(drawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startAnimation() {
|
public void startAnimation() {
|
||||||
|
|
|
@ -12,7 +12,6 @@ import android.view.Gravity
|
||||||
import android.view.HapticFeedbackConstants
|
import android.view.HapticFeedbackConstants
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import androidx.annotation.ColorInt
|
import androidx.annotation.ColorInt
|
||||||
|
@ -22,7 +21,6 @@ import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.view.isInvisible
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.marginBottom
|
import androidx.core.view.marginBottom
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
@ -39,6 +37,7 @@ import org.session.libsignal.utilities.IdPrefix
|
||||||
import org.session.libsignal.utilities.ThreadUtils
|
import org.session.libsignal.utilities.ThreadUtils
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
import org.thoughtcrime.securesms.ApplicationContext
|
||||||
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
|
||||||
|
import org.thoughtcrime.securesms.conversation.v2.components.ExpirationTimerView
|
||||||
import org.thoughtcrime.securesms.database.LokiAPIDatabase
|
import org.thoughtcrime.securesms.database.LokiAPIDatabase
|
||||||
import org.thoughtcrime.securesms.database.LokiThreadDatabase
|
import org.thoughtcrime.securesms.database.LokiThreadDatabase
|
||||||
import org.thoughtcrime.securesms.database.MmsDatabase
|
import org.thoughtcrime.securesms.database.MmsDatabase
|
||||||
|
@ -203,43 +202,7 @@ class VisibleMessageView : LinearLayout {
|
||||||
binding.dateBreakTextView.text = if (showDateBreak) DateUtils.getDisplayFormattedTimeSpanString(context, Locale.getDefault(), message.timestamp) else null
|
binding.dateBreakTextView.text = if (showDateBreak) DateUtils.getDisplayFormattedTimeSpanString(context, Locale.getDefault(), message.timestamp) else null
|
||||||
binding.dateBreakTextView.isVisible = showDateBreak
|
binding.dateBreakTextView.isVisible = showDateBreak
|
||||||
// Message status indicator
|
// Message status indicator
|
||||||
if (message.isOutgoing) {
|
showStatusMessage(message)
|
||||||
val (iconID, iconColor, textId, contentDescription) = getMessageStatusImage(message)
|
|
||||||
if (textId != null) {
|
|
||||||
binding.messageStatusTextView.setText(textId)
|
|
||||||
|
|
||||||
if (iconColor != null) {
|
|
||||||
binding.messageStatusTextView.setTextColor(iconColor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (iconID != null) {
|
|
||||||
val drawable = ContextCompat.getDrawable(context, iconID)?.mutate()
|
|
||||||
if (iconColor != null) {
|
|
||||||
drawable?.setTint(iconColor)
|
|
||||||
}
|
|
||||||
binding.messageStatusImageView.setImageDrawable(drawable)
|
|
||||||
}
|
|
||||||
binding.messageStatusImageView.contentDescription = contentDescription
|
|
||||||
|
|
||||||
val lastMessageID = mmsSmsDb.getLastMessageID(message.threadId)
|
|
||||||
binding.messageStatusTextView.isVisible = (
|
|
||||||
textId != null && (
|
|
||||||
!message.isSent ||
|
|
||||||
message.id == lastMessageID
|
|
||||||
)
|
|
||||||
)
|
|
||||||
binding.messageStatusImageView.isVisible = (
|
|
||||||
iconID != null && (
|
|
||||||
!message.isSent ||
|
|
||||||
message.id == lastMessageID
|
|
||||||
)
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
binding.messageStatusTextView.isVisible = false
|
|
||||||
binding.messageStatusImageView.isVisible = false
|
|
||||||
}
|
|
||||||
// Expiration timer
|
|
||||||
updateExpirationTimer(message)
|
|
||||||
// Emoji Reactions
|
// Emoji Reactions
|
||||||
val emojiLayoutParams = binding.emojiReactionsView.root.layoutParams as ConstraintLayout.LayoutParams
|
val emojiLayoutParams = binding.emojiReactionsView.root.layoutParams as ConstraintLayout.LayoutParams
|
||||||
emojiLayoutParams.horizontalBias = if (message.isOutgoing) 1f else 0f
|
emojiLayoutParams.horizontalBias = if (message.isOutgoing) 1f else 0f
|
||||||
|
@ -274,6 +237,29 @@ class VisibleMessageView : LinearLayout {
|
||||||
onDoubleTap = { binding.messageContentView.root.onContentDoubleTap?.invoke() }
|
onDoubleTap = { binding.messageContentView.root.onContentDoubleTap?.invoke() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun showStatusMessage(message: MessageRecord) {
|
||||||
|
if (message.isOutgoing) {
|
||||||
|
val (iconID, iconColor, textId, contentDescription) = getMessageStatusImage(message)
|
||||||
|
textId?.let(binding.messageStatusTextView::setText)
|
||||||
|
iconColor?.let(binding.messageStatusTextView::setTextColor)
|
||||||
|
iconID?.let { ContextCompat.getDrawable(context, it) }
|
||||||
|
?.run { iconColor?.let { mutate().apply { setTint(it) } } ?: this }
|
||||||
|
?.let(binding.messageStatusImageView::setImageDrawable)
|
||||||
|
binding.messageStatusImageView.contentDescription = contentDescription
|
||||||
|
|
||||||
|
val lastMessageID = mmsSmsDb.getLastMessageID(message.threadId)
|
||||||
|
binding.messageStatusTextView.isVisible =
|
||||||
|
textId != null && (!message.isSent || message.id == lastMessageID)
|
||||||
|
binding.messageStatusImageView.isVisible =
|
||||||
|
iconID != null && (!message.isSent || message.id == lastMessageID)
|
||||||
|
|
||||||
|
updateExpirationTimer(message, iconColor)
|
||||||
|
} else {
|
||||||
|
binding.messageStatusTextView.isVisible = false
|
||||||
|
binding.messageStatusImageView.isVisible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun isStartOfMessageCluster(current: MessageRecord, previous: MessageRecord?, isGroupThread: Boolean): Boolean {
|
private fun isStartOfMessageCluster(current: MessageRecord, previous: MessageRecord?, isGroupThread: Boolean): Boolean {
|
||||||
return if (isGroupThread) {
|
return if (isGroupThread) {
|
||||||
previous == null || previous.isUpdate || !DateUtils.isSameHour(current.timestamp, previous.timestamp)
|
previous == null || previous.isUpdate || !DateUtils.isSameHour(current.timestamp, previous.timestamp)
|
||||||
|
@ -341,46 +327,42 @@ class VisibleMessageView : LinearLayout {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateExpirationTimer(message: MessageRecord) {
|
private fun updateExpirationTimer(message: MessageRecord, iconColor: Int?) {
|
||||||
messageContentView.layoutParams = messageContentView.layoutParams
|
messageContentView.layoutParams = (messageContentView.layoutParams as FrameLayout.LayoutParams)
|
||||||
.apply {
|
.apply { gravity = if (message.isOutgoing) Gravity.END else Gravity.START }
|
||||||
this as FrameLayout.LayoutParams
|
|
||||||
this.gravity = if (message.isOutgoing) Gravity.END else Gravity.START
|
val container = binding.messageInnerContainer
|
||||||
|
container.layoutParams = (container.layoutParams as ConstraintLayout.LayoutParams)
|
||||||
|
.apply { horizontalBias = if (message.isOutgoing) 1f else 0f }
|
||||||
|
|
||||||
|
val expirationTimerView = ExpirationTimerView(binding.messageStatusImageView, iconColor)
|
||||||
|
|
||||||
|
// container.layoutParams = containerParams
|
||||||
|
if (message.expiresIn > 0) {
|
||||||
|
// expirationTimerView.setColorFilter(context.getColorFromAttr(android.R.attr.textColorPrimary))
|
||||||
|
// expirationTimerView.isInvisible = false
|
||||||
|
expirationTimerView.setPercentComplete(0.0f)
|
||||||
|
if (message.expireStarted > 0) {
|
||||||
|
expirationTimerView.setExpirationTime(message.expireStarted, message.expiresIn)
|
||||||
|
expirationTimerView.startAnimation()
|
||||||
|
if (message.expireStarted + message.expiresIn <= SnodeAPI.nowWithOffset) {
|
||||||
|
ApplicationContext.getInstance(context).expiringMessageManager.checkSchedule()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
expirationTimerView.setPercentComplete(0.0f)
|
||||||
|
expirationTimerView.stopAnimation()
|
||||||
|
ThreadUtils.queue {
|
||||||
|
val expirationManager = ApplicationContext.getInstance(context).expiringMessageManager
|
||||||
|
val id = message.getId()
|
||||||
|
val mms = message.isMms
|
||||||
|
if (mms) mmsDb.markExpireStarted(id) else smsDb.markExpireStarted(id)
|
||||||
|
expirationManager.scheduleDeletion(id, mms, message.expiresIn)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
// val container = binding.messageInnerContainer
|
// expirationTimerView.isInvisible = true
|
||||||
// container.layoutParams = (container.layoutParams as ConstraintLayout.LayoutParams)
|
}
|
||||||
// .apply { horizontalBias = if (message.isOutgoing) 1f else 0f }
|
container.requestLayout()
|
||||||
|
|
||||||
// container.layoutParams = containerParams
|
|
||||||
// if (message.expiresIn > 0 && !message.isPending) {
|
|
||||||
// binding.expirationTimerView.setColorFilter(context.getColorFromAttr(android.R.attr.textColorPrimary))
|
|
||||||
// binding.expirationTimerView.isInvisible = false
|
|
||||||
// binding.expirationTimerView.setPercentComplete(0.0f)
|
|
||||||
// if (message.expireStarted > 0) {
|
|
||||||
// binding.expirationTimerView.setExpirationTime(message.expireStarted, message.expiresIn)
|
|
||||||
// binding.expirationTimerView.startAnimation()
|
|
||||||
// if (message.expireStarted + message.expiresIn <= SnodeAPI.nowWithOffset) {
|
|
||||||
// ApplicationContext.getInstance(context).expiringMessageManager.checkSchedule()
|
|
||||||
// }
|
|
||||||
// } else if (!message.isMediaPending) {
|
|
||||||
// binding.expirationTimerView.setPercentComplete(0.0f)
|
|
||||||
// binding.expirationTimerView.stopAnimation()
|
|
||||||
// ThreadUtils.queue {
|
|
||||||
// val expirationManager = ApplicationContext.getInstance(context).expiringMessageManager
|
|
||||||
// val id = message.getId()
|
|
||||||
// val mms = message.isMms
|
|
||||||
// if (mms) mmsDb.markExpireStarted(id) else smsDb.markExpireStarted(id)
|
|
||||||
// expirationManager.scheduleDeletion(id, mms, message.expiresIn)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// binding.expirationTimerView.stopAnimation()
|
|
||||||
// binding.expirationTimerView.setPercentComplete(0.0f)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// binding.expirationTimerView.isInvisible = true
|
|
||||||
// }
|
|
||||||
// container.requestLayout()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleIsSelectedChanged() {
|
private fun handleIsSelectedChanged() {
|
||||||
|
|
Loading…
Reference in New Issue