mirror of
https://github.com/element-hq/element-android
synced 2024-11-24 02:15:35 +03:00
Merge pull request #4100 from vector-im/feature/adm/vector-tinting
Missing vector tinting
This commit is contained in:
commit
701b0fbeef
12 changed files with 55 additions and 24 deletions
|
@ -27,6 +27,7 @@ import im.vector.app.core.epoxy.ClickListener
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyModel
|
import im.vector.app.core.epoxy.VectorEpoxyModel
|
||||||
import im.vector.app.core.epoxy.onClick
|
import im.vector.app.core.epoxy.onClick
|
||||||
|
import im.vector.app.core.extensions.setAttributeTintedImageResource
|
||||||
import im.vector.app.core.extensions.setTextOrHide
|
import im.vector.app.core.extensions.setTextOrHide
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,7 +63,7 @@ abstract class BottomSheetRadioActionItem : VectorEpoxyModel<BottomSheetRadioAct
|
||||||
holder.descriptionText.setTextOrHide(description)
|
holder.descriptionText.setTextOrHide(description)
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_on))
|
holder.radioImage.setAttributeTintedImageResource(R.drawable.ic_radio_on, R.attr.colorPrimary)
|
||||||
holder.radioImage.contentDescription = holder.view.context.getString(R.string.a11y_checked)
|
holder.radioImage.contentDescription = holder.view.context.getString(R.string.a11y_checked)
|
||||||
} else {
|
} else {
|
||||||
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_off))
|
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_off))
|
||||||
|
|
|
@ -27,6 +27,7 @@ import im.vector.app.core.epoxy.ClickListener
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyModel
|
import im.vector.app.core.epoxy.VectorEpoxyModel
|
||||||
import im.vector.app.core.epoxy.onClick
|
import im.vector.app.core.epoxy.onClick
|
||||||
|
import im.vector.app.core.extensions.setAttributeTintedImageResource
|
||||||
|
|
||||||
@EpoxyModelClass(layout = R.layout.item_radio)
|
@EpoxyModelClass(layout = R.layout.item_radio)
|
||||||
abstract class RadioButtonItem : VectorEpoxyModel<RadioButtonItem.Holder>() {
|
abstract class RadioButtonItem : VectorEpoxyModel<RadioButtonItem.Holder>() {
|
||||||
|
@ -54,7 +55,7 @@ abstract class RadioButtonItem : VectorEpoxyModel<RadioButtonItem.Holder>() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_on))
|
holder.radioImage.setAttributeTintedImageResource(R.drawable.ic_radio_on, R.attr.colorPrimary)
|
||||||
holder.radioImage.contentDescription = holder.view.context.getString(R.string.a11y_checked)
|
holder.radioImage.contentDescription = holder.view.context.getString(R.string.a11y_checked)
|
||||||
} else {
|
} else {
|
||||||
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_off))
|
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_off))
|
||||||
|
|
|
@ -22,9 +22,14 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
|
import androidx.annotation.AttrRes
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.graphics.drawable.DrawableCompat
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
|
import im.vector.app.features.themes.ThemeUtils
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove left margin of a SearchView
|
* Remove left margin of a SearchView
|
||||||
|
@ -58,3 +63,20 @@ fun ImageView.setDrawableOrHide(drawableRes: Drawable?) {
|
||||||
setImageDrawable(drawableRes)
|
setImageDrawable(drawableRes)
|
||||||
isVisible = drawableRes != null
|
isVisible = drawableRes != null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun View.setAttributeTintedBackground(@DrawableRes drawableRes: Int, @AttrRes tint: Int) {
|
||||||
|
val drawable = ContextCompat.getDrawable(context, drawableRes)!!
|
||||||
|
DrawableCompat.setTint(drawable, ThemeUtils.getColor(context, tint))
|
||||||
|
background = drawable
|
||||||
|
}
|
||||||
|
|
||||||
|
fun ImageView.setAttributeTintedImageResource(@DrawableRes drawableRes: Int, @AttrRes tint: Int) {
|
||||||
|
val drawable = ContextCompat.getDrawable(context, drawableRes)!!
|
||||||
|
DrawableCompat.setTint(drawable, ThemeUtils.getColor(context, tint))
|
||||||
|
setImageDrawable(drawable)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.setAttributeBackground(@AttrRes attributeId: Int) {
|
||||||
|
val attribute = ThemeUtils.getAttribute(context, attributeId)!!
|
||||||
|
setBackgroundResource(attribute.resourceId)
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,9 @@ import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
import im.vector.app.BuildConfig
|
import im.vector.app.BuildConfig
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
|
import im.vector.app.core.extensions.setAttributeBackground
|
||||||
|
import im.vector.app.core.extensions.setAttributeTintedBackground
|
||||||
|
import im.vector.app.core.extensions.setAttributeTintedImageResource
|
||||||
import im.vector.app.core.hardware.vibrate
|
import im.vector.app.core.hardware.vibrate
|
||||||
import im.vector.app.core.utils.CountUpTimer
|
import im.vector.app.core.utils.CountUpTimer
|
||||||
import im.vector.app.core.utils.DimensionConverter
|
import im.vector.app.core.utils.DimensionConverter
|
||||||
|
@ -217,7 +220,7 @@ class VoiceMessageRecorderView: ConstraintLayout, VoiceMessagePlaybackTracker.Li
|
||||||
views.voiceMessageLockArrow.translationY = 0F
|
views.voiceMessageLockArrow.translationY = 0F
|
||||||
}
|
}
|
||||||
RecordingState.LOCKING -> {
|
RecordingState.LOCKING -> {
|
||||||
views.voiceMessageLockImage.setImageResource(R.drawable.ic_voice_message_locked)
|
views.voiceMessageLockImage.setAttributeTintedImageResource(R.drawable.ic_voice_message_locked, R.attr.colorPrimary)
|
||||||
val translationAmount = -distanceY.coerceIn(0F, distanceToLock)
|
val translationAmount = -distanceY.coerceIn(0F, distanceToLock)
|
||||||
views.voiceMessageMicButton.translationY = translationAmount
|
views.voiceMessageMicButton.translationY = translationAmount
|
||||||
views.voiceMessageLockArrow.translationY = translationAmount
|
views.voiceMessageLockArrow.translationY = translationAmount
|
||||||
|
@ -366,6 +369,7 @@ class VoiceMessageRecorderView: ConstraintLayout, VoiceMessagePlaybackTracker.Li
|
||||||
|
|
||||||
private fun showRecordingViews() {
|
private fun showRecordingViews() {
|
||||||
views.voiceMessageMicButton.setImageResource(R.drawable.ic_voice_mic_recording)
|
views.voiceMessageMicButton.setImageResource(R.drawable.ic_voice_mic_recording)
|
||||||
|
views.voiceMessageMicButton.setAttributeTintedBackground(R.drawable.circle_with_halo, R.attr.colorPrimary)
|
||||||
views.voiceMessageMicButton.updateLayoutParams<MarginLayoutParams> {
|
views.voiceMessageMicButton.updateLayoutParams<MarginLayoutParams> {
|
||||||
setMargins(0, 0, 0, 0)
|
setMargins(0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
|
@ -443,6 +447,7 @@ class VoiceMessageRecorderView: ConstraintLayout, VoiceMessagePlaybackTracker.Li
|
||||||
private fun resetMicButtonUi() {
|
private fun resetMicButtonUi() {
|
||||||
views.voiceMessageMicButton.isVisible = true
|
views.voiceMessageMicButton.isVisible = true
|
||||||
views.voiceMessageMicButton.setImageResource(R.drawable.ic_voice_mic)
|
views.voiceMessageMicButton.setImageResource(R.drawable.ic_voice_mic)
|
||||||
|
views.voiceMessageMicButton.setAttributeBackground(android.R.attr.selectableItemBackgroundBorderless)
|
||||||
views.voiceMessageMicButton.updateLayoutParams<MarginLayoutParams> {
|
views.voiceMessageMicButton.updateLayoutParams<MarginLayoutParams> {
|
||||||
if (rtlXMultiplier == -1) {
|
if (rtlXMultiplier == -1) {
|
||||||
// RTL
|
// RTL
|
||||||
|
|
|
@ -28,6 +28,7 @@ import im.vector.app.core.epoxy.ClickListener
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
||||||
import im.vector.app.core.epoxy.VectorEpoxyModel
|
import im.vector.app.core.epoxy.VectorEpoxyModel
|
||||||
import im.vector.app.core.epoxy.onClick
|
import im.vector.app.core.epoxy.onClick
|
||||||
|
import im.vector.app.core.extensions.setAttributeTintedImageResource
|
||||||
import im.vector.app.core.utils.DebouncedClickListener
|
import im.vector.app.core.utils.DebouncedClickListener
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
import org.matrix.android.sdk.api.util.MatrixItem
|
import org.matrix.android.sdk.api.util.MatrixItem
|
||||||
|
@ -57,7 +58,7 @@ abstract class SpaceJoinRuleItem : VectorEpoxyModel<SpaceJoinRuleItem.Holder>()
|
||||||
holder.upgradeRequiredButton.setOnClickListener(DebouncedClickListener(listener))
|
holder.upgradeRequiredButton.setOnClickListener(DebouncedClickListener(listener))
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_on))
|
holder.radioImage.setAttributeTintedImageResource(R.drawable.ic_radio_on, R.attr.colorPrimary)
|
||||||
holder.radioImage.contentDescription = holder.view.context.getString(R.string.a11y_checked)
|
holder.radioImage.contentDescription = holder.view.context.getString(R.string.a11y_checked)
|
||||||
} else {
|
} else {
|
||||||
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_off))
|
holder.radioImage.setImageDrawable(ContextCompat.getDrawable(holder.view.context, R.drawable.ic_radio_off))
|
||||||
|
|
17
vector/src/main/res/drawable/circle_with_halo.xml
Normal file
17
vector/src/main/res/drawable/circle_with_halo.xml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<solid android:color="#33FF0000" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:bottom="4dp"
|
||||||
|
android:left="4dp"
|
||||||
|
android:right="4dp"
|
||||||
|
android:top="4dp">
|
||||||
|
<shape android:shape="oval">
|
||||||
|
<solid android:color="#FF0000" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
|
@ -5,6 +5,6 @@
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
android:pathData="M12,2C6.4771,2 2,6.4771 2,12C2,17.5228 6.4771,22 12,22C17.5228,22 22,17.5228 22,12C22,6.4771 17.5228,2 12,2ZM11.2929,6.2929C11.3888,6.197 11.4993,6.1247 11.6172,6.0759L12.7071,6.2929L12.7075,6.2933L16.7071,10.2929C17.0976,10.6834 17.0976,11.3166 16.7071,11.7071C16.3166,12.0976 15.6834,12.0976 15.2929,11.7071L13,9.4142L13,17C13,17.5523 12.5523,18 12,18C11.4477,18 11,17.5523 11,17L11,9.4142L8.7071,11.7071C8.3166,12.0976 7.6834,12.0976 7.2929,11.7071C6.9024,11.3166 6.9024,10.6834 7.2929,10.2929L11.2929,6.2929ZM11.6172,6.0759L12.705,6.2908C12.5242,6.1111 12.2751,6 12,6C11.8644,6 11.7351,6.027 11.6172,6.0759Z"
|
android:pathData="M12,2C6.4771,2 2,6.4771 2,12C2,17.5228 6.4771,22 12,22C17.5228,22 22,17.5228 22,12C22,6.4771 17.5228,2 12,2ZM11.2929,6.2929C11.3888,6.197 11.4993,6.1247 11.6172,6.0759L12.7071,6.2929L12.7075,6.2933L16.7071,10.2929C17.0976,10.6834 17.0976,11.3166 16.7071,11.7071C16.3166,12.0976 15.6834,12.0976 15.2929,11.7071L13,9.4142L13,17C13,17.5523 12.5523,18 12,18C11.4477,18 11,17.5523 11,17L11,9.4142L8.7071,11.7071C8.3166,12.0976 7.6834,12.0976 7.2929,11.7071C6.9024,11.3166 6.9024,10.6834 7.2929,10.2929L11.2929,6.2929ZM11.6172,6.0759L12.705,6.2908C12.5242,6.1111 12.2751,6 12,6C11.8644,6 11.7351,6.027 11.6172,6.0759Z"
|
||||||
android:fillColor="#0DBD8B"
|
android:fillColor="#FF0000"
|
||||||
android:fillType="evenOdd"/>
|
android:fillType="evenOdd"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
android:fillType="evenOdd"/>
|
android:fillType="evenOdd"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="M2,2h20v20h-20z"
|
android:pathData="M2,2h20v20h-20z"
|
||||||
android:fillColor="#0DBD8B"/>
|
android:fillColor="#FF0000"/>
|
||||||
</group>
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="4dp"
|
|
||||||
android:height="32dp"
|
|
||||||
android:viewportWidth="4"
|
|
||||||
android:viewportHeight="32">
|
|
||||||
<path
|
|
||||||
android:pathData="M0,0C2.2091,0 4,1.7909 4,4V28C4,30.2091 2.2091,32 0,32V0Z"
|
|
||||||
android:fillColor="#0DBD8B"/>
|
|
||||||
</vector>
|
|
|
@ -1,5 +1,5 @@
|
||||||
<vector android:autoMirrored="true" android:height="24dp"
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
android:viewportHeight="24" android:viewportWidth="24"
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<path android:fillColor="#0DBD8B" android:fillType="evenOdd" android:pathData="M11.3333,2C8.3878,2 6,4.3878 6,7.3333V10C4.8954,10 4,10.8954 4,12V20C4,21.1046 4.8954,22 6,22H18C19.1046,22 20,21.1046 20,20V12C20,10.8954 19.1046,10 18,10V7.3333C18,4.3878 15.6122,2 12.6667,2H11.3333ZM15.3333,10V7.3333C15.3333,5.8606 14.1394,4.6667 12.6667,4.6667H11.3333C9.8606,4.6667 8.6667,5.8606 8.6667,7.3333V10H15.3333Z"/>
|
<path android:fillColor="#FF0000" android:fillType="evenOdd" android:pathData="M11.3333,2C8.3878,2 6,4.3878 6,7.3333V10C4.8954,10 4,10.8954 4,12V20C4,21.1046 4.8954,22 6,22H18C19.1046,22 20,21.1046 20,20V12C20,10.8954 19.1046,10 18,10V7.3333C18,4.3878 15.6122,2 12.6667,2H11.3333ZM15.3333,10V7.3333C15.3333,5.8606 14.1394,4.6667 12.6667,4.6667H11.3333C9.8606,4.6667 8.6667,5.8606 8.6667,7.3333V10H15.3333Z"/>
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -3,14 +3,6 @@
|
||||||
android:height="52dp"
|
android:height="52dp"
|
||||||
android:viewportWidth="52"
|
android:viewportWidth="52"
|
||||||
android:viewportHeight="52">
|
android:viewportHeight="52">
|
||||||
<path
|
|
||||||
android:pathData="M26.173,26.1729m-22.7631,0a22.7631,22.7631 0,1 1,45.5262 0a22.7631,22.7631 0,1 1,-45.5262 0"
|
|
||||||
android:fillColor="#0DBD8B"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M26,26m-26,0a26,26 0,1 1,52 0a26,26 0,1 1,-52 0"
|
|
||||||
android:strokeAlpha="0.2"
|
|
||||||
android:fillColor="#0DBD8B"
|
|
||||||
android:fillAlpha="0.2"/>
|
|
||||||
<path
|
<path
|
||||||
android:pathData="M21.2414,18.7749C21.2414,16.051 23.4496,13.8429 26.1734,13.8429C28.8973,13.8429 31.1054,16.051 31.1054,18.7749V26.1509C31.1054,28.8747 28.8973,31.0829 26.1734,31.0829C23.4496,31.0829 21.2414,28.8747 21.2414,26.1509V18.7749ZM17.542,24.2475C18.5968,24.2475 19.4518,25.1025 19.4518,26.1572C19.4518,29.8561 22.4509,32.8596 26.1586,32.8675C26.1637,32.8674 26.1689,32.8674 26.174,32.8674C26.179,32.8674 26.184,32.8674 26.189,32.8675C29.896,32.8589 32.8944,29.8556 32.8944,26.1572C32.8944,25.1025 33.7494,24.2475 34.8041,24.2475C35.8588,24.2475 36.7138,25.1025 36.7138,26.1572C36.7138,31.3227 32.9916,35.6165 28.0837,36.5143V37.24C28.0837,38.2947 27.2287,39.1497 26.174,39.1497C25.1193,39.1497 24.2643,38.2947 24.2643,37.24V36.5147C19.3555,35.6176 15.6323,31.3233 15.6323,26.1572C15.6323,25.1025 16.4873,24.2475 17.542,24.2475Z"
|
android:pathData="M21.2414,18.7749C21.2414,16.051 23.4496,13.8429 26.1734,13.8429C28.8973,13.8429 31.1054,16.051 31.1054,18.7749V26.1509C31.1054,28.8747 28.8973,31.0829 26.1734,31.0829C23.4496,31.0829 21.2414,28.8747 21.2414,26.1509V18.7749ZM17.542,24.2475C18.5968,24.2475 19.4518,25.1025 19.4518,26.1572C19.4518,29.8561 22.4509,32.8596 26.1586,32.8675C26.1637,32.8674 26.1689,32.8674 26.174,32.8674C26.179,32.8674 26.184,32.8674 26.189,32.8675C29.896,32.8589 32.8944,29.8556 32.8944,26.1572C32.8944,25.1025 33.7494,24.2475 34.8041,24.2475C35.8588,24.2475 36.7138,25.1025 36.7138,26.1572C36.7138,31.3227 32.9916,35.6165 28.0837,36.5143V37.24C28.0837,38.2947 27.2287,39.1497 26.174,39.1497C25.1193,39.1497 24.2643,38.2947 24.2643,37.24V36.5147C19.3555,35.6176 15.6323,31.3233 15.6323,26.1572C15.6323,25.1025 16.4873,24.2475 17.542,24.2475Z"
|
||||||
android:fillColor="#ffffff"
|
android:fillColor="#ffffff"
|
||||||
|
|
|
@ -139,6 +139,7 @@
|
||||||
android:text="@string/room_jump_to_first_unread"
|
android:text="@string/room_jump_to_first_unread"
|
||||||
android:visibility="invisible"
|
android:visibility="invisible"
|
||||||
app:chipIcon="@drawable/ic_jump_to_unread"
|
app:chipIcon="@drawable/ic_jump_to_unread"
|
||||||
|
app:chipIconTint="?colorPrimary"
|
||||||
app:closeIcon="@drawable/ic_close_24dp"
|
app:closeIcon="@drawable/ic_close_24dp"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
|
Loading…
Reference in a new issue