diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f2df4623c..a318d1c25 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -210,6 +210,14 @@ android:name=".settings.SettingsActivity" android:theme="@style/AppTheme" /> + + + + diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 8375c2623..70e2bb568 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -93,6 +93,19 @@ class MainActivity : BaseActivity(), ActionBarProvider { router = Conductor.attachRouter(this, binding.controllerContainer, savedInstanceState) + if (intent.getBooleanExtra(BundleKeys.KEY_OPEN_CHAT, false)) { + logRouterBackStack(router!!) + remapChatController( + router!!, + intent.getParcelableExtra(KEY_USER_ENTITY)!!.id!!, + intent.getStringExtra(KEY_ROOM_TOKEN)!!, + intent.extras!!, + true, + true + ) + logRouterBackStack(router!!) + } + if (intent.hasExtra(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL)) { onNewIntent(intent) } else if (!router!!.hasRootController()) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt b/app/src/main/java/com/nextcloud/talk/contacts/ContactsActivity.kt similarity index 84% rename from app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt rename to app/src/main/java/com/nextcloud/talk/contacts/ContactsActivity.kt index 9820c2cbf..74c128dde 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt +++ b/app/src/main/java/com/nextcloud/talk/contacts/ContactsActivity.kt @@ -21,17 +21,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.nextcloud.talk.controllers +package com.nextcloud.talk.contacts import android.app.SearchManager import android.content.Context +import android.content.Intent import android.graphics.PorterDuff +import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle import android.text.InputType import android.util.Log import android.view.Menu -import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.inputmethod.EditorInfo @@ -44,14 +45,13 @@ import androidx.work.WorkManager import autodagger.AutoInjector import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.R +import com.nextcloud.talk.activities.BaseActivity +import com.nextcloud.talk.activities.MainActivity import com.nextcloud.talk.adapters.items.ContactItem import com.nextcloud.talk.adapters.items.GenericTextHeaderItem import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication -import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication -import com.nextcloud.talk.controllers.base.BaseController import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum -import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ControllerContactsRvBinding import com.nextcloud.talk.events.OpenConversationEvent @@ -66,9 +66,10 @@ import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.ui.dialog.ContactsBottomDialog import com.nextcloud.talk.users.UserManager import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_OPEN_CHAT import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew -import com.nextcloud.talk.utils.remapchat.ConductorRemapping import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.SelectableAdapter import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager @@ -78,7 +79,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody -import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.parceler.Parcels @@ -88,18 +88,15 @@ import java.util.Locale import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) -class ContactsController(args: Bundle) : - BaseController(R.layout.controller_contacts_rv), +class ContactsActivity : + BaseActivity(), SearchView.OnQueryTextListener, FlexibleAdapter.OnItemClickListener { - private val binding: ControllerContactsRvBinding? by viewBinding(ControllerContactsRvBinding::bind) + private lateinit var binding: ControllerContactsRvBinding @Inject lateinit var userManager: UserManager - @Inject - lateinit var eventBus: EventBus - @Inject lateinit var ncApi: NcApi @@ -126,18 +123,29 @@ class ContactsController(args: Bundle) : private var conversationToken: String? = null private var contactsBottomDialog: ContactsBottomDialog? = null - init { - setHasOptionsMenu(true) - sharedApplication!!.componentApplication.inject(this) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) + + binding = ControllerContactsRvBinding.inflate(layoutInflater) + setupActionBar() + setupSystemColors() + setContentView(binding.root) + + if (savedInstanceState != null) { + if (adapter != null) { + adapter?.onRestoreInstanceState(savedInstanceState) + } + } existingParticipants = ArrayList() - if (args.containsKey(BundleKeys.KEY_NEW_CONVERSATION)) { + if (intent.hasExtra(BundleKeys.KEY_NEW_CONVERSATION)) { isNewConversationView = true - } else if (args.containsKey(BundleKeys.KEY_ADD_PARTICIPANTS)) { + } else if (intent.hasExtra(BundleKeys.KEY_ADD_PARTICIPANTS)) { isAddingParticipantsView = true - conversationToken = args.getString(BundleKeys.KEY_TOKEN) - if (args.containsKey(BundleKeys.KEY_EXISTING_PARTICIPANTS)) { - existingParticipants = args.getStringArrayList(BundleKeys.KEY_EXISTING_PARTICIPANTS) + conversationToken = intent.getStringExtra(BundleKeys.KEY_TOKEN) + if (intent.hasExtra(BundleKeys.KEY_EXISTING_PARTICIPANTS)) { + existingParticipants = intent.getStringArrayListExtra(BundleKeys.KEY_EXISTING_PARTICIPANTS) } } selectedUserIds = HashSet() @@ -146,34 +154,31 @@ class ContactsController(args: Bundle) : selectedCircleIds = HashSet() } - override fun onAttach(view: View) { - super.onAttach(view) - eventBus.register(this) + override fun onResume() { + super.onResume() + if (isNewConversationView) { toggleConversationPrivacyLayout(!isPublicCall) } if (isAddingParticipantsView) { - binding?.joinConversationViaLink?.joinConversationViaLinkRelativeLayout?.visibility = View.GONE - binding?.conversationPrivacyToggle?.callHeaderLayout?.visibility = View.GONE + binding.joinConversationViaLink.joinConversationViaLinkRelativeLayout.visibility = View.GONE + binding.conversationPrivacyToggle.callHeaderLayout.visibility = View.GONE } else { - binding?.joinConversationViaLink?.joinConversationViaLinkRelativeLayout?.setOnClickListener { + binding.joinConversationViaLink.joinConversationViaLinkRelativeLayout.setOnClickListener { joinConversationViaLink() } - binding?.conversationPrivacyToggle?.callHeaderLayout?.setOnClickListener { + binding.conversationPrivacyToggle.callHeaderLayout.setOnClickListener { toggleCallHeader() } } - } - override fun onViewBound(view: View) { - super.onViewBound(view) currentUser = userManager.currentUser.blockingGet() if (currentUser != null) { credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token) } if (adapter == null) { contactItems = ArrayList>() - adapter = FlexibleAdapter(contactItems, activity, false) + adapter = FlexibleAdapter(contactItems, this, false) if (currentUser != null) { fetchData() } @@ -182,6 +187,91 @@ class ContactsController(args: Bundle) : prepareViews() } + private fun setupActionBar() { + setSupportActionBar(binding.contactsToolbar) + binding.contactsToolbar.setNavigationOnClickListener { + onBackPressed() + } + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent))) + supportActionBar?.title = when { + isAddingParticipantsView -> { + resources!!.getString(R.string.nc_add_participants) + } + isNewConversationView -> { + resources!!.getString(R.string.nc_select_participants) + } + else -> { + resources!!.getString(R.string.nc_app_product_name) + } + } + } + + 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 onSaveInstanceState(bundle: Bundle) { + super.onSaveInstanceState(bundle) + adapter?.onSaveInstanceState(bundle) + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + super.onCreateOptionsMenu(menu) + menuInflater.inflate(R.menu.menu_contacts, menu) + searchItem = menu.findItem(R.id.action_search) + doneMenuItem = menu.findItem(R.id.contacts_selection_done) + initSearchView() + return true + } + + override fun onPrepareOptionsMenu(menu: Menu): Boolean { + super.onPrepareOptionsMenu(menu) + if (searchItem != null) { + binding?.titleTextView?.let { + viewThemeUtils.platform.colorToolbarMenuIcon( + it.context, + searchItem!! + ) + } + } + + checkAndHandleDoneMenuItem() + if (adapter?.hasFilter() == true) { + searchItem!!.expandActionView() + searchView!!.setQuery(adapter!!.getFilter(String::class.java) as CharSequence, false) + } + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.home -> { + finish() + true + } + R.id.contacts_selection_done -> { + selectionDone() + true + } + else -> { + super.onOptionsItemSelected(item) + } + } + } + private fun setupAdapter() { adapter?.setNotifyChangeOfUnfilteredItems(true)?.mode = SelectableAdapter.Mode.MULTI adapter?.setStickyHeaderElevation(HEADER_ELEVATION) @@ -285,13 +375,13 @@ class ContactsController(args: Bundle) : BundleKeys.KEY_ACTIVE_CONVERSATION, Parcels.wrap(roomOverall.ocs!!.data!!) ) - ConductorRemapping.remapChatController( - router, - currentUser!!.id!!, - roomOverall.ocs!!.data!!.token!!, - bundle, - true - ) + + // TODO: go directly to ChatActivity when conductor is removed + bundle.putBoolean(KEY_OPEN_CHAT, true) + val intent = Intent(context, MainActivity::class.java) + intent.putExtras(bundle) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) } override fun onError(e: Throwable) { @@ -330,72 +420,28 @@ class ContactsController(args: Bundle) : AddParticipantsToConversation::class.java ).setInputData(data.build()).build() WorkManager.getInstance().enqueue(addParticipantsToConversationWorker) - router.popCurrentController() + finish() } private fun initSearchView() { - if (activity != null) { - val searchManager: SearchManager? = activity?.getSystemService(Context.SEARCH_SERVICE) as SearchManager? - if (searchItem != null) { - searchView = MenuItemCompat.getActionView(searchItem) as SearchView - viewThemeUtils.talk.themeSearchView(searchView!!) - searchView!!.maxWidth = Int.MAX_VALUE - searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER - var imeOptions: Int = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && - appPreferences?.isKeyboardIncognito == true - ) { - imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING - } - searchView!!.imeOptions = imeOptions - searchView!!.queryHint = resources!!.getString(R.string.nc_search) - if (searchManager != null) { - searchView!!.setSearchableInfo(searchManager.getSearchableInfo(activity?.componentName)) - } - searchView!!.setOnQueryTextListener(this) - } - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.home -> { - router.popCurrentController() - } - R.id.contacts_selection_done -> { - selectionDone() - true - } - else -> { - super.onOptionsItemSelected(item) - } - } - } - - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - super.onCreateOptionsMenu(menu, inflater) - inflater.inflate(R.menu.menu_contacts, menu) - searchItem = menu.findItem(R.id.action_search) - doneMenuItem = menu.findItem(R.id.contacts_selection_done) - initSearchView() - } - - override fun onPrepareOptionsMenu(menu: Menu) { - super.onPrepareOptionsMenu(menu) - + val searchManager: SearchManager? = getSystemService(Context.SEARCH_SERVICE) as SearchManager? if (searchItem != null) { - binding?.titleTextView?.let { - viewThemeUtils.platform.colorToolbarMenuIcon( - it.context, - searchItem!! - ) + searchView = MenuItemCompat.getActionView(searchItem) as SearchView + viewThemeUtils.talk.themeSearchView(searchView!!) + searchView!!.maxWidth = Int.MAX_VALUE + searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER + var imeOptions: Int = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && + appPreferences?.isKeyboardIncognito == true + ) { + imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING } - } - - checkAndHandleDoneMenuItem() - if (adapter?.hasFilter() == true) { - searchItem!!.expandActionView() - searchView!!.setQuery(adapter!!.getFilter(String::class.java) as CharSequence, false) + searchView!!.imeOptions = imeOptions + searchView!!.queryHint = resources!!.getString(R.string.nc_search) + if (searchManager != null) { + searchView!!.setSearchableInfo(searchManager.getSearchableInfo(componentName)) + } + searchView!!.setOnQueryTextListener(this) } } @@ -626,7 +672,7 @@ class ContactsController(args: Bundle) : } private fun prepareViews() { - layoutManager = SmoothScrollLinearLayoutManager(activity) + layoutManager = SmoothScrollLinearLayoutManager(this) binding?.controllerGenericRv?.recyclerView?.layoutManager = layoutManager binding?.controllerGenericRv?.recyclerView?.setHasFixedSize(true) binding?.controllerGenericRv?.recyclerView?.adapter = adapter @@ -671,18 +717,6 @@ class ContactsController(args: Bundle) : } } - override fun onSaveViewState(view: View, outState: Bundle) { - adapter?.onSaveInstanceState(outState) - super.onSaveViewState(view, outState) - } - - override fun onRestoreViewState(view: View, savedViewState: Bundle) { - super.onRestoreViewState(view, savedViewState) - if (adapter != null) { - adapter?.onRestoreInstanceState(savedViewState) - } - } - override fun onDestroy() { super.onDestroy() dispose(null) @@ -716,41 +750,33 @@ class ContactsController(args: Bundle) : } } - override val title: String - get() = when { - isAddingParticipantsView -> { - resources!!.getString(R.string.nc_add_participants) - } - isNewConversationView -> { - resources!!.getString(R.string.nc_select_participants) - } - else -> { - resources!!.getString(R.string.nc_app_product_name) - } - } - private fun prepareAndShowBottomSheetWithBundle(bundle: Bundle) { // 11: create conversation-enter name for new conversation // 10: get&join room when enter link - contactsBottomDialog = ContactsBottomDialog(activity!!, bundle) + contactsBottomDialog = ContactsBottomDialog(this, bundle) contactsBottomDialog?.show() } @Subscribe(threadMode = ThreadMode.MAIN) fun onMessageEvent(openConversationEvent: OpenConversationEvent) { - ConductorRemapping.remapChatController( - router, - currentUser!!.id!!, - openConversationEvent.conversation!!.token!!, - openConversationEvent.bundle!!, - true - ) - contactsBottomDialog?.dismiss() - } + // ConductorRemapping.remapChatController( + // router, + // currentUser!!.id!!, + // openConversationEvent.conversation!!.token!!, + // openConversationEvent.bundle!!, + // true + // ) - override fun onDetach(view: View) { - super.onDetach(view) - eventBus.unregister(this) + // TODO: go directly to ChatActivity when conductor is removed + + var bundle = openConversationEvent.bundle!! + + bundle.putBoolean(KEY_OPEN_CHAT, true) + val intent = Intent(context, MainActivity::class.java) + intent.putExtras(bundle) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) + contactsBottomDialog?.dismiss() } override fun onItemClick(view: View, position: Int): Boolean { @@ -812,23 +838,21 @@ class ContactsController(args: Bundle) : } override fun onNext(roomOverall: RoomOverall) { - if (activity != null) { - val bundle = Bundle() - bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, currentUser) - bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomOverall.ocs!!.data!!.token) - bundle.putString(BundleKeys.KEY_ROOM_ID, roomOverall.ocs!!.data!!.roomId) - bundle.putParcelable( - BundleKeys.KEY_ACTIVE_CONVERSATION, - Parcels.wrap(roomOverall.ocs!!.data!!) - ) - ConductorRemapping.remapChatController( - router, - currentUser!!.id!!, - roomOverall.ocs!!.data!!.token!!, - bundle, - true - ) - } + val bundle = Bundle() + bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, currentUser) + bundle.putString(BundleKeys.KEY_ROOM_TOKEN, roomOverall.ocs!!.data!!.token) + bundle.putString(BundleKeys.KEY_ROOM_ID, roomOverall.ocs!!.data!!.roomId) + bundle.putParcelable( + BundleKeys.KEY_ACTIVE_CONVERSATION, + Parcels.wrap(roomOverall.ocs!!.data!!) + ) + + // TODO: go directly to ChatActivity when conductor is removed + bundle.putBoolean(KEY_OPEN_CHAT, true) + val intent = Intent(context, MainActivity::class.java) + intent.putExtras(bundle) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) } override fun onError(e: Throwable) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index c42dbbaa1..4fa5c195d 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -126,6 +126,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.callbacks.MentionAutocompleteCallback import com.nextcloud.talk.controllers.base.BaseController 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.databinding.ControllerChatBinding import com.nextcloud.talk.events.UserMentionClickEvent @@ -1778,11 +1779,10 @@ class ChatController(args: Bundle) : bundle.putParcelable(BundleKeys.KEY_USER_ENTITY, conversationUser) bundle.putString(KEY_ROOM_TOKEN, roomToken) bundle.putBoolean(BundleKeys.KEY_ROOM_ONE_TO_ONE, isOneToOneConversation()) - router.pushController( - RouterTransaction.with(ConversationInfoController(bundle)) - .pushChangeHandler(HorizontalChangeHandler()) - .popChangeHandler(HorizontalChangeHandler()) - ) + + val intent = Intent(activity, ConversationInfoActivity::class.java) + intent.putExtras(bundle) + activity!!.startActivity(intent) } private fun setupMentionAutocomplete() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt index 811e58202..4bc0dad35 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt @@ -61,7 +61,6 @@ import coil.request.ImageRequest import coil.target.Target import coil.transform.CircleCropTransformation import com.bluelinelabs.conductor.RouterTransaction -import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -76,6 +75,7 @@ import com.nextcloud.talk.adapters.items.MessagesTextHeaderItem import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication +import com.nextcloud.talk.contacts.ContactsActivity import com.nextcloud.talk.controllers.base.BaseController import com.nextcloud.talk.controllers.util.viewBinding import com.nextcloud.talk.data.user.model.User @@ -767,13 +767,9 @@ class ConversationsListController(bundle: Bundle) : conversation.type === Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL private fun showNewConversationsScreen() { - val bundle = Bundle() - bundle.putBoolean(KEY_NEW_CONVERSATION, true) - router.pushController( - RouterTransaction.with(ContactsController(bundle)) - .pushChangeHandler(HorizontalChangeHandler()) - .popChangeHandler(HorizontalChangeHandler()) - ) + val intent = Intent(context, ContactsActivity::class.java) + intent.putExtra(KEY_NEW_CONVERSATION, true) + startActivity(intent) } private fun dispose(disposable: Disposable?) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt similarity index 82% rename from app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt rename to app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt index 701a644c8..b6ba4e223 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt @@ -5,7 +5,7 @@ * @author Andy Scherzinger * @author Tim Krüger * @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 * Copyright (C) 2021 Andy Scherzinger (info@andy-scherzinger.de) * Copyright (C) 2017-2018 Mario Danic @@ -24,21 +24,22 @@ * along with this program. If not, see . */ -package com.nextcloud.talk.controllers +package com.nextcloud.talk.conversation.info import android.annotation.SuppressLint import android.content.Intent +import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.os.Parcelable import android.text.TextUtils import android.util.Log -import android.view.MenuItem import android.view.View import android.view.View.GONE import android.view.View.VISIBLE import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.SwitchCompat +import androidx.core.content.res.ResourcesCompat import androidx.work.Data import androidx.work.OneTimeWorkRequest import androidx.work.WorkManager @@ -47,18 +48,16 @@ import com.afollestad.materialdialogs.LayoutMode.WRAP_CONTENT import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet 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.nextcloud.talk.R +import com.nextcloud.talk.activities.BaseActivity +import com.nextcloud.talk.activities.MainActivity import com.nextcloud.talk.adapters.items.ParticipantItem import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication -import com.nextcloud.talk.controllers.base.BaseController +import com.nextcloud.talk.contacts.ContactsActivity import com.nextcloud.talk.controllers.bottomsheet.items.BasicListItemWithImage 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.databinding.ControllerConversationInfoBinding import com.nextcloud.talk.events.EventStatus @@ -82,6 +81,7 @@ import com.nextcloud.talk.shareditems.activities.SharedItemsActivity import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateConstants import com.nextcloud.talk.utils.DateUtils +import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.bundle.BundleKeys import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule @@ -91,7 +91,6 @@ import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import java.util.Calendar @@ -100,14 +99,11 @@ import java.util.Locale import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) -class ConversationInfoController(args: Bundle) : - BaseController( - R.layout.controller_conversation_info, - args - ), +class ConversationInfoActivity : + BaseActivity(), FlexibleAdapter.OnItemClickListener { - private val binding: ControllerConversationInfoBinding? by viewBinding(ControllerConversationInfoBinding::bind) + private lateinit var binding: ControllerConversationInfoBinding @Inject lateinit var ncApi: NcApi @@ -115,16 +111,13 @@ class ConversationInfoController(args: Bundle) : @Inject lateinit var conversationsRepository: ConversationsRepository - @Inject - lateinit var eventBus: EventBus - @Inject lateinit var dateUtils: DateUtils - private val conversationToken: String? - private val conversationUser: User? - private val hasAvatarSpacing: Boolean - private val credentials: String? + private lateinit var conversationToken: String + private lateinit var conversationUser: User + private var hasAvatarSpacing: Boolean = false + private lateinit var credentials: String private var roomDisposable: Disposable? = null private var participantsDisposable: Disposable? = null @@ -146,68 +139,97 @@ class ConversationInfoController(args: Bundle) : return null } - init { - setHasOptionsMenu(true) - NextcloudTalkApplication.sharedApplication?.componentApplication?.inject(this) - conversationUser = args.getParcelable(BundleKeys.KEY_USER_ENTITY) - conversationToken = args.getString(BundleKeys.KEY_ROOM_TOKEN) - hasAvatarSpacing = args.getBoolean(BundleKeys.KEY_ROOM_ONE_TO_ONE, false) - credentials = ApiUtils.getCredentials(conversationUser!!.username, conversationUser.token) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) + + binding = ControllerConversationInfoBinding.inflate(layoutInflater) + setupActionBar() + 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 { - when (item.itemId) { - android.R.id.home -> { - router.popCurrentController() - return true - } - else -> return super.onOptionsItemSelected(item) - } - } - - override fun onAttach(view: View) { - super.onAttach(view) - eventBus.register(this) + override fun onResume() { + super.onResume() if (databaseStorageModule == null) { - databaseStorageModule = DatabaseStorageModule(conversationUser!!, conversationToken) + databaseStorageModule = DatabaseStorageModule(conversationUser, conversationToken) } - binding?.notificationSettingsView?.notificationSettings?.setStorageModule(databaseStorageModule) - binding?.webinarInfoView?.webinarSettings?.setStorageModule(databaseStorageModule) - binding?.guestAccessView?.guestAccessSettings?.setStorageModule(databaseStorageModule) + binding.notificationSettingsView.notificationSettings.setStorageModule(databaseStorageModule) + binding.webinarInfoView.webinarSettings.setStorageModule(databaseStorageModule) + binding.guestAccessView.guestAccessSettings.setStorageModule(databaseStorageModule) - binding?.deleteConversationAction?.setOnClickListener { showDeleteConversationDialog() } - binding?.leaveConversationAction?.setOnClickListener { leaveConversation() } - binding?.clearConversationHistory?.setOnClickListener { showClearHistoryDialog() } - binding?.addParticipantsAction?.setOnClickListener { addParticipants() } + binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog() } + binding.leaveConversationAction.setOnClickListener { leaveConversation() } + binding.clearConversationHistory.setOnClickListener { showClearHistoryDialog() } + binding.addParticipantsAction.setOnClickListener { addParticipants() } if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "rich-object-list-media")) { - binding?.showSharedItemsAction?.setOnClickListener { showSharedItems() } + binding.showSharedItemsAction.setOnClickListener { showSharedItems() } } else { - binding?.categorySharedItems?.visibility = GONE + binding.categorySharedItems.visibility = GONE } fetchRoomInfo() themeCategories() 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) + ) } private fun themeSwitchPreferences() { - binding?.run { + binding.run { listOf( - binding?.webinarInfoView?.conversationInfoLobby!!, - binding?.notificationSettingsView?.callNotifications!!, - binding?.notificationSettingsView?.conversationInfoPriorityConversation!!, - binding?.guestAccessView?.guestAccessAllowSwitch!!, - binding?.guestAccessView?.guestAccessPasswordSwitch!! + binding.webinarInfoView.conversationInfoLobby, + binding.notificationSettingsView.callNotifications, + binding.notificationSettingsView.conversationInfoPriorityConversation, + binding.guestAccessView.guestAccessAllowSwitch, + binding.guestAccessView.guestAccessPasswordSwitch ).forEach(viewThemeUtils.talk::colorSwitchPreference) } } private fun themeCategories() { - binding?.run { + binding.run { listOf( conversationInfoName, conversationDescription, @@ -216,30 +238,22 @@ class ConversationInfoController(args: Bundle) : ownOptions, categorySharedItems, categoryConversationSettings, - binding?.guestAccessView?.guestAccessCategory!!, - binding?.webinarInfoView?.conversationInfoWebinar!!, - binding?.notificationSettingsView?.notificationSettingsCategory!! + binding.guestAccessView.guestAccessCategory, + binding.webinarInfoView.conversationInfoWebinar, + binding.notificationSettingsView.notificationSettingsCategory ).forEach(viewThemeUtils.talk::colorPreferenceCategory) } } 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_CLEAR_TOP) intent.putExtra(BundleKeys.KEY_CONVERSATION_NAME, conversation?.displayName) intent.putExtra(BundleKeys.KEY_ROOM_TOKEN, conversationToken) intent.putExtra(BundleKeys.KEY_USER_ENTITY, conversationUser as Parcelable) intent.putExtra(SharedItemsActivity.KEY_USER_IS_OWNER_OR_MODERATOR, conversation?.isParticipantOwnerOrModerator) - activity!!.startActivity(intent) - } - - override fun onViewBound(view: View) { - super.onViewBound(view) - - binding?.addParticipantsAction?.visibility = GONE - - binding?.progressBar?.let { viewThemeUtils.platform.colorCircularProgressBar(it) } + startActivity(intent) } private fun setupWebinaryView() { @@ -257,7 +271,7 @@ class ConversationInfoController(args: Bundle) : reconfigureLobbyTimerView() binding?.webinarInfoView?.startTimePreferences?.setOnClickListener { - MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { + MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show { val currentTimeCalendar = Calendar.getInstance() if (conversation!!.lobbyTimer != null && conversation!!.lobbyTimer != 0L) { currentTimeCalendar.timeInMillis = conversation!!.lobbyTimer!! * DateConstants.SECOND_DIVIDER @@ -345,7 +359,7 @@ class ConversationInfoController(args: Bundle) : val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) ncApi.setLobbyForConversation( - ApiUtils.getCredentials(conversationUser!!.username, conversationUser.token), + ApiUtils.getCredentials(conversationUser.username, conversationUser.token), ApiUtils.getUrlForRoomWebinaryLobby(apiVersion, conversationUser.baseUrl, conversation!!.token), state, conversation!!.lobbyTimer @@ -376,54 +390,45 @@ class ConversationInfoController(args: Bundle) : getListOfParticipants() } - override fun onDetach(view: View) { - super.onDetach(view) - eventBus.unregister(this) - } - private fun showDeleteConversationDialog() { - if (activity != null) { - binding?.conversationInfoName?.let { - val dialogBuilder = MaterialAlertDialogBuilder(it.context) - .setIcon( - viewThemeUtils.dialog.colorMaterialAlertDialogIcon( - context, - R.drawable.ic_delete_black_24dp - ) + binding.conversationInfoName.let { + val dialogBuilder = MaterialAlertDialogBuilder(it.context) + .setIcon( + viewThemeUtils.dialog.colorMaterialAlertDialogIcon( + context, + 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() { - if (activity != null) { - if (adapter == null) { - adapter = FlexibleAdapter(userItems, activity, true) - } - - val layoutManager = SmoothScrollLinearLayoutManager(activity) - binding?.recyclerView?.layoutManager = layoutManager - binding?.recyclerView?.setHasFixedSize(true) - binding?.recyclerView?.adapter = adapter - - adapter!!.addListener(this) + if (adapter == null) { + adapter = FlexibleAdapter(userItems, this, true) } + + val layoutManager = SmoothScrollLinearLayoutManager(this) + binding.recyclerView.layoutManager = layoutManager + binding.recyclerView.setHasFixedSize(true) + binding.recyclerView.adapter = adapter + binding.recyclerView.isNestedScrollingEnabled = false + adapter!!.addListener(this) } private fun handleParticipants(participants: List) { @@ -435,7 +440,7 @@ class ConversationInfoController(args: Bundle) : for (i in participants.indices) { participant = participants[i] - userItem = ParticipantItem(router.activity, participant, conversationUser, viewThemeUtils) + userItem = ParticipantItem(this, participant, conversationUser, viewThemeUtils) if (participant.sessionId != null) { userItem.isOnline = !participant.sessionId.equals("0") } else { @@ -461,18 +466,10 @@ class ConversationInfoController(args: Bundle) : setupAdapter() - binding?.participantsListCategory?.visibility = VISIBLE + binding.participantsListCategory?.visibility = VISIBLE 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() { var apiVersion = 1 // FIXME Fix API checking with guests? @@ -528,19 +525,9 @@ class ConversationInfoController(args: Bundle) : bundle.putStringArrayList(BundleKeys.KEY_EXISTING_PARTICIPANTS, existingParticipantsId) bundle.putString(BundleKeys.KEY_TOKEN, conversation!!.token) - router.pushController( - ( - RouterTransaction.with( - ContactsController(bundle) - ) - .pushChangeHandler( - HorizontalChangeHandler() - ) - .popChangeHandler( - HorizontalChangeHandler() - ) - ) - ) + val intent = Intent(this, ContactsActivity::class.java) + intent.putExtras(bundle) + startActivity(intent) } private fun leaveConversation() { @@ -551,37 +538,38 @@ class ConversationInfoController(args: Bundle) : .java ).setInputData(it).build() ) - router.popToRoot() + + val intent = Intent(context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) } } private fun showClearHistoryDialog() { - if (activity != null) { - binding?.conversationInfoName?.context?.let { - val dialogBuilder = MaterialAlertDialogBuilder(it) - .setIcon( - viewThemeUtils.dialog.colorMaterialAlertDialogIcon( - context, - R.drawable.ic_delete_black_24dp - ) + binding.conversationInfoName.context.let { + val dialogBuilder = MaterialAlertDialogBuilder(it) + .setIcon( + viewThemeUtils.dialog.colorMaterialAlertDialogIcon( + context, + 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 +578,7 @@ class ConversationInfoController(args: Bundle) : ncApi.clearChatHistory( credentials, - ApiUtils.getUrlForChat(apiVersion, conversationUser!!.baseUrl, conversationToken) + ApiUtils.getUrlForChat(apiVersion, conversationUser.baseUrl, conversationToken) ) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread()) @@ -622,7 +610,9 @@ class ConversationInfoController(args: Bundle) : DeleteConversationWorker::class.java ).setInputData(it).build() ) - router.popToRoot() + val intent = Intent(context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) } } @@ -659,7 +649,7 @@ class ConversationInfoController(args: Bundle) : binding?.clearConversationHistory?.visibility = GONE } - if (isAttached && (!isBeingDestroyed || !isDestroyed)) { + if (!isDestroyed) { binding?.ownOptions?.visibility = VISIBLE setupWebinaryView() @@ -706,7 +696,7 @@ class ConversationInfoController(args: Bundle) : binding?.let { GuestAccessHelper( - this@ConversationInfoController, + this@ConversationInfoActivity, it, conversation!!, conversationUser @@ -882,7 +872,7 @@ class ConversationInfoController(args: Bundle) : credentials, ApiUtils.getUrlForRoomModerators( apiVersion, - conversationUser!!.baseUrl, + conversationUser.baseUrl, conversation!!.token ), participant.userId @@ -895,7 +885,7 @@ class ConversationInfoController(args: Bundle) : credentials, ApiUtils.getUrlForRoomModerators( apiVersion, - conversationUser!!.baseUrl, + conversationUser.baseUrl, conversation!!.token ), participant.userId @@ -912,7 +902,7 @@ class ConversationInfoController(args: Bundle) : credentials, ApiUtils.getUrlForAttendees( apiVersion, - conversationUser!!.baseUrl, + conversationUser.baseUrl, conversation!!.token ), participant.attendeeId @@ -944,7 +934,7 @@ class ConversationInfoController(args: Bundle) : ncApi.removeParticipantFromConversation( credentials, ApiUtils.getUrlForRemovingParticipantFromConversation( - conversationUser!!.baseUrl, + conversationUser.baseUrl, conversation!!.token, true ), @@ -974,7 +964,7 @@ class ConversationInfoController(args: Bundle) : ncApi.removeParticipantFromConversation( credentials, ApiUtils.getUrlForRemovingParticipantFromConversation( - conversationUser!!.baseUrl, + conversationUser.baseUrl, conversation!!.token, false ), @@ -1005,7 +995,7 @@ class ConversationInfoController(args: Bundle) : } override fun onItemClick(view: View?, position: Int): Boolean { - if (!conversation!!.canModerate(conversationUser!!)) { + if (!conversation!!.canModerate(conversationUser)) { return true } @@ -1022,7 +1012,7 @@ class ConversationInfoController(args: Bundle) : 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) title(text = participant.displayName) @@ -1048,7 +1038,7 @@ class ConversationInfoController(args: Bundle) : 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) title(text = participant.displayName) @@ -1068,7 +1058,7 @@ class ConversationInfoController(args: Bundle) : 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) title(text = participant.displayName) @@ -1119,7 +1109,7 @@ class ConversationInfoController(args: Bundle) : } if (items.isNotEmpty()) { - MaterialDialog(activity!!, BottomSheet(WRAP_CONTENT)).show { + MaterialDialog(this, BottomSheet(WRAP_CONTENT)).show { cornerRadius(res = R.dimen.corner_radius) title(text = participant.displayName) diff --git a/app/src/main/java/com/nextcloud/talk/conversation/info/GuestAccessHelper.kt b/app/src/main/java/com/nextcloud/talk/conversation/info/GuestAccessHelper.kt index c82d524c9..a1eefd704 100644 --- a/app/src/main/java/com/nextcloud/talk/conversation/info/GuestAccessHelper.kt +++ b/app/src/main/java/com/nextcloud/talk/conversation/info/GuestAccessHelper.kt @@ -10,7 +10,6 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.SwitchCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.R -import com.nextcloud.talk.controllers.ConversationInfoController import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ControllerConversationInfoBinding import com.nextcloud.talk.databinding.DialogPasswordBinding @@ -24,16 +23,15 @@ import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers class GuestAccessHelper( - controller: ConversationInfoController, + private val activity: ConversationInfoActivity, private val binding: ControllerConversationInfoBinding, private val conversation: Conversation, private val conversationUser: User ) { - private val activity = controller.activity!! - private val conversationsRepository = controller.conversationsRepository - private val viewThemeUtils = controller.viewThemeUtils - private val context = controller.context + private val conversationsRepository = activity.conversationsRepository + private val viewThemeUtils = activity.viewThemeUtils + private val context = activity.context fun setupGuestAccess() { val guestAccessAllowSwitch = ( diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index 4b643b1ed..611a1093c 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -86,4 +86,5 @@ object BundleKeys { const val KEY_DISMISS_RECORDING_URL = "KEY_DISMISS_RECORDING_URL" const val KEY_SHARE_RECORDING_TO_CHAT_URL = "KEY_SHARE_RECORDING_TO_CHAT_URL" const val KEY_GEOCODING_RESULT = "KEY_GEOCODING_RESULT" + const val KEY_OPEN_CHAT = "KEY_OPEN_CHAT" // just temporarily used until conductor is deleted } diff --git a/app/src/main/res/layout/controller_contacts_rv.xml b/app/src/main/res/layout/controller_contacts_rv.xml index 5975135ff..2c2514a4d 100644 --- a/app/src/main/res/layout/controller_contacts_rv.xml +++ b/app/src/main/res/layout/controller_contacts_rv.xml @@ -19,11 +19,29 @@ --> + + + + - ~ Copyright (C) 2022 Marcel Hibbe + ~ Copyright (C) 2022-2023 Marcel Hibbe ~ Copyright (C) 2021 Andy Scherzinger ~ Copyright (C) 2017-2018 Mario Danic ~ @@ -24,13 +24,31 @@ ~ along with this program. If not, see . --> - + android:orientation="vertical"> + + + + - +