mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-24 16:57:50 +00:00
SES-1727 Mentions text is the wrong colour (#1454)
* Fixes #1453 * Cleanup * Code review adjustments * Adjusted mentions to use the accent colour as their background colour when using light themes --------- Co-authored-by: alansley <aclansley@gmail.com>
This commit is contained in:
parent
bff1a12155
commit
96510946c6
@ -39,15 +39,20 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
|
|||||||
public int getDesiredTheme() {
|
public int getDesiredTheme() {
|
||||||
ThemeState themeState = ActivityUtilitiesKt.themeState(getPreferences());
|
ThemeState themeState = ActivityUtilitiesKt.themeState(getPreferences());
|
||||||
int userSelectedTheme = themeState.getTheme();
|
int userSelectedTheme = themeState.getTheme();
|
||||||
|
|
||||||
|
// If the user has configured Session to follow the system light/dark theme mode then do so..
|
||||||
if (themeState.getFollowSystem()) {
|
if (themeState.getFollowSystem()) {
|
||||||
// do light or dark based on the selected theme
|
|
||||||
|
// Use light or dark versions of the user's theme based on light-mode / dark-mode settings
|
||||||
boolean isDayUi = UiModeUtilities.isDayUiMode(this);
|
boolean isDayUi = UiModeUtilities.isDayUiMode(this);
|
||||||
if (userSelectedTheme == R.style.Ocean_Dark || userSelectedTheme == R.style.Ocean_Light) {
|
if (userSelectedTheme == R.style.Ocean_Dark || userSelectedTheme == R.style.Ocean_Light) {
|
||||||
return isDayUi ? R.style.Ocean_Light : R.style.Ocean_Dark;
|
return isDayUi ? R.style.Ocean_Light : R.style.Ocean_Dark;
|
||||||
} else {
|
} else {
|
||||||
return isDayUi ? R.style.Classic_Light : R.style.Classic_Dark;
|
return isDayUi ? R.style.Classic_Light : R.style.Classic_Dark;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else // ..otherwise just return their selected theme.
|
||||||
|
{
|
||||||
return userSelectedTheme;
|
return userSelectedTheme;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,18 +4,24 @@ import android.content.Context
|
|||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import android.text.Spannable
|
import android.text.Spannable
|
||||||
import android.text.SpannableString
|
import android.text.SpannableString
|
||||||
|
import android.text.style.BackgroundColorSpan
|
||||||
import android.text.style.ForegroundColorSpan
|
import android.text.style.ForegroundColorSpan
|
||||||
import android.text.style.StyleSpan
|
import android.text.style.StyleSpan
|
||||||
import android.util.Range
|
import android.util.Range
|
||||||
|
import androidx.appcompat.widget.ThemeUtils
|
||||||
import androidx.core.content.res.ResourcesCompat
|
import androidx.core.content.res.ResourcesCompat
|
||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
import nl.komponents.kovenant.combine.Tuple2
|
import nl.komponents.kovenant.combine.Tuple2
|
||||||
import org.session.libsession.messaging.contacts.Contact
|
import org.session.libsession.messaging.contacts.Contact
|
||||||
import org.session.libsession.messaging.utilities.SodiumUtilities
|
import org.session.libsession.messaging.utilities.SodiumUtilities
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
|
import org.session.libsession.utilities.ThemeUtil
|
||||||
|
import org.session.libsignal.utilities.Log
|
||||||
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
|
||||||
import org.thoughtcrime.securesms.util.UiModeUtilities
|
import org.thoughtcrime.securesms.util.UiModeUtilities
|
||||||
import org.thoughtcrime.securesms.util.getAccentColor
|
import org.thoughtcrime.securesms.util.getAccentColor
|
||||||
|
import org.thoughtcrime.securesms.util.getColorResourceIdFromAttr
|
||||||
|
import org.thoughtcrime.securesms.util.getMessageTextColourAttr
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
object MentionUtilities {
|
object MentionUtilities {
|
||||||
@ -58,15 +64,37 @@ object MentionUtilities {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val result = SpannableString(text)
|
val result = SpannableString(text)
|
||||||
val isLightMode = UiModeUtilities.isDayUiMode(context)
|
|
||||||
val color = if (isOutgoingMessage) {
|
var mentionTextColour: Int? = null
|
||||||
ResourcesCompat.getColor(context.resources, if (isLightMode) R.color.white else R.color.black, context.theme)
|
// In dark themes..
|
||||||
} else {
|
if (ThemeUtil.isDarkTheme(context)) {
|
||||||
context.getAccentColor()
|
// ..we use the standard outgoing message colour for outgoing messages..
|
||||||
|
if (isOutgoingMessage) {
|
||||||
|
val mentionTextColourAttributeId = getMessageTextColourAttr(true)
|
||||||
|
val mentionTextColourResourceId = getColorResourceIdFromAttr(context, mentionTextColourAttributeId)
|
||||||
|
mentionTextColour = ResourcesCompat.getColor(context.resources, mentionTextColourResourceId, context.theme)
|
||||||
|
}
|
||||||
|
else // ..but we use the accent colour for incoming messages (i.e., someone mentioning us)..
|
||||||
|
{
|
||||||
|
mentionTextColour = context.getAccentColor()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else // ..while in light themes we always just use the incoming or outgoing message text colour for mentions.
|
||||||
|
{
|
||||||
|
val mentionTextColourAttributeId = getMessageTextColourAttr(isOutgoingMessage)
|
||||||
|
val mentionTextColourResourceId = getColorResourceIdFromAttr(context, mentionTextColourAttributeId)
|
||||||
|
mentionTextColour = ResourcesCompat.getColor(context.resources, mentionTextColourResourceId, context.theme)
|
||||||
|
}
|
||||||
|
|
||||||
for (mention in mentions) {
|
for (mention in mentions) {
|
||||||
result.setSpan(ForegroundColorSpan(color), mention.first.lower, mention.first.upper, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
result.setSpan(ForegroundColorSpan(mentionTextColour), mention.first.lower, mention.first.upper, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||||
result.setSpan(StyleSpan(Typeface.BOLD), mention.first.lower, mention.first.upper, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
result.setSpan(StyleSpan(Typeface.BOLD), mention.first.lower, mention.first.upper, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||||
|
|
||||||
|
// If we're using a light theme then we change the background colour of the mention to be the accent colour
|
||||||
|
if (ThemeUtil.isLightTheme(context)) {
|
||||||
|
val backgroundColour = context.getAccentColor();
|
||||||
|
result.setSpan(BackgroundColorSpan(backgroundColour), mention.first.lower, mention.first.upper, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,15 @@ import android.graphics.Bitmap
|
|||||||
import android.graphics.PointF
|
import android.graphics.PointF
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.util.Size
|
import android.util.Size
|
||||||
|
import android.util.TypedValue
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.annotation.ColorInt
|
import androidx.annotation.ColorInt
|
||||||
import androidx.annotation.DimenRes
|
import androidx.annotation.DimenRes
|
||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
import org.session.libsession.utilities.getColorFromAttr
|
import org.session.libsession.utilities.getColorFromAttr
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
|
import androidx.annotation.AttrRes
|
||||||
|
import androidx.annotation.ColorRes
|
||||||
import androidx.core.graphics.applyCanvas
|
import androidx.core.graphics.applyCanvas
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@ -32,6 +35,20 @@ val View.hitRect: Rect
|
|||||||
@ColorInt
|
@ColorInt
|
||||||
fun Context.getAccentColor() = getColorFromAttr(R.attr.colorAccent)
|
fun Context.getAccentColor() = getColorFromAttr(R.attr.colorAccent)
|
||||||
|
|
||||||
|
// Method to grab the appropriate attribute for a message colour.
|
||||||
|
// Note: This is an attribute, NOT a resource Id - see `getColorResourceIdFromAttr` for that.
|
||||||
|
@AttrRes
|
||||||
|
fun getMessageTextColourAttr(messageIsOutgoing: Boolean): Int =
|
||||||
|
if (messageIsOutgoing) R.attr.message_sent_text_color else R.attr.message_received_text_color
|
||||||
|
|
||||||
|
// Method to get an actual R.id.<SOME_COLOUR> resource Id from an attribute such as R.attr.message_sent_text_color etc.
|
||||||
|
@ColorRes
|
||||||
|
fun getColorResourceIdFromAttr(context: Context, attr: Int): Int {
|
||||||
|
val typedValue = TypedValue()
|
||||||
|
context.theme.resolveAttribute(attr, typedValue, true)
|
||||||
|
return typedValue.resourceId
|
||||||
|
}
|
||||||
|
|
||||||
fun View.animateSizeChange(@DimenRes startSizeID: Int, @DimenRes endSizeID: Int, animationDuration: Long = 250) {
|
fun View.animateSizeChange(@DimenRes startSizeID: Int, @DimenRes endSizeID: Int, animationDuration: Long = 250) {
|
||||||
val startSize = resources.getDimension(startSizeID)
|
val startSize = resources.getDimension(startSizeID)
|
||||||
val endSize = resources.getDimension(endSizeID)
|
val endSize = resources.getDimension(endSizeID)
|
||||||
@ -70,7 +87,6 @@ fun View.hideKeyboard() {
|
|||||||
imm.hideSoftInputFromWindow(this.windowToken, 0)
|
imm.hideSoftInputFromWindow(this.windowToken, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun View.drawToBitmap(config: Bitmap.Config = Bitmap.Config.ARGB_8888, longestWidth: Int = 2000): Bitmap {
|
fun View.drawToBitmap(config: Bitmap.Config = Bitmap.Config.ARGB_8888, longestWidth: Int = 2000): Bitmap {
|
||||||
val size = Size(measuredWidth, measuredHeight).coerceAtMost(longestWidth)
|
val size = Size(measuredWidth, measuredHeight).coerceAtMost(longestWidth)
|
||||||
val scale = size.width / measuredWidth.toFloat()
|
val scale = size.width / measuredWidth.toFloat()
|
||||||
|
@ -2,7 +2,7 @@ package org.session.libsession.messaging.mentions
|
|||||||
|
|
||||||
import org.session.libsession.messaging.MessagingModuleConfiguration
|
import org.session.libsession.messaging.MessagingModuleConfiguration
|
||||||
import org.session.libsession.messaging.contacts.Contact
|
import org.session.libsession.messaging.contacts.Contact
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
|
|
||||||
object MentionsManager {
|
object MentionsManager {
|
||||||
var userPublicKeyCache = mutableMapOf<Long, Set<String>>() // Thread ID to set of user hex encoded public keys
|
var userPublicKeyCache = mutableMapOf<Long, Set<String>>() // Thread ID to set of user hex encoded public keys
|
||||||
|
@ -27,6 +27,10 @@ public class ThemeUtil {
|
|||||||
return getAttributeText(context, R.attr.theme_type, "light").equals("dark");
|
return getAttributeText(context, R.attr.theme_type, "light").equals("dark");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isLightTheme(@NonNull Context context) {
|
||||||
|
return getAttributeText(context, R.attr.theme_type, "light").equals("light");
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean getThemedBoolean(@NonNull Context context, @AttrRes int attr) {
|
public static boolean getThemedBoolean(@NonNull Context context, @AttrRes int attr) {
|
||||||
TypedValue typedValue = new TypedValue();
|
TypedValue typedValue = new TypedValue();
|
||||||
Resources.Theme theme = context.getTheme();
|
Resources.Theme theme = context.getTheme();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user