Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ sealed class PeekResult {
val topic: String?,
val avatarUrl: String?,
val numJoinedMembers: Int?,
val roomType: String?,
val viaServers: List<String>
) : PeekResult()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomCanonicalAliasContent
import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomNameContent
import org.matrix.android.sdk.api.session.room.model.RoomTopicContent
import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsFilter
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
import org.matrix.android.sdk.api.session.room.peeking.PeekResult
Expand Down Expand Up @@ -100,7 +101,8 @@ internal class DefaultPeekRoomTask @Inject constructor(
name = publicRepoResult.name,
topic = publicRepoResult.topic,
numJoinedMembers = publicRepoResult.numJoinedMembers,
viaServers = serverList
viaServers = serverList,
roomType = null // would be nice to get that from directory...
)
}

Expand Down Expand Up @@ -130,13 +132,18 @@ internal class DefaultPeekRoomTask @Inject constructor(
.distinctBy { it.stateKey }
.count()

val roomType = stateEvents
.lastOrNull { it.type == EventType.STATE_ROOM_CREATE }
?.let { it.content?.toModel<RoomCreateContent>()?.type }

return PeekResult.Success(
roomId = roomId,
alias = alias,
avatarUrl = avatarUrl,
name = name,
topic = topic,
numJoinedMembers = memberCount,
roomType = roomType,
viaServers = serverList
)
} catch (failure: Throwable) {
Expand Down
12 changes: 12 additions & 0 deletions vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ import im.vector.app.features.login.LoginSplashFragment
import im.vector.app.features.login.LoginWaitForEmailFragment
import im.vector.app.features.login.LoginWebFragment
import im.vector.app.features.login.terms.LoginTermsFragment
import im.vector.app.features.matrixto.MatrixToRoomSpaceFragment
import im.vector.app.features.matrixto.MatrixToUserFragment
import im.vector.app.features.pin.PinFragment
import im.vector.app.features.qrcode.QrCodeScannerFragment
import im.vector.app.features.reactions.EmojiChooserFragment
Expand Down Expand Up @@ -654,4 +656,14 @@ interface FragmentModule {
@IntoMap
@FragmentKey(CreateSpaceDefaultRoomsFragment::class)
fun bindCreateSpaceDefaultRoomsFragment(fragment: CreateSpaceDefaultRoomsFragment): Fragment

@Binds
@IntoMap
@FragmentKey(MatrixToUserFragment::class)
fun bindMatrixToUserFragment(fragment: MatrixToUserFragment): Fragment

@Binds
@IntoMap
@FragmentKey(MatrixToRoomSpaceFragment::class)
fun bindMatrixToRoomSpaceFragment(fragment: MatrixToRoomSpaceFragment): Fragment
}
17 changes: 17 additions & 0 deletions vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,23 @@ class HomeActivity :
return true
}

override fun navToRoom(roomId: String?, eventId: String?, deepLink: Uri?): Boolean {
if (roomId == null) return false
val listener = object : MatrixToBottomSheet.InteractionListener {
override fun navigateToRoom(roomId: String) {
navigator.openRoom(this@HomeActivity, roomId)
}

override fun switchToSpace(spaceId: String) {
navigator.switchToSpace(this@HomeActivity, spaceId, null, false)
}
}

MatrixToBottomSheet.withLink(deepLink.toString(), listener)
.show(supportFragmentManager, "HA#MatrixToBottomSheet")
return true
}

companion object {
fun newIntent(context: Context, clearNotification: Boolean = false, accountCreation: Boolean = false): Intent {
val args = HomeActivityArgs(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1407,7 +1407,7 @@ class RoomDetailFragment @Inject constructor(
override fun onUrlClicked(url: String, title: String): Boolean {
permalinkHandler
.launch(requireActivity(), url, object : NavigationInterceptor {
override fun navToRoom(roomId: String?, eventId: String?): Boolean {
override fun navToRoom(roomId: String?, eventId: String?, deepLink: Uri?): Boolean {
// Same room?
if (roomId == roomDetailArgs.roomId) {
// Navigation to same room
Expand Down Expand Up @@ -1599,7 +1599,7 @@ class RoomDetailFragment @Inject constructor(
override fun onRoomCreateLinkClicked(url: String) {
permalinkHandler
.launch(requireContext(), url, object : NavigationInterceptor {
override fun navToRoom(roomId: String?, eventId: String?): Boolean {
override fun navToRoom(roomId: String?, eventId: String?, deepLink: Uri?): Boolean {
requireActivity().finish()
return false
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,11 @@ import org.matrix.android.sdk.api.util.MatrixItem

sealed class MatrixToAction : VectorViewModelAction {
data class StartChattingWithUser(val matrixItem: MatrixItem) : MatrixToAction()
object FailedToResolveUser : MatrixToAction()
object FailedToStartChatting : MatrixToAction()
data class JoinSpace(val spaceID: String, val viaServers: List<String>?) : MatrixToAction()
data class JoinRoom(val roomId: String, val viaServers: List<String>?) : MatrixToAction()
data class OpenSpace(val spaceID: String) : MatrixToAction()
data class OpenRoom(val roomId: String) : MatrixToAction()
// data class OpenSpace(val spaceID: String) : MatrixToAction()
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,23 @@ import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isInvisible
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
import androidx.fragment.app.Fragment
import com.airbnb.mvrx.Incomplete
import com.airbnb.mvrx.MvRx
import com.airbnb.mvrx.Success
import com.airbnb.mvrx.Uninitialized
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import im.vector.app.R
import im.vector.app.core.di.ScreenComponent
import im.vector.app.core.extensions.setTextOrHide
import im.vector.app.core.extensions.commitTransaction
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
import im.vector.app.databinding.BottomSheetMatrixToCardBinding
import im.vector.app.features.home.AvatarRenderer
import kotlinx.parcelize.Parcelize
import org.matrix.android.sdk.api.session.permalinks.PermalinkData
import javax.inject.Inject
import kotlin.reflect.KClass

class MatrixToBottomSheet :
VectorBaseBottomSheetDialogFragment<BottomSheetMatrixToCardBinding>() {
Expand Down Expand Up @@ -65,63 +66,41 @@ class MatrixToBottomSheet :

interface InteractionListener {
fun navigateToRoom(roomId: String)
fun switchToSpace(spaceId: String) {}
}

override fun invalidate() = withState(viewModel) { state ->
super.invalidate()
when (val item = state.matrixItem) {
Uninitialized -> {
views.matrixToCardContentLoading.isVisible = false
views.matrixToCardUserContentVisibility.isVisible = false
when (state.linkType) {
is PermalinkData.RoomLink -> {
views.matrixToCardContentLoading.isVisible = state.roomPeekResult is Incomplete
showFragment(MatrixToRoomSpaceFragment::class, Bundle())
}
is Loading -> {
views.matrixToCardContentLoading.isVisible = true
views.matrixToCardUserContentVisibility.isVisible = false
is PermalinkData.UserLink -> {
views.matrixToCardContentLoading.isVisible = state.matrixItem is Incomplete
showFragment(MatrixToUserFragment::class, Bundle())
}
is Success -> {
views.matrixToCardContentLoading.isVisible = false
views.matrixToCardUserContentVisibility.isVisible = true
views.matrixToCardNameText.setTextOrHide(item.invoke().displayName)
views.matrixToCardUserIdText.setTextOrHide(item.invoke().id)
avatarRenderer.render(item.invoke(), views.matrixToCardAvatar)
is PermalinkData.GroupLink -> {
}
is Fail -> {
// TODO display some error copy?
dismiss()
is PermalinkData.FallbackLink -> {
}
}
}

when (state.startChattingState) {
Uninitialized -> {
views.matrixToCardButtonLoading.isVisible = false
views.matrixToCardSendMessageButton.isVisible = false
}
is Success -> {
views.matrixToCardButtonLoading.isVisible = false
views.matrixToCardSendMessageButton.isVisible = true
}
is Fail -> {
views.matrixToCardButtonLoading.isVisible = false
views.matrixToCardSendMessageButton.isVisible = true
// TODO display some error copy?
dismiss()
}
is Loading -> {
views.matrixToCardButtonLoading.isVisible = true
views.matrixToCardSendMessageButton.isInvisible = true
private fun showFragment(fragmentClass: KClass<out Fragment>, bundle: Bundle) {
if (childFragmentManager.findFragmentByTag(fragmentClass.simpleName) == null) {
childFragmentManager.commitTransaction {
replace(views.matrixToCardFragmentContainer.id,
fragmentClass.java,
bundle,
fragmentClass.simpleName
)
}
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
views.matrixToCardSendMessageButton.debouncedClicks {
withState(viewModel) {
it.matrixItem.invoke()?.let { item ->
viewModel.handle(MatrixToAction.StartChattingWithUser(item))
}
}
}

viewModel.observeViewEvents {
when (it) {
Expand All @@ -130,6 +109,16 @@ class MatrixToBottomSheet :
dismiss()
}
MatrixToViewEvents.Dismiss -> dismiss()
is MatrixToViewEvents.NavigateToSpace -> {
interactionListener?.switchToSpace(it.spaceId)
dismiss()
}
is MatrixToViewEvents.ShowModalError -> {
AlertDialog.Builder(requireContext())
.setMessage(it.error)
.setPositiveButton(getString(R.string.ok), null)
.show()
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,45 @@ package im.vector.app.features.matrixto
import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.Uninitialized
import org.matrix.android.sdk.api.session.permalinks.PermalinkData
import org.matrix.android.sdk.api.session.permalinks.PermalinkParser
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.util.MatrixItem

data class MatrixToBottomSheetState(
val deepLink: String,
val linkType: PermalinkData,
val matrixItem: Async<MatrixItem> = Uninitialized,
val startChattingState: Async<Unit> = Uninitialized
val startChattingState: Async<Unit> = Uninitialized,
val roomPeekResult: Async<RoomInfoResult> = Uninitialized
) : MvRxState {

constructor(args: MatrixToBottomSheet.MatrixToArgs) : this(
deepLink = args.matrixToLink
deepLink = args.matrixToLink,
linkType = PermalinkParser.parse(args.matrixToLink)
)
}

sealed class RoomInfoResult {
data class FullInfo(
val roomItem: MatrixItem.RoomItem,
val name: String,
val topic: String,
val memberCount: Int?,
val alias: String?,
val membership: Membership,
val roomType: String?,
val viaServers: List<String>?
) : RoomInfoResult()

data class PartialInfo(
val roomId: String?,
val viaServers: List<String>
) : RoomInfoResult()

data class UnknownAlias(
val alias: String?
) : RoomInfoResult()

object NotFound : RoomInfoResult()
}
Loading