Merge pull request #6648 from vector-im/feature/mna/align-naming-lls

[Location sharing] Align naming of components for live location feature
This commit is contained in:
Maxime NATUREL 2022-08-02 10:32:39 +02:00 committed by GitHub
commit 74c9a71cbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 199 additions and 198 deletions

1
changelog.d/6647.misc Normal file
View File

@ -0,0 +1 @@
[Location sharing] Align naming of components for live location feature

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<declare-styleable name="LocationLiveEndedBannerView"> <declare-styleable name="LiveLocationEndedBannerView">
<attr name="locLiveEndedBkgWithAlpha" format="boolean" /> <attr name="locLiveEndedBkgWithAlpha" format="boolean" />
<attr name="locLiveEndedIconMarginStart" format="dimension" /> <attr name="locLiveEndedIconMarginStart" format="dimension" />
</declare-styleable> </declare-styleable>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Widget.Vector.Button.Text.OnPrimary.LocationLive"> <style name="Widget.Vector.Button.Text.OnPrimary.LiveLocation">
<item name="android:foreground">?selectableItemBackground</item> <item name="android:foreground">?selectableItemBackground</item>
<item name="android:background">@android:color/transparent</item> <item name="android:background">@android:color/transparent</item>
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
@ -12,7 +12,7 @@
<item name="android:insetLeft">8dp</item> <item name="android:insetLeft">8dp</item>
</style> </style>
<style name="Widget.Vector.Button.Text.LocationLive"> <style name="Widget.Vector.Button.Text.LiveLocation">
<item name="android:foreground">?selectableItemBackground</item> <item name="android:foreground">?selectableItemBackground</item>
<item name="android:background">@android:color/transparent</item> <item name="android:background">@android:color/transparent</item>
<item name="android:textAppearance">@style/TextAppearance.Vector.Body.Medium</item> <item name="android:textAppearance">@style/TextAppearance.Vector.Body.Medium</item>

View File

@ -347,7 +347,7 @@
<activity android:name=".features.spaces.leave.SpaceLeaveAdvancedActivity" /> <activity android:name=".features.spaces.leave.SpaceLeaveAdvancedActivity" />
<activity android:name=".features.poll.create.CreatePollActivity" /> <activity android:name=".features.poll.create.CreatePollActivity" />
<activity android:name=".features.location.LocationSharingActivity" /> <activity android:name=".features.location.LocationSharingActivity" />
<activity android:name=".features.location.live.map.LocationLiveMapViewActivity" /> <activity android:name=".features.location.live.map.LiveLocationMapViewActivity" />
<activity android:name=".features.settings.font.FontScaleSettingActivity"/> <activity android:name=".features.settings.font.FontScaleSettingActivity"/>
<!-- Services --> <!-- Services -->

View File

@ -55,7 +55,7 @@ import im.vector.app.features.home.room.list.home.HomeRoomListViewModel
import im.vector.app.features.homeserver.HomeServerCapabilitiesViewModel import im.vector.app.features.homeserver.HomeServerCapabilitiesViewModel
import im.vector.app.features.invite.InviteUsersToRoomViewModel import im.vector.app.features.invite.InviteUsersToRoomViewModel
import im.vector.app.features.location.LocationSharingViewModel import im.vector.app.features.location.LocationSharingViewModel
import im.vector.app.features.location.live.map.LocationLiveMapViewModel import im.vector.app.features.location.live.map.LiveLocationMapViewModel
import im.vector.app.features.login.LoginViewModel import im.vector.app.features.login.LoginViewModel
import im.vector.app.features.login2.LoginViewModel2 import im.vector.app.features.login2.LoginViewModel2
import im.vector.app.features.login2.created.AccountCreatedViewModel import im.vector.app.features.login2.created.AccountCreatedViewModel
@ -612,8 +612,8 @@ interface MavericksViewModelModule {
@Binds @Binds
@IntoMap @IntoMap
@MavericksViewModelKey(LocationLiveMapViewModel::class) @MavericksViewModelKey(LiveLocationMapViewModel::class)
fun locationLiveMapViewModelFactory(factory: LocationLiveMapViewModel.Factory): MavericksAssistedViewModelFactory<*, *> fun liveLocationMapViewModelFactory(factory: LiveLocationMapViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
@Binds @Binds
@IntoMap @IntoMap

View File

@ -656,8 +656,8 @@ class TimelineFragment @Inject constructor(
) )
} }
private fun navigateToLocationLiveMap() { private fun navigateToLiveLocationMap() {
navigator.openLocationLiveMap( navigator.openLiveLocationMap(
context = requireContext(), context = requireContext(),
roomId = timelineArgs.roomId roomId = timelineArgs.roomId
) )
@ -857,11 +857,11 @@ class TimelineFragment @Inject constructor(
} }
private fun setupLiveLocationIndicator() { private fun setupLiveLocationIndicator() {
views.locationLiveStatusIndicator.stopButton.debouncedClicks { views.liveLocationStatusIndicator.stopButton.debouncedClicks {
timelineViewModel.handle(RoomDetailAction.StopLiveLocationSharing) timelineViewModel.handle(RoomDetailAction.StopLiveLocationSharing)
} }
views.locationLiveStatusIndicator.debouncedClicks { views.liveLocationStatusIndicator.debouncedClicks {
navigateToLocationLiveMap() navigateToLiveLocationMap()
} }
} }
@ -1688,7 +1688,7 @@ class TimelineFragment @Inject constructor(
} }
private fun updateLiveLocationIndicator(isSharingLiveLocation: Boolean) { private fun updateLiveLocationIndicator(isSharingLiveLocation: Boolean) {
views.locationLiveStatusIndicator.isVisible = isSharingLiveLocation views.liveLocationStatusIndicator.isVisible = isSharingLiveLocation
} }
private fun FragmentTimelineBinding.hideComposerViews() { private fun FragmentTimelineBinding.hideComposerViews() {
@ -2068,7 +2068,7 @@ class TimelineFragment @Inject constructor(
handleShowLocationPreview(messageContent, informationData.senderId) handleShowLocationPreview(messageContent, informationData.senderId)
} }
is MessageBeaconInfoContent -> { is MessageBeaconInfoContent -> {
navigateToLocationLiveMap() navigateToLiveLocationMap()
} }
else -> { else -> {
val handled = onThreadSummaryClicked(informationData.eventId, isRootThreadEvent) val handled = onThreadSummaryClicked(informationData.eventId, isRootThreadEvent)

View File

@ -42,8 +42,8 @@ abstract class MessageLiveLocationInactiveItem :
override fun getViewStubId() = STUB_ID override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) { class Holder : AbsMessageItem.Holder(STUB_ID) {
val bannerImageView by bind<ImageView>(R.id.locationLiveEndedBannerBackground) val bannerImageView by bind<ImageView>(R.id.liveLocationEndedBannerBackground)
val noLocationMapImageView by bind<ImageView>(R.id.locationLiveInactiveMap) val noLocationMapImageView by bind<ImageView>(R.id.liveLocationInactiveMap)
} }
companion object { companion object {

View File

@ -26,8 +26,8 @@ import im.vector.app.core.resources.toTimestamp
import im.vector.app.core.utils.DimensionConverter import im.vector.app.core.utils.DimensionConverter
import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.RoomDetailAction
import im.vector.app.features.home.room.detail.timeline.style.TimelineMessageLayout import im.vector.app.features.home.room.detail.timeline.style.TimelineMessageLayout
import im.vector.app.features.location.live.LocationLiveMessageBannerViewState import im.vector.app.features.location.live.LiveLocationMessageBannerViewState
import im.vector.app.features.location.live.LocationLiveRunningBannerView import im.vector.app.features.location.live.LiveLocationRunningBannerView
import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalDateTime
@EpoxyModelClass @EpoxyModelClass
@ -44,17 +44,17 @@ abstract class MessageLiveLocationItem : AbsMessageLocationItem<MessageLiveLocat
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
super.bind(holder) super.bind(holder)
bindLocationLiveBanner(holder) bindLiveLocationBanner(holder)
} }
private fun bindLocationLiveBanner(holder: Holder) { private fun bindLiveLocationBanner(holder: Holder) {
// TODO in a future PR add check on device id to confirm that is the one that sent the beacon // TODO in a future PR add check on device id to confirm that is the one that sent the beacon
val isEmitter = currentUserId != null && currentUserId == locationUserId val isEmitter = currentUserId != null && currentUserId == locationUserId
val messageLayout = attributes.informationData.messageLayout val messageLayout = attributes.informationData.messageLayout
val viewState = buildViewState(holder, messageLayout, isEmitter) val viewState = buildViewState(holder, messageLayout, isEmitter)
holder.locationLiveRunningBanner.isVisible = true holder.liveLocationRunningBanner.isVisible = true
holder.locationLiveRunningBanner.render(viewState) holder.liveLocationRunningBanner.render(viewState)
holder.locationLiveRunningBanner.stopButton.setOnClickListener { holder.liveLocationRunningBanner.stopButton.setOnClickListener {
attributes.callback?.onTimelineItemAction(RoomDetailAction.StopLiveLocationSharing) attributes.callback?.onTimelineItemAction(RoomDetailAction.StopLiveLocationSharing)
} }
} }
@ -63,24 +63,24 @@ abstract class MessageLiveLocationItem : AbsMessageLocationItem<MessageLiveLocat
holder: Holder, holder: Holder,
messageLayout: TimelineMessageLayout, messageLayout: TimelineMessageLayout,
isEmitter: Boolean isEmitter: Boolean
): LocationLiveMessageBannerViewState { ): LiveLocationMessageBannerViewState {
return when { return when {
messageLayout is TimelineMessageLayout.Bubble && isEmitter -> messageLayout is TimelineMessageLayout.Bubble && isEmitter ->
LocationLiveMessageBannerViewState.Emitter( LiveLocationMessageBannerViewState.Emitter(
remainingTimeInMillis = getRemainingTimeOfLiveInMillis(), remainingTimeInMillis = getRemainingTimeOfLiveInMillis(),
bottomStartCornerRadiusInDp = messageLayout.cornersRadius.bottomStartRadius, bottomStartCornerRadiusInDp = messageLayout.cornersRadius.bottomStartRadius,
bottomEndCornerRadiusInDp = messageLayout.cornersRadius.bottomEndRadius, bottomEndCornerRadiusInDp = messageLayout.cornersRadius.bottomEndRadius,
isStopButtonCenteredVertically = false isStopButtonCenteredVertically = false
) )
messageLayout is TimelineMessageLayout.Bubble -> messageLayout is TimelineMessageLayout.Bubble ->
LocationLiveMessageBannerViewState.Watcher( LiveLocationMessageBannerViewState.Watcher(
bottomStartCornerRadiusInDp = messageLayout.cornersRadius.bottomStartRadius, bottomStartCornerRadiusInDp = messageLayout.cornersRadius.bottomStartRadius,
bottomEndCornerRadiusInDp = messageLayout.cornersRadius.bottomEndRadius, bottomEndCornerRadiusInDp = messageLayout.cornersRadius.bottomEndRadius,
formattedLocalTimeOfEndOfLive = getFormattedLocalTimeEndOfLive(), formattedLocalTimeOfEndOfLive = getFormattedLocalTimeEndOfLive(),
) )
isEmitter -> { isEmitter -> {
val cornerRadius = getBannerCornerRadiusForDefaultLayout(holder) val cornerRadius = getBannerCornerRadiusForDefaultLayout(holder)
LocationLiveMessageBannerViewState.Emitter( LiveLocationMessageBannerViewState.Emitter(
remainingTimeInMillis = getRemainingTimeOfLiveInMillis(), remainingTimeInMillis = getRemainingTimeOfLiveInMillis(),
bottomStartCornerRadiusInDp = cornerRadius, bottomStartCornerRadiusInDp = cornerRadius,
bottomEndCornerRadiusInDp = cornerRadius, bottomEndCornerRadiusInDp = cornerRadius,
@ -89,7 +89,7 @@ abstract class MessageLiveLocationItem : AbsMessageLocationItem<MessageLiveLocat
} }
else -> { else -> {
val cornerRadius = getBannerCornerRadiusForDefaultLayout(holder) val cornerRadius = getBannerCornerRadiusForDefaultLayout(holder)
LocationLiveMessageBannerViewState.Watcher( LiveLocationMessageBannerViewState.Watcher(
bottomStartCornerRadiusInDp = cornerRadius, bottomStartCornerRadiusInDp = cornerRadius,
bottomEndCornerRadiusInDp = cornerRadius, bottomEndCornerRadiusInDp = cornerRadius,
formattedLocalTimeOfEndOfLive = getFormattedLocalTimeEndOfLive(), formattedLocalTimeOfEndOfLive = getFormattedLocalTimeEndOfLive(),
@ -112,7 +112,7 @@ abstract class MessageLiveLocationItem : AbsMessageLocationItem<MessageLiveLocat
override fun getViewStubId() = STUB_ID override fun getViewStubId() = STUB_ID
class Holder : AbsMessageLocationItem.Holder(STUB_ID) { class Holder : AbsMessageLocationItem.Holder(STUB_ID) {
val locationLiveRunningBanner by bind<LocationLiveRunningBannerView>(R.id.locationLiveRunningBanner) val liveLocationRunningBanner by bind<LiveLocationRunningBannerView>(R.id.liveLocationRunningBanner)
} }
companion object { companion object {

View File

@ -42,8 +42,8 @@ abstract class MessageLiveLocationStartItem :
override fun getViewStubId() = STUB_ID override fun getViewStubId() = STUB_ID
class Holder : AbsMessageItem.Holder(STUB_ID) { class Holder : AbsMessageItem.Holder(STUB_ID) {
val bannerImageView by bind<ImageView>(R.id.locationLiveStartBanner) val bannerImageView by bind<ImageView>(R.id.liveLocationStartBanner)
val noLocationMapImageView by bind<ImageView>(R.id.locationLiveStartMap) val noLocationMapImageView by bind<ImageView>(R.id.liveLocationStartMap)
} }
companion object { companion object {

View File

@ -24,17 +24,17 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.res.use import androidx.core.content.res.use
import androidx.core.view.updateLayoutParams import androidx.core.view.updateLayoutParams
import im.vector.app.R import im.vector.app.R
import im.vector.app.databinding.ViewLocationLiveEndedBannerBinding import im.vector.app.databinding.ViewLiveLocationEndedBannerBinding
private const val BACKGROUND_ALPHA = 0.75f private const val BACKGROUND_ALPHA = 0.75f
class LocationLiveEndedBannerView @JvmOverloads constructor( class LiveLocationEndedBannerView @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) { ) : ConstraintLayout(context, attrs, defStyleAttr) {
private val binding = ViewLocationLiveEndedBannerBinding.inflate( private val binding = ViewLiveLocationEndedBannerBinding.inflate(
LayoutInflater.from(context), LayoutInflater.from(context),
this this
) )
@ -42,7 +42,7 @@ class LocationLiveEndedBannerView @JvmOverloads constructor(
init { init {
context.obtainStyledAttributes( context.obtainStyledAttributes(
attrs, attrs,
R.styleable.LocationLiveEndedBannerView, R.styleable.LiveLocationEndedBannerView,
0, 0,
0 0
).use { ).use {
@ -52,13 +52,13 @@ class LocationLiveEndedBannerView @JvmOverloads constructor(
} }
private fun setBackgroundAlpha(typedArray: TypedArray) { private fun setBackgroundAlpha(typedArray: TypedArray) {
val withAlpha = typedArray.getBoolean(R.styleable.LocationLiveEndedBannerView_locLiveEndedBkgWithAlpha, false) val withAlpha = typedArray.getBoolean(R.styleable.LiveLocationEndedBannerView_locLiveEndedBkgWithAlpha, false)
binding.locationLiveEndedBannerBackground.alpha = if (withAlpha) BACKGROUND_ALPHA else 1f binding.liveLocationEndedBannerBackground.alpha = if (withAlpha) BACKGROUND_ALPHA else 1f
} }
private fun setIconMarginStart(typedArray: TypedArray) { private fun setIconMarginStart(typedArray: TypedArray) {
val margin = typedArray.getDimensionPixelOffset(R.styleable.LocationLiveEndedBannerView_locLiveEndedIconMarginStart, 0) val margin = typedArray.getDimensionPixelOffset(R.styleable.LiveLocationEndedBannerView_locLiveEndedIconMarginStart, 0)
binding.locationLiveEndedBannerIcon.updateLayoutParams<MarginLayoutParams> { binding.liveLocationEndedBannerIcon.updateLayoutParams<MarginLayoutParams> {
marginStart = margin marginStart = margin
} }
} }

View File

@ -16,7 +16,7 @@
package im.vector.app.features.location.live package im.vector.app.features.location.live
sealed class LocationLiveMessageBannerViewState( sealed class LiveLocationMessageBannerViewState(
open val bottomStartCornerRadiusInDp: Float, open val bottomStartCornerRadiusInDp: Float,
open val bottomEndCornerRadiusInDp: Float, open val bottomEndCornerRadiusInDp: Float,
) { ) {
@ -26,11 +26,11 @@ sealed class LocationLiveMessageBannerViewState(
override val bottomEndCornerRadiusInDp: Float, override val bottomEndCornerRadiusInDp: Float,
val remainingTimeInMillis: Long, val remainingTimeInMillis: Long,
val isStopButtonCenteredVertically: Boolean val isStopButtonCenteredVertically: Boolean
) : LocationLiveMessageBannerViewState(bottomStartCornerRadiusInDp, bottomEndCornerRadiusInDp) ) : LiveLocationMessageBannerViewState(bottomStartCornerRadiusInDp, bottomEndCornerRadiusInDp)
data class Watcher( data class Watcher(
override val bottomStartCornerRadiusInDp: Float, override val bottomStartCornerRadiusInDp: Float,
override val bottomEndCornerRadiusInDp: Float, override val bottomEndCornerRadiusInDp: Float,
val formattedLocalTimeOfEndOfLive: String, val formattedLocalTimeOfEndOfLive: String,
) : LocationLiveMessageBannerViewState(bottomStartCornerRadiusInDp, bottomEndCornerRadiusInDp) ) : LiveLocationMessageBannerViewState(bottomStartCornerRadiusInDp, bottomEndCornerRadiusInDp)
} }

View File

@ -31,51 +31,51 @@ import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.glide.GlideApp import im.vector.app.core.glide.GlideApp
import im.vector.app.core.utils.TextUtils import im.vector.app.core.utils.TextUtils
import im.vector.app.databinding.ViewLocationLiveRunningBannerBinding import im.vector.app.databinding.ViewLiveLocationRunningBannerBinding
import im.vector.app.features.themes.ThemeUtils import im.vector.app.features.themes.ThemeUtils
import org.threeten.bp.Duration import org.threeten.bp.Duration
private const val REMAINING_TIME_COUNTER_INTERVAL_IN_MS = 1000L private const val REMAINING_TIME_COUNTER_INTERVAL_IN_MS = 1000L
class LocationLiveRunningBannerView @JvmOverloads constructor( class LiveLocationRunningBannerView @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) { ) : ConstraintLayout(context, attrs, defStyleAttr) {
private val binding = ViewLocationLiveRunningBannerBinding.inflate( private val binding = ViewLiveLocationRunningBannerBinding.inflate(
LayoutInflater.from(context), LayoutInflater.from(context),
this this
) )
val stopButton: Button val stopButton: Button
get() = binding.locationLiveRunningBannerStop get() = binding.liveLocationRunningBannerStop
private val background: ImageView private val background: ImageView
get() = binding.locationLiveRunningBannerBackground get() = binding.liveLocationRunningBannerBackground
private val title: TextView private val title: TextView
get() = binding.locationLiveRunningBannerTitle get() = binding.liveLocationRunningBannerTitle
private val subTitle: TextView private val subTitle: TextView
get() = binding.locationLiveRunningBannerSubTitle get() = binding.liveLocationRunningBannerSubTitle
private var countDownTimer: CountDownTimer? = null private var countDownTimer: CountDownTimer? = null
fun render(viewState: LocationLiveMessageBannerViewState) { fun render(viewState: LiveLocationMessageBannerViewState) {
when (viewState) { when (viewState) {
is LocationLiveMessageBannerViewState.Emitter -> renderEmitter(viewState) is LiveLocationMessageBannerViewState.Emitter -> renderEmitter(viewState)
is LocationLiveMessageBannerViewState.Watcher -> renderWatcher(viewState) is LiveLocationMessageBannerViewState.Watcher -> renderWatcher(viewState)
} }
GlideApp.with(context) GlideApp.with(context)
.load(ColorDrawable(ThemeUtils.getColor(context, android.R.attr.colorBackground))) .load(ColorDrawable(ThemeUtils.getColor(context, android.R.attr.colorBackground)))
.placeholder(binding.locationLiveRunningBannerBackground.drawable) .placeholder(binding.liveLocationRunningBannerBackground.drawable)
.transform(GranularRoundedCorners(0f, 0f, viewState.bottomEndCornerRadiusInDp, viewState.bottomStartCornerRadiusInDp)) .transform(GranularRoundedCorners(0f, 0f, viewState.bottomEndCornerRadiusInDp, viewState.bottomStartCornerRadiusInDp))
.into(background) .into(background)
} }
private fun renderEmitter(viewState: LocationLiveMessageBannerViewState.Emitter) { private fun renderEmitter(viewState: LiveLocationMessageBannerViewState.Emitter) {
stopButton.isVisible = true stopButton.isVisible = true
title.text = context.getString(R.string.location_share_live_enabled) title.text = context.getString(R.string.location_share_live_enabled)
@ -109,21 +109,21 @@ class LocationLiveRunningBannerView @JvmOverloads constructor(
if (viewState.isStopButtonCenteredVertically) { if (viewState.isStopButtonCenteredVertically) {
constraintSet.connect( constraintSet.connect(
R.id.locationLiveRunningBannerStop, R.id.liveLocationRunningBannerStop,
ConstraintSet.BOTTOM, ConstraintSet.BOTTOM,
R.id.locationLiveRunningBannerBackground, R.id.liveLocationRunningBannerBackground,
ConstraintSet.BOTTOM, ConstraintSet.BOTTOM,
0 0
) )
} else { } else {
constraintSet.clear(R.id.locationLiveRunningBannerStop, ConstraintSet.BOTTOM) constraintSet.clear(R.id.liveLocationRunningBannerStop, ConstraintSet.BOTTOM)
} }
constraintSet.applyTo(parentLayout) constraintSet.applyTo(parentLayout)
} }
} }
private fun renderWatcher(viewState: LocationLiveMessageBannerViewState.Watcher) { private fun renderWatcher(viewState: LiveLocationMessageBannerViewState.Watcher) {
stopButton.isVisible = false stopButton.isVisible = false
title.text = context.getString(R.string.location_share_live_view) title.text = context.getString(R.string.location_share_live_view)
subTitle.text = context.getString(R.string.location_share_live_until, viewState.formattedLocalTimeOfEndOfLive) subTitle.text = context.getString(R.string.location_share_live_until, viewState.formattedLocalTimeOfEndOfLive)

View File

@ -21,19 +21,19 @@ import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.Button import android.widget.Button
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import im.vector.app.databinding.ViewLocationLiveStatusBinding import im.vector.app.databinding.ViewLiveLocationStatusBinding
class LocationLiveStatusView @JvmOverloads constructor( class LiveLocationStatusView @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) { ) : ConstraintLayout(context, attrs, defStyleAttr) {
private val binding = ViewLocationLiveStatusBinding.inflate( private val binding = ViewLiveLocationStatusBinding.inflate(
LayoutInflater.from(context), LayoutInflater.from(context),
this this
) )
val stopButton: Button val stopButton: Button
get() = binding.locationLiveStatusStop get() = binding.liveLocationStatusStop
} }

View File

@ -18,8 +18,8 @@ package im.vector.app.features.location.live.map
import im.vector.app.core.platform.VectorViewModelAction import im.vector.app.core.platform.VectorViewModelAction
sealed class LocationLiveMapAction : VectorViewModelAction { sealed class LiveLocationMapAction : VectorViewModelAction {
data class AddMapSymbol(val key: String, val value: Long) : LocationLiveMapAction() data class AddMapSymbol(val key: String, val value: Long) : LiveLocationMapAction()
data class RemoveMapSymbol(val key: String) : LocationLiveMapAction() data class RemoveMapSymbol(val key: String) : LiveLocationMapAction()
object StopSharing : LocationLiveMapAction() object StopSharing : LiveLocationMapAction()
} }

View File

@ -23,7 +23,7 @@ import android.widget.PopupWindow
import im.vector.app.R import im.vector.app.R
import im.vector.app.databinding.ViewLiveLocationMarkerPopupBinding import im.vector.app.databinding.ViewLiveLocationMarkerPopupBinding
class LocationLiveMapMarkerOptionsDialog( class LiveLocationMapMarkerOptionsDialog(
context: Context, context: Context,
) : PopupWindow() { ) : PopupWindow() {

View File

@ -28,17 +28,17 @@ import im.vector.app.features.MainActivity
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
data class LocationLiveMapViewArgs( data class LiveLocationMapViewArgs(
val roomId: String val roomId: String
) : Parcelable ) : Parcelable
@AndroidEntryPoint @AndroidEntryPoint
class LocationLiveMapViewActivity : VectorBaseActivity<ActivityLocationSharingBinding>() { class LiveLocationMapViewActivity : VectorBaseActivity<ActivityLocationSharingBinding>() {
override fun getBinding() = ActivityLocationSharingBinding.inflate(layoutInflater) override fun getBinding() = ActivityLocationSharingBinding.inflate(layoutInflater)
override fun initUiAndData() { override fun initUiAndData() {
val mapViewArgs: LocationLiveMapViewArgs? = intent?.extras?.getParcelable(EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS) val mapViewArgs: LiveLocationMapViewArgs? = intent?.extras?.getParcelable(EXTRA_LIVE_LOCATION_MAP_VIEW_ARGS)
if (mapViewArgs == null) { if (mapViewArgs == null) {
finish() finish()
return return
@ -50,7 +50,7 @@ class LocationLiveMapViewActivity : VectorBaseActivity<ActivityLocationSharingBi
if (isFirstCreation()) { if (isFirstCreation()) {
addFragment( addFragment(
views.fragmentContainer, views.fragmentContainer,
LocationLiveMapViewFragment::class.java, LiveLocationMapViewFragment::class.java,
mapViewArgs mapViewArgs
) )
} }
@ -58,11 +58,11 @@ class LocationLiveMapViewActivity : VectorBaseActivity<ActivityLocationSharingBi
companion object { companion object {
private const val EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS = "EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS" private const val EXTRA_LIVE_LOCATION_MAP_VIEW_ARGS = "EXTRA_LIVE_LOCATION_MAP_VIEW_ARGS"
fun getIntent(context: Context, locationLiveMapViewArgs: LocationLiveMapViewArgs, firstStartMainActivity: Boolean = false): Intent { fun getIntent(context: Context, liveLocationMapViewArgs: LiveLocationMapViewArgs, firstStartMainActivity: Boolean = false): Intent {
val intent = Intent(context, LocationLiveMapViewActivity::class.java).apply { val intent = Intent(context, LiveLocationMapViewActivity::class.java).apply {
putExtra(EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS, locationLiveMapViewArgs) putExtra(EXTRA_LIVE_LOCATION_MAP_VIEW_ARGS, liveLocationMapViewArgs)
} }
return if (firstStartMainActivity) { return if (firstStartMainActivity) {
MainActivity.getIntentWithNextIntent(context, intent) MainActivity.getIntentWithNextIntent(context, intent)

View File

@ -18,6 +18,6 @@ package im.vector.app.features.location.live.map
import im.vector.app.core.platform.VectorViewEvents import im.vector.app.core.platform.VectorViewEvents
sealed interface LocationLiveMapViewEvents : VectorViewEvents { sealed interface LiveLocationMapViewEvents : VectorViewEvents {
data class Error(val error: Throwable) : LocationLiveMapViewEvents data class Error(val error: Throwable) : LiveLocationMapViewEvents
} }

View File

@ -46,7 +46,7 @@ import im.vector.app.core.extensions.configureWith
import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.core.utils.DimensionConverter import im.vector.app.core.utils.DimensionConverter
import im.vector.app.core.utils.openLocation import im.vector.app.core.utils.openLocation
import im.vector.app.databinding.FragmentLocationLiveMapViewBinding import im.vector.app.databinding.FragmentLiveLocationMapViewBinding
import im.vector.app.features.location.LocationData import im.vector.app.features.location.LocationData
import im.vector.app.features.location.UrlMapProvider import im.vector.app.features.location.UrlMapProvider
import im.vector.app.features.location.zoomToBounds import im.vector.app.features.location.zoomToBounds
@ -60,13 +60,13 @@ import javax.inject.Inject
* Screen showing a map with all the current users sharing their live location in a room. * Screen showing a map with all the current users sharing their live location in a room.
*/ */
@AndroidEntryPoint @AndroidEntryPoint
class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<FragmentLocationLiveMapViewBinding>() { class LiveLocationMapViewFragment @Inject constructor() : VectorBaseFragment<FragmentLiveLocationMapViewBinding>() {
@Inject lateinit var urlMapProvider: UrlMapProvider @Inject lateinit var urlMapProvider: UrlMapProvider
@Inject lateinit var bottomSheetController: LiveLocationBottomSheetController @Inject lateinit var bottomSheetController: LiveLocationBottomSheetController
@Inject lateinit var dimensionConverter: DimensionConverter @Inject lateinit var dimensionConverter: DimensionConverter
private val viewModel: LocationLiveMapViewModel by fragmentViewModel() private val viewModel: LiveLocationMapViewModel by fragmentViewModel()
private var mapboxMap: WeakReference<MapboxMap>? = null private var mapboxMap: WeakReference<MapboxMap>? = null
private var symbolManager: SymbolManager? = null private var symbolManager: SymbolManager? = null
@ -74,8 +74,8 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
private val pendingLiveLocations = mutableListOf<UserLiveLocationViewState>() private val pendingLiveLocations = mutableListOf<UserLiveLocationViewState>()
private var isMapFirstUpdate = true private var isMapFirstUpdate = true
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLocationLiveMapViewBinding { override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLiveLocationMapViewBinding {
return FragmentLocationLiveMapViewBinding.inflate(layoutInflater, container, false) return FragmentLiveLocationMapViewBinding.inflate(layoutInflater, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -90,7 +90,7 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
} }
override fun onStopLocationClicked() { override fun onStopLocationClicked() {
viewModel.handle(LocationLiveMapAction.StopSharing) viewModel.handle(LiveLocationMapAction.StopSharing)
} }
} }
} }
@ -98,7 +98,7 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
private fun observeViewEvents() { private fun observeViewEvents() {
viewModel.observeViewEvents { viewEvent -> viewModel.observeViewEvents { viewEvent ->
when (viewEvent) { when (viewEvent) {
is LocationLiveMapViewEvents.Error -> displayErrorDialog(viewEvent.error) is LiveLocationMapViewEvents.Error -> displayErrorDialog(viewEvent.error)
} }
} }
} }
@ -114,7 +114,7 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
lifecycleScope.launch { lifecycleScope.launch {
mapboxMap.setStyle(urlMapProvider.getMapUrl()) { style -> mapboxMap.setStyle(urlMapProvider.getMapUrl()) { style ->
mapStyle = style mapStyle = style
this@LocationLiveMapViewFragment.mapboxMap = WeakReference(mapboxMap) this@LiveLocationMapViewFragment.mapboxMap = WeakReference(mapboxMap)
symbolManager = SymbolManager(mapFragment.view as MapView, mapboxMap, style).apply { symbolManager = SymbolManager(mapFragment.view as MapView, mapboxMap, style).apply {
iconAllowOverlap = true iconAllowOverlap = true
addClickListener { addClickListener {
@ -136,9 +136,9 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
?.get() ?.get()
?.zoomToLocation(LocationData(it.latLng.latitude, it.latLng.longitude, null), preserveCurrentZoomLevel = false) ?.zoomToLocation(LocationData(it.latLng.latitude, it.latLng.longitude, null), preserveCurrentZoomLevel = false)
LocationLiveMapMarkerOptionsDialog(requireContext()) LiveLocationMapMarkerOptionsDialog(requireContext())
.apply { .apply {
callback = object : LocationLiveMapMarkerOptionsDialog.Callback { callback = object : LiveLocationMapMarkerOptionsDialog.Callback {
override fun onShareLocationClicked() { override fun onShareLocationClicked() {
shareLocation(symbol) shareLocation(symbol)
dismiss() dismiss()
@ -238,7 +238,7 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
addUserPinToMapStyle(userLocation.matrixItem.id, userLocation.pinDrawable) addUserPinToMapStyle(userLocation.matrixItem.id, userLocation.pinDrawable)
val symbolOptions = buildSymbolOptions(userLocation) val symbolOptions = buildSymbolOptions(userLocation)
val symbol = symbolManager.create(symbolOptions) val symbol = symbolManager.create(symbolOptions)
viewModel.handle(LocationLiveMapAction.AddMapSymbol(userLocation.matrixItem.id, symbol.id)) viewModel.handle(LiveLocationMapAction.AddMapSymbol(userLocation.matrixItem.id, symbol.id))
} }
private fun updateSymbol(symbolId: Long, userLocation: UserLiveLocationViewState, symbolManager: SymbolManager) { private fun updateSymbol(symbolId: Long, userLocation: UserLiveLocationViewState, symbolManager: SymbolManager) {
@ -254,7 +254,7 @@ class LocationLiveMapViewFragment @Inject constructor() : VectorBaseFragment<Fra
val userIdsToRemove = state.mapSymbolIds.keys.subtract(userLiveLocations.map { it.matrixItem.id }.toSet()) val userIdsToRemove = state.mapSymbolIds.keys.subtract(userLiveLocations.map { it.matrixItem.id }.toSet())
userIdsToRemove.forEach { userId -> userIdsToRemove.forEach { userId ->
removeUserPinFromMapStyle(userId) removeUserPinFromMapStyle(userId)
viewModel.handle(LocationLiveMapAction.RemoveMapSymbol(userId)) viewModel.handle(LiveLocationMapAction.RemoveMapSymbol(userId))
state.mapSymbolIds[userId]?.let { symbolId -> state.mapSymbolIds[userId]?.let { symbolId ->
Timber.d("trying to delete symbol with id: $symbolId") Timber.d("trying to delete symbol with id: $symbolId")

View File

@ -30,19 +30,19 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.session.room.location.UpdateLiveLocationShareResult import org.matrix.android.sdk.api.session.room.location.UpdateLiveLocationShareResult
class LocationLiveMapViewModel @AssistedInject constructor( class LiveLocationMapViewModel @AssistedInject constructor(
@Assisted private val initialState: LocationLiveMapViewState, @Assisted private val initialState: LiveLocationMapViewState,
getListOfUserLiveLocationUseCase: GetListOfUserLiveLocationUseCase, getListOfUserLiveLocationUseCase: GetListOfUserLiveLocationUseCase,
private val locationSharingServiceConnection: LocationSharingServiceConnection, private val locationSharingServiceConnection: LocationSharingServiceConnection,
private val stopLiveLocationShareUseCase: StopLiveLocationShareUseCase, private val stopLiveLocationShareUseCase: StopLiveLocationShareUseCase,
) : VectorViewModel<LocationLiveMapViewState, LocationLiveMapAction, LocationLiveMapViewEvents>(initialState), LocationSharingServiceConnection.Callback { ) : VectorViewModel<LiveLocationMapViewState, LiveLocationMapAction, LiveLocationMapViewEvents>(initialState), LocationSharingServiceConnection.Callback {
@AssistedFactory @AssistedFactory
interface Factory : MavericksAssistedViewModelFactory<LocationLiveMapViewModel, LocationLiveMapViewState> { interface Factory : MavericksAssistedViewModelFactory<LiveLocationMapViewModel, LiveLocationMapViewState> {
override fun create(initialState: LocationLiveMapViewState): LocationLiveMapViewModel override fun create(initialState: LiveLocationMapViewState): LiveLocationMapViewModel
} }
companion object : MavericksViewModelFactory<LocationLiveMapViewModel, LocationLiveMapViewState> by hiltMavericksViewModelFactory() companion object : MavericksViewModelFactory<LiveLocationMapViewModel, LiveLocationMapViewState> by hiltMavericksViewModelFactory()
init { init {
getListOfUserLiveLocationUseCase.execute(initialState.roomId) getListOfUserLiveLocationUseCase.execute(initialState.roomId)
@ -56,22 +56,22 @@ class LocationLiveMapViewModel @AssistedInject constructor(
super.onCleared() super.onCleared()
} }
override fun handle(action: LocationLiveMapAction) { override fun handle(action: LiveLocationMapAction) {
when (action) { when (action) {
is LocationLiveMapAction.AddMapSymbol -> handleAddMapSymbol(action) is LiveLocationMapAction.AddMapSymbol -> handleAddMapSymbol(action)
is LocationLiveMapAction.RemoveMapSymbol -> handleRemoveMapSymbol(action) is LiveLocationMapAction.RemoveMapSymbol -> handleRemoveMapSymbol(action)
LocationLiveMapAction.StopSharing -> handleStopSharing() LiveLocationMapAction.StopSharing -> handleStopSharing()
} }
} }
private fun handleAddMapSymbol(action: LocationLiveMapAction.AddMapSymbol) = withState { state -> private fun handleAddMapSymbol(action: LiveLocationMapAction.AddMapSymbol) = withState { state ->
val newMapSymbolIds = state.mapSymbolIds.toMutableMap().apply { set(action.key, action.value) } val newMapSymbolIds = state.mapSymbolIds.toMutableMap().apply { set(action.key, action.value) }
setState { setState {
copy(mapSymbolIds = newMapSymbolIds) copy(mapSymbolIds = newMapSymbolIds)
} }
} }
private fun handleRemoveMapSymbol(action: LocationLiveMapAction.RemoveMapSymbol) = withState { state -> private fun handleRemoveMapSymbol(action: LiveLocationMapAction.RemoveMapSymbol) = withState { state ->
val newMapSymbolIds = state.mapSymbolIds.toMutableMap().apply { remove(action.key) } val newMapSymbolIds = state.mapSymbolIds.toMutableMap().apply { remove(action.key) }
setState { setState {
copy(mapSymbolIds = newMapSymbolIds) copy(mapSymbolIds = newMapSymbolIds)
@ -82,7 +82,7 @@ class LocationLiveMapViewModel @AssistedInject constructor(
viewModelScope.launch { viewModelScope.launch {
val result = stopLiveLocationShareUseCase.execute(initialState.roomId) val result = stopLiveLocationShareUseCase.execute(initialState.roomId)
if (result is UpdateLiveLocationShareResult.Failure) { if (result is UpdateLiveLocationShareResult.Failure) {
_viewEvents.post(LocationLiveMapViewEvents.Error(result.error)) _viewEvents.post(LiveLocationMapViewEvents.Error(result.error))
} }
} }
} }
@ -96,6 +96,6 @@ class LocationLiveMapViewModel @AssistedInject constructor(
} }
override fun onLocationServiceError(error: Throwable) { override fun onLocationServiceError(error: Throwable) {
_viewEvents.post(LocationLiveMapViewEvents.Error(error)) _viewEvents.post(LiveLocationMapViewEvents.Error(error))
} }
} }

View File

@ -21,7 +21,7 @@ import com.airbnb.mvrx.MavericksState
import im.vector.app.features.location.LocationData import im.vector.app.features.location.LocationData
import org.matrix.android.sdk.api.util.MatrixItem import org.matrix.android.sdk.api.util.MatrixItem
data class LocationLiveMapViewState( data class LiveLocationMapViewState(
val roomId: String, val roomId: String,
val userLocations: List<UserLiveLocationViewState> = emptyList(), val userLocations: List<UserLiveLocationViewState> = emptyList(),
/** /**
@ -29,8 +29,8 @@ data class LocationLiveMapViewState(
*/ */
val mapSymbolIds: Map<String, Long> = emptyMap() val mapSymbolIds: Map<String, Long> = emptyMap()
) : MavericksState { ) : MavericksState {
constructor(locationLiveMapViewArgs: LocationLiveMapViewArgs) : this( constructor(liveLocationMapViewArgs: LiveLocationMapViewArgs) : this(
roomId = locationLiveMapViewArgs.roomId roomId = liveLocationMapViewArgs.roomId
) )
} }

View File

@ -29,8 +29,8 @@ import im.vector.app.core.time.Clock
import im.vector.app.features.home.HomeActivity import im.vector.app.features.home.HomeActivity
import im.vector.app.features.home.room.detail.RoomDetailActivity import im.vector.app.features.home.room.detail.RoomDetailActivity
import im.vector.app.features.home.room.detail.arguments.TimelineArgs import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.location.live.map.LocationLiveMapViewActivity import im.vector.app.features.location.live.map.LiveLocationMapViewActivity
import im.vector.app.features.location.live.map.LocationLiveMapViewArgs import im.vector.app.features.location.live.map.LiveLocationMapViewArgs
import im.vector.app.features.notifications.NotificationUtils import im.vector.app.features.notifications.NotificationUtils
import im.vector.app.features.themes.ThemeUtils import im.vector.app.features.themes.ThemeUtils
import javax.inject.Inject import javax.inject.Inject
@ -51,7 +51,7 @@ class LiveLocationNotificationBuilder @Inject constructor(
return NotificationCompat.Builder(context, NotificationUtils.SILENT_NOTIFICATION_CHANNEL_ID) return NotificationCompat.Builder(context, NotificationUtils.SILENT_NOTIFICATION_CHANNEL_ID)
.setContentTitle(stringProvider.getString(R.string.live_location_sharing_notification_title)) .setContentTitle(stringProvider.getString(R.string.live_location_sharing_notification_title))
.setContentText(stringProvider.getString(R.string.live_location_sharing_notification_description)) .setContentText(stringProvider.getString(R.string.live_location_sharing_notification_description))
.setSmallIcon(R.drawable.ic_attachment_location_live_white) .setSmallIcon(R.drawable.ic_attachment_live_location_white)
.setColor(ThemeUtils.getColor(context, android.R.attr.colorPrimary)) .setColor(ThemeUtils.getColor(context, android.R.attr.colorPrimary))
.setCategory(NotificationCompat.CATEGORY_LOCATION_SHARING) .setCategory(NotificationCompat.CATEGORY_LOCATION_SHARING)
.setContentIntent(buildOpenLiveLocationMapIntent(roomId)) .setContentIntent(buildOpenLiveLocationMapIntent(roomId))
@ -61,9 +61,9 @@ class LiveLocationNotificationBuilder @Inject constructor(
private fun buildOpenLiveLocationMapIntent(roomId: String): PendingIntent? { private fun buildOpenLiveLocationMapIntent(roomId: String): PendingIntent? {
val homeIntent = HomeActivity.newIntent(context, firstStartMainActivity = false) val homeIntent = HomeActivity.newIntent(context, firstStartMainActivity = false)
val roomIntent = RoomDetailActivity.newIntent(context, TimelineArgs(roomId = roomId, switchToParentSpace = true), firstStartMainActivity = false) val roomIntent = RoomDetailActivity.newIntent(context, TimelineArgs(roomId = roomId, switchToParentSpace = true), firstStartMainActivity = false)
val mapIntent = LocationLiveMapViewActivity.getIntent( val mapIntent = LiveLocationMapViewActivity.getIntent(
context = context, context = context,
locationLiveMapViewArgs = LocationLiveMapViewArgs(roomId = roomId), liveLocationMapViewArgs = LiveLocationMapViewArgs(roomId = roomId),
firstStartMainActivity = true firstStartMainActivity = true
) )
mapIntent.action = NotificationUtils.TAP_TO_VIEW_ACTION mapIntent.action = NotificationUtils.TAP_TO_VIEW_ACTION

View File

@ -66,8 +66,8 @@ import im.vector.app.features.location.LocationData
import im.vector.app.features.location.LocationSharingActivity import im.vector.app.features.location.LocationSharingActivity
import im.vector.app.features.location.LocationSharingArgs import im.vector.app.features.location.LocationSharingArgs
import im.vector.app.features.location.LocationSharingMode import im.vector.app.features.location.LocationSharingMode
import im.vector.app.features.location.live.map.LocationLiveMapViewActivity import im.vector.app.features.location.live.map.LiveLocationMapViewActivity
import im.vector.app.features.location.live.map.LocationLiveMapViewArgs import im.vector.app.features.location.live.map.LiveLocationMapViewArgs
import im.vector.app.features.login.LoginActivity import im.vector.app.features.login.LoginActivity
import im.vector.app.features.login.LoginConfig import im.vector.app.features.login.LoginConfig
import im.vector.app.features.matrixto.MatrixToBottomSheet import im.vector.app.features.matrixto.MatrixToBottomSheet
@ -560,10 +560,10 @@ class DefaultNavigator @Inject constructor(
context.startActivity(intent) context.startActivity(intent)
} }
override fun openLocationLiveMap(context: Context, roomId: String) { override fun openLiveLocationMap(context: Context, roomId: String) {
val intent = LocationLiveMapViewActivity.getIntent( val intent = LiveLocationMapViewActivity.getIntent(
context = context, context = context,
locationLiveMapViewArgs = LocationLiveMapViewArgs(roomId = roomId) liveLocationMapViewArgs = LiveLocationMapViewArgs(roomId = roomId)
) )
context.startActivity(intent) context.startActivity(intent)
} }

View File

@ -186,7 +186,7 @@ interface Navigator {
locationOwnerId: String? locationOwnerId: String?
) )
fun openLocationLiveMap(context: Context, roomId: String) fun openLiveLocationMap(context: Context, roomId: String)
fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null) fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null)

View File

@ -17,7 +17,7 @@
android:backgroundTint="?vctr_live_location" android:backgroundTint="?vctr_live_location"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:padding="4dp" android:padding="4dp"
android:src="@drawable/ic_attachment_location_live_white" /> android:src="@drawable/ic_attachment_live_location_white" />
<TextView <TextView
style="@style/TextAppearance.Vector.Headline.Medium" style="@style/TextAppearance.Vector.Headline.Medium"

View File

@ -49,7 +49,7 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<im.vector.app.features.location.live.LocationLiveEndedBannerView <im.vector.app.features.location.live.LiveLocationEndedBannerView
android:id="@+id/liveLocationMapFragmentEndedBanner" android:id="@+id/liveLocationMapFragmentEndedBanner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="56dp" android:layout_height="56dp"

View File

@ -45,8 +45,8 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/appBarLayout" /> app:layout_constraintTop_toBottomOf="@id/appBarLayout" />
<im.vector.app.features.location.live.LocationLiveStatusView <im.vector.app.features.location.live.LiveLocationStatusView
android:id="@+id/locationLiveStatusIndicator" android:id="@+id/liveLocationStatusIndicator"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="gone" android:visibility="gone"
@ -63,7 +63,7 @@
android:minHeight="54dp" android:minHeight="54dp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/locationLiveStatusIndicator" /> app:layout_constraintTop_toBottomOf="@id/liveLocationStatusIndicator" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/timelineRecyclerView" android:id="@+id/timelineRecyclerView"

View File

@ -7,7 +7,7 @@
<!-- Size will be overrode --> <!-- Size will be overrode -->
<ImageView <ImageView
android:id="@+id/locationLiveInactiveMap" android:id="@+id/liveLocationInactiveMap"
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="200dp" android:layout_height="200dp"
android:contentDescription="@string/a11y_static_map_image" android:contentDescription="@string/a11y_static_map_image"
@ -15,29 +15,29 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<im.vector.app.features.location.live.LocationLiveEndedBannerView <im.vector.app.features.location.live.LiveLocationEndedBannerView
android:id="@+id/locationLiveEndedBanner" android:id="@+id/liveLocationEndedBanner"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="48dp" android:layout_height="48dp"
app:layout_constraintBottom_toBottomOf="@id/locationLiveInactiveMap" app:layout_constraintBottom_toBottomOf="@id/liveLocationInactiveMap"
app:layout_constraintEnd_toEndOf="@id/locationLiveInactiveMap" app:layout_constraintEnd_toEndOf="@id/liveLocationInactiveMap"
app:layout_constraintStart_toStartOf="@id/locationLiveInactiveMap" app:layout_constraintStart_toStartOf="@id/liveLocationInactiveMap"
app:locLiveEndedBkgWithAlpha="true" app:locLiveEndedBkgWithAlpha="true"
app:locLiveEndedIconMarginStart="8dp" /> app:locLiveEndedIconMarginStart="8dp" />
<ImageView <ImageView
android:id="@+id/locationLiveInactiveIcon" android:id="@+id/liveLocationInactiveIcon"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="65dp" android:layout_height="65dp"
android:src="@drawable/ic_attachment_location_white" android:src="@drawable/ic_attachment_location_white"
app:layout_constraintBottom_toTopOf="@id/locationLiveInactiveVerticalCenter" app:layout_constraintBottom_toTopOf="@id/liveLocationInactiveVerticalCenter"
app:layout_constraintEnd_toEndOf="@id/locationLiveInactiveMap" app:layout_constraintEnd_toEndOf="@id/liveLocationInactiveMap"
app:layout_constraintStart_toStartOf="@id/locationLiveInactiveMap" app:layout_constraintStart_toStartOf="@id/liveLocationInactiveMap"
app:tint="?vctr_content_quaternary" app:tint="?vctr_content_quaternary"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/locationLiveInactiveVerticalCenter" android:id="@+id/liveLocationInactiveVerticalCenter"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"

View File

@ -7,7 +7,7 @@
<!-- Size will be overrode --> <!-- Size will be overrode -->
<ImageView <ImageView
android:id="@+id/locationLiveStartMap" android:id="@+id/liveLocationStartMap"
android:layout_width="300dp" android:layout_width="300dp"
android:layout_height="200dp" android:layout_height="200dp"
android:contentDescription="@string/a11y_static_map_image" android:contentDescription="@string/a11y_static_map_image"
@ -16,18 +16,18 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/locationLiveStartBanner" android:id="@+id/liveLocationStartBanner"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="48dp" android:layout_height="48dp"
android:alpha="0.75" android:alpha="0.75"
android:src="?android:colorBackground" android:src="?android:colorBackground"
app:layout_constraintBottom_toBottomOf="@id/locationLiveStartMap" app:layout_constraintBottom_toBottomOf="@id/liveLocationStartMap"
app:layout_constraintEnd_toEndOf="@id/locationLiveStartMap" app:layout_constraintEnd_toEndOf="@id/liveLocationStartMap"
app:layout_constraintStart_toStartOf="@id/locationLiveStartMap" app:layout_constraintStart_toStartOf="@id/liveLocationStartMap"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<ImageView <ImageView
android:id="@+id/locationLiveStartIcon" android:id="@+id/liveLocationStartIcon"
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="32dp" android:layout_height="32dp"
android:layout_marginVertical="8dp" android:layout_marginVertical="8dp"
@ -35,15 +35,15 @@
android:background="@drawable/circle" android:background="@drawable/circle"
android:backgroundTint="?vctr_content_quaternary" android:backgroundTint="?vctr_content_quaternary"
android:padding="3dp" android:padding="3dp"
app:layout_constraintBottom_toBottomOf="@id/locationLiveStartBanner" app:layout_constraintBottom_toBottomOf="@id/liveLocationStartBanner"
app:layout_constraintStart_toStartOf="@id/locationLiveStartBanner" app:layout_constraintStart_toStartOf="@id/liveLocationStartBanner"
app:layout_constraintTop_toTopOf="@id/locationLiveStartBanner" app:layout_constraintTop_toTopOf="@id/liveLocationStartBanner"
app:srcCompat="@drawable/ic_attachment_location_live_white" app:srcCompat="@drawable/ic_attachment_live_location_white"
app:tint="?android:colorBackground" app:tint="?android:colorBackground"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/locationLiveStartTitle" android:id="@+id/liveLocationStartTitle"
style="@style/Widget.Vector.TextView.Caption" style="@style/Widget.Vector.TextView.Caption"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -52,19 +52,19 @@
android:ellipsize="end" android:ellipsize="end"
android:text="@string/location_share_live_started" android:text="@string/location_share_live_started"
android:textColor="?vctr_content_tertiary" android:textColor="?vctr_content_tertiary"
app:layout_constraintBottom_toBottomOf="@id/locationLiveStartBanner" app:layout_constraintBottom_toBottomOf="@id/liveLocationStartBanner"
app:layout_constraintEnd_toEndOf="@id/locationLiveStartBanner" app:layout_constraintEnd_toEndOf="@id/liveLocationStartBanner"
app:layout_constraintStart_toEndOf="@id/locationLiveStartIcon" app:layout_constraintStart_toEndOf="@id/liveLocationStartIcon"
app:layout_constraintTop_toTopOf="@id/locationLiveStartBanner" /> app:layout_constraintTop_toTopOf="@id/liveLocationStartBanner" />
<ProgressBar <ProgressBar
android:id="@+id/locationLiveStartLoader" android:id="@+id/liveLocationStartLoader"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:indeterminateTint="?vctr_content_quaternary" android:indeterminateTint="?vctr_content_quaternary"
app:layout_constraintBottom_toTopOf="@id/locationLiveStartBanner" app:layout_constraintBottom_toTopOf="@id/liveLocationStartBanner"
app:layout_constraintEnd_toEndOf="@id/locationLiveStartMap" app:layout_constraintEnd_toEndOf="@id/liveLocationStartMap"
app:layout_constraintStart_toStartOf="@id/locationLiveStartMap" app:layout_constraintStart_toStartOf="@id/liveLocationStartMap"
app:layout_constraintTop_toTopOf="@id/locationLiveStartMap" /> app:layout_constraintTop_toTopOf="@id/liveLocationStartMap" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -45,8 +45,8 @@
app:layout_constraintTop_toBottomOf="@id/staticMapPinImageView" app:layout_constraintTop_toBottomOf="@id/staticMapPinImageView"
tools:visibility="visible" /> tools:visibility="visible" />
<im.vector.app.features.location.live.LocationLiveRunningBannerView <im.vector.app.features.location.live.LiveLocationRunningBannerView
android:id="@+id/locationLiveRunningBanner" android:id="@+id/liveLocationRunningBanner"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="gone" android:visibility="gone"

View File

@ -7,7 +7,7 @@
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<ImageView <ImageView
android:id="@+id/locationLiveEndedBannerBackground" android:id="@+id/liveLocationEndedBannerBackground"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:src="?android:colorBackground" android:src="?android:colorBackground"
@ -18,7 +18,7 @@
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<ImageView <ImageView
android:id="@+id/locationLiveEndedBannerIcon" android:id="@+id/liveLocationEndedBannerIcon"
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="32dp" android:layout_height="32dp"
android:layout_marginVertical="8dp" android:layout_marginVertical="8dp"
@ -26,15 +26,15 @@
android:background="@drawable/circle" android:background="@drawable/circle"
android:backgroundTint="?vctr_content_quaternary" android:backgroundTint="?vctr_content_quaternary"
android:padding="3dp" android:padding="3dp"
app:layout_constraintBottom_toBottomOf="@id/locationLiveEndedBannerBackground" app:layout_constraintBottom_toBottomOf="@id/liveLocationEndedBannerBackground"
app:layout_constraintStart_toStartOf="@id/locationLiveEndedBannerBackground" app:layout_constraintStart_toStartOf="@id/liveLocationEndedBannerBackground"
app:layout_constraintTop_toTopOf="@id/locationLiveEndedBannerBackground" app:layout_constraintTop_toTopOf="@id/liveLocationEndedBannerBackground"
app:srcCompat="@drawable/ic_attachment_location_live_white" app:srcCompat="@drawable/ic_attachment_live_location_white"
app:tint="?android:colorBackground" app:tint="?android:colorBackground"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/locationLiveEndedTitle" android:id="@+id/liveLocationEndedTitle"
style="@style/Widget.Vector.TextView.Caption" style="@style/Widget.Vector.TextView.Caption"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -43,8 +43,8 @@
android:lines="1" android:lines="1"
android:text="@string/location_share_live_ended" android:text="@string/location_share_live_ended"
android:textColor="?vctr_content_tertiary" android:textColor="?vctr_content_tertiary"
app:layout_constraintBottom_toBottomOf="@id/locationLiveEndedBannerBackground" app:layout_constraintBottom_toBottomOf="@id/liveLocationEndedBannerBackground"
app:layout_constraintEnd_toEndOf="@id/locationLiveEndedBannerBackground" app:layout_constraintEnd_toEndOf="@id/liveLocationEndedBannerBackground"
app:layout_constraintStart_toEndOf="@id/locationLiveEndedBannerIcon" app:layout_constraintStart_toEndOf="@id/liveLocationEndedBannerIcon"
app:layout_constraintTop_toTopOf="@id/locationLiveEndedBannerBackground" /> app:layout_constraintTop_toTopOf="@id/liveLocationEndedBannerBackground" />
</merge> </merge>

View File

@ -7,7 +7,7 @@
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<ImageView <ImageView
android:id="@+id/locationLiveRunningBannerBackground" android:id="@+id/liveLocationRunningBannerBackground"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="50dp" android:layout_height="50dp"
android:alpha="0.75" android:alpha="0.75"
@ -18,7 +18,7 @@
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<ImageView <ImageView
android:id="@+id/locationLiveRunningBannerIcon" android:id="@+id/liveLocationRunningBannerIcon"
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="32dp" android:layout_height="32dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
@ -26,13 +26,13 @@
android:backgroundTint="?vctr_live_location" android:backgroundTint="?vctr_live_location"
android:padding="3dp" android:padding="3dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/locationLiveRunningBannerBackground" app:layout_constraintStart_toStartOf="@id/liveLocationRunningBannerBackground"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_attachment_location_live_white" app:srcCompat="@drawable/ic_attachment_live_location_white"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/locationLiveRunningBannerTitle" android:id="@+id/liveLocationRunningBannerTitle"
style="@style/Widget.Vector.TextView.Caption" style="@style/Widget.Vector.TextView.Caption"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -40,16 +40,16 @@
android:ellipsize="end" android:ellipsize="end"
android:lines="1" android:lines="1"
android:textColor="?colorOnSurface" android:textColor="?colorOnSurface"
app:layout_constraintBottom_toTopOf="@id/locationLiveRunningBannerSubTitle" app:layout_constraintBottom_toTopOf="@id/liveLocationRunningBannerSubTitle"
app:layout_constraintEnd_toStartOf="@id/locationLiveRunningBannerStop" app:layout_constraintEnd_toStartOf="@id/liveLocationRunningBannerStop"
app:layout_constraintHorizontal_bias="0" app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/locationLiveRunningBannerIcon" app:layout_constraintStart_toEndOf="@id/liveLocationRunningBannerIcon"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" app:layout_constraintVertical_chainStyle="packed"
tools:text="@string/location_share_live_enabled" /> tools:text="@string/location_share_live_enabled" />
<TextView <TextView
android:id="@+id/locationLiveRunningBannerSubTitle" android:id="@+id/liveLocationRunningBannerSubTitle"
style="@style/Widget.Vector.TextView.Caption" style="@style/Widget.Vector.TextView.Caption"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -57,19 +57,19 @@
android:lines="1" android:lines="1"
android:textColor="?vctr_content_secondary" android:textColor="?vctr_content_secondary"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/locationLiveRunningBannerTitle" app:layout_constraintEnd_toEndOf="@id/liveLocationRunningBannerTitle"
app:layout_constraintHorizontal_bias="0" app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="@id/locationLiveRunningBannerTitle" app:layout_constraintStart_toStartOf="@id/liveLocationRunningBannerTitle"
app:layout_constraintTop_toBottomOf="@id/locationLiveRunningBannerTitle" app:layout_constraintTop_toBottomOf="@id/liveLocationRunningBannerTitle"
tools:text="9min left" /> tools:text="9min left" />
<Button <Button
android:id="@+id/locationLiveRunningBannerStop" android:id="@+id/liveLocationRunningBannerStop"
style="@style/Widget.Vector.Button.Text.LocationLive" style="@style/Widget.Vector.Button.Text.LiveLocation"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/location_share_live_stop" android:text="@string/location_share_live_stop"
app:layout_constraintBottom_toBottomOf="@id/locationLiveRunningBannerBackground" app:layout_constraintBottom_toBottomOf="@id/liveLocationRunningBannerBackground"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/locationLiveRunningBannerBackground" /> app:layout_constraintTop_toTopOf="@id/liveLocationRunningBannerBackground" />
</merge> </merge>

View File

@ -7,14 +7,14 @@
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<androidx.constraintlayout.helper.widget.Flow <androidx.constraintlayout.helper.widget.Flow
android:id="@+id/locationLiveStatusContainer" android:id="@+id/liveLocationStatusContainer"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="32dp" android:layout_height="32dp"
android:background="?colorPrimary" android:background="?colorPrimary"
android:duplicateParentState="true" android:duplicateParentState="true"
android:paddingStart="9dp" android:paddingStart="9dp"
android:paddingEnd="12dp" android:paddingEnd="12dp"
app:constraint_referenced_ids="locationLiveStatusIcon,locationLiveStatusTitle" app:constraint_referenced_ids="liveLocationStatusIcon,liveLocationStatusTitle"
app:flow_horizontalBias="0" app:flow_horizontalBias="0"
app:flow_horizontalGap="8dp" app:flow_horizontalGap="8dp"
app:flow_horizontalStyle="packed" app:flow_horizontalStyle="packed"
@ -23,14 +23,14 @@
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<ImageView <ImageView
android:id="@+id/locationLiveStatusIcon" android:id="@+id/liveLocationStatusIcon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="13dp" android:layout_height="13dp"
app:srcCompat="@drawable/ic_attachment_location_live_white" app:srcCompat="@drawable/ic_attachment_live_location_white"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<TextView <TextView
android:id="@+id/locationLiveStatusTitle" android:id="@+id/liveLocationStatusTitle"
style="@style/Widget.Vector.TextView.Caption" style="@style/Widget.Vector.TextView.Caption"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -38,12 +38,12 @@
android:textColor="?colorOnPrimary" /> android:textColor="?colorOnPrimary" />
<Button <Button
android:id="@+id/locationLiveStatusStop" android:id="@+id/liveLocationStatusStop"
style="@style/Widget.Vector.Button.Text.OnPrimary.LocationLive" style="@style/Widget.Vector.Button.Text.OnPrimary.LiveLocation"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
android:text="@string/location_share_live_stop" android:text="@string/location_share_live_stop"
app:layout_constraintBottom_toBottomOf="@id/locationLiveStatusContainer" app:layout_constraintBottom_toBottomOf="@id/liveLocationStatusContainer"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/locationLiveStatusContainer" /> app:layout_constraintTop_toTopOf="@id/liveLocationStatusContainer" />
</merge> </merge>

View File

@ -65,7 +65,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/locationSharingOptionUserCurrent" app:layout_constraintTop_toBottomOf="@id/locationSharingOptionUserCurrent"
app:locShareIcon="@drawable/ic_attachment_location_live_white" app:locShareIcon="@drawable/ic_attachment_live_location_white"
app:locShareIconBackground="@drawable/circle" app:locShareIconBackground="@drawable/circle"
app:locShareIconBackgroundTint="?vctr_live_location" app:locShareIconBackgroundTint="?vctr_live_location"
app:locShareIconDescription="@string/a11y_location_share_option_user_live_icon" app:locShareIconDescription="@string/a11y_location_share_option_user_live_icon"

View File

@ -34,20 +34,20 @@ import org.matrix.android.sdk.api.util.MatrixItem
private const val A_ROOM_ID = "room_id" private const val A_ROOM_ID = "room_id"
class LocationLiveMapViewModelTest { class LiveLocationMapViewModelTest {
@get:Rule @get:Rule
val mvRxTestRule = MvRxTestRule(testDispatcher = UnconfinedTestDispatcher()) val mvRxTestRule = MvRxTestRule(testDispatcher = UnconfinedTestDispatcher())
private val args = LocationLiveMapViewArgs(roomId = A_ROOM_ID) private val args = LiveLocationMapViewArgs(roomId = A_ROOM_ID)
private val getListOfUserLiveLocationUseCase = mockk<GetListOfUserLiveLocationUseCase>() private val getListOfUserLiveLocationUseCase = mockk<GetListOfUserLiveLocationUseCase>()
private val locationServiceConnection = FakeLocationSharingServiceConnection() private val locationServiceConnection = FakeLocationSharingServiceConnection()
private val stopLiveLocationShareUseCase = mockk<StopLiveLocationShareUseCase>() private val stopLiveLocationShareUseCase = mockk<StopLiveLocationShareUseCase>()
private fun createViewModel(): LocationLiveMapViewModel { private fun createViewModel(): LiveLocationMapViewModel {
return LocationLiveMapViewModel( return LiveLocationMapViewModel(
LocationLiveMapViewState(args), LiveLocationMapViewState(args),
getListOfUserLiveLocationUseCase, getListOfUserLiveLocationUseCase,
locationServiceConnection.instance, locationServiceConnection.instance,
stopLiveLocationShareUseCase stopLiveLocationShareUseCase
@ -78,7 +78,7 @@ class LocationLiveMapViewModelTest {
viewModel viewModel
.test() .test()
.assertState( .assertState(
LocationLiveMapViewState(args).copy( LiveLocationMapViewState(args).copy(
userLocations = userLocations userLocations = userLocations
) )
) )