Rollback to Fragment to be able to use Maverick capabilities

This commit is contained in:
Maxime NATUREL 2022-05-11 16:53:13 +02:00
parent 26cddd2d0d
commit 23e8cad10f
6 changed files with 98 additions and 33 deletions

View File

@ -64,6 +64,7 @@ import im.vector.app.features.home.room.list.RoomListFragment
import im.vector.app.features.home.room.threads.list.views.ThreadListFragment import im.vector.app.features.home.room.threads.list.views.ThreadListFragment
import im.vector.app.features.location.LocationPreviewFragment import im.vector.app.features.location.LocationPreviewFragment
import im.vector.app.features.location.LocationSharingFragment import im.vector.app.features.location.LocationSharingFragment
import im.vector.app.features.location.live.map.LocationLiveMapViewFragment
import im.vector.app.features.login.LoginCaptchaFragment import im.vector.app.features.login.LoginCaptchaFragment
import im.vector.app.features.login.LoginFragment import im.vector.app.features.login.LoginFragment
import im.vector.app.features.login.LoginGenericTextInputFormFragment import im.vector.app.features.login.LoginGenericTextInputFormFragment
@ -993,4 +994,9 @@ interface FragmentModule {
@IntoMap @IntoMap
@FragmentKey(LocationPreviewFragment::class) @FragmentKey(LocationPreviewFragment::class)
fun bindLocationPreviewFragment(fragment: LocationPreviewFragment): Fragment fun bindLocationPreviewFragment(fragment: LocationPreviewFragment): Fragment
@Binds
@IntoMap
@FragmentKey(LocationLiveMapViewFragment::class)
fun bindLocationLiveMapViewFragment(fragment: LocationLiveMapViewFragment): Fragment
} }

View File

@ -39,10 +39,8 @@ fun ComponentActivity.registerStartForActivityResult(onResult: (ActivityResult)
fun AppCompatActivity.addFragment( fun AppCompatActivity.addFragment(
container: ViewGroup, container: ViewGroup,
fragment: Fragment, fragment: Fragment,
allowStateLoss: Boolean = false, allowStateLoss: Boolean = false) {
tag: String? = null supportFragmentManager.commitTransaction(allowStateLoss) { add(container.id, fragment) }
) {
supportFragmentManager.commitTransaction(allowStateLoss) { add(container.id, fragment, tag) }
} }
fun <T : Fragment> AppCompatActivity.addFragment( fun <T : Fragment> AppCompatActivity.addFragment(

View File

@ -36,9 +36,10 @@ fun Fragment.registerStartForActivityResult(onResult: (ActivityResult) -> Unit):
fun Fragment.addFragment( fun Fragment.addFragment(
frameId: Int, frameId: Int,
fragment: Fragment, fragment: Fragment,
tag: String? = null,
allowStateLoss: Boolean = false allowStateLoss: Boolean = false
) { ) {
parentFragmentManager.commitTransaction(allowStateLoss) { add(frameId, fragment) } parentFragmentManager.commitTransaction(allowStateLoss) { add(frameId, fragment, tag) }
} }
fun <T : Fragment> Fragment.addFragment( fun <T : Fragment> Fragment.addFragment(

View File

@ -19,31 +19,21 @@ package im.vector.app.features.location.live.map
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Parcelable import android.os.Parcelable
import androidx.lifecycle.lifecycleScope
import com.mapbox.mapboxsdk.maps.MapboxMapOptions
import com.mapbox.mapboxsdk.maps.SupportMapFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.extensions.addFragment import im.vector.app.core.extensions.addFragment
import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.platform.VectorBaseActivity
import im.vector.app.databinding.ActivityLocationSharingBinding import im.vector.app.databinding.ActivityLocationSharingBinding
import im.vector.app.features.location.UrlMapProvider
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import javax.inject.Inject
@Parcelize @Parcelize
data class LocationLiveMapViewArgs( data class LocationLiveMapViewArgs(
val roomId: String val roomId: String
) : Parcelable ) : Parcelable
/**
* Screen showing a map with all the current users sharing their live location in room.
*/
@AndroidEntryPoint @AndroidEntryPoint
class LocationLiveMapViewActivity : VectorBaseActivity<ActivityLocationSharingBinding>() { class LocationLiveMapViewActivity : VectorBaseActivity<ActivityLocationSharingBinding>() {
@Inject lateinit var urlMapProvider: UrlMapProvider
override fun getBinding() = ActivityLocationSharingBinding.inflate(layoutInflater) override fun getBinding() = ActivityLocationSharingBinding.inflate(layoutInflater)
override fun initUiAndData() { override fun initUiAndData() {
@ -56,30 +46,18 @@ class LocationLiveMapViewActivity : VectorBaseActivity<ActivityLocationSharingBi
.setTitle(getString(R.string.location_activity_title_preview)) .setTitle(getString(R.string.location_activity_title_preview))
.allowBack() .allowBack()
setupMap() if (isFirstCreation()) {
} addFragment(
views.fragmentContainer,
private fun setupMap() { LocationLiveMapViewFragment::class.java,
val mapFragment: SupportMapFragment? = if (isFirstCreation()) { mapViewArgs
val options = MapboxMapOptions.createFromAttributes(this, null) )
val fragment = SupportMapFragment.newInstance(options)
addFragment(views.fragmentContainer, fragment, tag = MAP_FRAGMENT_TAG)
fragment
} else {
supportFragmentManager.findFragmentByTag(MAP_FRAGMENT_TAG) as? SupportMapFragment
}
mapFragment?.getMapAsync { mapBoxMap ->
lifecycleScope.launchWhenCreated {
mapBoxMap.setStyle(urlMapProvider.getMapUrl())
}
} }
} }
companion object { companion object {
private const val EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS = "EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS" private const val EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS = "EXTRA_LOCATION_LIVE_MAP_VIEW_ARGS"
private const val MAP_FRAGMENT_TAG = "im.vector.app.features.location.live.map"
fun getIntent(context: Context, locationLiveMapViewArgs: LocationLiveMapViewArgs): Intent { fun getIntent(context: Context, locationLiveMapViewArgs: LocationLiveMapViewArgs): Intent {
return Intent(context, LocationLiveMapViewActivity::class.java).apply { return Intent(context, LocationLiveMapViewActivity::class.java).apply {

View File

@ -0,0 +1,77 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.location.live.map
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import com.airbnb.mvrx.args
import com.mapbox.mapboxsdk.maps.MapView
import com.mapbox.mapboxsdk.maps.MapboxMapOptions
import com.mapbox.mapboxsdk.maps.SupportMapFragment
import im.vector.app.R
import im.vector.app.core.extensions.addFragment
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentLiveLocationMapBinding
import im.vector.app.databinding.FragmentLocationPreviewBinding
import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider
import im.vector.app.features.location.UrlMapProvider
import java.lang.ref.WeakReference
import javax.inject.Inject
/**
* Screen showing a map with all the current users sharing their live location in room.
*/
class LocationLiveMapViewFragment @Inject constructor(
private val urlMapProvider: UrlMapProvider,
private val locationPinProvider: LocationPinProvider
) : VectorBaseFragment<FragmentLiveLocationMapBinding>() {
private val args: LocationLiveMapViewArgs by args()
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLiveLocationMapBinding {
return FragmentLiveLocationMapBinding.inflate(layoutInflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupMap()
}
private fun setupMap() {
val mapFragment: SupportMapFragment =
parentFragmentManager.findFragmentByTag(MAP_FRAGMENT_TAG) as? SupportMapFragment
?: run {
val options = MapboxMapOptions.createFromAttributes(requireContext(), null)
val fragment = SupportMapFragment.newInstance(options)
addFragment(R.id.liveLocationMapContainer, fragment, tag = MAP_FRAGMENT_TAG)
fragment
}
mapFragment.getMapAsync { mapBoxMap ->
lifecycleScope.launchWhenCreated {
mapBoxMap.setStyle(urlMapProvider.getMapUrl())
}
}
}
companion object {
private const val MAP_FRAGMENT_TAG = "im.vector.app.features.location.live.map"
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/liveLocationMapContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />