diff --git a/changelog.d/5143.bugfix b/changelog.d/5143.bugfix new file mode 100644 index 0000000000..ba8f42b6cb --- /dev/null +++ b/changelog.d/5143.bugfix @@ -0,0 +1 @@ +Fix location rendering in timeline if map cannot be loaded \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageLocationItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageLocationItem.kt index 6f0b6abb72..dea1ca21be 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageLocationItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageLocationItem.kt @@ -16,10 +16,17 @@ package im.vector.app.features.home.room.detail.timeline.item +import android.graphics.drawable.Drawable import android.widget.ImageView +import android.widget.TextView +import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target import im.vector.app.R import im.vector.app.core.glide.GlideApp import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider @@ -46,13 +53,24 @@ abstract class MessageLocationItem : AbsMessageItem<MessageLocationItem.Holder>( GlideApp.with(holder.staticMapImageView) .load(location) .apply(RequestOptions.centerCropTransform()) - .into(holder.staticMapImageView) + .listener(object : RequestListener<Drawable> { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean { + holder.staticMapPinImageView.setImageResource(R.drawable.ic_location_pin_failed) + holder.staticMapErrorTextView.isVisible = true + return false + } - locationPinProvider?.create(locationOwnerId) { pinDrawable -> - GlideApp.with(holder.staticMapPinImageView) - .load(pinDrawable) - .into(holder.staticMapPinImageView) - } + override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + locationPinProvider?.create(locationOwnerId) { pinDrawable -> + GlideApp.with(holder.staticMapPinImageView) + .load(pinDrawable) + .into(holder.staticMapPinImageView) + } + holder.staticMapErrorTextView.isVisible = false + return false + } + }) + .into(holder.staticMapImageView) } override fun getViewType() = STUB_ID @@ -60,6 +78,7 @@ abstract class MessageLocationItem : AbsMessageItem<MessageLocationItem.Holder>( class Holder : AbsMessageItem.Holder(STUB_ID) { val staticMapImageView by bind<ImageView>(R.id.staticMapImageView) val staticMapPinImageView by bind<ImageView>(R.id.staticMapPinImageView) + val staticMapErrorTextView by bind<TextView>(R.id.staticMapErrorTextView) } companion object { diff --git a/vector/src/main/res/drawable/ic_location_pin_failed.xml b/vector/src/main/res/drawable/ic_location_pin_failed.xml new file mode 100644 index 0000000000..250d048836 --- /dev/null +++ b/vector/src/main/res/drawable/ic_location_pin_failed.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="70dp" + android:height="70dp" + android:viewportWidth="70" + android:viewportHeight="70"> + <path + android:pathData="M34.9997,5.8335C23.7122,5.8335 14.583,15.2112 14.583,26.8059C14.583,39.2995 27.4747,56.5269 32.783,63.0882C33.9497,64.5264 36.0788,64.5264 37.2455,63.0882C42.5247,56.5269 55.4163,39.2995 55.4163,26.8059C55.4163,15.2112 46.2872,5.8335 34.9997,5.8335ZM34.9997,34.2961C30.9747,34.2961 27.708,30.9405 27.708,26.8059C27.708,22.6714 30.9747,19.3158 34.9997,19.3158C39.0247,19.3158 42.2913,22.6714 42.2913,26.8059C42.2913,30.9405 39.0247,34.2961 34.9997,34.2961Z" + android:fillColor="#C1C6CD"/> +</vector> diff --git a/vector/src/main/res/layout/item_timeline_event_location_stub.xml b/vector/src/main/res/layout/item_timeline_event_location_stub.xml index 316470b5f1..3074dc8e84 100644 --- a/vector/src/main/res/layout/item_timeline_event_location_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_location_stub.xml @@ -2,6 +2,7 @@ <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardCornerRadius="8dp"> @@ -21,4 +22,16 @@ android:importantForAccessibility="no" android:src="@drawable/bg_map_user_pin" /> + <TextView + android:id="@+id/staticMapErrorTextView" + style="@style/Widget.Vector.TextView.Subtitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal|bottom" + android:layout_marginBottom="54dp" + android:text="@string/location_timeline_failed_to_load_map" + android:textColor="?vctr_content_tertiary" + android:visibility="gone" + tools:visibility="visible" /> + </com.google.android.material.card.MaterialCardView> diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 67f3a08e5f..3907605319 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3756,6 +3756,7 @@ <string name="settings_enable_location_sharing">Enable location sharing</string> <string name="settings_enable_location_sharing_summary">Once enabled you will be able to send your location to any room</string> <string name="labs_render_locations_in_timeline">Render user locations in the timeline</string> + <string name="location_timeline_failed_to_load_map">Failed to load map</string> <string name="tooltip_attachment_photo">Open camera</string> <string name="tooltip_attachment_gallery">Send images and videos</string>