diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt index 1bd1efccae..c982cb34f0 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt @@ -45,7 +45,11 @@ class ChatRoomAdapter( view, actionsListener, reactionListener - ) { userId -> navigator?.toUserDetails(userId) } + ) { userId -> + if (roomId != null) { + navigator?.toUserDetails(userId,roomId) + } + } } BaseUiModel.ViewType.URL_PREVIEW -> { val view = parent.inflate(R.layout.message_url_preview) diff --git a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomNavigator.kt b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomNavigator.kt index 734feebc50..54b5317163 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomNavigator.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomNavigator.kt @@ -16,9 +16,9 @@ import chat.rocket.android.util.extensions.addFragmentBackStack class ChatRoomNavigator(internal val activity: ChatRoomActivity) { - fun toUserDetails(userId: String) { + fun toUserDetails(userId: String,chatRoomId: String) { activity.addFragmentBackStack(TAG_USER_DETAILS_FRAGMENT, R.id.fragment_container) { - chat.rocket.android.userdetails.ui.newInstance(userId) + chat.rocket.android.userdetails.ui.newInstance(userId,chatRoomId) } } @@ -69,9 +69,9 @@ class ChatRoomNavigator(internal val activity: ChatRoomActivity) { } } - fun toMemberDetails(userId: String) { + fun toMemberDetails(userId: String, chatRoomId: String) { activity.addFragmentBackStack(TAG_USER_DETAILS_FRAGMENT, R.id.fragment_container) { - chat.rocket.android.userdetails.ui.newInstance(userId) + chat.rocket.android.userdetails.ui.newInstance(userId,chatRoomId) } } diff --git a/app/src/main/java/chat/rocket/android/members/presentation/MembersPresenter.kt b/app/src/main/java/chat/rocket/android/members/presentation/MembersPresenter.kt index d84f18df5a..a1ac7de2e5 100644 --- a/app/src/main/java/chat/rocket/android/members/presentation/MembersPresenter.kt +++ b/app/src/main/java/chat/rocket/android/members/presentation/MembersPresenter.kt @@ -58,7 +58,7 @@ class MembersPresenter @Inject constructor( } } - fun toMemberDetails(memberUiModel: MemberUiModel) { - navigator.toMemberDetails(memberUiModel.userId) + fun toMemberDetails(memberUiModel: MemberUiModel, chatRoomId: String) { + navigator.toMemberDetails(memberUiModel.userId,chatRoomId) } } diff --git a/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt b/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt index 8177fa9b55..a770e9e5b1 100644 --- a/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt +++ b/app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt @@ -44,7 +44,7 @@ class MembersFragment : Fragment(), MembersView { @Inject lateinit var analyticsManager: AnalyticsManager private val adapter: MembersAdapter = - MembersAdapter { memberUiModel -> presenter.toMemberDetails(memberUiModel) } + MembersAdapter { memberUiModel -> presenter.toMemberDetails(memberUiModel,chatRoomId) } private val linearLayoutManager = LinearLayoutManager(context) private lateinit var chatRoomId: String diff --git a/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsPresenter.kt b/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsPresenter.kt index 004778e654..22581b15f1 100644 --- a/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsPresenter.kt +++ b/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsPresenter.kt @@ -12,8 +12,12 @@ import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.retryIO import chat.rocket.common.model.RoomType +import chat.rocket.common.model.of +import chat.rocket.common.model.roomTypeOf import chat.rocket.common.util.ifNull import chat.rocket.core.internal.rest.createDirectMessage +import chat.rocket.core.internal.rest.kickUser +import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.DefaultDispatcher import kotlinx.coroutines.experimental.withContext import timber.log.Timber @@ -71,6 +75,46 @@ class UserDetailsPresenter @Inject constructor( } } + fun kickUser(userId: String,chatRoomId:String){ + launchUI(strategy){ + try { + view.showLoading() + dbManager.getRoom(chatRoomId)?.let { + val result = retryIO ("kickUser($userId,$chatRoomId,${roomTypeOf(it.chatRoom.type)})"){ + client.kickUser(chatRoomId, roomTypeOf(it.chatRoom.type),userId) + } + if(result){ + view.showKickedUserSuccessfullyMessage() + } + }.ifNull { + Timber.e("Couldn't find a room with id: $chatRoomId at current server.") + } + }catch (exception: Exception){ + Timber.e(exception) + exception.message?.let { + view.showMessage(it) + }.ifNull { + view.showGenericErrorMessage() + } + }finally { + view.hideLoading() + } + } + } + + fun checkDirectMessageRoomType(chatRoomId: String) { + launchUI(strategy){ + dbManager.getRoom(chatRoomId)?.let { + when(roomTypeOf(it.chatRoom.type)){ + is RoomType.DirectMessage -> view.disableKickButton() + else -> view.enableKickButton() + } + }.ifNull { + Timber.e("Couldn't find a room with id: $chatRoomId at current server.") + } + } + } + fun createDirectMessage(username: String) { launchUI(strategy) { try { diff --git a/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsView.kt b/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsView.kt index 1492c5152f..67eaf62686 100644 --- a/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsView.kt +++ b/app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsView.kt @@ -21,4 +21,17 @@ interface UserDetailsView : LoadingView, MessageView { status: String, utcOffset: String ) + /** + * Disable Kick Button + */ + fun disableKickButton() + /** + * Enable Kick Button + */ + fun enableKickButton() + + /** + * Shows a message that a channel was successfully created. + */ + fun showKickedUserSuccessfullyMessage() } diff --git a/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt b/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt index 346784b40c..baab89c64f 100644 --- a/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt +++ b/app/src/main/java/chat/rocket/android/userdetails/ui/UserDetailsFragment.kt @@ -29,14 +29,16 @@ import kotlinx.android.synthetic.main.app_bar_chat_room.* import kotlinx.android.synthetic.main.fragment_user_details.* import javax.inject.Inject -fun newInstance(userId: String): Fragment { +fun newInstance(userId: String,chatRoomId: String): Fragment { return UserDetailsFragment().apply { - arguments = Bundle(1).apply { + arguments = Bundle(2).apply { putString(BUNDLE_USER_ID, userId) + putString(BUNDLE_USER_CHATROOM_ID,chatRoomId) } } } +private const val BUNDLE_USER_CHATROOM_ID = "user_chat_room_id" internal const val TAG_USER_DETAILS_FRAGMENT = "UserDetailsFragment" private const val BUNDLE_USER_ID = "user_id" @@ -46,6 +48,7 @@ class UserDetailsFragment : Fragment(), UserDetailsView { @Inject lateinit var analyticsManager: AnalyticsManager private lateinit var userId: String + private lateinit var chatRoomId: String private val handler = Handler() override fun onCreate(savedInstanceState: Bundle?) { @@ -55,6 +58,7 @@ class UserDetailsFragment : Fragment(), UserDetailsView { val bundle = arguments if (bundle != null) { userId = bundle.getString(BUNDLE_USER_ID) + chatRoomId = bundle.getString(BUNDLE_USER_CHATROOM_ID) } else { requireNotNull(bundle) { "no arguments supplied when the fragment was instantiated" } } @@ -72,7 +76,8 @@ class UserDetailsFragment : Fragment(), UserDetailsView { setupToolbar() setupListeners() presenter.loadUserDetails(userId) - + presenter.checkDirectMessageRoomType(chatRoomId) + button_kick.setOnClickListener { presenter.kickUser(userId,chatRoomId) } analyticsManager.logScreenView(ScreenViewEvent.UserDetails) } @@ -107,15 +112,23 @@ class UserDetailsFragment : Fragment(), UserDetailsView { } override fun showLoading() { - group_user_details.isVisible = false view_loading.isVisible = true } override fun hideLoading() { - group_user_details.isVisible = true view_loading.isVisible = false } + override fun enableKickButton() { + button_kick.isVisible = true + } + + override fun disableKickButton() { + button_kick.isVisible = false + } + + override fun showKickedUserSuccessfullyMessage() = showMessage(getString(R.string.msg_kick_user_successfully)) + override fun showMessage(resId: Int) { ui { showToast(resId) } } diff --git a/app/src/main/res/layout/fragment_user_details.xml b/app/src/main/res/layout/fragment_user_details.xml index f52cbeeeb3..0c94dde196 100644 --- a/app/src/main/res/layout/fragment_user_details.xml +++ b/app/src/main/res/layout/fragment_user_details.xml @@ -126,5 +126,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:constraint_referenced_ids="image_blur, image_avatar, text_name, text_username, text_message, text_title_status, text_description_status, text_title_timezone, text_description_timezone" /> + +