diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt index 62a47a91e..6149b7d68 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt @@ -1080,13 +1080,11 @@ class CallActivity : CallBaseActivity() { } private fun getSpotlightView(): SpotlightView? { - val primary = viewThemeUtils.getScheme(binding!!.audioOutputButton.context).primary - return SpotlightView.Builder(this) + val builder = SpotlightView.Builder(this) .introAnimationDuration(300) .enableRevealAnimation(true) .performClick(false) .fadeinTextDuration(400) - .headingTvColor(primary) .headingTvSize(20) .headingTvText(resources.getString(R.string.nc_push_to_talk)) .subHeadingTvColor(resources.getColor(R.color.bg_default, null)) @@ -1095,11 +1093,11 @@ class CallActivity : CallBaseActivity() { .maskColor(Color.parseColor("#dc000000")) .target(binding!!.microphoneButton) .lineAnimDuration(400) - .lineAndArcColor(primary) .enableDismissAfterShown(true) .dismissOnBackPress(true) .usageId("pushToTalk") - .show() + + return viewThemeUtils.talk.themeSpotlightView(context, builder).show() } private fun onCameraClick() { diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java index bb82cfa26..494918d39 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/AdvancedUserItem.java @@ -41,7 +41,6 @@ import androidx.annotation.Nullable; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; import eu.davidea.flexibleadapter.items.IFilterable; -import eu.davidea.flexibleadapter.utils.FlexibleUtils; import eu.davidea.viewholders.FlexibleViewHolder; public class AdvancedUserItem extends AbstractFlexibleItem implements @@ -65,8 +64,7 @@ public class AdvancedUserItem extends AbstractFlexibleItem implements @@ -74,8 +73,7 @@ public class ContactItem extends AbstractFlexibleItem implements IFilterable { @@ -103,8 +102,7 @@ public class MentionAutocompleteItem extends AbstractFlexibleItem implements @@ -81,8 +80,7 @@ public class ParticipantItem extends AbstractFlexibleItem context?.resources?.getString(R.string.nc_message_read) - ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) + ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read) + ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent) else -> null } readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context, drawableInt)?.let { binding.checkMark.setImageDrawable(it) - binding.checkMark.setColorFilter( - viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, - PorterDuff.Mode.SRC_ATOP - ) + viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark) } } @@ -176,7 +173,8 @@ class OutcomingLinkPreviewMessageViewHolder(outcomingView: View, payload: Any) : .enrichChatReplyMessageText( binding.messageQuote.quotedMessage.context, parentChatMessage, - viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant + false, + viewThemeUtils ) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt index ef7d71da0..e61b6704b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt @@ -25,7 +25,6 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.graphics.PorterDuff import android.net.Uri import android.util.Log import android.util.TypedValue @@ -38,6 +37,7 @@ import androidx.appcompat.content.res.AppCompatResources import autodagger.AutoInjector import coil.load import com.google.android.flexbox.FlexboxLayout +import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication @@ -84,15 +84,14 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : override fun onBind(message: ChatMessage) { super.onBind(message) sharedApplication!!.componentApplication.inject(this) - val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant - binding.messageTime.setTextColor(textColor) + viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) realView.isSelected = false val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams layoutParams.isWrapBefore = false - val textSize = context!!.resources.getDimension(R.dimen.chat_text_size) + val textSize = context.resources.getDimension(R.dimen.chat_text_size) colorizeMessageBubble(message) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) @@ -110,22 +109,19 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : } val readStatusContentDescriptionString = when (message.readStatus) { - ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) - ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) + ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read) + ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent) else -> null } readStatusDrawableInt?.let { drawableInt -> - AppCompatResources.getDrawable(context!!, drawableInt)?.let { + AppCompatResources.getDrawable(context, drawableInt)?.let { binding.checkMark.setImageDrawable(it) - binding.checkMark.setColorFilter( - viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, - PorterDuff.Mode.SRC_ATOP - ) + viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark) } } - binding.checkMark.setContentDescription(readStatusContentDescriptionString) + binding.checkMark.contentDescription = readStatusContentDescriptionString // geo-location setLocationDataOnMessageItem(message) @@ -163,7 +159,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : } } - binding.webview.settings?.javaScriptEnabled = true + binding.webview.settings.javaScriptEnabled = true binding.webview.webViewClient = object : WebViewClient() { @Deprecated("Use shouldOverrideUrlLoading(WebView view, WebResourceRequest request)") @@ -180,11 +176,11 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : val urlStringBuffer = StringBuffer("file:///android_asset/leafletMapMessagePreview.html") urlStringBuffer.append( - "?mapProviderUrl=" + URLEncoder.encode(context!!.getString(R.string.osm_tile_server_url)) + "?mapProviderUrl=" + URLEncoder.encode(context.getString(R.string.osm_tile_server_url)) ) urlStringBuffer.append( "&mapProviderAttribution=" + URLEncoder.encode( - context!!.getString( + context.getString( R.string .osm_tile_server_attributation ) @@ -224,12 +220,13 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : binding.messageQuote.quotedMessageImage.visibility = View.GONE } binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName - ?: context!!.getText(R.string.nc_nick_guest) + ?: context.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = messageUtils .enrichChatReplyMessageText( binding.messageQuote.quotedMessage.context, parentChatMessage, - viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant + false, + viewThemeUtils ) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) @@ -250,7 +247,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) : val geoLinkWithMarker = addMarkerToGeoLink(locationGeoLink!!) val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(geoLinkWithMarker)) browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - context!!.startActivity(browserIntent) + context.startActivity(browserIntent) } else { Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Log.e(TAG, "locationGeoLink was null or empty") diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt index 7c12298aa..f850c82de 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingPollMessageViewHolder.kt @@ -23,11 +23,11 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context -import android.graphics.PorterDuff import android.view.View import androidx.appcompat.content.res.AppCompatResources import autodagger.AutoInjector import coil.load +import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.talk.R import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication @@ -78,8 +78,7 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : super.onBind(message) this.message = message sharedApplication!!.componentApplication.inject(this) - val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant - binding.messageTime.setTextColor(textColor) + viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) colorizeMessageBubble(message) @@ -96,18 +95,15 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : } val readStatusContentDescriptionString = when (message.readStatus) { - ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) - ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) + ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read) + ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent) else -> null } readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context, drawableInt)?.let { binding.checkMark.setImageDrawable(it) - binding.checkMark.setColorFilter( - viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, - PorterDuff.Mode.SRC_ATOP - ) + viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark) } } @@ -191,7 +187,8 @@ class OutcomingPollMessageViewHolder(outcomingView: View, payload: Any) : .enrichChatReplyMessageText( binding.messageQuote.quotedMessage.context, parentChatMessage, - viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant + false, + viewThemeUtils ) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt index 3931f810a..77f4b09da 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt @@ -24,13 +24,13 @@ package com.nextcloud.talk.adapters.messages import android.content.Context -import android.graphics.PorterDuff import android.util.TypedValue import android.view.View import androidx.core.content.res.ResourcesCompat import autodagger.AutoInjector import coil.load import com.google.android.flexbox.FlexboxLayout +import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication @@ -71,11 +71,12 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH realView.isSelected = false val layoutParams = binding.messageTime.layoutParams as FlexboxLayout.LayoutParams layoutParams.isWrapBefore = false - var textSize = context!!.resources.getDimension(R.dimen.chat_text_size) - val textColor = viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant - binding.messageTime.setTextColor(textColor) - - var processedMessageText = messageUtils.enrichChatMessageText(binding.messageText.context, message, textColor) + var textSize = context.resources.getDimension(R.dimen.chat_text_size) + viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) + var processedMessageText = messageUtils.enrichChatMessageText( + binding.messageText.context, message, false, + viewThemeUtils + ) processedMessageText = messageUtils.processMessageParameters( binding.messageText.context, viewThemeUtils, @@ -98,7 +99,7 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageTime.layoutParams = layoutParams - binding.messageText.setTextColor(textColor) + viewThemeUtils.platform.colorTextView(binding.messageText, ColorRole.ON_SURFACE_VARIANT) binding.messageText.text = processedMessageText binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) @@ -118,22 +119,19 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH } val readStatusContentDescriptionString = when (message.readStatus) { - ReadStatus.READ -> context?.resources?.getString(R.string.nc_message_read) - ReadStatus.SENT -> context?.resources?.getString(R.string.nc_message_sent) + ReadStatus.READ -> context.resources?.getString(R.string.nc_message_read) + ReadStatus.SENT -> context.resources?.getString(R.string.nc_message_sent) else -> null } readStatusDrawableInt?.let { drawableInt -> - ResourcesCompat.getDrawable(context!!.resources, drawableInt, null)?.let { + ResourcesCompat.getDrawable(context.resources, drawableInt, null)?.let { binding.checkMark.setImageDrawable(it) - binding.checkMark.setColorFilter( - viewThemeUtils.getScheme(binding.messageText.context).onSurfaceVariant, - PorterDuff.Mode.SRC_ATOP - ) + viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark) } } - binding.checkMark.setContentDescription(readStatusContentDescriptionString) + binding.checkMark.contentDescription = readStatusContentDescriptionString itemView.setTag(R.string.replyable_message_view_tag, message.replyable) @@ -158,7 +156,6 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH private fun processParentMessage(message: ChatMessage) { val parentChatMessage = message.parentMessage - val textColor = viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant parentChatMessage!!.activeUser = message.activeUser parentChatMessage.imageUrl?.let { binding.messageQuote.quotedMessageImage.visibility = View.VISIBLE @@ -172,19 +169,20 @@ class OutcomingTextMessageViewHolder(itemView: View) : OutcomingTextMessageViewH binding.messageQuote.quotedMessageImage.visibility = View.GONE } binding.messageQuote.quotedMessageAuthor.text = parentChatMessage.actorDisplayName - ?: context!!.getText(R.string.nc_nick_guest) + ?: context.getText(R.string.nc_nick_guest) binding.messageQuote.quotedMessage.text = messageUtils .enrichChatReplyMessageText( binding.messageQuote.quotedMessage.context, parentChatMessage, - textColor + false, + viewThemeUtils ) - binding.messageQuote.quotedMessageAuthor.setTextColor(textColor) - binding.messageQuote.quotedMessage.setTextColor(textColor) - binding.messageQuote.quoteColoredView.setBackgroundColor(textColor) + viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) + viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) + viewThemeUtils.talk.colorOutgoingQuoteBackground(binding.messageQuote.quoteColoredView) - binding.messageQuote.quotedChatMessageView.setOnClickListener() { + binding.messageQuote.quotedChatMessageView.setOnClickListener { val chatActivity = commonMessageInterface as ChatActivity chatActivity.jumpToQuotedMessage(parentChatMessage) } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt index ea6d1114a..2fe5ff6af 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingVoiceMessageViewHolder.kt @@ -24,7 +24,6 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context -import android.graphics.PorterDuff import android.os.Handler import android.util.Log import android.view.View @@ -86,8 +85,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : super.onBind(message) this.message = message sharedApplication!!.componentApplication.inject(this) - val textColor = viewThemeUtils.getScheme(binding.messageTime.context).onSurfaceVariant - binding.messageTime.setTextColor(textColor) + viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(message.timestamp) colorizeMessageBubble(message) @@ -139,10 +137,7 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : readStatusDrawableInt?.let { drawableInt -> AppCompatResources.getDrawable(context!!, drawableInt)?.let { binding.checkMark.setImageDrawable(it) - binding.checkMark.setColorFilter( - viewThemeUtils.getScheme(binding.checkMark.context).onSurfaceVariant, - PorterDuff.Mode.SRC_ATOP - ) + viewThemeUtils.talk.themeMessageCheckMark(binding.checkMark) } } @@ -291,7 +286,8 @@ class OutcomingVoiceMessageViewHolder(outcomingView: View) : .enrichChatReplyMessageText( binding.messageQuote.quotedMessage.context, parentChatMessage, - viewThemeUtils.getScheme(binding.messageQuote.quotedMessage.context).onSurfaceVariant + false, + viewThemeUtils ) viewThemeUtils.talk.colorOutgoingQuoteText(binding.messageQuote.quotedMessage) viewThemeUtils.talk.colorOutgoingQuoteAuthorText(binding.messageQuote.quotedMessageAuthor) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/PreviewMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/PreviewMessageViewHolder.kt index 47f71972c..7b1ef8fc8 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/PreviewMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/PreviewMessageViewHolder.kt @@ -28,7 +28,6 @@ package com.nextcloud.talk.adapters.messages import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.net.Uri import android.os.Handler @@ -235,17 +234,14 @@ abstract class PreviewMessageViewHolder(itemView: View?, payload: Any?) : if (message.selectedIndividualHashMap!!.containsKey(KEY_MIMETYPE)) { val mimetype = message.selectedIndividualHashMap!![KEY_MIMETYPE] val drawableResourceId = getDrawableResourceIdForMimeType(mimetype) - val drawable = ContextCompat.getDrawable(context!!, drawableResourceId) + var drawable = ContextCompat.getDrawable(context!!, drawableResourceId) if (drawable != null && ( drawableResourceId == R.drawable.ic_mimetype_folder || drawableResourceId == R.drawable.ic_mimetype_package_x_generic ) ) { - drawable.setColorFilter( - viewThemeUtils!!.getScheme(image.context).primary, - PorterDuff.Mode.SRC_ATOP - ) + drawable = viewThemeUtils?.platform?.tintDrawable(context!!, drawable) } placeholder = drawable } else { diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt index 73586d9a3..2e38b9bb3 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/Reaction.kt @@ -25,8 +25,6 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView -import androidx.core.content.ContextCompat -import com.nextcloud.talk.R import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.ui.theme.ViewThemeUtils @@ -65,7 +63,7 @@ class Reaction { val isSelfReaction = message.reactionsSelf != null && message.reactionsSelf!!.isNotEmpty() && message.reactionsSelf!!.contains(emoji) - val textColor = getTextColor(isOutgoingMessage, isSelfReaction, binding, viewThemeUtils) + val textColor = viewThemeUtils.talk.getTextColor(isOutgoingMessage, isSelfReaction, binding) val emojiWithAmountWrapper = getEmojiWithAmountWrapperLayout( binding.reactionsEmojiWrapper.context, emoji, @@ -112,15 +110,7 @@ class Reaction { emojiWithAmountWrapper.layoutParams = layoutInfo.wrapperParams if (layoutInfo.isSelfReaction) { - val color = if (layoutInfo.isOutgoingMessage) { - ContextCompat.getColor( - emojiWithAmountWrapper.context, - R.color.bg_message_list_incoming_bubble - ) - } else { - layoutInfo.viewThemeUtils.getScheme(emojiWithAmountWrapper.context).primaryContainer - } - layoutInfo.viewThemeUtils.talk.setCheckedBackground(emojiWithAmountWrapper, color) + layoutInfo.viewThemeUtils.talk.setCheckedBackground(emojiWithAmountWrapper, layoutInfo.isOutgoingMessage) emojiWithAmountWrapper.setPaddingRelative( layoutInfo.paddingSide, @@ -176,19 +166,6 @@ class Reaction { return amountParams } - private fun getTextColor( - isOutgoingMessage: Boolean, - isSelfReaction: Boolean, - binding: ReactionsInsideMessageBinding, - viewThemeUtils: ViewThemeUtils - ): Int { - var textColor = viewThemeUtils.getScheme(binding.root.context).onSurfaceVariant - if (!isOutgoingMessage || isSelfReaction) { - textColor = ContextCompat.getColor(binding.root.context, R.color.high_emphasis_text) - } - return textColor - } - private data class EmojiWithAmountWrapperLayoutInfo( val textColor: Int, val amountParams: LinearLayout.LayoutParams, diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index a0948c713..23bffe15e 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -1618,9 +1618,10 @@ class ChatActivity : currentConversation!!.status, null, size, - viewThemeUtils.platform.getScheme(binding.chatToolbar.context).surface, + 0, binding.chatToolbar.context ) + viewThemeUtils.talk.themeStatusDrawable(context, status) binding.chatToolbar.findViewById(R.id.chat_toolbar_avatar) .setImageDrawable(BitmapDrawable(resources, bitmap)) binding.chatToolbar.findViewById(R.id.chat_toolbar_status) diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt index f1647ffc4..ec0ee64fd 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt @@ -26,7 +26,6 @@ package com.nextcloud.talk.remotefilebrowser.activities import android.app.Activity import android.content.Intent -import android.content.res.ColorStateList import android.os.Bundle import android.util.Log import android.view.Menu @@ -90,13 +89,10 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe binding = ActivityRemoteFileBrowserBinding.inflate(layoutInflater) setSupportActionBar(binding.remoteFileBrowserItemsToolbar) viewThemeUtils.material.themeToolbar(binding.remoteFileBrowserItemsToolbar) - val scheme = viewThemeUtils.getScheme(binding.sortListButtonGroup.context) - binding.sortListButtonGroup.setBackgroundColor(scheme.surface) - binding.sortButton.iconTint = ColorStateList.valueOf(scheme.onSurface) - binding.sortButton.setTextColor(scheme.onSurface) + viewThemeUtils.talk.themeSortListButtonGroup(binding.sortListButtonGroup) + viewThemeUtils.talk.themeSortButton(binding.sortButton) viewThemeUtils.material.colorMaterialTextButton(binding.sortButton) - binding.pathNavigationBackButton.iconTint = ColorStateList.valueOf(scheme.onSurface) - binding.pathNavigationBackButton.setTextColor(scheme.onSurface) + viewThemeUtils.talk.themePathNavigationButton(binding.pathNavigationBackButton) viewThemeUtils.material.colorMaterialTextButton(binding.pathNavigationBackButton) viewThemeUtils.platform.themeStatusBar(this) setContentView(binding.root) @@ -199,7 +195,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe override fun onCreateOptionsMenu(menu: Menu): Boolean { super.onCreateOptionsMenu(menu) menuInflater.inflate(R.menu.menu_share_files, menu) - filesSelectionDoneMenuItem = menu?.findItem(R.id.files_selection_done) + filesSelectionDoneMenuItem = menu.findItem(R.id.files_selection_done) return true } diff --git a/app/src/main/java/com/nextcloud/talk/ui/StatusDrawable.java b/app/src/main/java/com/nextcloud/talk/ui/StatusDrawable.java index b2a1fe1b8..2505c98d3 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/StatusDrawable.java +++ b/app/src/main/java/com/nextcloud/talk/ui/StatusDrawable.java @@ -33,6 +33,7 @@ import android.text.TextUtils; import com.nextcloud.talk.R; +import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.core.content.res.ResourcesCompat; @@ -44,11 +45,17 @@ public class StatusDrawable extends Drawable { private String text; private StatusDrawableType icon = StatusDrawableType.UNDEFINED; private Paint textPaint; - private final int backgroundColor; + private int backgroundColor; private final float radius; private Context context; - public StatusDrawable(String status, String statusIcon, float statusSize, int backgroundColor, Context context) { + public void colorStatusDrawable(@ColorInt int color) { + backgroundColor = color; + invalidateSelf(); + } + + public StatusDrawable(String status, String statusIcon, float statusSize, int backgroundColor, + Context context) { radius = statusSize; this.backgroundColor = backgroundColor; @@ -58,19 +65,17 @@ public class StatusDrawable extends Drawable { this.context = context; } else if (TextUtils.isEmpty(statusIcon) && status != null) { switch (status) { - case "online": + case "online" -> { icon = StatusDrawableType.ONLINE; this.context = context; - break; - - case "away": + } + case "away" -> { icon = StatusDrawableType.AWAY; this.context = context; - break; - - default: - // do not show - break; + } + default -> { + } + // do not show } } else { text = statusIcon; diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java index 57fe1d61d..1e2c37cf6 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java @@ -329,12 +329,14 @@ public class ChooseAccountDialogFragment extends DialogFragment { private void drawStatus() { float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, getContext()); binding.currentAccount.ticker.setBackground(null); - binding.currentAccount.ticker.setImageDrawable(new StatusDrawable( + StatusDrawable drawable = new StatusDrawable( status.getStatus(), status.getIcon(), size, - viewThemeUtils.getScheme(binding.currentAccount.ticker.getContext()).getSurface(), - getContext())); + 0, + getContext()); + viewThemeUtils.talk.themeStatusDrawable(binding.currentAccount.ticker.getContext(), drawable); + binding.currentAccount.ticker.setImageDrawable(drawable); binding.currentAccount.ticker.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt index 99fb803c7..cf98cbdd1 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/TalkSpecificViewThemeUtils.kt @@ -26,13 +26,19 @@ import android.content.Context import android.content.res.ColorStateList import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter +import android.graphics.Typeface import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable import android.os.Build +import android.text.Spannable +import android.text.Spanned +import android.text.style.ForegroundColorSpan +import android.text.style.StyleSpan import android.view.View +import android.widget.ImageView import android.widget.LinearLayout +import android.widget.RelativeLayout import android.widget.TextView -import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.widget.SearchView @@ -42,17 +48,23 @@ import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.ColorUtils import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.ViewCompat +import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.materialswitch.MaterialSwitch import com.nextcloud.android.common.ui.theme.MaterialSchemes import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase import com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils import com.nextcloud.talk.R +import com.nextcloud.talk.databinding.ReactionsInsideMessageBinding import com.nextcloud.talk.ui.MicInputCloud +import com.nextcloud.talk.ui.StatusDrawable import com.nextcloud.talk.ui.WaveformSeekBar import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DrawableUtils +import com.nextcloud.talk.utils.message.MessageUtils import com.vanniktech.emoji.EmojiTextView +import com.wooplr.spotlight.SpotlightView +import eu.davidea.flexibleadapter.utils.FlexibleUtils import javax.inject.Inject import kotlin.math.roundToInt @@ -160,11 +172,19 @@ class TalkSpecificViewThemeUtils @Inject constructor( } } - fun setCheckedBackground(linearLayout: LinearLayout, @ColorInt backgroundColor: Int) { + fun setCheckedBackground(linearLayout: LinearLayout, incoming: Boolean) { withScheme(linearLayout) { scheme -> val drawable = AppCompatResources .getDrawable(linearLayout.context, R.drawable.reaction_self_background)!! .mutate() + val backgroundColor = if (incoming) { + scheme.primaryContainer + } else { + ContextCompat.getColor( + linearLayout.context, + R.color.bg_message_list_incoming_bubble + ) + } DrawableCompat.setTintList( drawable, ColorStateList.valueOf(backgroundColor) @@ -263,6 +283,107 @@ class TalkSpecificViewThemeUtils @Inject constructor( } } + fun themeForegroundColorSpan(context: Context): ForegroundColorSpan { + return withScheme(context) { scheme -> + return@withScheme ForegroundColorSpan(scheme.primary) + } + } + + fun themeSpotlightView(context: Context, builder: SpotlightView.Builder): SpotlightView.Builder { + return withScheme(context) { scheme -> + return@withScheme builder.headingTvColor(scheme.primary).lineAndArcColor(scheme.primary) + } + } + + fun themeAndHighlightText( + textView: TextView, + originalText: String?, + c: String? + ) { + withScheme(textView) { scheme -> + var constraint = c + constraint = FlexibleUtils.toLowerCase(constraint) + var start = FlexibleUtils.toLowerCase(originalText).indexOf(constraint) + if (start != -1) { + val spanText = Spannable.Factory.getInstance().newSpannable(originalText) + do { + val end = start + constraint.length + spanText.setSpan( + ForegroundColorSpan(scheme.primary), + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + spanText.setSpan(StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + start = FlexibleUtils.toLowerCase(originalText) + .indexOf(constraint, end + 1) // +1 skips the consecutive span + } while (start != -1) + textView.setText(spanText, TextView.BufferType.SPANNABLE) + } else { + textView.setText(originalText, TextView.BufferType.NORMAL) + } + } + } + + fun themeSortButton(sortButton: MaterialButton) { + withScheme(sortButton) { scheme -> + sortButton.iconTint = ColorStateList.valueOf(scheme.onSurface) + sortButton.setTextColor(scheme.onSurface) + } + } + + fun themePathNavigationButton(navigationBtn: MaterialButton) { + withScheme(navigationBtn) { scheme -> + navigationBtn.iconTint = ColorStateList.valueOf(scheme.onSurface) + navigationBtn.setTextColor(scheme.onSurface) + } + } + + fun themeSortListButtonGroup(relativeLayout: RelativeLayout) { + withScheme(relativeLayout) { scheme -> + relativeLayout.setBackgroundColor(scheme.surface) + } + } + + fun themeStatusDrawable(context: Context, statusDrawable: StatusDrawable) { + withScheme(context) { scheme -> + statusDrawable.colorStatusDrawable(scheme.surface) + } + } + + fun themeMessageCheckMark(imageView: ImageView) { + withScheme(imageView) { scheme -> + imageView.setColorFilter( + scheme.onSurfaceVariant, + PorterDuff.Mode.SRC_ATOP + ) + } + } + + fun themeMarkdown(context: Context, message: String, incoming: Boolean): Spanned { + return withScheme(context) { scheme -> + return@withScheme if (incoming) { + MessageUtils(context).getRenderedMarkdownText(context, message, R.color.nc_incoming_text_default) + } else { + MessageUtils(context).getRenderedMarkdownText(context, message, scheme.onSurfaceVariant) + } + } + } + + fun getTextColor( + isOutgoingMessage: Boolean, + isSelfReaction: Boolean, + binding: ReactionsInsideMessageBinding, + ): Int { + return withScheme(binding.root) { scheme -> + return@withScheme if (!isOutgoingMessage || isSelfReaction) { + ContextCompat.getColor(binding.root.context, R.color.high_emphasis_text) + } else { + scheme.onSurfaceVariant + } + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index dc681d951..4682f50fc 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -292,7 +292,7 @@ public class DisplayUtils { if (chipXmlRes == R.xml.chip_you) { spannableString.setSpan( - new ForegroundColorSpan(viewThemeUtils.getScheme(context).getOnPrimary()), + viewThemeUtils.talk.themeForegroundColorSpan(context), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index d9de6beaf..c386aec64 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -40,28 +40,48 @@ import io.noties.markwon.ext.tasklist.TaskListDrawable import io.noties.markwon.ext.tasklist.TaskListPlugin class MessageUtils(val context: Context) { - fun enrichChatReplyMessageText(context: Context, message: ChatMessage, textColor: Int): Spanned? { + fun enrichChatReplyMessageText( + context: Context, + message: ChatMessage, + incoming: Boolean, + viewThemeUtils: ViewThemeUtils + ): Spanned? { return if (message.message == null) { null } else if (message.renderMarkdown == false) { SpannableString(DisplayUtils.ellipsize(message.text, MAX_REPLY_LENGTH)) } else { - enrichChatMessageText(context, DisplayUtils.ellipsize(message.text, MAX_REPLY_LENGTH), textColor) + enrichChatMessageText( + context, + DisplayUtils.ellipsize(message.text, MAX_REPLY_LENGTH), + incoming, + viewThemeUtils + ) } } - fun enrichChatMessageText(context: Context, message: ChatMessage, textColor: Int): Spanned? { + fun enrichChatMessageText( + context: Context, + message: ChatMessage, + incoming: Boolean, + viewThemeUtils: ViewThemeUtils + ): Spanned? { return if (message.message == null) { null } else if (message.renderMarkdown == false) { SpannableString(message.message) } else { - enrichChatMessageText(context, message.message!!, textColor) + enrichChatMessageText(context, message.text, incoming, viewThemeUtils) } } - private fun enrichChatMessageText(context: Context, message: String, textColor: Int): Spanned { - return getRenderedMarkdownText(context, message, textColor) + private fun enrichChatMessageText( + context: Context, + message: String, + incoming: Boolean, + viewThemeUtils: ViewThemeUtils + ): Spanned { + return viewThemeUtils.talk.themeMarkdown(context, message, incoming) } fun processMessageParameters( @@ -131,7 +151,7 @@ class MessageUtils(val context: Context) { return messageStringInternal } - private fun getRenderedMarkdownText(context: Context, markdown: String, textColor: Int): Spanned { + fun getRenderedMarkdownText(context: Context, markdown: String, textColor: Int): Spanned { val drawable = TaskListDrawable(textColor, textColor, context.getColor(R.color.bg_default)) val markwon = Markwon.builder(context).usePlugin(object : AbstractMarkwonPlugin() { override fun configureTheme(builder: MarkwonTheme.Builder) {