From e359db66ecaea15f418094d42ec19404a9a6b39b Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 30 Mar 2023 14:19:00 +0200 Subject: [PATCH] ReplaceController with Activity for Contacts Signed-off-by: Marcel Hibbe --- app/src/main/AndroidManifest.xml | 4 + .../ContactsActivity.kt} | 329 +++++++++--------- .../ConversationsListController.kt | 12 +- .../info/ConversationInfoActivity.kt | 25 +- .../res/layout/controller_contacts_rv.xml | 18 + 5 files changed, 200 insertions(+), 188 deletions(-) rename app/src/main/java/com/nextcloud/talk/{controllers/ContactsController.kt => contacts/ContactsActivity.kt} (85%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9c3b87f8d..a318d1c25 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -214,6 +214,10 @@ android:name=".conversation.info.ConversationInfoActivity" android:theme="@style/AppTheme" /> + + 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 85% 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..8bff35801 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,17 @@ * 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.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 +44,12 @@ 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.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 +64,9 @@ 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.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 +76,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 +85,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 +120,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 +151,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 +184,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 +372,16 @@ 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: fix to open chat (go via MainActivity and open RemapChat... if conductor is still used) + + // ConductorRemapping.remapChatController( + // router, + // currentUser!!.id!!, + // roomOverall.ocs!!.data!!.token!!, + // bundle, + // true + // ) } 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,43 +750,26 @@ 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 - ) + // TODO: fix to open chat + // ConductorRemapping.remapChatController( + // router, + // currentUser!!.id!!, + // openConversationEvent.conversation!!.token!!, + // openConversationEvent.bundle!!, + // true + // ) contactsBottomDialog?.dismiss() } - override fun onDetach(view: View) { - super.onDetach(view) - eventBus.unregister(this) - } - override fun onItemClick(view: View, position: Int): Boolean { if (adapter?.getItem(position) is ContactItem) { if (!isNewConversationView && !isAddingParticipantsView) { @@ -812,23 +829,23 @@ 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: fix to open chat + // ConductorRemapping.remapChatController( + // router, + // currentUser!!.id!!, + // roomOverall.ocs!!.data!!.token!!, + // bundle, + // true + // ) } override fun onError(e: Throwable) { 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/conversation/info/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt index 58c10d32d..be6bb5b74 100644 --- a/app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt @@ -97,7 +97,7 @@ import java.util.Locale import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) -class ConversationInfoActivity() : +class ConversationInfoActivity : BaseActivity(), FlexibleAdapter.OnItemClickListener { @@ -214,29 +214,6 @@ class ConversationInfoActivity() : ) } - // 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() { binding.run { listOf( 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 @@ --> + + + +