From 8754f7772ba110aa8984aa1bb28d43a861643429 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 25 Mar 2021 11:13:14 +0100 Subject: [PATCH] Invite Space/Room chooser --- .../im/vector/app/core/di/ScreenComponent.kt | 2 + .../features/navigation/DefaultNavigator.kt | 29 ++++- .../InviteRoomSpaceChooserBottomSheet.kt | 100 ++++++++++++++++++ .../bottom_sheet_space_invite_chooser.xml | 54 ++++++++++ vector/src/main/res/values/strings.xml | 4 + 5 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/spaces/InviteRoomSpaceChooserBottomSheet.kt create mode 100644 vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml diff --git a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt index 59939a1318..d4b6178860 100644 --- a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt +++ b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt @@ -77,6 +77,7 @@ import im.vector.app.features.settings.VectorSettingsActivity import im.vector.app.features.settings.devices.DeviceVerificationInfoBottomSheet import im.vector.app.features.share.IncomingShareActivity import im.vector.app.features.signout.soft.SoftLogoutActivity +import im.vector.app.features.spaces.InviteRoomSpaceChooserBottomSheet import im.vector.app.features.spaces.ShareSpaceBottomSheet import im.vector.app.features.spaces.SpaceCreationActivity import im.vector.app.features.spaces.SpaceExploreActivity @@ -181,6 +182,7 @@ interface ScreenComponent { fun inject(bottomSheet: MatrixToBottomSheet) fun inject(bottomSheet: ShareSpaceBottomSheet) fun inject(bottomSheet: SpaceSettingsMenuBottomSheet) + fun inject(bottomSheet: InviteRoomSpaceChooserBottomSheet) /* ========================================================================================== * Others diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index c2986dfbc2..57b690bec2 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -71,6 +71,7 @@ import im.vector.app.features.roomprofile.RoomProfileActivity import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsActivity import im.vector.app.features.share.SharedData +import im.vector.app.features.spaces.InviteRoomSpaceChooserBottomSheet import im.vector.app.features.spaces.SpaceExploreActivity import im.vector.app.features.spaces.SpacePreviewActivity import im.vector.app.features.terms.ReviewTermsActivity @@ -275,8 +276,32 @@ class DefaultNavigator @Inject constructor( } override fun openInviteUsersToRoom(context: Context, roomId: String) { - val intent = InviteUsersToRoomActivity.getIntent(context, roomId) - context.startActivity(intent) + val selectedSpace = selectedSpaceDataSource.currentValue?.orNull()?.let { + sessionHolder.getSafeActiveSession()?.getRoomSummary(it.roomId) + } + if (vectorPreferences.labSpaces() && selectedSpace != null) { + // let user decides if he does it from space or room + (context as? AppCompatActivity)?.supportFragmentManager?.let { fm -> + InviteRoomSpaceChooserBottomSheet.newInstance( + selectedSpace.roomId, + roomId, + object : InviteRoomSpaceChooserBottomSheet.InteractionListener { + override fun inviteToSpace(spaceId: String) { + val intent = InviteUsersToRoomActivity.getIntent(context, spaceId) + context.startActivity(intent) + } + + override fun inviteToRoom(roomId: String) { + val intent = InviteUsersToRoomActivity.getIntent(context, roomId) + context.startActivity(intent) + } + } + ).show(fm, InviteRoomSpaceChooserBottomSheet::class.java.name) + } + } else { + val intent = InviteUsersToRoomActivity.getIntent(context, roomId) + context.startActivity(intent) + } } override fun openRoomsFiltering(context: Context) { diff --git a/vector/src/main/java/im/vector/app/features/spaces/InviteRoomSpaceChooserBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/InviteRoomSpaceChooserBottomSheet.kt new file mode 100644 index 0000000000..bc2a9c604b --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/spaces/InviteRoomSpaceChooserBottomSheet.kt @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2021 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.spaces + +import android.os.Bundle +import android.os.Parcelable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isVisible +import com.airbnb.mvrx.args +import im.vector.app.R +import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.core.di.ScreenComponent +import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment +import im.vector.app.databinding.BottomSheetSpaceInviteChooserBinding +import kotlinx.parcelize.Parcelize +import javax.inject.Inject + +class InviteRoomSpaceChooserBottomSheet : VectorBaseBottomSheetDialogFragment() { + + @Parcelize + data class Args( + val spaceId: String, + val roomId: String + ) : Parcelable + + override val showExpanded = true + + private val inviteArgs: Args by args() + + @Inject + lateinit var activeSessionHolder: ActiveSessionHolder + + interface InteractionListener { + fun inviteToSpace(spaceId: String) + fun inviteToRoom(roomId: String) + } + + var interactionListener: InteractionListener? = null + + override fun injectWith(injector: ScreenComponent) { + injector.inject(this) + } + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetSpaceInviteChooserBinding { + return BottomSheetSpaceInviteChooserBinding.inflate(inflater, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + // Not going for full view model for now, as it may change + + val summary = activeSessionHolder.getSafeActiveSession()?.spaceService()?.getSpace(inviteArgs.spaceId)?.spaceSummary() + + val spaceName = summary?.name + + views.inviteToSpaceButton.isVisible = true + views.inviteToSpaceButton.title = getString(R.string.invite_to_space_with_name, spaceName) + views.inviteToSpaceButton.subTitle = getString(R.string.invite_to_space_with_name_desc, spaceName) + views.inviteToSpaceButton.debouncedClicks { + dismiss() + interactionListener?.inviteToSpace(inviteArgs.spaceId) + } + + views.inviteToRoomOnly.isVisible = true + views.inviteToRoomOnly.title = getString(R.string.invite_just_to_this_room) + views.inviteToRoomOnly.subTitle = getString(R.string.invite_just_to_this_room_desc, spaceName) + views.inviteToRoomOnly.debouncedClicks { + dismiss() + interactionListener?.inviteToRoom(inviteArgs.roomId) + } + } + + companion object { + + fun newInstance(spaceId: String, roomId: String, interactionListener: InteractionListener) + : InviteRoomSpaceChooserBottomSheet { + return InviteRoomSpaceChooserBottomSheet().apply { + this.interactionListener = interactionListener + setArguments(Args(spaceId, roomId)) + } + } + } +} diff --git a/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml b/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml new file mode 100644 index 0000000000..03ff7b2fa0 --- /dev/null +++ b/vector/src/main/res/layout/bottom_sheet_space_invite_chooser.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 80052f91a3..3ec514959a 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3288,6 +3288,10 @@ Invite by email Invite by username Share link + Invite to %s + "They’ll be able to explore %s" + Just to this room + "They won’t be a part of %s" Join my space %1$s %2$s Skip for now