From 973ebd236c23cc89e3c75c6912e5554bae7269e2 Mon Sep 17 00:00:00 2001 From: Christophe Beyls Date: Mon, 13 May 2024 19:11:49 +0200 Subject: [PATCH] Load all vector drawables with AppCompat for consistency (#4411) Currently some vector drawables are loaded using the AppCompat library and others are loaded using the framework. This pull request uniformizes this to use AppCompat to load them all. Other changes: - Set all compound drawables using relative positioning, since all XML layouts are also using relative positioning. - Remove unnecessary layer list drawable used to center `R.drawable.ic_play_indicator` icon and use `ImageView.setForegroundGravity()` instead. - Merge layers in toolbar icons `ic_arrow_back_with_background` and `ic_more_with_background` into a single vector drawable. Note that the AppCompat implementation of vector drawables is unable to load vector drawables inside layer-list drawables, so this change also makes these images compatible with older Android versions. **Note**: technically, AppCompat will always delegate to the framework to load vector drawables on API 24+ which is the current minSDK version of the app. But at least this gives the option to lower the minSDK version in the future. --- .../tusky/adapter/StatusBaseViewHolder.java | 8 +++--- .../compose/view/ComposeScheduleView.kt | 6 ++--- .../StatusNotificationViewHolder.kt | 6 ++--- .../tusky/util/StatusViewHelper.kt | 2 +- .../main/res/drawable/background_circle.xml | 5 ---- app/src/main/res/drawable/ic_arrow_back.xml | 11 -------- .../ic_arrow_back_with_background.xml | 25 ++++++++++--------- app/src/main/res/drawable/ic_more.xml | 10 -------- .../res/drawable/ic_more_with_background.xml | 24 +++++++++--------- .../res/drawable/play_indicator_overlay.xml | 6 ----- .../res/layout-land/fragment_report_done.xml | 4 +-- app/src/main/res/layout/activity_filters.xml | 4 +-- .../res/layout/activity_tab_preference.xml | 2 +- .../main/res/layout/fragment_report_done.xml | 2 +- app/src/main/res/layout/item_account.xml | 2 +- .../main/res/layout/item_add_poll_option.xml | 7 +++--- .../res/layout/item_autocomplete_account.xml | 4 +-- app/src/main/res/layout/item_blocked_user.xml | 4 +-- .../main/res/layout/item_follow_request.xml | 4 +-- app/src/main/res/layout/item_list.xml | 18 ++++++------- app/src/main/res/layout/item_muted_user.xml | 4 +-- .../main/res/layout/item_tab_preference.xml | 10 ++++---- .../res/layout/view_background_message.xml | 3 ++- 23 files changed, 72 insertions(+), 99 deletions(-) delete mode 100644 app/src/main/res/drawable/background_circle.xml delete mode 100644 app/src/main/res/drawable/ic_arrow_back.xml delete mode 100644 app/src/main/res/drawable/ic_more.xml delete mode 100644 app/src/main/res/drawable/play_indicator_overlay.xml diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index a110b2c54..89a7d7eb7 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -9,6 +9,7 @@ import android.graphics.drawable.Drawable; import android.text.Spanned; import android.text.TextUtils; import android.text.format.DateUtils; +import android.view.Gravity; import android.view.Menu; import android.view.View; import android.view.ViewGroup; @@ -21,10 +22,10 @@ import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.TooltipCompat; import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.content.ContextCompat; import androidx.core.text.HtmlCompat; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; @@ -535,7 +536,8 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { final Attachment.Type type = attachment.getType(); if (showingContent && (type == Attachment.Type.VIDEO || type == Attachment.Type.GIFV)) { - imageView.setForeground(ContextCompat.getDrawable(itemView.getContext(), R.drawable.play_indicator_overlay)); + imageView.setForegroundGravity(Gravity.CENTER); + imageView.setForeground(AppCompatResources.getDrawable(itemView.getContext(), R.drawable.ic_play_indicator)); } else { imageView.setForeground(null); } @@ -611,7 +613,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { // Set the icon next to the label. int drawableId = getLabelIcon(attachments.get(0).getType()); - mediaLabel.setCompoundDrawablesWithIntrinsicBounds(drawableId, 0, 0, 0); + mediaLabel.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableId, 0, 0, 0); setAttachmentClickListener(mediaLabel, listener, i, mediaDescriptions[i], false); } else { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt index a68906d9e..c7f6a503f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt @@ -18,8 +18,8 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointForward import com.google.android.material.datepicker.MaterialDatePicker @@ -89,10 +89,10 @@ class ComposeScheduleView } private fun setEditIcons() { - val icon = ContextCompat.getDrawable(context, R.drawable.ic_create_24dp) ?: return + val icon = AppCompatResources.getDrawable(context, R.drawable.ic_create_24dp) ?: return val size = binding.scheduledDateTime.lineHeight icon.setBounds(0, 0, size, size) - binding.scheduledDateTime.setCompoundDrawables(null, null, icon, null) + binding.scheduledDateTime.setCompoundDrawablesRelative(null, null, icon, null) } fun setResetOnClickListener(listener: OnClickListener?) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/StatusNotificationViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/StatusNotificationViewHolder.kt index 89657fcac..e1a51c3c6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/StatusNotificationViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/StatusNotificationViewHolder.kt @@ -27,7 +27,7 @@ import android.text.style.StyleSpan import android.view.View import androidx.annotation.ColorRes import androidx.annotation.DrawableRes -import androidx.core.content.ContextCompat +import androidx.appcompat.content.res.AppCompatResources import androidx.core.text.toSpannable import androidx.recyclerview.widget.RecyclerView import at.connyduck.sparkbutton.helpers.Utils @@ -173,7 +173,7 @@ internal class StatusNotificationViewHolder( @DrawableRes drawable: Int, @ColorRes color: Int ): Drawable? { - val icon = ContextCompat.getDrawable(context, drawable) + val icon = AppCompatResources.getDrawable(context, drawable) icon?.setTint(context.getColor(color)) return icon } @@ -247,7 +247,7 @@ internal class StatusNotificationViewHolder( format = context.getString(R.string.notification_favourite_format) } } - binding.notificationTopText.setCompoundDrawablesWithIntrinsicBounds( + binding.notificationTopText.setCompoundDrawablesRelativeWithIntrinsicBounds( icon, null, null, diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt index db56aea4f..ee575ce66 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt @@ -243,7 +243,7 @@ class StatusViewHelper(private val itemView: View) { // Set the icon next to the label. val drawableId = getLabelIcon(attachments[0].type) - mediaLabel.setCompoundDrawablesWithIntrinsicBounds(drawableId, 0, 0, 0) + mediaLabel.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableId, 0, 0, 0) mediaLabel.setOnClickListener { listener.onViewMedia(null, 0) } } diff --git a/app/src/main/res/drawable/background_circle.xml b/app/src/main/res/drawable/background_circle.xml deleted file mode 100644 index 923aaee68..000000000 --- a/app/src/main/res/drawable/background_circle.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_arrow_back.xml b/app/src/main/res/drawable/ic_arrow_back.xml deleted file mode 100644 index 89d18543f..000000000 --- a/app/src/main/res/drawable/ic_arrow_back.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_arrow_back_with_background.xml b/app/src/main/res/drawable/ic_arrow_back_with_background.xml index 1a4d711f0..5253e68ff 100644 --- a/app/src/main/res/drawable/ic_arrow_back_with_background.xml +++ b/app/src/main/res/drawable/ic_arrow_back_with_background.xml @@ -1,12 +1,13 @@ - - - - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/drawable/ic_more.xml b/app/src/main/res/drawable/ic_more.xml deleted file mode 100644 index f84f9b3f1..000000000 --- a/app/src/main/res/drawable/ic_more.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_more_with_background.xml b/app/src/main/res/drawable/ic_more_with_background.xml index 755b37298..72140f5a0 100644 --- a/app/src/main/res/drawable/ic_more_with_background.xml +++ b/app/src/main/res/drawable/ic_more_with_background.xml @@ -1,12 +1,12 @@ - - - - - - - \ No newline at end of file + + + + diff --git a/app/src/main/res/drawable/play_indicator_overlay.xml b/app/src/main/res/drawable/play_indicator_overlay.xml deleted file mode 100644 index 66ffc2c9b..000000000 --- a/app/src/main/res/drawable/play_indicator_overlay.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_report_done.xml b/app/src/main/res/layout-land/fragment_report_done.xml index d9900a2a8..6263758a3 100644 --- a/app/src/main/res/layout-land/fragment_report_done.xml +++ b/app/src/main/res/layout-land/fragment_report_done.xml @@ -23,13 +23,13 @@ android:layout_width="0dp" android:layout_height="0dp" android:scaleType="fitCenter" - android:src="@drawable/ic_check_24dp" app:layout_constraintBottom_toBottomOf="@id/checkMark" app:layout_constraintEnd_toEndOf="@id/checkMark" + app:layout_constraintHeight_default="percent" app:layout_constraintHeight_percent="0.25" app:layout_constraintStart_toStartOf="@id/checkMark" app:layout_constraintTop_toTopOf="@id/checkMark" - app:layout_constraintHeight_default="percent" + app:srcCompat="@drawable/ic_check_24dp" tools:ignore="ContentDescription" /> + app:layout_anchorGravity="bottom|end" + app:srcCompat="@drawable/ic_plus_24dp" /> diff --git a/app/src/main/res/layout/activity_tab_preference.xml b/app/src/main/res/layout/activity_tab_preference.xml index c29b95bfe..d664d8935 100644 --- a/app/src/main/res/layout/activity_tab_preference.xml +++ b/app/src/main/res/layout/activity_tab_preference.xml @@ -29,7 +29,7 @@ android:layout_gravity="bottom|end" android:layout_margin="16dp" android:contentDescription="@string/action_add_tab" - android:src="@drawable/ic_plus_24dp" /> + app:srcCompat="@drawable/ic_plus_24dp" /> diff --git a/app/src/main/res/layout/item_add_poll_option.xml b/app/src/main/res/layout/item_add_poll_option.xml index 7ac77806a..ad91f846f 100644 --- a/app/src/main/res/layout/item_add_poll_option.xml +++ b/app/src/main/res/layout/item_add_poll_option.xml @@ -1,5 +1,6 @@ @@ -21,12 +22,12 @@ + android:contentDescription="@string/action_remove" + app:srcCompat="@drawable/ic_clear_24dp" /> diff --git a/app/src/main/res/layout/item_autocomplete_account.xml b/app/src/main/res/layout/item_autocomplete_account.xml index 000bae534..c64a370f4 100644 --- a/app/src/main/res/layout/item_autocomplete_account.xml +++ b/app/src/main/res/layout/item_autocomplete_account.xml @@ -26,9 +26,9 @@ android:layout_width="24dp" android:layout_height="24dp" android:contentDescription="@string/profile_badge_bot_text" - android:src="@drawable/bot_badge" app:layout_constraintBottom_toBottomOf="@id/avatar" - app:layout_constraintEnd_toEndOf="@id/avatar" /> + app:layout_constraintEnd_toEndOf="@id/avatar" + app:srcCompat="@drawable/bot_badge" /> + app:layout_constraintEnd_toEndOf="@id/blocked_user_avatar" + app:srcCompat="@drawable/bot_badge" /> + app:layout_constraintEnd_toEndOf="@id/avatar" + app:srcCompat="@drawable/bot_badge" /> + android:visibility="gone" + app:srcCompat="@drawable/ic_more_horiz_24dp" /> + android:visibility="gone" + app:srcCompat="@drawable/ic_plus_24dp" /> + android:visibility="gone" + app:srcCompat="@drawable/ic_clear_24dp" /> diff --git a/app/src/main/res/layout/item_muted_user.xml b/app/src/main/res/layout/item_muted_user.xml index 915c28e33..463867a36 100644 --- a/app/src/main/res/layout/item_muted_user.xml +++ b/app/src/main/res/layout/item_muted_user.xml @@ -24,9 +24,9 @@ android:layout_width="24dp" android:layout_height="24dp" android:contentDescription="@string/profile_badge_bot_text" - android:src="@drawable/bot_badge" app:layout_constraintBottom_toBottomOf="@id/muted_user_avatar" - app:layout_constraintEnd_toEndOf="@id/muted_user_avatar" /> + app:layout_constraintEnd_toEndOf="@id/muted_user_avatar" + app:srcCompat="@drawable/bot_badge" /> + app:srcCompat="@drawable/ic_drag_indicator_24dp" + tools:ignore="ContentDescription" /> + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/ic_clear_24dp" /> + tools:src="@drawable/errorphant_offline" />