ReplaceController with Activity for ConversationInfo

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2023-03-30 12:43:11 +02:00
parent 6ff9fd7d1f
commit 85dd7c3996
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
5 changed files with 232 additions and 192 deletions

View File

@ -210,6 +210,10 @@
android:name=".settings.SettingsActivity" android:name=".settings.SettingsActivity"
android:theme="@style/AppTheme" /> android:theme="@style/AppTheme" />
<activity
android:name=".conversation.info.ConversationInfoActivity"
android:theme="@style/AppTheme" />
<receiver android:name=".receivers.PackageReplacedReceiver" <receiver android:name=".receivers.PackageReplacedReceiver"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>

View File

@ -126,6 +126,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.callbacks.MentionAutocompleteCallback import com.nextcloud.talk.callbacks.MentionAutocompleteCallback
import com.nextcloud.talk.controllers.base.BaseController import com.nextcloud.talk.controllers.base.BaseController
import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.controllers.util.viewBinding
import com.nextcloud.talk.conversation.info.ConversationInfoActivity
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ControllerChatBinding import com.nextcloud.talk.databinding.ControllerChatBinding
import com.nextcloud.talk.events.UserMentionClickEvent import com.nextcloud.talk.events.UserMentionClickEvent
@ -1778,11 +1779,10 @@ class ChatController(args: Bundle) :
bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, conversationUser) bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, conversationUser)
bundle.putString(KEY_ROOM_TOKEN, roomToken) bundle.putString(KEY_ROOM_TOKEN, roomToken)
bundle.putBoolean(BundleKeys.KEY_ROOM_ONE_TO_ONE, isOneToOneConversation()) bundle.putBoolean(BundleKeys.KEY_ROOM_ONE_TO_ONE, isOneToOneConversation())
router.pushController(
RouterTransaction.with(ConversationInfoController(bundle)) val intent = Intent(activity, ConversationInfoActivity::class.java)
.pushChangeHandler(HorizontalChangeHandler()) intent.putExtras(bundle)
.popChangeHandler(HorizontalChangeHandler()) activity!!.startActivity(intent)
)
} }
private fun setupMentionAutocomplete() { private fun setupMentionAutocomplete() {

View File

@ -5,7 +5,7 @@
* @author Andy Scherzinger * @author Andy Scherzinger
* @author Tim Krüger * @author Tim Krüger
* @author Marcel Hibbe * @author Marcel Hibbe
* Copyright (C) 2022 Marcel Hibbe (dev@mhibbe.de) * Copyright (C) 2022-2023 Marcel Hibbe (dev@mhibbe.de)
* Copyright (C) 2021-2022 Tim Krüger <t@timkrueger.me> * Copyright (C) 2021-2022 Tim Krüger <t@timkrueger.me>
* Copyright (C) 2021 Andy Scherzinger (info@andy-scherzinger.de) * Copyright (C) 2021 Andy Scherzinger (info@andy-scherzinger.de)
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com> * Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
@ -24,21 +24,22 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package com.nextcloud.talk.controllers package com.nextcloud.talk.conversation.info
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.os.Parcelable import android.os.Parcelable
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import android.view.MenuItem
import android.view.View import android.view.View
import android.view.View.GONE import android.view.View.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.SwitchCompat
import androidx.core.content.res.ResourcesCompat
import androidx.work.Data import androidx.work.Data
import androidx.work.OneTimeWorkRequest import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager import androidx.work.WorkManager
@ -47,18 +48,14 @@ import com.afollestad.materialdialogs.LayoutMode.WRAP_CONTENT
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.datetime.dateTimePicker import com.afollestad.materialdialogs.datetime.dateTimePicker
import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.adapters.items.ParticipantItem import com.nextcloud.talk.adapters.items.ParticipantItem
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.controllers.base.BaseController
import com.nextcloud.talk.controllers.bottomsheet.items.BasicListItemWithImage import com.nextcloud.talk.controllers.bottomsheet.items.BasicListItemWithImage
import com.nextcloud.talk.controllers.bottomsheet.items.listItemsWithImage import com.nextcloud.talk.controllers.bottomsheet.items.listItemsWithImage
import com.nextcloud.talk.controllers.util.viewBinding
import com.nextcloud.talk.conversation.info.GuestAccessHelper
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ControllerConversationInfoBinding import com.nextcloud.talk.databinding.ControllerConversationInfoBinding
import com.nextcloud.talk.events.EventStatus import com.nextcloud.talk.events.EventStatus
@ -82,6 +79,7 @@ import com.nextcloud.talk.shareditems.activities.SharedItemsActivity
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.DateConstants import com.nextcloud.talk.utils.DateConstants
import com.nextcloud.talk.utils.DateUtils import com.nextcloud.talk.utils.DateUtils
import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule
@ -91,7 +89,6 @@ import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
import java.util.Calendar import java.util.Calendar
@ -100,14 +97,11 @@ import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class) @AutoInjector(NextcloudTalkApplication::class)
class ConversationInfoController(args: Bundle) : class ConversationInfoActivity() :
BaseController( BaseActivity(),
R.layout.controller_conversation_info,
args
),
FlexibleAdapter.OnItemClickListener { FlexibleAdapter.OnItemClickListener {
private val binding: ControllerConversationInfoBinding? by viewBinding(ControllerConversationInfoBinding::bind) private lateinit var binding: ControllerConversationInfoBinding
@Inject @Inject
lateinit var ncApi: NcApi lateinit var ncApi: NcApi
@ -115,16 +109,13 @@ class ConversationInfoController(args: Bundle) :
@Inject @Inject
lateinit var conversationsRepository: ConversationsRepository lateinit var conversationsRepository: ConversationsRepository
@Inject
lateinit var eventBus: EventBus
@Inject @Inject
lateinit var dateUtils: DateUtils lateinit var dateUtils: DateUtils
private val conversationToken: String? private lateinit var conversationToken: String
private val conversationUser: User? private lateinit var conversationUser: User
private val hasAvatarSpacing: Boolean private var hasAvatarSpacing: Boolean = false
private val credentials: String? private lateinit var credentials: String
private var roomDisposable: Disposable? = null private var roomDisposable: Disposable? = null
private var participantsDisposable: Disposable? = null private var participantsDisposable: Disposable? = null
@ -146,68 +137,120 @@ class ConversationInfoController(args: Bundle) :
return null return null
} }
init { override fun onCreate(savedInstanceState: Bundle?) {
setHasOptionsMenu(true) super.onCreate(savedInstanceState)
NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this) NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
conversationUser = args.getParcelable(BundleKeys.KEY_USER_ENTITY)
conversationToken = args.getString(BundleKeys.KEY_ROOM_TOKEN) binding = ControllerConversationInfoBinding.inflate(layoutInflater)
hasAvatarSpacing = args.getBoolean(BundleKeys.KEY_ROOM_ONE_TO_ONE, false) setupActionBar()
credentials = ApiUtils.getCredentials(conversationUser!!.username, conversationUser.token) setupSystemColors()
setContentView(binding.root)
conversationUser = intent.getParcelableExtra(BundleKeys.KEY_USER_ENTITY)!!
conversationToken = intent.getStringExtra(BundleKeys.KEY_ROOM_TOKEN)!!
hasAvatarSpacing = intent.getBooleanExtra(BundleKeys.KEY_ROOM_ONE_TO_ONE, false)
credentials = ApiUtils.getCredentials(conversationUser.username, conversationUser.token)
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onResume() {
when (item.itemId) { super.onResume()
android.R.id.home -> {
router.popCurrentController()
return true
}
else -> return super.onOptionsItemSelected(item)
}
}
override fun onAttach(view: View) {
super.onAttach(view)
eventBus.register(this)
if (databaseStorageModule == null) { if (databaseStorageModule == null) {
databaseStorageModule = DatabaseStorageModule(conversationUser!!, conversationToken) databaseStorageModule = DatabaseStorageModule(conversationUser, conversationToken)
} }
binding?.notificationSettingsView?.notificationSettings?.setStorageModule(databaseStorageModule) binding.notificationSettingsView.notificationSettings.setStorageModule(databaseStorageModule)
binding?.webinarInfoView?.webinarSettings?.setStorageModule(databaseStorageModule) binding.webinarInfoView.webinarSettings.setStorageModule(databaseStorageModule)
binding?.guestAccessView?.guestAccessSettings?.setStorageModule(databaseStorageModule) binding.guestAccessView.guestAccessSettings.setStorageModule(databaseStorageModule)
binding?.deleteConversationAction?.setOnClickListener { showDeleteConversationDialog() } binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog() }
binding?.leaveConversationAction?.setOnClickListener { leaveConversation() } binding.leaveConversationAction.setOnClickListener { leaveConversation() }
binding?.clearConversationHistory?.setOnClickListener { showClearHistoryDialog() } binding.clearConversationHistory.setOnClickListener { showClearHistoryDialog() }
binding?.addParticipantsAction?.setOnClickListener { addParticipants() } binding.addParticipantsAction.setOnClickListener { addParticipants() }
if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "rich-object-list-media")) { if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "rich-object-list-media")) {
binding?.showSharedItemsAction?.setOnClickListener { showSharedItems() } binding.showSharedItemsAction.setOnClickListener { showSharedItems() }
} else { } else {
binding?.categorySharedItems?.visibility = GONE binding.categorySharedItems.visibility = GONE
} }
fetchRoomInfo() fetchRoomInfo()
themeCategories() themeCategories()
themeSwitchPreferences() themeSwitchPreferences()
binding.addParticipantsAction.visibility = GONE
binding.progressBar.let { viewThemeUtils.platform.colorCircularProgressBar(it) }
} }
private fun setupActionBar() {
setSupportActionBar(binding.conversationInfoToolbar)
binding.conversationInfoToolbar.setNavigationOnClickListener {
onBackPressed()
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
supportActionBar?.title = if (hasAvatarSpacing) {
" " + resources!!.getString(R.string.nc_conversation_menu_conversation_info)
} else {
resources!!.getString(R.string.nc_conversation_menu_conversation_info)
}
}
private fun setupSystemColors() {
DisplayUtils.applyColorToStatusBar(
this,
ResourcesCompat.getColor(
resources,
R.color.appbar,
null
)
)
DisplayUtils.applyColorToNavigationBar(
this.window,
ResourcesCompat.getColor(resources, R.color.bg_default, null)
)
}
// override fun onCreateOptionsMenu(menu: Menu): Boolean {
// super.onCreateOptionsMenu(menu)
// menuInflater.inflate(R.menu.menu_locationpicker, menu)
// return true
// }
//
// override fun onPrepareOptionsMenu(menu: Menu): Boolean {
// super.onPrepareOptionsMenu(menu)
// // searchItem = menu.findItem(R.id.location_action_search)
// // initSearchView()
// return true
// }
// override fun onOptionsItemSelected(item: MenuItem): Boolean {
// when (item.itemId) {
// android.R.id.home -> {
// finish()
// return true
// }
// else -> return super.onOptionsItemSelected(item)
// }
// }
private fun themeSwitchPreferences() { private fun themeSwitchPreferences() {
binding?.run { binding.run {
listOf( listOf(
binding?.webinarInfoView?.conversationInfoLobby!!, binding.webinarInfoView.conversationInfoLobby,
binding?.notificationSettingsView?.callNotifications!!, binding.notificationSettingsView.callNotifications,
binding?.notificationSettingsView?.conversationInfoPriorityConversation!!, binding.notificationSettingsView.conversationInfoPriorityConversation,
binding?.guestAccessView?.guestAccessAllowSwitch!!, binding.guestAccessView.guestAccessAllowSwitch,
binding?.guestAccessView?.guestAccessPasswordSwitch!! binding.guestAccessView.guestAccessPasswordSwitch
).forEach(viewThemeUtils.talk::colorSwitchPreference) ).forEach(viewThemeUtils.talk::colorSwitchPreference)
} }
} }
private fun themeCategories() { private fun themeCategories() {
binding?.run { binding.run {
listOf( listOf(
conversationInfoName, conversationInfoName,
conversationDescription, conversationDescription,
@ -216,30 +259,22 @@ class ConversationInfoController(args: Bundle) :
ownOptions, ownOptions,
categorySharedItems, categorySharedItems,
categoryConversationSettings, categoryConversationSettings,
binding?.guestAccessView?.guestAccessCategory!!, binding.guestAccessView.guestAccessCategory,
binding?.webinarInfoView?.conversationInfoWebinar!!, binding.webinarInfoView.conversationInfoWebinar,
binding?.notificationSettingsView?.notificationSettingsCategory!! binding.notificationSettingsView.notificationSettingsCategory
).forEach(viewThemeUtils.talk::colorPreferenceCategory) ).forEach(viewThemeUtils.talk::colorPreferenceCategory)
} }
} }
private fun showSharedItems() { private fun showSharedItems() {
val intent = Intent(activity, SharedItemsActivity::class.java) val intent = Intent(this, SharedItemsActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.putExtra(BundleKeys.KEY_CONVERSATION_NAME, conversation?.displayName) intent.putExtra(BundleKeys.KEY_CONVERSATION_NAME, conversation?.displayName)
intent.putExtra(BundleKeys.KEY_ROOM_TOKEN, conversationToken) intent.putExtra(BundleKeys.KEY_ROOM_TOKEN, conversationToken)
intent.putExtra(BundleKeys.KEY_USER_ENTITY, conversationUser as Parcelable) intent.putExtra(BundleKeys.KEY_USER_ENTITY, conversationUser as Parcelable)
intent.putExtra(SharedItemsActivity.KEY_USER_IS_OWNER_OR_MODERATOR, conversation?.isParticipantOwnerOrModerator) intent.putExtra(SharedItemsActivity.KEY_USER_IS_OWNER_OR_MODERATOR, conversation?.isParticipantOwnerOrModerator)
activity!!.startActivity(intent) startActivity(intent)
}
override fun onViewBound(view: View) {
super.onViewBound(view)
binding?.addParticipantsAction?.visibility = GONE
binding?.progressBar?.let { viewThemeUtils.platform.colorCircularProgressBar(it) }
} }
private fun setupWebinaryView() { private fun setupWebinaryView() {
@ -257,7 +292,7 @@ class ConversationInfoController(args: Bundle) :
reconfigureLobbyTimerView() reconfigureLobbyTimerView()
binding?.webinarInfoView?.startTimePreferences?.setOnClickListener { binding?.webinarInfoView?.startTimePreferences?.setOnClickListener {
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show {
val currentTimeCalendar = Calendar.getInstance() val currentTimeCalendar = Calendar.getInstance()
if (conversation!!.lobbyTimer != null && conversation!!.lobbyTimer != 0L) { if (conversation!!.lobbyTimer != null && conversation!!.lobbyTimer != 0L) {
currentTimeCalendar.timeInMillis = conversation!!.lobbyTimer!! * DateConstants.SECOND_DIVIDER currentTimeCalendar.timeInMillis = conversation!!.lobbyTimer!! * DateConstants.SECOND_DIVIDER
@ -345,7 +380,7 @@ class ConversationInfoController(args: Bundle) :
val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1))
ncApi.setLobbyForConversation( ncApi.setLobbyForConversation(
ApiUtils.getCredentials(conversationUser!!.username, conversationUser.token), ApiUtils.getCredentials(conversationUser.username, conversationUser.token),
ApiUtils.getUrlForRoomWebinaryLobby(apiVersion, conversationUser.baseUrl, conversation!!.token), ApiUtils.getUrlForRoomWebinaryLobby(apiVersion, conversationUser.baseUrl, conversation!!.token),
state, state,
conversation!!.lobbyTimer conversation!!.lobbyTimer
@ -376,54 +411,45 @@ class ConversationInfoController(args: Bundle) :
getListOfParticipants() getListOfParticipants()
} }
override fun onDetach(view: View) {
super.onDetach(view)
eventBus.unregister(this)
}
private fun showDeleteConversationDialog() { private fun showDeleteConversationDialog() {
if (activity != null) { binding.conversationInfoName.let {
binding?.conversationInfoName?.let { val dialogBuilder = MaterialAlertDialogBuilder(it.context)
val dialogBuilder = MaterialAlertDialogBuilder(it.context) .setIcon(
.setIcon( viewThemeUtils.dialog.colorMaterialAlertDialogIcon(
viewThemeUtils.dialog.colorMaterialAlertDialogIcon( context,
context, R.drawable.ic_delete_black_24dp
R.drawable.ic_delete_black_24dp
)
) )
.setTitle(R.string.nc_delete_call)
.setMessage(R.string.nc_delete_conversation_more)
.setPositiveButton(R.string.nc_delete) { _, _ ->
deleteConversation()
}
.setNegativeButton(R.string.nc_cancel) { _, _ ->
// unused atm
}
viewThemeUtils.dialog
.colorMaterialAlertDialogBackground(it.context, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.platform.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
) )
} .setTitle(R.string.nc_delete_call)
.setMessage(R.string.nc_delete_conversation_more)
.setPositiveButton(R.string.nc_delete) { _, _ ->
deleteConversation()
}
.setNegativeButton(R.string.nc_cancel) { _, _ ->
// unused atm
}
viewThemeUtils.dialog
.colorMaterialAlertDialogBackground(it.context, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.platform.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
)
} }
} }
private fun setupAdapter() { private fun setupAdapter() {
if (activity != null) { if (adapter == null) {
if (adapter == null) { adapter = FlexibleAdapter(userItems, this, true)
adapter = FlexibleAdapter(userItems, activity, true)
}
val layoutManager = SmoothScrollLinearLayoutManager(activity)
binding?.recyclerView?.layoutManager = layoutManager
binding?.recyclerView?.setHasFixedSize(true)
binding?.recyclerView?.adapter = adapter
adapter!!.addListener(this)
} }
val layoutManager = SmoothScrollLinearLayoutManager(this)
binding.recyclerView.layoutManager = layoutManager
binding.recyclerView.setHasFixedSize(true)
binding.recyclerView.adapter = adapter
adapter!!.addListener(this)
} }
private fun handleParticipants(participants: List<Participant>) { private fun handleParticipants(participants: List<Participant>) {
@ -435,7 +461,7 @@ class ConversationInfoController(args: Bundle) :
for (i in participants.indices) { for (i in participants.indices) {
participant = participants[i] participant = participants[i]
userItem = ParticipantItem(router.activity, participant, conversationUser, viewThemeUtils) userItem = ParticipantItem(this, participant, conversationUser, viewThemeUtils)
if (participant.sessionId != null) { if (participant.sessionId != null) {
userItem.isOnline = !participant.sessionId.equals("0") userItem.isOnline = !participant.sessionId.equals("0")
} else { } else {
@ -461,18 +487,10 @@ class ConversationInfoController(args: Bundle) :
setupAdapter() setupAdapter()
binding?.participantsListCategory?.visibility = VISIBLE binding.participantsListCategory?.visibility = VISIBLE
adapter!!.updateDataSet(userItems) adapter!!.updateDataSet(userItems)
} }
override val title: String
get() =
if (hasAvatarSpacing) {
" " + resources!!.getString(R.string.nc_conversation_menu_conversation_info)
} else {
resources!!.getString(R.string.nc_conversation_menu_conversation_info)
}
private fun getListOfParticipants() { private fun getListOfParticipants() {
var apiVersion = 1 var apiVersion = 1
// FIXME Fix API checking with guests? // FIXME Fix API checking with guests?
@ -528,19 +546,20 @@ class ConversationInfoController(args: Bundle) :
bundle.putStringArrayList(BundleKeys.KEY_EXISTING_PARTICIPANTS, existingParticipantsId) bundle.putStringArrayList(BundleKeys.KEY_EXISTING_PARTICIPANTS, existingParticipantsId)
bundle.putString(BundleKeys.KEY_TOKEN, conversation!!.token) bundle.putString(BundleKeys.KEY_TOKEN, conversation!!.token)
router.pushController( // TODO fix to open Contacts
( // router.pushController(
RouterTransaction.with( // (
ContactsController(bundle) // RouterTransaction.with(
) // ContactsController(bundle)
.pushChangeHandler( // )
HorizontalChangeHandler() // .pushChangeHandler(
) // HorizontalChangeHandler()
.popChangeHandler( // )
HorizontalChangeHandler() // .popChangeHandler(
) // HorizontalChangeHandler()
) // )
) // )
// )
} }
private fun leaveConversation() { private fun leaveConversation() {
@ -551,37 +570,37 @@ class ConversationInfoController(args: Bundle) :
.java .java
).setInputData(it).build() ).setInputData(it).build()
) )
router.popToRoot()
// TODO: fix to open ConversationList
// router.popToRoot()
} }
} }
private fun showClearHistoryDialog() { private fun showClearHistoryDialog() {
if (activity != null) { binding.conversationInfoName.context.let {
binding?.conversationInfoName?.context?.let { val dialogBuilder = MaterialAlertDialogBuilder(it)
val dialogBuilder = MaterialAlertDialogBuilder(it) .setIcon(
.setIcon( viewThemeUtils.dialog.colorMaterialAlertDialogIcon(
viewThemeUtils.dialog.colorMaterialAlertDialogIcon( context,
context, R.drawable.ic_delete_black_24dp
R.drawable.ic_delete_black_24dp
)
) )
.setTitle(R.string.nc_clear_history)
.setMessage(R.string.nc_clear_history_warning)
.setPositiveButton(R.string.nc_delete_all) { _, _ ->
clearHistory()
}
.setNegativeButton(R.string.nc_cancel) { _, _ ->
// unused atm
}
viewThemeUtils.dialog
.colorMaterialAlertDialogBackground(it, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.platform.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
) )
} .setTitle(R.string.nc_clear_history)
.setMessage(R.string.nc_clear_history_warning)
.setPositiveButton(R.string.nc_delete_all) { _, _ ->
clearHistory()
}
.setNegativeButton(R.string.nc_cancel) { _, _ ->
// unused atm
}
viewThemeUtils.dialog
.colorMaterialAlertDialogBackground(it, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.platform.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
)
} }
} }
@ -590,7 +609,7 @@ class ConversationInfoController(args: Bundle) :
ncApi.clearChatHistory( ncApi.clearChatHistory(
credentials, credentials,
ApiUtils.getUrlForChat(apiVersion, conversationUser!!.baseUrl, conversationToken) ApiUtils.getUrlForChat(apiVersion, conversationUser.baseUrl, conversationToken)
) )
?.subscribeOn(Schedulers.io()) ?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread()) ?.observeOn(AndroidSchedulers.mainThread())
@ -622,7 +641,8 @@ class ConversationInfoController(args: Bundle) :
DeleteConversationWorker::class.java DeleteConversationWorker::class.java
).setInputData(it).build() ).setInputData(it).build()
) )
router.popToRoot() // TODO: fix to open ConversationList
// router.popToRoot()
} }
} }
@ -659,7 +679,7 @@ class ConversationInfoController(args: Bundle) :
binding?.clearConversationHistory?.visibility = GONE binding?.clearConversationHistory?.visibility = GONE
} }
if (isAttached && (!isBeingDestroyed || !isDestroyed)) { if (!isDestroyed) {
binding?.ownOptions?.visibility = VISIBLE binding?.ownOptions?.visibility = VISIBLE
setupWebinaryView() setupWebinaryView()
@ -706,7 +726,7 @@ class ConversationInfoController(args: Bundle) :
binding?.let { binding?.let {
GuestAccessHelper( GuestAccessHelper(
this@ConversationInfoController, this@ConversationInfoActivity,
it, it,
conversation!!, conversation!!,
conversationUser conversationUser
@ -882,7 +902,7 @@ class ConversationInfoController(args: Bundle) :
credentials, credentials,
ApiUtils.getUrlForRoomModerators( ApiUtils.getUrlForRoomModerators(
apiVersion, apiVersion,
conversationUser!!.baseUrl, conversationUser.baseUrl,
conversation!!.token conversation!!.token
), ),
participant.userId participant.userId
@ -895,7 +915,7 @@ class ConversationInfoController(args: Bundle) :
credentials, credentials,
ApiUtils.getUrlForRoomModerators( ApiUtils.getUrlForRoomModerators(
apiVersion, apiVersion,
conversationUser!!.baseUrl, conversationUser.baseUrl,
conversation!!.token conversation!!.token
), ),
participant.userId participant.userId
@ -912,7 +932,7 @@ class ConversationInfoController(args: Bundle) :
credentials, credentials,
ApiUtils.getUrlForAttendees( ApiUtils.getUrlForAttendees(
apiVersion, apiVersion,
conversationUser!!.baseUrl, conversationUser.baseUrl,
conversation!!.token conversation!!.token
), ),
participant.attendeeId participant.attendeeId
@ -944,7 +964,7 @@ class ConversationInfoController(args: Bundle) :
ncApi.removeParticipantFromConversation( ncApi.removeParticipantFromConversation(
credentials, credentials,
ApiUtils.getUrlForRemovingParticipantFromConversation( ApiUtils.getUrlForRemovingParticipantFromConversation(
conversationUser!!.baseUrl, conversationUser.baseUrl,
conversation!!.token, conversation!!.token,
true true
), ),
@ -974,7 +994,7 @@ class ConversationInfoController(args: Bundle) :
ncApi.removeParticipantFromConversation( ncApi.removeParticipantFromConversation(
credentials, credentials,
ApiUtils.getUrlForRemovingParticipantFromConversation( ApiUtils.getUrlForRemovingParticipantFromConversation(
conversationUser!!.baseUrl, conversationUser.baseUrl,
conversation!!.token, conversation!!.token,
false false
), ),
@ -1005,7 +1025,7 @@ class ConversationInfoController(args: Bundle) :
} }
override fun onItemClick(view: View?, position: Int): Boolean { override fun onItemClick(view: View?, position: Int): Boolean {
if (!conversation!!.canModerate(conversationUser!!)) { if (!conversation!!.canModerate(conversationUser)) {
return true return true
} }
@ -1022,7 +1042,7 @@ class ConversationInfoController(args: Bundle) :
context.getString(R.string.nc_attendee_pin, participant.attendeePin) context.getString(R.string.nc_attendee_pin, participant.attendeePin)
) )
) )
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show {
cornerRadius(res = R.dimen.corner_radius) cornerRadius(res = R.dimen.corner_radius)
title(text = participant.displayName) title(text = participant.displayName)
@ -1048,7 +1068,7 @@ class ConversationInfoController(args: Bundle) :
context.getString(R.string.nc_remove_group_and_members) context.getString(R.string.nc_remove_group_and_members)
) )
) )
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show {
cornerRadius(res = R.dimen.corner_radius) cornerRadius(res = R.dimen.corner_radius)
title(text = participant.displayName) title(text = participant.displayName)
@ -1068,7 +1088,7 @@ class ConversationInfoController(args: Bundle) :
context.getString(R.string.nc_remove_circle_and_members) context.getString(R.string.nc_remove_circle_and_members)
) )
) )
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show {
cornerRadius(res = R.dimen.corner_radius) cornerRadius(res = R.dimen.corner_radius)
title(text = participant.displayName) title(text = participant.displayName)
@ -1119,7 +1139,7 @@ class ConversationInfoController(args: Bundle) :
} }
if (items.isNotEmpty()) { if (items.isNotEmpty()) {
MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show {
cornerRadius(res = R.dimen.corner_radius) cornerRadius(res = R.dimen.corner_radius)
title(text = participant.displayName) title(text = participant.displayName)

View File

@ -10,7 +10,6 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.SwitchCompat
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.controllers.ConversationInfoController
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ControllerConversationInfoBinding import com.nextcloud.talk.databinding.ControllerConversationInfoBinding
import com.nextcloud.talk.databinding.DialogPasswordBinding import com.nextcloud.talk.databinding.DialogPasswordBinding
@ -24,16 +23,15 @@ import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
class GuestAccessHelper( class GuestAccessHelper(
controller: ConversationInfoController, private val activity: ConversationInfoActivity,
private val binding: ControllerConversationInfoBinding, private val binding: ControllerConversationInfoBinding,
private val conversation: Conversation, private val conversation: Conversation,
private val conversationUser: User private val conversationUser: User
) { ) {
private val activity = controller.activity!! private val conversationsRepository = activity.conversationsRepository
private val conversationsRepository = controller.conversationsRepository private val viewThemeUtils = activity.viewThemeUtils
private val viewThemeUtils = controller.viewThemeUtils private val context = activity.context
private val context = controller.context
fun setupGuestAccess() { fun setupGuestAccess() {
val guestAccessAllowSwitch = ( val guestAccessAllowSwitch = (

View File

@ -6,7 +6,7 @@
~ @author Marcel Hibbe ~ @author Marcel Hibbe
~ @author Tim Krüger ~ @author Tim Krüger
~ Copyright (C) 2022 Tim Krüger <t@timkrueger.me> ~ Copyright (C) 2022 Tim Krüger <t@timkrueger.me>
~ Copyright (C) 2022 Marcel Hibbe <dev@mhibbe.de> ~ Copyright (C) 2022-2023 Marcel Hibbe <dev@mhibbe.de>
~ Copyright (C) 2021 Andy Scherzinger <info@andy-scherzinger.de> ~ Copyright (C) 2021 Andy Scherzinger <info@andy-scherzinger.de>
~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com> ~ Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
~ ~
@ -24,13 +24,31 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>. ~ along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:apc="http://schemas.android.com/apk/res-auto" xmlns:apc="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/parent_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical">
tools:background="@color/white">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/conversation_info_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/conversation_info_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/appbar"
android:theme="?attr/actionBarPopupTheme"
app:layout_scrollFlags="scroll|enterAlways"
app:navigationIconTint="@color/fontAppbar"
app:popupTheme="@style/appActionBarPopupMenu"
app:titleTextColor="@color/fontAppbar"
tools:title="@string/nc_app_product_name" />
</com.google.android.material.appbar.AppBarLayout>
<ProgressBar <ProgressBar
android:id="@+id/progressBar" android:id="@+id/progressBar"
@ -279,4 +297,4 @@
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
</RelativeLayout> </LinearLayout>