Fix artifacting corners on landing page.

fork-5.53.8
Alex Hart 2022-04-01 17:00:12 -03:00 zatwierdzone przez Cody Henthorne
rodzic d9ffd67f36
commit a9f208153c
2 zmienionych plików z 79 dodań i 14 usunięć

Wyświetl plik

@ -1,15 +1,21 @@
package org.thoughtcrime.securesms.stories.landing package org.thoughtcrime.securesms.stories.landing
import android.graphics.drawable.Drawable
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.avatar.view.AvatarView import org.thoughtcrime.securesms.avatar.view.AvatarView
import org.thoughtcrime.securesms.badges.BadgeImageView import org.thoughtcrime.securesms.badges.BadgeImageView
import org.thoughtcrime.securesms.components.ThumbnailView import org.thoughtcrime.securesms.components.ThumbnailView
import org.thoughtcrime.securesms.components.settings.PreferenceModel import org.thoughtcrime.securesms.components.settings.PreferenceModel
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader
import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.GlideApp
import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.stories.StoryTextPostModel import org.thoughtcrime.securesms.stories.StoryTextPostModel
@ -80,7 +86,10 @@ object StoriesLandingItem {
private val avatarView: AvatarView = itemView.findViewById(R.id.avatar) private val avatarView: AvatarView = itemView.findViewById(R.id.avatar)
private val badgeView: BadgeImageView = itemView.findViewById(R.id.badge) private val badgeView: BadgeImageView = itemView.findViewById(R.id.badge)
private val storyPreview: ThumbnailView = itemView.findViewById<ThumbnailView>(R.id.story).apply { private val storyPreview: ImageView = itemView.findViewById<ImageView>(R.id.story).apply {
isClickable = false
}
private val storyBlur: ImageView = itemView.findViewById<ImageView>(R.id.story_blur).apply {
isClickable = false isClickable = false
} }
private val storyMulti: ThumbnailView = itemView.findViewById<ThumbnailView>(R.id.story_multi).apply { private val storyMulti: ThumbnailView = itemView.findViewById<ThumbnailView>(R.id.story_multi).apply {
@ -112,13 +121,32 @@ object StoriesLandingItem {
avatarView.setStoryRingFromState(model.data.storyViewState) avatarView.setStoryRingFromState(model.data.storyViewState)
val thumbnail = record.slideDeck.thumbnailSlide?.uri
val blur = record.slideDeck.thumbnailSlide?.placeholderBlur
clearGlide()
storyBlur.visible = blur != null
if (blur != null) {
GlideApp.with(storyBlur).load(blur).into(storyBlur)
}
@Suppress("CascadeIf") @Suppress("CascadeIf")
if (record.storyType.isTextStory) { if (record.storyType.isTextStory) {
storyPreview.setImageResource(GlideApp.with(storyPreview), StoryTextPostModel.parseFrom(record), 0, 0) storyBlur.visible = false
} else if (record.slideDeck.thumbnailSlide != null) { val storyTextPostModel = StoryTextPostModel.parseFrom(record)
storyPreview.setImageResource(GlideApp.with(storyPreview), record.slideDeck.thumbnailSlide!!, false, true) GlideApp.with(storyPreview)
} else { .load(storyTextPostModel)
storyPreview.clear(GlideApp.with(storyPreview)) .addListener(HideBlurAfterLoadListener())
.placeholder(storyTextPostModel.getPlaceholder())
.centerCrop()
.into(storyPreview)
} else if (thumbnail != null) {
storyBlur.visible = blur != null
GlideApp.with(storyPreview)
.load(DecryptableStreamUriLoader.DecryptableUri(thumbnail))
.addListener(HideBlurAfterLoadListener())
.centerCrop()
.into(storyPreview)
} }
if (model.data.secondaryStory != null) { if (model.data.secondaryStory != null) {
@ -199,5 +227,19 @@ object StoriesLandingItem {
itemView.isSelected = true itemView.isSelected = true
StoryContextMenu.show(context, itemView, model) { itemView.isSelected = false } StoryContextMenu.show(context, itemView, model) { itemView.isSelected = false }
} }
private fun clearGlide() {
GlideApp.with(storyPreview).clear(storyPreview)
GlideApp.with(storyBlur).clear(storyBlur)
}
private inner class HideBlurAfterLoadListener : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean = false
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
storyBlur.visible = false
return false
}
}
} }
} }

Wyświetl plik

@ -85,7 +85,7 @@
android:id="@+id/story_multi" android:id="@+id/story_multi"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="72dp" android:layout_height="72dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="14dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:rotation="-10.89" android:rotation="-10.89"
android:visibility="gone" android:visibility="gone"
@ -95,20 +95,43 @@
tools:background="@color/green" tools:background="@color/green"
tools:visibility="visible" /> tools:visibility="visible" />
<org.thoughtcrime.securesms.components.OutlinedThumbnailView <com.google.android.material.imageview.ShapeableImageView
android:id="@+id/story" android:id="@+id/story_outline"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="88dp" android:layout_height="88dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"
android:padding="2dp" android:src="@color/signal_background_primary"
android:transitionName="story" android:transitionName="story"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:otv_cornerRadius="12dp" app:shapeAppearance="@style/ShapeAppearanceOverlay.Signal.Story.Preview" />
app:otv_strokeColor="@color/signal_background_primary"
app:otv_strokeWidth="2dp" <com.google.android.material.imageview.ShapeableImageView
tools:background="@color/red" /> android:id="@+id/story"
android:layout_width="56dp"
android:layout_height="84dp"
android:background="@color/signal_background_primary"
android:transitionName="story"
app:layout_constraintBottom_toBottomOf="@+id/story_outline"
app:layout_constraintEnd_toEndOf="@+id/story_outline"
app:layout_constraintTop_toTopOf="@+id/story_outline"
app:layout_constraintStart_toStartOf="@+id/story_outline"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Signal.Story.Preview"
tools:src="@drawable/test_gradient" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/story_blur"
android:layout_width="56dp"
android:layout_height="84dp"
android:background="@color/signal_background_primary"
android:transitionName="story"
app:layout_constraintBottom_toBottomOf="@+id/story_outline"
app:layout_constraintEnd_toEndOf="@+id/story_outline"
app:layout_constraintTop_toTopOf="@+id/story_outline"
app:layout_constraintStart_toStartOf="@+id/story_outline"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Signal.Story.Preview"
tools:src="@drawable/test_gradient" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>