diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt index 9e7dc27a..e56762f0 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt @@ -26,6 +26,8 @@ import android.text.Editable import android.text.Spannable import android.view.View import androidx.appcompat.app.AlertDialog +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.airbnb.epoxy.EpoxyVisibilityTracker @@ -51,12 +53,7 @@ import im.vector.riotredesign.core.extensions.observeEvent import im.vector.riotredesign.core.glide.GlideApp import im.vector.riotredesign.core.platform.ToolbarConfigurable import im.vector.riotredesign.core.platform.VectorBaseFragment -import im.vector.riotredesign.core.utils.PERMISSIONS_FOR_TAKING_PHOTO -import im.vector.riotredesign.core.utils.PERMISSION_REQUEST_CODE_LAUNCH_CAMERA -import im.vector.riotredesign.core.utils.PERMISSION_REQUEST_CODE_LAUNCH_NATIVE_CAMERA -import im.vector.riotredesign.core.utils.PERMISSION_REQUEST_CODE_LAUNCH_NATIVE_VIDEO_CAMERA -import im.vector.riotredesign.core.utils.checkPermissions -import im.vector.riotredesign.core.utils.openCamera +import im.vector.riotredesign.core.utils.* import im.vector.riotredesign.features.autocomplete.command.AutocompleteCommandPresenter import im.vector.riotredesign.features.autocomplete.command.CommandAutocompletePolicy import im.vector.riotredesign.features.autocomplete.user.AutocompleteUserPresenter @@ -333,12 +330,15 @@ class RoomDetailFragment : VectorBaseFragment(), TimelineEventController.Callbac private fun renderState(state: RoomDetailViewState) { renderRoomSummary(state) val summary = state.asyncRoomSummary() + val inviter = state.inviter() if (summary?.membership == Membership.JOIN) { timelineEventController.setTimeline(state.timeline) inviteView.visibility = View.GONE - } else if (summary?.membership == Membership.INVITE) { + } else if (summary?.membership == Membership.INVITE && inviter != null) { inviteView.visibility = View.VISIBLE - inviteView.render(summary) + inviteView.render(inviter, VectorInviteView.Mode.LARGE) + } else { + //TODO : close the screen } } diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt index 323daab5..1168b643 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewModel.kt @@ -19,11 +19,13 @@ package im.vector.riotredesign.features.home.room.detail import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import com.airbnb.mvrx.MvRxViewModelFactory +import com.airbnb.mvrx.Success import com.airbnb.mvrx.ViewModelContext import com.jakewharton.rxrelay2.BehaviorRelay import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.content.ContentAttachmentData +import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.message.MessageType import im.vector.matrix.rx.rx import im.vector.riotredesign.core.platform.VectorViewModel @@ -62,6 +64,7 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, init { observeRoomSummary() observeEventDisplayedActions() + observeInvitationState() room.loadRoomMembersIfNeeded() timeline.start() setState { copy(timeline = this@RoomDetailViewModel.timeline) } @@ -240,6 +243,18 @@ class RoomDetailViewModel(initialState: RoomDetailViewState, } } + private fun observeInvitationState() { + asyncSubscribe(RoomDetailViewState::asyncRoomSummary) { summary -> + if (summary.membership == Membership.INVITE) { + summary.lastMessage?.sender?.let { senderId -> + session.getUser(senderId) + }?.also { + setState { copy(inviter = Success(it)) } + } + } + } + } + override fun onCleared() { timeline.dispose() super.onCleared() diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt index 4df1551c..43fbe9bd 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailViewState.kt @@ -22,11 +22,13 @@ import com.airbnb.mvrx.Uninitialized import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.timeline.Timeline import im.vector.matrix.android.api.session.room.timeline.TimelineData +import im.vector.matrix.android.api.session.user.model.User data class RoomDetailViewState( val roomId: String, val eventId: String?, val timeline: Timeline? = null, + val inviter: Async = Uninitialized, val asyncRoomSummary: Async = Uninitialized, val asyncTimelineData: Async = Uninitialized ) : MvRxState { diff --git a/vector/src/main/java/im/vector/riotredesign/features/invite/VectorInviteView.kt b/vector/src/main/java/im/vector/riotredesign/features/invite/VectorInviteView.kt index 7ed3ebb1..5cfddff2 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/invite/VectorInviteView.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/invite/VectorInviteView.kt @@ -21,7 +21,9 @@ import android.graphics.Color import android.util.AttributeSet import android.view.View import androidx.constraintlayout.widget.ConstraintLayout -import im.vector.matrix.android.api.session.room.model.RoomSummary +import androidx.core.view.setPadding +import androidx.core.view.updateLayoutParams +import im.vector.matrix.android.api.session.user.model.User import im.vector.riotredesign.R import im.vector.riotredesign.features.home.AvatarRenderer import kotlinx.android.synthetic.main.vector_invite_view.view.* @@ -34,19 +36,33 @@ class VectorInviteView @JvmOverloads constructor(context: Context, attrs: Attrib fun onRejectInvite() } + enum class Mode { + LARGE, + SMALL + } + var callback: Callback? = null init { View.inflate(context, R.layout.vector_invite_view, this) - layoutParams = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT) setBackgroundColor(Color.WHITE) inviteRejectView.setOnClickListener { callback?.onRejectInvite() } inviteAcceptView.setOnClickListener { callback?.onAcceptInvite() } } - fun render(roomSummary: RoomSummary) { - AvatarRenderer.render(roomSummary.avatarUrl, roomSummary.roomId, roomSummary.displayName, inviteAvatarView) - inviteIdentifierView.text = roomSummary.lastMessage?.sender - inviteNameView.text = roomSummary.displayName + fun render(sender: User, mode: Mode = Mode.LARGE) { + if (mode == Mode.LARGE) { + updateLayoutParams { height = ConstraintLayout.LayoutParams.MATCH_CONSTRAINT } + AvatarRenderer.render(sender.avatarUrl, sender.userId, sender.displayName, inviteAvatarView) + inviteIdentifierView.text = sender.userId + inviteNameView.text = sender.displayName + inviteLabelView.text = context.getString(R.string.send_you_invite) + } else { + updateLayoutParams { height = ConstraintLayout.LayoutParams.WRAP_CONTENT } + inviteAvatarView.visibility = View.GONE + inviteIdentifierView.visibility = View.GONE + inviteNameView.visibility = View.GONE + inviteLabelView.text = context.getString(R.string.invited_by, sender.userId) + } } } \ No newline at end of file diff --git a/vector/src/main/res/drawable/bg_button_secondary.xml b/vector/src/main/res/drawable/bg_button_secondary.xml new file mode 100644 index 00000000..f889d60f --- /dev/null +++ b/vector/src/main/res/drawable/bg_button_secondary.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/layout/fragment_room_detail.xml b/vector/src/main/res/layout/fragment_room_detail.xml index 1101e938..a5711bce 100644 --- a/vector/src/main/res/layout/fragment_room_detail.xml +++ b/vector/src/main/res/layout/fragment_room_detail.xml @@ -142,11 +142,13 @@ + app:layout_constraintTop_toBottomOf="@+id/toolbar" + app:layout_constraintVertical_bias="1.0" /> \ No newline at end of file diff --git a/vector/src/main/res/layout/vector_invite_view.xml b/vector/src/main/res/layout/vector_invite_view.xml index c497a492..dee10b3f 100644 --- a/vector/src/main/res/layout/vector_invite_view.xml +++ b/vector/src/main/res/layout/vector_invite_view.xml @@ -25,27 +25,30 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="40dp" - android:text="Matthew" + android:textAppearance="@style/TextAppearance.Vector.Title" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/inviteAvatarView" /> + app:layout_constraintTop_toBottomOf="@id/inviteAvatarView" + tools:text="Matthew" /> + app:layout_constraintTop_toBottomOf="@id/inviteNameView" + tools:text="\@matthew:matrix.org" /> @@ -54,7 +57,7 @@ android:id="@+id/inviteRejectView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="24dp" + android:layout_marginTop="16dp" android:layout_marginRight="4dp" android:text="@string/reject" app:layout_constraintEnd_toStartOf="@+id/inviteAcceptView" @@ -73,5 +76,10 @@ app:layout_constraintStart_toEndOf="@+id/inviteRejectView" app:layout_constraintTop_toTopOf="@id/inviteRejectView" /> + + \ No newline at end of file diff --git a/vector/src/main/res/values/colors.xml b/vector/src/main/res/values/colors.xml index 2a1fc868..75bad082 100644 --- a/vector/src/main/res/values/colors.xml +++ b/vector/src/main/res/values/colors.xml @@ -3,7 +3,6 @@ #f2f5f8 #2e3649 #7ac9a1 - #212121 #007aff #f56679 #a5a5a6 @@ -18,4 +17,9 @@ #a5a5a5 #61708B + #000000 + #de000000 + #61000000 + #5d000000 + diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 97af4f71..5c1c8ec7 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -4,5 +4,7 @@ "Retry" "Join a room to start using the app." + "Sent you an invitation" + Invited by %s \ No newline at end of file diff --git a/vector/src/main/res/values/styles_widget.xml b/vector/src/main/res/values/styles_widget.xml index 40419e7b..ad2efe7e 100644 --- a/vector/src/main/res/values/styles_widget.xml +++ b/vector/src/main/res/values/styles_widget.xml @@ -1,11 +1,12 @@ - - \ No newline at end of file diff --git a/vector/src/main/res/values/text_appearances.xml b/vector/src/main/res/values/text_appearances.xml index 78554f9e..e1dd3b43 100644 --- a/vector/src/main/res/values/text_appearances.xml +++ b/vector/src/main/res/values/text_appearances.xml @@ -1,5 +1,40 @@ - - + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/values/theme_light.xml b/vector/src/main/res/values/theme_light.xml index 6a9dc6d9..68076a4b 100644 --- a/vector/src/main/res/values/theme_light.xml +++ b/vector/src/main/res/values/theme_light.xml @@ -6,12 +6,14 @@