mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-18 20:29:10 +03:00
Merge pull request #2458 from vector-im/feature/bma/room_history_join_rule
Room setting: improve room history and add join rule
This commit is contained in:
commit
51b86e21f6
35 changed files with 1105 additions and 86 deletions
|
@ -3,9 +3,11 @@ Changes in Element 1.0.12 (2020-XX-XX)
|
|||
|
||||
Features ✨:
|
||||
- Add room aliases management, and room directory visibility management in a dedicated screen (#1579, #2428)
|
||||
- Room setting: update join rules and guest access (#2442)
|
||||
|
||||
Improvements 🙌:
|
||||
- Add Setting Item to Change PIN (#2462)
|
||||
- Improve room history visibility setting UX (#1579)
|
||||
|
||||
Bugfix 🐛:
|
||||
- Double bottomsheet effect after verify with passphrase
|
||||
|
|
|
@ -35,6 +35,8 @@ import org.matrix.android.sdk.api.util.toOptional
|
|||
import io.reactivex.Completable
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.Single
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
|
||||
class RxRoom(private val room: Room) {
|
||||
|
||||
|
@ -131,6 +133,10 @@ class RxRoom(private val room: Room) {
|
|||
room.updateHistoryReadability(readability, it)
|
||||
}
|
||||
|
||||
fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?): Completable = completableBuilder<Unit> {
|
||||
room.updateJoinRule(joinRules, guestAccess, it)
|
||||
}
|
||||
|
||||
fun updateAvatar(avatarUri: Uri, fileName: String): Completable = completableBuilder<Unit> {
|
||||
room.updateAvatar(avatarUri, fileName, it)
|
||||
}
|
||||
|
|
|
@ -21,7 +21,9 @@ import androidx.lifecycle.LiveData
|
|||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import org.matrix.android.sdk.api.query.QueryStringValue
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
import org.matrix.android.sdk.api.util.Cancelable
|
||||
import org.matrix.android.sdk.api.util.JsonDict
|
||||
import org.matrix.android.sdk.api.util.Optional
|
||||
|
@ -50,6 +52,11 @@ interface StateService {
|
|||
*/
|
||||
fun updateHistoryReadability(readability: RoomHistoryVisibility, callback: MatrixCallback<Unit>): Cancelable
|
||||
|
||||
/**
|
||||
* Update the join rule and/or the guest access
|
||||
*/
|
||||
fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?, callback: MatrixCallback<Unit>): Cancelable
|
||||
|
||||
/**
|
||||
* Update the avatar of the room
|
||||
*/
|
||||
|
|
|
@ -25,8 +25,12 @@ import org.matrix.android.sdk.api.query.QueryStringValue
|
|||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||
import org.matrix.android.sdk.api.session.events.model.toContent
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomCanonicalAliasContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
|
||||
import org.matrix.android.sdk.api.session.room.state.StateService
|
||||
import org.matrix.android.sdk.api.util.Cancelable
|
||||
import org.matrix.android.sdk.api.util.JsonDict
|
||||
|
@ -133,6 +137,31 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
|
|||
)
|
||||
}
|
||||
|
||||
override fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?, callback: MatrixCallback<Unit>): Cancelable {
|
||||
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) {
|
||||
if (joinRules != null) {
|
||||
awaitCallback<Unit> {
|
||||
sendStateEvent(
|
||||
eventType = EventType.STATE_ROOM_JOIN_RULES,
|
||||
body = RoomJoinRulesContent(joinRules).toContent(),
|
||||
callback = it,
|
||||
stateKey = null
|
||||
)
|
||||
}
|
||||
}
|
||||
if (guestAccess != null) {
|
||||
awaitCallback<Unit> {
|
||||
sendStateEvent(
|
||||
eventType = EventType.STATE_ROOM_GUEST_ACCESS,
|
||||
body = RoomGuestAccessContent(guestAccess).toContent(),
|
||||
callback = it,
|
||||
stateKey = null
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun updateAvatar(avatarUri: Uri, fileName: String, callback: MatrixCallback<Unit>): Cancelable {
|
||||
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) {
|
||||
val response = fileUploader.uploadFromUri(avatarUri, fileName, "image/jpeg")
|
||||
|
|
|
@ -68,6 +68,8 @@ import im.vector.app.features.roommemberprofile.RoomMemberProfileActivity
|
|||
import im.vector.app.features.roommemberprofile.devices.DeviceListBottomSheet
|
||||
import im.vector.app.features.roomprofile.RoomProfileActivity
|
||||
import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheet
|
||||
import im.vector.app.features.roomprofile.settings.historyvisibility.RoomHistoryVisibilityBottomSheet
|
||||
import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleBottomSheet
|
||||
import im.vector.app.features.settings.VectorSettingsActivity
|
||||
import im.vector.app.features.settings.devices.DeviceVerificationInfoBottomSheet
|
||||
import im.vector.app.features.share.IncomingShareActivity
|
||||
|
@ -155,6 +157,8 @@ interface ScreenComponent {
|
|||
fun inject(bottomSheet: DisplayReadReceiptsBottomSheet)
|
||||
fun inject(bottomSheet: RoomListQuickActionsBottomSheet)
|
||||
fun inject(bottomSheet: RoomAliasBottomSheet)
|
||||
fun inject(bottomSheet: RoomHistoryVisibilityBottomSheet)
|
||||
fun inject(bottomSheet: RoomJoinRuleBottomSheet)
|
||||
fun inject(bottomSheet: VerificationBottomSheet)
|
||||
fun inject(bottomSheet: DeviceVerificationInfoBottomSheet)
|
||||
fun inject(bottomSheet: DeviceListBottomSheet)
|
||||
|
|
|
@ -36,6 +36,8 @@ import im.vector.app.features.reactions.EmojiChooserViewModel
|
|||
import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.alias.detail.RoomAliasBottomSheetSharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.settings.historyvisibility.RoomHistoryVisibilitySharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleSharedActionViewModel
|
||||
import im.vector.app.features.userdirectory.UserListSharedActionViewModel
|
||||
|
||||
@Module
|
||||
|
@ -111,6 +113,16 @@ interface ViewModelModule {
|
|||
@ViewModelKey(RoomAliasBottomSheetSharedActionViewModel::class)
|
||||
fun bindRoomAliasBottomSheetSharedActionViewModel(viewModel: RoomAliasBottomSheetSharedActionViewModel): ViewModel
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(RoomHistoryVisibilitySharedActionViewModel::class)
|
||||
fun bindRoomHistoryVisibilitySharedActionViewModel(viewModel: RoomHistoryVisibilitySharedActionViewModel): ViewModel
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(RoomJoinRuleSharedActionViewModel::class)
|
||||
fun bindRoomJoinRuleSharedActionViewModel(viewModel: RoomJoinRuleSharedActionViewModel): ViewModel
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ViewModelKey(RoomDirectorySharedActionViewModel::class)
|
||||
|
|
|
@ -21,6 +21,7 @@ import android.view.View
|
|||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.drawable.DrawableCompat
|
||||
import androidx.core.view.isInvisible
|
||||
|
@ -43,6 +44,13 @@ abstract class BottomSheetActionItem : VectorEpoxyModel<BottomSheetActionItem.Ho
|
|||
@DrawableRes
|
||||
var iconRes: Int = 0
|
||||
|
||||
@EpoxyAttribute
|
||||
var showIcon = true
|
||||
|
||||
@EpoxyAttribute
|
||||
var text: String? = null
|
||||
|
||||
@StringRes
|
||||
@EpoxyAttribute
|
||||
var textRes: Int = 0
|
||||
|
||||
|
@ -75,9 +83,14 @@ abstract class BottomSheetActionItem : VectorEpoxyModel<BottomSheetActionItem.Ho
|
|||
} else {
|
||||
ThemeUtils.getColor(holder.view.context, R.attr.riotx_text_secondary)
|
||||
}
|
||||
holder.icon.isVisible = showIcon
|
||||
holder.icon.setImageResource(iconRes)
|
||||
ImageViewCompat.setImageTintList(holder.icon, ColorStateList.valueOf(tintColor))
|
||||
holder.text.setText(textRes)
|
||||
if (text != null) {
|
||||
holder.text.text = text
|
||||
} else {
|
||||
holder.text.setText(textRes)
|
||||
}
|
||||
holder.text.setTextColor(tintColor)
|
||||
holder.selected.isInvisible = !selected
|
||||
if (showExpand) {
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.core.ui.bottomsheet
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.annotation.CallSuper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import butterknife.BindView
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.extensions.cleanup
|
||||
import im.vector.app.core.extensions.configureWith
|
||||
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Generic Bottom sheet with actions
|
||||
*/
|
||||
abstract class BottomSheetGeneric<STATE : BottomSheetGenericState, ACTION : BottomSheetGenericAction> :
|
||||
VectorBaseBottomSheetDialogFragment(),
|
||||
BottomSheetGenericController.Listener<ACTION> {
|
||||
|
||||
@Inject lateinit var sharedViewPool: RecyclerView.RecycledViewPool
|
||||
|
||||
@BindView(R.id.bottomSheetRecyclerView)
|
||||
lateinit var recyclerView: RecyclerView
|
||||
|
||||
final override val showExpanded = true
|
||||
|
||||
final override fun getLayoutResId() = R.layout.bottom_sheet_generic_list
|
||||
|
||||
abstract fun getController(): BottomSheetGenericController<STATE, ACTION>
|
||||
|
||||
@CallSuper
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
recyclerView.configureWith(getController(), viewPool = sharedViewPool, hasFixedSize = false, disableItemAnimation = true)
|
||||
getController().listener = this
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
override fun onDestroyView() {
|
||||
recyclerView.cleanup()
|
||||
getController().listener = null
|
||||
super.onDestroyView()
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.core.ui.bottomsheet
|
||||
|
||||
import androidx.annotation.DrawableRes
|
||||
import im.vector.app.core.epoxy.bottomsheet.BottomSheetActionItem_
|
||||
import im.vector.app.core.platform.VectorSharedAction
|
||||
|
||||
/**
|
||||
* Parent class for a bottom sheet action
|
||||
*/
|
||||
open class BottomSheetGenericAction(
|
||||
open val title: String,
|
||||
@DrawableRes open val iconResId: Int,
|
||||
open val isSelected: Boolean,
|
||||
open val destructive: Boolean
|
||||
) : VectorSharedAction {
|
||||
|
||||
fun toBottomSheetItem(): BottomSheetActionItem_ {
|
||||
return BottomSheetActionItem_().apply {
|
||||
id("action_$title")
|
||||
iconRes(iconResId)
|
||||
text(title)
|
||||
selected(isSelected)
|
||||
destructive(destructive)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.core.ui.bottomsheet
|
||||
|
||||
import android.view.View
|
||||
import com.airbnb.epoxy.TypedEpoxyController
|
||||
import im.vector.app.core.epoxy.dividerItem
|
||||
|
||||
/**
|
||||
* Epoxy controller for generic bottom sheet actions
|
||||
*/
|
||||
abstract class BottomSheetGenericController<State : BottomSheetGenericState, Action : BottomSheetGenericAction>
|
||||
: TypedEpoxyController<State>() {
|
||||
|
||||
var listener: Listener<Action>? = null
|
||||
|
||||
abstract fun getTitle(): String?
|
||||
|
||||
open fun getSubTitle(): String? = null
|
||||
|
||||
abstract fun getActions(state: State): List<Action>
|
||||
|
||||
override fun buildModels(state: State?) {
|
||||
state ?: return
|
||||
// Title
|
||||
getTitle()?.let { title ->
|
||||
bottomSheetTitleItem {
|
||||
id("title")
|
||||
title(title)
|
||||
subTitle(getSubTitle())
|
||||
}
|
||||
|
||||
dividerItem {
|
||||
id("title_separator")
|
||||
}
|
||||
}
|
||||
// Actions
|
||||
val actions = getActions(state)
|
||||
val showIcons = actions.any { it.iconResId > 0 }
|
||||
actions.forEach { action ->
|
||||
action.toBottomSheetItem()
|
||||
.showIcon(showIcons)
|
||||
.listener(View.OnClickListener { listener?.didSelectAction(action) })
|
||||
.addTo(this)
|
||||
}
|
||||
}
|
||||
|
||||
interface Listener<Action> {
|
||||
fun didSelectAction(action: Action)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.core.ui.bottomsheet
|
||||
|
||||
import im.vector.app.core.platform.VectorSharedAction
|
||||
import im.vector.app.core.platform.VectorSharedActionViewModel
|
||||
|
||||
/**
|
||||
* Activity shared view model to handle bottom sheet quick actions
|
||||
*/
|
||||
abstract class BottomSheetGenericSharedActionViewModel<Action : VectorSharedAction> : VectorSharedActionViewModel<Action>()
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.core.ui.bottomsheet
|
||||
|
||||
import com.airbnb.mvrx.MvRxState
|
||||
|
||||
abstract class BottomSheetGenericState : MvRxState
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.core.ui.bottomsheet
|
||||
|
||||
import android.widget.TextView
|
||||
import com.airbnb.epoxy.EpoxyAttribute
|
||||
import com.airbnb.epoxy.EpoxyModelClass
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.epoxy.VectorEpoxyHolder
|
||||
import im.vector.app.core.epoxy.VectorEpoxyModel
|
||||
import im.vector.app.core.extensions.setTextOrHide
|
||||
|
||||
/**
|
||||
* A title for bottom sheet, with an optional subtitle. It does not include the bottom separator.
|
||||
*/
|
||||
@EpoxyModelClass(layout = R.layout.item_bottom_sheet_title)
|
||||
abstract class BottomSheetTitleItem : VectorEpoxyModel<BottomSheetTitleItem.Holder>() {
|
||||
|
||||
@EpoxyAttribute
|
||||
lateinit var title: String
|
||||
|
||||
@EpoxyAttribute
|
||||
var subTitle: String? = null
|
||||
|
||||
override fun bind(holder: Holder) {
|
||||
super.bind(holder)
|
||||
holder.title.text = title
|
||||
holder.subtitle.setTextOrHide(subTitle)
|
||||
}
|
||||
|
||||
class Holder : VectorEpoxyHolder() {
|
||||
val title by bind<TextView>(R.id.itemBottomSheetTitleTitle)
|
||||
val subtitle by bind<TextView>(R.id.itemBottomSheetTitleSubtitle)
|
||||
}
|
||||
}
|
|
@ -260,13 +260,13 @@ class NoticeEventFormatter @Inject constructor(
|
|||
private fun formatRoomHistoryVisibilityEvent(event: Event, senderName: String?, rs: RoomSummary?): CharSequence? {
|
||||
val historyVisibility = event.getClearContent().toModel<RoomHistoryVisibilityContent>()?.historyVisibility ?: return null
|
||||
|
||||
val formattedVisibility = roomHistoryVisibilityFormatter.format(historyVisibility)
|
||||
val historyVisibilitySuffix = roomHistoryVisibilityFormatter.getNoticeSuffix(historyVisibility)
|
||||
return if (event.isSentByCurrentUser()) {
|
||||
sp.getString(if (rs.isDm()) R.string.notice_made_future_direct_room_visibility_by_you else R.string.notice_made_future_room_visibility_by_you,
|
||||
formattedVisibility)
|
||||
historyVisibilitySuffix)
|
||||
} else {
|
||||
sp.getString(if (rs.isDm()) R.string.notice_made_future_direct_room_visibility else R.string.notice_made_future_room_visibility,
|
||||
senderName, formattedVisibility)
|
||||
senderName, historyVisibilitySuffix)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,13 +24,21 @@ import javax.inject.Inject
|
|||
class RoomHistoryVisibilityFormatter @Inject constructor(
|
||||
private val stringProvider: StringProvider
|
||||
) {
|
||||
fun getNoticeSuffix(roomHistoryVisibility: RoomHistoryVisibility): String {
|
||||
return stringProvider.getString(when (roomHistoryVisibility) {
|
||||
RoomHistoryVisibility.WORLD_READABLE -> R.string.notice_room_visibility_world_readable
|
||||
RoomHistoryVisibility.SHARED -> R.string.notice_room_visibility_shared
|
||||
RoomHistoryVisibility.INVITED -> R.string.notice_room_visibility_invited
|
||||
RoomHistoryVisibility.JOINED -> R.string.notice_room_visibility_joined
|
||||
})
|
||||
}
|
||||
|
||||
fun format(roomHistoryVisibility: RoomHistoryVisibility): String {
|
||||
return when (roomHistoryVisibility) {
|
||||
RoomHistoryVisibility.SHARED -> stringProvider.getString(R.string.notice_room_visibility_shared)
|
||||
RoomHistoryVisibility.INVITED -> stringProvider.getString(R.string.notice_room_visibility_invited)
|
||||
RoomHistoryVisibility.JOINED -> stringProvider.getString(R.string.notice_room_visibility_joined)
|
||||
RoomHistoryVisibility.WORLD_READABLE -> stringProvider.getString(R.string.notice_room_visibility_world_readable)
|
||||
}
|
||||
fun getSetting(roomHistoryVisibility: RoomHistoryVisibility): String {
|
||||
return stringProvider.getString(when (roomHistoryVisibility) {
|
||||
RoomHistoryVisibility.WORLD_READABLE -> R.string.room_settings_read_history_entry_anyone
|
||||
RoomHistoryVisibility.SHARED -> R.string.room_settings_read_history_entry_members_only_option_time_shared
|
||||
RoomHistoryVisibility.INVITED -> R.string.room_settings_read_history_entry_members_only_invited
|
||||
RoomHistoryVisibility.JOINED -> R.string.room_settings_read_history_entry_members_only_joined
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,13 +17,17 @@
|
|||
package im.vector.app.features.roomprofile.settings
|
||||
|
||||
import im.vector.app.core.platform.VectorViewModelAction
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
|
||||
sealed class RoomSettingsAction : VectorViewModelAction {
|
||||
data class SetAvatarAction(val avatarAction: RoomSettingsViewState.AvatarAction) : RoomSettingsAction()
|
||||
data class SetRoomName(val newName: String) : RoomSettingsAction()
|
||||
data class SetRoomTopic(val newTopic: String) : RoomSettingsAction()
|
||||
data class SetRoomHistoryVisibility(val visibility: RoomHistoryVisibility) : RoomSettingsAction()
|
||||
data class SetRoomJoinRule(val roomJoinRule: RoomJoinRules?, val roomGuestAccess: GuestAccess?) : RoomSettingsAction()
|
||||
|
||||
object Save : RoomSettingsAction()
|
||||
object Cancel : RoomSettingsAction()
|
||||
}
|
||||
|
|
|
@ -26,9 +26,8 @@ import im.vector.app.features.form.formEditTextItem
|
|||
import im.vector.app.features.form.formEditableAvatarItem
|
||||
import im.vector.app.features.home.AvatarRenderer
|
||||
import im.vector.app.features.home.room.detail.timeline.format.RoomHistoryVisibilityFormatter
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||
import javax.inject.Inject
|
||||
|
||||
|
@ -47,6 +46,7 @@ class RoomSettingsController @Inject constructor(
|
|||
fun onTopicChanged(topic: String)
|
||||
fun onHistoryVisibilityClicked()
|
||||
fun onRoomAliasesClicked()
|
||||
fun onJoinRuleClicked()
|
||||
}
|
||||
|
||||
private val dividerColor = colorProvider.getColorFromAttribute(R.attr.vctr_list_divider_color)
|
||||
|
@ -60,9 +60,6 @@ class RoomSettingsController @Inject constructor(
|
|||
override fun buildModels(data: RoomSettingsViewState?) {
|
||||
val roomSummary = data?.roomSummary?.invoke() ?: return
|
||||
|
||||
val historyVisibility = data.historyVisibilityEvent?.let { formatRoomHistoryVisibilityEvent(it) } ?: ""
|
||||
val newHistoryVisibility = data.newHistoryVisibility?.let { roomHistoryVisibilityFormatter.format(it) }
|
||||
|
||||
formEditableAvatarItem {
|
||||
id("avatar")
|
||||
enabled(data.actionPermissions.canChangeAvatar)
|
||||
|
@ -121,16 +118,35 @@ class RoomSettingsController @Inject constructor(
|
|||
buildProfileAction(
|
||||
id = "historyReadability",
|
||||
title = stringProvider.getString(R.string.room_settings_room_read_history_rules_pref_title),
|
||||
subtitle = newHistoryVisibility ?: historyVisibility,
|
||||
subtitle = roomHistoryVisibilityFormatter.getSetting(data.newHistoryVisibility ?: data.currentHistoryVisibility),
|
||||
dividerColor = dividerColor,
|
||||
divider = true,
|
||||
editable = data.actionPermissions.canChangeHistoryVisibility,
|
||||
action = { if (data.actionPermissions.canChangeHistoryVisibility) callback?.onHistoryVisibilityClicked() }
|
||||
)
|
||||
|
||||
buildProfileAction(
|
||||
id = "joinRule",
|
||||
title = stringProvider.getString(R.string.room_settings_room_access_title),
|
||||
subtitle = data.getJoinRuleWording(),
|
||||
dividerColor = dividerColor,
|
||||
divider = false,
|
||||
editable = data.actionPermissions.canChangeHistoryReadability,
|
||||
action = { if (data.actionPermissions.canChangeHistoryReadability) callback?.onHistoryVisibilityClicked() }
|
||||
editable = data.actionPermissions.canChangeJoinRule,
|
||||
action = { if (data.actionPermissions.canChangeJoinRule) callback?.onJoinRuleClicked() }
|
||||
)
|
||||
}
|
||||
|
||||
private fun formatRoomHistoryVisibilityEvent(event: Event): String? {
|
||||
val historyVisibility = event.getClearContent().toModel<RoomHistoryVisibilityContent>()?.historyVisibility ?: return null
|
||||
return roomHistoryVisibilityFormatter.format(historyVisibility)
|
||||
private fun RoomSettingsViewState.getJoinRuleWording(): String {
|
||||
val joinRule = newRoomJoinRules.newJoinRules ?: currentRoomJoinRules
|
||||
val guestAccess = newRoomJoinRules.newGuestAccess ?: currentGuestAccess
|
||||
return stringProvider.getString(if (joinRule == RoomJoinRules.INVITE) {
|
||||
R.string.room_settings_room_access_entry_only_invited
|
||||
} else {
|
||||
if (guestAccess == GuestAccess.CanJoin) {
|
||||
R.string.room_settings_room_access_entry_anyone_with_link_including_guest
|
||||
} else {
|
||||
R.string.room_settings_room_access_entry_anyone_with_link_apart_guest
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,15 +37,15 @@ import im.vector.app.core.platform.VectorBaseFragment
|
|||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.utils.toast
|
||||
import im.vector.app.features.home.AvatarRenderer
|
||||
import im.vector.app.features.home.room.detail.timeline.format.RoomHistoryVisibilityFormatter
|
||||
import im.vector.app.features.roomprofile.RoomProfileArgs
|
||||
import im.vector.app.features.roomprofile.RoomProfileSharedAction
|
||||
import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.settings.historyvisibility.RoomHistoryVisibilitySharedActionViewModel
|
||||
import im.vector.app.features.roomprofile.settings.historyvisibility.RoomHistoryVisibilityBottomSheet
|
||||
import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleBottomSheet
|
||||
import im.vector.app.features.roomprofile.settings.joinrule.RoomJoinRuleSharedActionViewModel
|
||||
import kotlinx.android.synthetic.main.fragment_room_setting_generic.*
|
||||
import kotlinx.android.synthetic.main.merge_overlay_waiting_view.*
|
||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
|
||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||
import java.util.UUID
|
||||
import javax.inject.Inject
|
||||
|
@ -53,7 +53,6 @@ import javax.inject.Inject
|
|||
class RoomSettingsFragment @Inject constructor(
|
||||
val viewModelFactory: RoomSettingsViewModel.Factory,
|
||||
private val controller: RoomSettingsController,
|
||||
private val roomHistoryVisibilityFormatter: RoomHistoryVisibilityFormatter,
|
||||
colorProvider: ColorProvider,
|
||||
private val avatarRenderer: AvatarRenderer
|
||||
) :
|
||||
|
@ -64,6 +63,9 @@ class RoomSettingsFragment @Inject constructor(
|
|||
|
||||
private val viewModel: RoomSettingsViewModel by fragmentViewModel()
|
||||
private lateinit var roomProfileSharedActionViewModel: RoomProfileSharedActionViewModel
|
||||
private lateinit var roomHistoryVisibilitySharedActionViewModel: RoomHistoryVisibilitySharedActionViewModel
|
||||
private lateinit var roomJoinRuleSharedActionViewModel: RoomJoinRuleSharedActionViewModel
|
||||
|
||||
private val roomProfileArgs: RoomProfileArgs by args()
|
||||
private val galleryOrCameraDialogHelper = GalleryOrCameraDialogHelper(this, colorProvider)
|
||||
|
||||
|
@ -74,6 +76,8 @@ class RoomSettingsFragment @Inject constructor(
|
|||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
roomProfileSharedActionViewModel = activityViewModelProvider.get(RoomProfileSharedActionViewModel::class.java)
|
||||
setupRoomHistoryVisibilitySharedActionViewModel()
|
||||
setupRoomJoinRuleSharedActionViewModel()
|
||||
controller.callback = this
|
||||
setupToolbar(roomSettingsToolbar)
|
||||
roomSettingsRecyclerView.configureWith(controller, hasFixedSize = true)
|
||||
|
@ -92,6 +96,26 @@ class RoomSettingsFragment @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private fun setupRoomJoinRuleSharedActionViewModel() {
|
||||
roomJoinRuleSharedActionViewModel = activityViewModelProvider.get(RoomJoinRuleSharedActionViewModel::class.java)
|
||||
roomJoinRuleSharedActionViewModel
|
||||
.observe()
|
||||
.subscribe { action ->
|
||||
viewModel.handle(RoomSettingsAction.SetRoomJoinRule(action.roomJoinRule, action.roomGuestAccess))
|
||||
}
|
||||
.disposeOnDestroyView()
|
||||
}
|
||||
|
||||
private fun setupRoomHistoryVisibilitySharedActionViewModel() {
|
||||
roomHistoryVisibilitySharedActionViewModel = activityViewModelProvider.get(RoomHistoryVisibilitySharedActionViewModel::class.java)
|
||||
roomHistoryVisibilitySharedActionViewModel
|
||||
.observe()
|
||||
.subscribe { action ->
|
||||
viewModel.handle(RoomSettingsAction.SetRoomHistoryVisibility(action.roomHistoryVisibility))
|
||||
}
|
||||
.disposeOnDestroyView()
|
||||
}
|
||||
|
||||
private fun showSuccess() {
|
||||
activity?.toast(R.string.room_settings_save_success)
|
||||
}
|
||||
|
@ -141,37 +165,22 @@ class RoomSettingsFragment @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onHistoryVisibilityClicked() = withState(viewModel) { state ->
|
||||
val historyVisibilities = arrayOf(
|
||||
RoomHistoryVisibility.SHARED,
|
||||
RoomHistoryVisibility.INVITED,
|
||||
RoomHistoryVisibility.JOINED,
|
||||
RoomHistoryVisibility.WORLD_READABLE
|
||||
)
|
||||
val currentHistoryVisibility =
|
||||
state.newHistoryVisibility ?: state.historyVisibilityEvent?.getClearContent().toModel<RoomHistoryVisibilityContent>()?.historyVisibility
|
||||
val currentHistoryVisibilityIndex = historyVisibilities.indexOf(currentHistoryVisibility)
|
||||
|
||||
AlertDialog.Builder(requireContext()).apply {
|
||||
setTitle(R.string.room_settings_room_read_history_rules_pref_title)
|
||||
setSingleChoiceItems(
|
||||
historyVisibilities
|
||||
.map { roomHistoryVisibilityFormatter.format(it) }
|
||||
.toTypedArray(),
|
||||
currentHistoryVisibilityIndex) { dialog, which ->
|
||||
if (which != currentHistoryVisibilityIndex) {
|
||||
viewModel.handle(RoomSettingsAction.SetRoomHistoryVisibility(historyVisibilities[which]))
|
||||
}
|
||||
dialog.cancel()
|
||||
}
|
||||
show()
|
||||
}
|
||||
return@withState
|
||||
val currentHistoryVisibility = state.newHistoryVisibility ?: state.currentHistoryVisibility
|
||||
RoomHistoryVisibilityBottomSheet.newInstance(currentHistoryVisibility)
|
||||
.show(childFragmentManager, "RoomHistoryVisibilityBottomSheet")
|
||||
}
|
||||
|
||||
override fun onRoomAliasesClicked() {
|
||||
roomProfileSharedActionViewModel.post(RoomProfileSharedAction.OpenRoomAliasesSettings)
|
||||
}
|
||||
|
||||
override fun onJoinRuleClicked() = withState(viewModel) { state ->
|
||||
val currentJoinRule = state.newRoomJoinRules.newJoinRules ?: state.currentRoomJoinRules
|
||||
val currentGuestAccess = state.newRoomJoinRules.newGuestAccess ?: state.currentGuestAccess
|
||||
RoomJoinRuleBottomSheet.newInstance(currentJoinRule, currentGuestAccess)
|
||||
.show(childFragmentManager, "RoomJoinRuleBottomSheet")
|
||||
}
|
||||
|
||||
override fun onImageReady(uri: Uri?) {
|
||||
uri ?: return
|
||||
viewModel.handle(
|
||||
|
@ -186,10 +195,10 @@ class RoomSettingsFragment @Inject constructor(
|
|||
override fun onAvatarDelete() {
|
||||
withState(viewModel) {
|
||||
when (it.avatarAction) {
|
||||
RoomSettingsViewState.AvatarAction.None -> {
|
||||
RoomSettingsViewState.AvatarAction.None -> {
|
||||
viewModel.handle(RoomSettingsAction.SetAvatarAction(RoomSettingsViewState.AvatarAction.DeleteAvatar))
|
||||
}
|
||||
RoomSettingsViewState.AvatarAction.DeleteAvatar -> {
|
||||
RoomSettingsViewState.AvatarAction.DeleteAvatar -> {
|
||||
/* Should not happen */
|
||||
Unit
|
||||
}
|
||||
|
|
|
@ -33,6 +33,9 @@ import org.matrix.android.sdk.api.session.Session
|
|||
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomAvatarContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
|
||||
import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper
|
||||
import org.matrix.android.sdk.rx.mapOptional
|
||||
import org.matrix.android.sdk.rx.rx
|
||||
|
@ -60,6 +63,9 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
|
||||
init {
|
||||
observeRoomSummary()
|
||||
observeRoomHistoryVisibility()
|
||||
observeJoinRule()
|
||||
observeGuestAccess()
|
||||
observeRoomAvatar()
|
||||
observeState()
|
||||
}
|
||||
|
@ -70,10 +76,12 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
RoomSettingsViewState::newName,
|
||||
RoomSettingsViewState::newTopic,
|
||||
RoomSettingsViewState::newHistoryVisibility,
|
||||
RoomSettingsViewState::newRoomJoinRules,
|
||||
RoomSettingsViewState::roomSummary) { avatarAction,
|
||||
newName,
|
||||
newTopic,
|
||||
newHistoryVisibility,
|
||||
newJoinRule,
|
||||
asyncSummary ->
|
||||
val summary = asyncSummary()
|
||||
setState {
|
||||
|
@ -81,7 +89,8 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
showSaveAction = avatarAction !is RoomSettingsViewState.AvatarAction.None
|
||||
|| summary?.name != newName
|
||||
|| summary?.topic != newTopic
|
||||
|| newHistoryVisibility != null
|
||||
|| (newHistoryVisibility != null && newHistoryVisibility != currentHistoryVisibility)
|
||||
|| newJoinRule.hasChanged()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -93,7 +102,6 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
.execute { async ->
|
||||
val roomSummary = async.invoke()
|
||||
copy(
|
||||
historyVisibilityEvent = room.getStateEvent(EventType.STATE_ROOM_HISTORY_VISIBILITY),
|
||||
roomSummary = async,
|
||||
newName = roomSummary?.name,
|
||||
newTopic = roomSummary?.topic
|
||||
|
@ -109,14 +117,57 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
canChangeAvatar = powerLevelsHelper.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_AVATAR),
|
||||
canChangeName = powerLevelsHelper.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_NAME),
|
||||
canChangeTopic = powerLevelsHelper.isUserAllowedToSend(session.myUserId, true, EventType.STATE_ROOM_TOPIC),
|
||||
canChangeHistoryReadability = powerLevelsHelper.isUserAllowedToSend(session.myUserId, true,
|
||||
EventType.STATE_ROOM_HISTORY_VISIBILITY)
|
||||
canChangeHistoryVisibility = powerLevelsHelper.isUserAllowedToSend(session.myUserId, true,
|
||||
EventType.STATE_ROOM_HISTORY_VISIBILITY),
|
||||
canChangeJoinRule = powerLevelsHelper.isUserAllowedToSend(session.myUserId, true,
|
||||
EventType.STATE_ROOM_JOIN_RULES)
|
||||
&& powerLevelsHelper.isUserAllowedToSend(session.myUserId, true,
|
||||
EventType.STATE_ROOM_GUEST_ACCESS)
|
||||
)
|
||||
setState { copy(actionPermissions = permissions) }
|
||||
}
|
||||
.disposeOnClear()
|
||||
}
|
||||
|
||||
private fun observeRoomHistoryVisibility() {
|
||||
room.rx()
|
||||
.liveStateEvent(EventType.STATE_ROOM_HISTORY_VISIBILITY, QueryStringValue.NoCondition)
|
||||
.mapOptional { it.content.toModel<RoomHistoryVisibilityContent>() }
|
||||
.unwrap()
|
||||
.subscribe {
|
||||
it.historyVisibility?.let {
|
||||
setState { copy(currentHistoryVisibility = it) }
|
||||
}
|
||||
}
|
||||
.disposeOnClear()
|
||||
}
|
||||
|
||||
private fun observeGuestAccess() {
|
||||
room.rx()
|
||||
.liveStateEvent(EventType.STATE_ROOM_JOIN_RULES, QueryStringValue.NoCondition)
|
||||
.mapOptional { it.content.toModel<RoomJoinRulesContent>() }
|
||||
.unwrap()
|
||||
.subscribe {
|
||||
it.joinRules?.let {
|
||||
setState { copy(currentRoomJoinRules = it) }
|
||||
}
|
||||
}
|
||||
.disposeOnClear()
|
||||
}
|
||||
|
||||
private fun observeJoinRule() {
|
||||
room.rx()
|
||||
.liveStateEvent(EventType.STATE_ROOM_GUEST_ACCESS, QueryStringValue.NoCondition)
|
||||
.mapOptional { it.content.toModel<RoomGuestAccessContent>() }
|
||||
.unwrap()
|
||||
.subscribe {
|
||||
it.guestAccess?.let {
|
||||
setState { copy(currentGuestAccess = it) }
|
||||
}
|
||||
}
|
||||
.disposeOnClear()
|
||||
}
|
||||
|
||||
/**
|
||||
* We do not want to use the fallback avatar url, which can be the other user avatar, or the current user avatar.
|
||||
*/
|
||||
|
@ -137,11 +188,21 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
is RoomSettingsAction.SetRoomName -> setState { copy(newName = action.newName) }
|
||||
is RoomSettingsAction.SetRoomTopic -> setState { copy(newTopic = action.newTopic) }
|
||||
is RoomSettingsAction.SetRoomHistoryVisibility -> setState { copy(newHistoryVisibility = action.visibility) }
|
||||
is RoomSettingsAction.SetRoomJoinRule -> handleSetRoomJoinRule(action)
|
||||
is RoomSettingsAction.Save -> saveSettings()
|
||||
is RoomSettingsAction.Cancel -> cancel()
|
||||
}.exhaustive
|
||||
}
|
||||
|
||||
private fun handleSetRoomJoinRule(action: RoomSettingsAction.SetRoomJoinRule) = withState { state ->
|
||||
setState {
|
||||
copy(newRoomJoinRules = RoomSettingsViewState.NewJoinRule(
|
||||
action.roomJoinRule.takeIf { it != state.currentRoomJoinRules },
|
||||
action.roomGuestAccess.takeIf { it != state.currentGuestAccess }
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleSetAvatarAction(action: RoomSettingsAction.SetAvatarAction) {
|
||||
setState {
|
||||
deletePendingAvatar(this)
|
||||
|
@ -188,6 +249,10 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
operationList.add(room.rx().updateHistoryReadability(state.newHistoryVisibility))
|
||||
}
|
||||
|
||||
if (state.newRoomJoinRules.hasChanged()) {
|
||||
operationList.add(room.rx().updateJoinRule(state.newRoomJoinRules.newJoinRules, state.newRoomJoinRules.newGuestAccess))
|
||||
}
|
||||
|
||||
Observable
|
||||
.fromIterable(operationList)
|
||||
.concatMapCompletable { it }
|
||||
|
@ -198,7 +263,8 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
|
|||
deletePendingAvatar(this)
|
||||
copy(
|
||||
avatarAction = RoomSettingsViewState.AvatarAction.None,
|
||||
newHistoryVisibility = null
|
||||
newHistoryVisibility = null,
|
||||
newRoomJoinRules = RoomSettingsViewState.NewJoinRule()
|
||||
)
|
||||
}
|
||||
_viewEvents.post(RoomSettingsViewEvents.Success)
|
||||
|
|
|
@ -21,13 +21,17 @@ import com.airbnb.mvrx.Async
|
|||
import com.airbnb.mvrx.MvRxState
|
||||
import com.airbnb.mvrx.Uninitialized
|
||||
import im.vector.app.features.roomprofile.RoomProfileArgs
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
|
||||
data class RoomSettingsViewState(
|
||||
val roomId: String,
|
||||
val historyVisibilityEvent: Event? = null,
|
||||
// Default value: https://matrix.org/docs/spec/client_server/r0.6.1#id88
|
||||
val currentHistoryVisibility: RoomHistoryVisibility = RoomHistoryVisibility.SHARED,
|
||||
val currentRoomJoinRules: RoomJoinRules = RoomJoinRules.INVITE,
|
||||
val currentGuestAccess: GuestAccess? = null,
|
||||
val roomSummary: Async<RoomSummary> = Uninitialized,
|
||||
val isLoading: Boolean = false,
|
||||
val currentRoomAvatarUrl: String? = null,
|
||||
|
@ -35,6 +39,7 @@ data class RoomSettingsViewState(
|
|||
val newName: String? = null,
|
||||
val newTopic: String? = null,
|
||||
val newHistoryVisibility: RoomHistoryVisibility? = null,
|
||||
val newRoomJoinRules: NewJoinRule = NewJoinRule(),
|
||||
val showSaveAction: Boolean = false,
|
||||
val actionPermissions: ActionPermissions = ActionPermissions()
|
||||
) : MvRxState {
|
||||
|
@ -45,7 +50,8 @@ data class RoomSettingsViewState(
|
|||
val canChangeAvatar: Boolean = false,
|
||||
val canChangeName: Boolean = false,
|
||||
val canChangeTopic: Boolean = false,
|
||||
val canChangeHistoryReadability: Boolean = false
|
||||
val canChangeHistoryVisibility: Boolean = false,
|
||||
val canChangeJoinRule: Boolean = false
|
||||
)
|
||||
|
||||
sealed class AvatarAction {
|
||||
|
@ -54,4 +60,11 @@ data class RoomSettingsViewState(
|
|||
data class UpdateAvatar(val newAvatarUri: Uri,
|
||||
val newAvatarFileName: String) : AvatarAction()
|
||||
}
|
||||
|
||||
data class NewJoinRule(
|
||||
val newJoinRules: RoomJoinRules? = null,
|
||||
val newGuestAccess: GuestAccess? = null
|
||||
) {
|
||||
fun hasChanged() = newJoinRules != null || newGuestAccess != null
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.historyvisibility
|
||||
|
||||
import androidx.annotation.DrawableRes
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericAction
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
|
||||
class RoomHistoryVisibilityAction(
|
||||
val roomHistoryVisibility: RoomHistoryVisibility,
|
||||
title: String,
|
||||
@DrawableRes iconResId: Int,
|
||||
isSelected: Boolean
|
||||
) : BottomSheetGenericAction(
|
||||
title = title,
|
||||
iconResId = iconResId,
|
||||
isSelected = isSelected,
|
||||
destructive = false
|
||||
)
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.historyvisibility
|
||||
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.view.View
|
||||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGeneric
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericController
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import javax.inject.Inject
|
||||
|
||||
@Parcelize
|
||||
data class RoomHistoryVisibilityBottomSheetArgs(
|
||||
val currentRoomHistoryVisibility: RoomHistoryVisibility
|
||||
) : Parcelable
|
||||
|
||||
class RoomHistoryVisibilityBottomSheet : BottomSheetGeneric<RoomHistoryVisibilityState, RoomHistoryVisibilityAction>() {
|
||||
|
||||
private lateinit var roomHistoryVisibilitySharedActionViewModel: RoomHistoryVisibilitySharedActionViewModel
|
||||
@Inject lateinit var controller: RoomHistoryVisibilityController
|
||||
@Inject lateinit var roomHistoryVisibilityViewModelFactory: RoomHistoryVisibilityViewModel.Factory
|
||||
private val viewModel: RoomHistoryVisibilityViewModel by fragmentViewModel(RoomHistoryVisibilityViewModel::class)
|
||||
|
||||
override fun injectWith(injector: ScreenComponent) {
|
||||
injector.inject(this)
|
||||
}
|
||||
|
||||
override fun getController(): BottomSheetGenericController<RoomHistoryVisibilityState, RoomHistoryVisibilityAction> = controller
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
roomHistoryVisibilitySharedActionViewModel = activityViewModelProvider.get(RoomHistoryVisibilitySharedActionViewModel::class.java)
|
||||
}
|
||||
|
||||
override fun didSelectAction(action: RoomHistoryVisibilityAction) {
|
||||
roomHistoryVisibilitySharedActionViewModel.post(action)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
override fun invalidate() = withState(viewModel) {
|
||||
controller.setData(it)
|
||||
super.invalidate()
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance(currentRoomHistoryVisibility: RoomHistoryVisibility): RoomHistoryVisibilityBottomSheet {
|
||||
return RoomHistoryVisibilityBottomSheet().apply {
|
||||
setArguments(RoomHistoryVisibilityBottomSheetArgs(currentRoomHistoryVisibility))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.historyvisibility
|
||||
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericController
|
||||
import im.vector.app.features.home.room.detail.timeline.format.RoomHistoryVisibilityFormatter
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomHistoryVisibilityController @Inject constructor(
|
||||
private val historyVisibilityFormatter: RoomHistoryVisibilityFormatter,
|
||||
private val stringProvider: StringProvider
|
||||
) : BottomSheetGenericController<RoomHistoryVisibilityState, RoomHistoryVisibilityAction>() {
|
||||
|
||||
override fun getTitle() = stringProvider.getString(R.string.room_settings_room_read_history_rules_pref_dialog_title)
|
||||
|
||||
override fun getSubTitle() = stringProvider.getString(R.string.room_settings_room_read_history_dialog_subtitle)
|
||||
|
||||
override fun getActions(state: RoomHistoryVisibilityState): List<RoomHistoryVisibilityAction> {
|
||||
return listOf(
|
||||
RoomHistoryVisibility.WORLD_READABLE,
|
||||
RoomHistoryVisibility.SHARED,
|
||||
RoomHistoryVisibility.INVITED,
|
||||
RoomHistoryVisibility.JOINED
|
||||
)
|
||||
.map { roomHistoryVisibility ->
|
||||
RoomHistoryVisibilityAction(
|
||||
roomHistoryVisibility = roomHistoryVisibility,
|
||||
title = historyVisibilityFormatter.getSetting(roomHistoryVisibility),
|
||||
iconResId = 0,
|
||||
isSelected = roomHistoryVisibility == state.currentRoomHistoryVisibility
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Copyright 2019 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.roomprofile.settings.historyvisibility
|
||||
|
||||
import im.vector.app.core.platform.VectorSharedActionViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomHistoryVisibilitySharedActionViewModel @Inject constructor()
|
||||
: VectorSharedActionViewModel<RoomHistoryVisibilityAction>()
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.historyvisibility
|
||||
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericState
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
|
||||
data class RoomHistoryVisibilityState(
|
||||
val currentRoomHistoryVisibility: RoomHistoryVisibility = RoomHistoryVisibility.SHARED
|
||||
) : BottomSheetGenericState() {
|
||||
|
||||
constructor(args: RoomHistoryVisibilityBottomSheetArgs) : this(currentRoomHistoryVisibility = args.currentRoomHistoryVisibility)
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.historyvisibility
|
||||
|
||||
import com.airbnb.mvrx.FragmentViewModelContext
|
||||
import com.airbnb.mvrx.MvRxViewModelFactory
|
||||
import com.airbnb.mvrx.ViewModelContext
|
||||
import com.squareup.inject.assisted.Assisted
|
||||
import com.squareup.inject.assisted.AssistedInject
|
||||
import im.vector.app.core.platform.EmptyAction
|
||||
import im.vector.app.core.platform.EmptyViewEvents
|
||||
import im.vector.app.core.platform.VectorViewModel
|
||||
|
||||
class RoomHistoryVisibilityViewModel @AssistedInject constructor(@Assisted initialState: RoomHistoryVisibilityState)
|
||||
: VectorViewModel<RoomHistoryVisibilityState, EmptyAction, EmptyViewEvents>(initialState) {
|
||||
|
||||
@AssistedInject.Factory
|
||||
interface Factory {
|
||||
fun create(initialState: RoomHistoryVisibilityState): RoomHistoryVisibilityViewModel
|
||||
}
|
||||
|
||||
companion object : MvRxViewModelFactory<RoomHistoryVisibilityViewModel, RoomHistoryVisibilityState> {
|
||||
@JvmStatic
|
||||
override fun create(viewModelContext: ViewModelContext, state: RoomHistoryVisibilityState): RoomHistoryVisibilityViewModel? {
|
||||
val fragment: RoomHistoryVisibilityBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
|
||||
return fragment.roomHistoryVisibilityViewModelFactory.create(state)
|
||||
}
|
||||
}
|
||||
|
||||
override fun handle(action: EmptyAction) {
|
||||
// No op
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.joinrule
|
||||
|
||||
import androidx.annotation.DrawableRes
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericAction
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
|
||||
class RoomJoinRuleAction(
|
||||
val roomJoinRule: RoomJoinRules,
|
||||
val roomGuestAccess: GuestAccess?,
|
||||
title: String,
|
||||
@DrawableRes iconResId: Int,
|
||||
isSelected: Boolean
|
||||
) : BottomSheetGenericAction(
|
||||
title = title,
|
||||
iconResId = iconResId,
|
||||
isSelected = isSelected,
|
||||
destructive = false
|
||||
)
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.joinrule
|
||||
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.view.View
|
||||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import im.vector.app.core.di.ScreenComponent
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGeneric
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericController
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
import javax.inject.Inject
|
||||
|
||||
@Parcelize
|
||||
data class RoomJoinRuleBottomSheetArgs(
|
||||
val currentRoomJoinRule: RoomJoinRules,
|
||||
val currentGuestAccess: GuestAccess?
|
||||
) : Parcelable
|
||||
|
||||
class RoomJoinRuleBottomSheet : BottomSheetGeneric<RoomJoinRuleState, RoomJoinRuleAction>() {
|
||||
|
||||
private lateinit var roomJoinRuleSharedActionViewModel: RoomJoinRuleSharedActionViewModel
|
||||
@Inject lateinit var controller: RoomJoinRuleController
|
||||
@Inject lateinit var roomJoinRuleViewModelFactory: RoomJoinRuleViewModel.Factory
|
||||
private val viewModel: RoomJoinRuleViewModel by fragmentViewModel(RoomJoinRuleViewModel::class)
|
||||
|
||||
override fun injectWith(injector: ScreenComponent) {
|
||||
injector.inject(this)
|
||||
}
|
||||
|
||||
override fun getController(): BottomSheetGenericController<RoomJoinRuleState, RoomJoinRuleAction> = controller
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
roomJoinRuleSharedActionViewModel = activityViewModelProvider.get(RoomJoinRuleSharedActionViewModel::class.java)
|
||||
}
|
||||
|
||||
override fun didSelectAction(action: RoomJoinRuleAction) {
|
||||
roomJoinRuleSharedActionViewModel.post(action)
|
||||
dismiss()
|
||||
}
|
||||
|
||||
override fun invalidate() = withState(viewModel) {
|
||||
controller.setData(it)
|
||||
super.invalidate()
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance(currentRoomJoinRule: RoomJoinRules, currentGuestAccess: GuestAccess?): RoomJoinRuleBottomSheet {
|
||||
return RoomJoinRuleBottomSheet().apply {
|
||||
setArguments(RoomJoinRuleBottomSheetArgs(currentRoomJoinRule, currentGuestAccess))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.joinrule
|
||||
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericController
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomJoinRuleController @Inject constructor(
|
||||
private val stringProvider: StringProvider
|
||||
) : BottomSheetGenericController<RoomJoinRuleState, RoomJoinRuleAction>() {
|
||||
|
||||
override fun getTitle() = stringProvider.getString(R.string.room_settings_room_access_rules_pref_dialog_title)
|
||||
|
||||
override fun getActions(state: RoomJoinRuleState): List<RoomJoinRuleAction> {
|
||||
return listOf(
|
||||
RoomJoinRuleAction(
|
||||
roomJoinRule = RoomJoinRules.INVITE,
|
||||
roomGuestAccess = null,
|
||||
title = stringProvider.getString(R.string.room_settings_room_access_entry_only_invited),
|
||||
iconResId = 0,
|
||||
isSelected = state.currentRoomJoinRule == RoomJoinRules.INVITE
|
||||
),
|
||||
RoomJoinRuleAction(
|
||||
roomJoinRule = RoomJoinRules.PUBLIC,
|
||||
roomGuestAccess = GuestAccess.Forbidden,
|
||||
title = stringProvider.getString(R.string.room_settings_room_access_entry_anyone_with_link_apart_guest),
|
||||
iconResId = 0,
|
||||
isSelected = state.currentRoomJoinRule == RoomJoinRules.PUBLIC && state.currentGuestAccess == GuestAccess.Forbidden
|
||||
),
|
||||
RoomJoinRuleAction(
|
||||
roomJoinRule = RoomJoinRules.PUBLIC,
|
||||
roomGuestAccess = GuestAccess.CanJoin,
|
||||
title = stringProvider.getString(R.string.room_settings_room_access_entry_anyone_with_link_including_guest),
|
||||
iconResId = 0,
|
||||
isSelected = state.currentRoomJoinRule == RoomJoinRules.PUBLIC && state.currentGuestAccess == GuestAccess.CanJoin
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Copyright 2019 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.roomprofile.settings.joinrule
|
||||
|
||||
import im.vector.app.core.platform.VectorSharedActionViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomJoinRuleSharedActionViewModel @Inject constructor()
|
||||
: VectorSharedActionViewModel<RoomJoinRuleAction>()
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.joinrule
|
||||
|
||||
import im.vector.app.core.ui.bottomsheet.BottomSheetGenericState
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
|
||||
|
||||
data class RoomJoinRuleState(
|
||||
val currentRoomJoinRule: RoomJoinRules = RoomJoinRules.INVITE,
|
||||
val currentGuestAccess: GuestAccess? = null
|
||||
) : BottomSheetGenericState() {
|
||||
|
||||
constructor(args: RoomJoinRuleBottomSheetArgs) : this(
|
||||
currentRoomJoinRule = args.currentRoomJoinRule,
|
||||
currentGuestAccess = args.currentGuestAccess
|
||||
)
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (c) 2020 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.roomprofile.settings.joinrule
|
||||
|
||||
import com.airbnb.mvrx.FragmentViewModelContext
|
||||
import com.airbnb.mvrx.MvRxViewModelFactory
|
||||
import com.airbnb.mvrx.ViewModelContext
|
||||
import com.squareup.inject.assisted.Assisted
|
||||
import com.squareup.inject.assisted.AssistedInject
|
||||
import im.vector.app.core.platform.EmptyAction
|
||||
import im.vector.app.core.platform.EmptyViewEvents
|
||||
import im.vector.app.core.platform.VectorViewModel
|
||||
|
||||
class RoomJoinRuleViewModel @AssistedInject constructor(@Assisted initialState: RoomJoinRuleState)
|
||||
: VectorViewModel<RoomJoinRuleState, EmptyAction, EmptyViewEvents>(initialState) {
|
||||
|
||||
@AssistedInject.Factory
|
||||
interface Factory {
|
||||
fun create(initialState: RoomJoinRuleState): RoomJoinRuleViewModel
|
||||
}
|
||||
|
||||
companion object : MvRxViewModelFactory<RoomJoinRuleViewModel, RoomJoinRuleState> {
|
||||
@JvmStatic
|
||||
override fun create(viewModelContext: ViewModelContext, state: RoomJoinRuleState): RoomJoinRuleViewModel? {
|
||||
val fragment: RoomJoinRuleBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
|
||||
return fragment.roomJoinRuleViewModelFactory.create(state)
|
||||
}
|
||||
}
|
||||
|
||||
override fun handle(action: EmptyAction) {
|
||||
// No op
|
||||
}
|
||||
}
|
|
@ -13,6 +13,7 @@
|
|||
android:paddingEnd="@dimen/layout_horizontal_margin"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<!-- Used for sub items -->
|
||||
<Space
|
||||
android:id="@+id/actionStartSpace"
|
||||
android:layout_width="32dp"
|
||||
|
@ -25,37 +26,44 @@
|
|||
|
||||
<ImageView
|
||||
android:id="@+id/actionIcon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_width="26dp"
|
||||
android:layout_height="26dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_toEndOf="@id/actionStartSpace"
|
||||
android:scaleType="center"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/actionTitleContainer"
|
||||
app:layout_constraintStart_toEndOf="@+id/actionStartSpace"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:src="@drawable/ic_room_actions_notifications_all"
|
||||
app:tint="?riotx_text_secondary"
|
||||
tools:ignore="MissingPrefix" />
|
||||
tools:ignore="MissingPrefix"
|
||||
tools:src="@drawable/ic_room_actions_notifications_all" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/actionTitle"
|
||||
android:layout_width="wrap_content"
|
||||
<FrameLayout
|
||||
android:id="@+id/actionTitleContainer"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="40dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:drawablePadding="16dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="2"
|
||||
android:textColor="?riotx_text_secondary"
|
||||
android:textSize="17sp"
|
||||
app:layout_constrainedWidth="true"
|
||||
android:layout_marginEnd="8dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/actionSelected"
|
||||
app:layout_constraintHorizontal_bias="0.0"
|
||||
app:layout_constraintStart_toEndOf="@id/actionStartSpace"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="zbla azjazjaz s sdkqdskdsqk kqsdkdqsk kdqsksqdk" />
|
||||
app:layout_constraintStart_toEndOf="@id/actionIcon"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/actionTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:drawablePadding="16dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="2"
|
||||
android:textColor="?riotx_text_secondary"
|
||||
android:textSize="17sp"
|
||||
tools:drawableEnd="@drawable/ic_material_expand_more_black"
|
||||
tools:drawableTint="?riotx_text_secondary"
|
||||
tools:text="kdqsksqdk" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/actionSelected"
|
||||
|
@ -66,9 +74,8 @@
|
|||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:visibility="visible"
|
||||
app:tint="@color/riotx_accent"
|
||||
tools:ignore="MissingPrefix" />
|
||||
|
||||
tools:ignore="MissingPrefix"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
40
vector/src/main/res/layout/item_bottom_sheet_title.xml
Normal file
40
vector/src/main/res/layout/item_bottom_sheet_title.xml
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="50dp"
|
||||
android:paddingStart="@dimen/layout_horizontal_margin"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="@dimen/layout_horizontal_margin"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/itemBottomSheetTitleTitle"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="?riotx_text_primary"
|
||||
android:textSize="18sp"
|
||||
app:layout_constraintBottom_toTopOf="@+id/itemBottomSheetTitleSubtitle"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="@string/room_settings_room_read_history_rules_pref_dialog_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/itemBottomSheetTitleSubtitle"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:textColor="?riotx_text_primary"
|
||||
android:textSize="15sp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/itemBottomSheetTitleTitle"
|
||||
tools:text="@string/room_settings_room_read_history_dialog_subtitle"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -1022,7 +1022,9 @@
|
|||
<string name="room_settings_room_access_rules_pref_title">Room Access</string>
|
||||
<string name="room_settings_room_read_history_rules_pref_title">Room History Readability</string>
|
||||
<string name="room_settings_room_read_history_rules_pref_dialog_title">Who can read history?</string>
|
||||
<string name="room_settings_room_read_history_dialog_subtitle">Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.</string>
|
||||
<string name="room_settings_room_access_rules_pref_dialog_title">Who can access this room?</string>
|
||||
<string name="room_settings_room_access_title">Room access</string>
|
||||
|
||||
<!-- room settings : alias -->
|
||||
<string name="room_settings_alias_title">Room addresses</string>
|
||||
|
|
Loading…
Add table
Reference in a new issue