Add to backstack when navigating from permalink in room details

This commit is contained in:
ganfra 2019-01-03 21:26:39 +01:00 committed by ganfra
parent 84645c17c8
commit 14fc75a5f3
4 changed files with 38 additions and 12 deletions

View File

@ -35,5 +35,9 @@ class HomeModule(private val homeActivity: HomeActivity) {
SelectedGroupHolder()
}
single {
HomePermalinkHandler(get())
}
}
}

View File

@ -1,7 +1,9 @@
package im.vector.riotredesign.features.home
import android.support.v4.app.FragmentManager
import android.view.Gravity
import im.vector.riotredesign.R
import im.vector.riotredesign.core.extensions.addFragmentToBackstack
import im.vector.riotredesign.core.extensions.replaceFragment
import im.vector.riotredesign.features.home.room.detail.RoomDetailArgs
import im.vector.riotredesign.features.home.room.detail.RoomDetailFragment
@ -14,8 +16,11 @@ class HomeNavigator {
private var currentRoomId: String? = null
fun openRoomDetail(roomId: String, eventId: String?) {
if (isRoomOpened(roomId)) {
fun openRoomDetail(roomId: String,
eventId: String?,
addToBackstack: Boolean = false) {
Timber.v("Open room detail $roomId - $eventId - $addToBackstack")
if (!addToBackstack && isRoomOpened(roomId)) {
return
}
currentRoomId = roomId
@ -23,7 +28,12 @@ class HomeNavigator {
val args = RoomDetailArgs(roomId, eventId)
val roomDetailFragment = RoomDetailFragment.newInstance(args)
it.drawerLayout?.closeDrawer(Gravity.LEFT)
it.replaceFragment(roomDetailFragment, R.id.homeDetailFragmentContainer)
if (addToBackstack) {
it.addFragmentToBackstack(roomDetailFragment, R.id.homeDetailFragmentContainer, roomId)
} else {
clearBackStack(it.supportFragmentManager)
it.replaceFragment(roomDetailFragment, R.id.homeDetailFragmentContainer)
}
}
}
@ -39,4 +49,11 @@ class HomeNavigator {
return currentRoomId == roomId
}
private fun clearBackStack(fragmentManager: FragmentManager) {
if (fragmentManager.backStackEntryCount > 0) {
val first = fragmentManager.getBackStackEntryAt(0)
fragmentManager.popBackStack(first.id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
}
}

View File

@ -8,17 +8,18 @@ import android.view.View
import android.view.ViewGroup
import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel
import im.vector.matrix.android.api.permalinks.PermalinkParser
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.riotredesign.R
import im.vector.riotredesign.core.platform.RiotFragment
import im.vector.riotredesign.core.platform.ToolbarConfigurable
import im.vector.riotredesign.features.home.AvatarRenderer
import im.vector.riotredesign.features.home.HomePermalinkHandler
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.fragment_room_detail.*
import org.koin.android.ext.android.inject
import org.koin.core.parameter.parametersOf
import timber.log.Timber
@Parcelize
data class RoomDetailArgs(
@ -41,6 +42,7 @@ class RoomDetailFragment : RiotFragment(), TimelineEventController.Callback {
private val roomDetailArgs: RoomDetailArgs by args()
private val timelineEventController by inject<TimelineEventController> { parametersOf(roomDetailArgs.roomId) }
private val homePermalinkHandler by inject<HomePermalinkHandler>()
private lateinit var scrollOnNewMessageCallback: ScrollOnNewMessageCallback
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -70,16 +72,18 @@ class RoomDetailFragment : RiotFragment(), TimelineEventController.Callback {
private fun setupRecyclerView() {
val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true)
scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager)
//scrollOnNewMessageCallback = ScrollOnNewMessageCallback(layoutManager)
recyclerView.layoutManager = layoutManager
timelineEventController.addModelBuildListener { it.dispatchTo(scrollOnNewMessageCallback) }
//timelineEventController.addModelBuildListener { it.dispatchTo(scrollOnNewMessageCallback) }
recyclerView.setController(timelineEventController)
timelineEventController.callback = this
}
private fun renderState(state: RoomDetailViewState) {
if (state.asyncTimeline.complete) {
renderTimeline(state.asyncTimeline())
Timber.v("Render state")
val timeline = state.asyncTimeline()
if (timeline != null) {
renderTimeline(timeline)
}
renderRoomSummary(state.asyncRoomSummary())
}
@ -98,15 +102,14 @@ class RoomDetailFragment : RiotFragment(), TimelineEventController.Callback {
}
private fun renderTimeline(timeline: Timeline?) {
scrollOnNewMessageCallback.hasBeenUpdated.set(true)
//scrollOnNewMessageCallback.hasBeenUpdated.set(true)
timelineEventController.timeline = timeline
}
// TimelineEventController.Callback ************************************************************
override fun onUrlClicked(url: String) {
val permalinkData = PermalinkParser.parse(url)
homePermalinkHandler.launch(url)
}
}

View File

@ -1,10 +1,11 @@
package im.vector.riotredesign.features.home.room.detail.timeline
import android.text.util.Linkify
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan
import im.vector.matrix.android.api.permalinks.MatrixLinkify
import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan
import im.vector.riotredesign.R
import im.vector.riotredesign.core.epoxy.KotlinModel
import im.vector.riotredesign.features.home.AvatarRenderer
@ -30,6 +31,7 @@ data class MessageItem(
onUrlClickedListener?.invoke(url)
}
})
Linkify.addLinks(messageView, Linkify.ALL)
if (showInformation) {
avatarImageView.visibility = View.VISIBLE
memberNameView.visibility = View.VISIBLE