Skip to content
This repository was archived by the owner on Jun 7, 2020. It is now read-only.

[NEW] Added delete channel option #1979

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import chat.rocket.android.members.ui.TAG_MEMBERS_FRAGMENT
import chat.rocket.android.mentions.ui.TAG_MENTIONS_FRAGMENT
import chat.rocket.android.pinnedmessages.ui.TAG_PINNED_MESSAGES_FRAGMENT
import chat.rocket.android.util.extensions.addFragmentBackStack
import android.content.Intent
import chat.rocket.android.main.ui.MainActivity


class ChatDetailsNavigator(internal val activity: ChatDetailsActivity) {

Expand Down Expand Up @@ -40,4 +43,12 @@ class ChatDetailsNavigator(internal val activity: ChatDetailsActivity) {
chat.rocket.android.files.ui.newInstance(chatRoomId)
}
}

fun toChatList() {
val intent = Intent(activity.applicationContext, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
activity.startActivity(intent)
activity.finish()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatException
import chat.rocket.common.model.roomTypeOf
import chat.rocket.common.util.ifNull
import chat.rocket.core.internal.rest.deleteChannel
import chat.rocket.core.internal.rest.getInfo
import chat.rocket.core.model.Room
import javax.inject.Inject
Expand Down Expand Up @@ -61,6 +63,27 @@ class ChatDetailsPresenter @Inject constructor(
navigator.toFavoriteMessageList(chatRoomId)
}

fun deleteChannel(chatRoomType: String, chatRoomId: String) {
launchUI(strategy) {
view.showLoading()
try {
retryIO(description = "deleteChannel(${roomTypeOf(chatRoomType)},$chatRoomId") {
client.deleteChannel(roomTypeOf(chatRoomType),chatRoomId)
}
navigator.toChatList()

} catch (exception: RocketChatException) {
exception.message?.let {
view.showMessage(it)
}.ifNull {
view.showGenericErrorMessage()
}
} finally {
view.hideLoading()
}
}
}

private fun roomToChatDetails(room: Room): ChatDetails {
return with(room) {
ChatDetails(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import chat.rocket.android.chatdetails.domain.ChatDetails
import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView

interface ChatDetailsView: MessageView {
interface ChatDetailsView: LoadingView, MessageView {
fun displayDetails(room: ChatDetails)
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,23 @@ fun Context.chatDetailsIntent(
chatRoomId: String,
chatRoomType: String,
isSubscribed: Boolean = true,
isMenuDisabled: Boolean = false
isMenuDisabled: Boolean = false,
isOwner: Boolean = false
): Intent {
return Intent(this, ChatDetailsActivity::class.java).apply {
putExtra(INTENT_CHAT_ROOM_ID, chatRoomId)
putExtra(INTENT_CHAT_ROOM_TYPE, chatRoomType)
putExtra(INTENT_CHAT_IS_SUBSCRIBED, isSubscribed)
putExtra(INTENT_CHAT_DISABLED_MENU, isMenuDisabled)
putExtra(INTENT_CHAT_IS_OWNER, isOwner)
}
}

private const val INTENT_CHAT_ROOM_ID = "chat_room_id"
private const val INTENT_CHAT_ROOM_TYPE = "chat_room_type"
private const val INTENT_CHAT_IS_SUBSCRIBED = "is_chat_room_subscribed"
private const val INTENT_CHAT_DISABLED_MENU = "is_menu_disabled"
private const val INTENT_CHAT_IS_OWNER = "is_owner"

class ChatDetailsActivity: AppCompatActivity(), HasSupportFragmentInjector {
@Inject
Expand All @@ -51,10 +54,11 @@ class ChatDetailsActivity: AppCompatActivity(), HasSupportFragmentInjector {

val isSubscribed = intent.getBooleanExtra(INTENT_CHAT_IS_SUBSCRIBED, true)
val disableMenu = intent.getBooleanExtra(INTENT_CHAT_DISABLED_MENU, false)
val isOwner = intent.getBooleanExtra(INTENT_CHAT_IS_OWNER,false)

if (supportFragmentManager.findFragmentByTag(TAG_CHAT_DETAILS_FRAGMENT) == null) {
addFragment(TAG_CHAT_DETAILS_FRAGMENT, R.id.fragment_container) {
newInstance(chatRoomId, chatRoomType, isSubscribed, disableMenu)
newInstance(chatRoomId, chatRoomType, isSubscribed, disableMenu, isOwner)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package chat.rocket.android.chatdetails.ui

import android.app.AlertDialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
Expand All @@ -29,14 +31,16 @@ fun newInstance(
chatRoomId: String,
chatRoomType: String,
isSubscribed: Boolean,
disableMenu: Boolean
disableMenu: Boolean,
isOwner: Boolean
): ChatDetailsFragment {
return ChatDetailsFragment().apply {
arguments = Bundle(1).apply {
putString(BUNDLE_CHAT_ROOM_ID, chatRoomId)
putString(BUNDLE_CHAT_ROOM_TYPE, chatRoomType)
putBoolean(BUNDLE_IS_SUBSCRIBED, isSubscribed)
putBoolean(BUNDLE_DISABLE_MENU, disableMenu)
putBoolean(BUNDLE_IS_OWNER, isOwner)
}
}
}
Expand All @@ -47,6 +51,7 @@ private const val BUNDLE_CHAT_ROOM_ID = "BUNDLE_CHAT_ROOM_ID"
private const val BUNDLE_CHAT_ROOM_TYPE = "BUNDLE_CHAT_ROOM_TYPE"
private const val BUNDLE_IS_SUBSCRIBED = "BUNDLE_IS_SUBSCRIBED"
private const val BUNDLE_DISABLE_MENU = "BUNDLE_DISABLE_MENU"
private const val BUNDLE_IS_OWNER = "BUNDLE_IS_OWNER"

class ChatDetailsFragment: Fragment(), ChatDetailsView {
@Inject
Expand All @@ -62,6 +67,7 @@ class ChatDetailsFragment: Fragment(), ChatDetailsView {
private var chatRoomType: String? = null
private var isSubscribed: Boolean = true
private var disableMenu: Boolean = false
private var isOwner: Boolean = false

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -72,6 +78,7 @@ class ChatDetailsFragment: Fragment(), ChatDetailsView {
chatRoomType = bundle.getString(BUNDLE_CHAT_ROOM_TYPE)
isSubscribed = bundle.getBoolean(BUNDLE_IS_SUBSCRIBED)
disableMenu = bundle.getBoolean(BUNDLE_DISABLE_MENU)
isOwner = bundle.getBoolean(BUNDLE_IS_OWNER)
}
}

Expand All @@ -87,6 +94,22 @@ class ChatDetailsFragment: Fragment(), ChatDetailsView {
setupOptions()
setupToolbar()
getDetails()

button_delete.setOnClickListener {
ui {
val builder = AlertDialog.Builder(it)
builder.setTitle(it.getString(R.string.action_delete_channel))
.setMessage(it.getString(R.string.msg_delete_description))
.setPositiveButton(it.getString(R.string.msg_ok)) { _, _ ->
presenter.deleteChannel(
chatRoomType!!,
chatRoomId!!
)
}
.setNegativeButton(it.getString(R.string.msg_cancel)) { _, _ -> }
.show()
}
}
}

override fun displayDetails(room: ChatDetails) {
Expand All @@ -97,11 +120,25 @@ class ChatDetailsFragment: Fragment(), ChatDetailsView {
content_topic.text = if (room.topic.isNullOrEmpty()) getString(R.string.msg_no_topic) else room.topic
content_announcement.text = if (room.announcement.isNullOrEmpty()) getString(R.string.msg_no_announcement) else room.announcement
content_description.text = if (room.description.isNullOrEmpty()) getString(R.string.msg_no_description) else room.description
button_delete.isVisible = isOwner and (chatRoomType != RoomType.DIRECT_MESSAGE)
}
}

override fun showGenericErrorMessage() = showMessage(R.string.msg_generic_error)

override fun showLoading() {
ui {
view_loading.isVisible = true
}
}

override fun hideLoading() {
ui {
view_loading.isVisible = false
}
}


override fun showMessage(resId: Int) {
ui {
showToast(resId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@ class ChatRoomNavigator(internal val activity: ChatRoomActivity) {
chatRoomId: String,
chatRoomType: String,
isChatRoomSubscribed: Boolean,
isMenuDisabled: Boolean
isMenuDisabled: Boolean,
isOwner: Boolean
) {
activity.startActivity(
activity.chatDetailsIntent(
chatRoomId,
chatRoomType,
isChatRoomSubscribed,
isMenuDisabled
isMenuDisabled,
isOwner
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,16 @@ class ChatRoomPresenter @Inject constructor(
} finally {
// User has at least an 'owner' or 'moderator' role.
val canModerate = isOwnerOrMod()

val isOwner = isOwner()

// Can post anyway if has the 'post-readonly' permission on server.
val room = dbManager.getRoom(roomId)
room?.let {
chatIsBroadcast = it.chatRoom.broadcast ?: false
val roomUiModel = roomMapper.map(it, true)
launchUI(strategy) {
view.onIsOwnerUpdated(isOwner = isOwner)
view.onRoomUpdated(roomUiModel = roomUiModel.copy(
broadcast = chatIsBroadcast,
canModerate = canModerate,
Expand Down Expand Up @@ -200,6 +204,12 @@ class ChatRoomPresenter @Inject constructor(
} ?: false
}

private fun isOwner(): Boolean {
return chatRoles.firstOrNull { it.user.username == currentLoggedUsername }?.roles?.any {
it == "owner"
} ?: false
}

fun loadMessages(
chatRoomId: String,
chatRoomType: String,
Expand Down Expand Up @@ -912,9 +922,10 @@ class ChatRoomPresenter @Inject constructor(
chatRoomId: String,
chatRoomType: String,
isSubscribed: Boolean,
isMenuDisabled: Boolean
isMenuDisabled: Boolean,
isOwner: Boolean
) {
navigator.toChatDetails(chatRoomId, chatRoomType, isSubscribed, isMenuDisabled)
navigator.toChatDetails(chatRoomId, chatRoomType, isSubscribed, isMenuDisabled, isOwner)
}

fun loadChatRoomsSuggestions() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,6 @@ interface ChatRoomView : LoadingView, MessageView {

fun onRoomUpdated(roomUiModel: RoomUiModel)

fun onIsOwnerUpdated(isOwner: Boolean)

}
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
internal var citation: String? = null
private var editingMessageId: String? = null
internal var disableMenu: Boolean = false
internal var isOwner: Boolean = false

private val compositeDisposable = CompositeDisposable()
private var playComposeMessageButtonsAnimation = true
Expand Down Expand Up @@ -1168,4 +1169,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
setReactionButtonIcon(R.drawable.ic_reaction_24dp)
}
}

override fun onIsOwnerUpdated (isOwner: Boolean) {
this.isOwner = isOwner
}
}
3 changes: 2 additions & 1 deletion app/src/main/java/chat/rocket/android/chatroom/ui/Menu.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ internal fun ChatRoomFragment.setOnMenuItemClickListener(item: MenuItem) {
chatRoomId,
chatRoomType,
isSubscribed,
disableMenu
disableMenu,
isOwner
)
}
}
Expand Down
Loading