@@ -8,145 +8,71 @@ package com.nextcloud.talk.openconversations
88
99import android.content.Intent
1010import android.os.Bundle
11- import android.view.View
12- import androidx.core.graphics.drawable.toDrawable
13- import androidx.core.widget.doOnTextChanged
11+ import androidx.activity.compose.setContent
12+ import androidx.compose.material3.MaterialTheme
13+ import androidx.compose.runtime.getValue
1414import androidx.lifecycle.ViewModelProvider
15+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
1516import autodagger.AutoInjector
16- import com.google.android.material.snackbar.Snackbar
17- import com.nextcloud.android.common.ui.theme.utils.ColorRole
18- import com.nextcloud.talk.R
1917import com.nextcloud.talk.activities.BaseActivity
20- import com.nextcloud.talk.api.NcApi
2118import com.nextcloud.talk.application.NextcloudTalkApplication
2219import com.nextcloud.talk.chat.ChatActivity
23- import com.nextcloud.talk.databinding.ActivityOpenConversationsBinding
20+ import com.nextcloud.talk.components.ColoredStatusBar
2421import com.nextcloud.talk.models.json.conversations.Conversation
25- import com.nextcloud.talk.openconversations.adapters.OpenConversationsAdapter
2622import com.nextcloud.talk.openconversations.viewmodels.OpenConversationsViewModel
23+ import com.nextcloud.talk.utils.adjustUIForAPILevel35
2724import com.nextcloud.talk.utils.bundle.BundleKeys
28- import com.vanniktech.ui.hideKeyboardAndFocus
29- import com.vanniktech.ui.showKeyboardAndFocus
3025import javax.inject.Inject
3126
3227@AutoInjector(NextcloudTalkApplication ::class )
3328class ListOpenConversationsActivity : BaseActivity () {
3429
35- private lateinit var binding: ActivityOpenConversationsBinding
36-
37- @Inject
38- lateinit var ncApi: NcApi
39-
4030 @Inject
4131 lateinit var viewModelFactory: ViewModelProvider .Factory
4232
43- lateinit var openConversationsViewModel: OpenConversationsViewModel
44-
45- lateinit var adapter: OpenConversationsAdapter
46-
47- var searching = false
33+ private lateinit var openConversationsViewModel: OpenConversationsViewModel
4834
4935 override fun onCreate (savedInstanceState : Bundle ? ) {
36+ adjustUIForAPILevel35()
5037 super .onCreate(savedInstanceState)
5138 NextcloudTalkApplication .sharedApplication!! .componentApplication.inject(this )
5239
5340 openConversationsViewModel = ViewModelProvider (this , viewModelFactory)[OpenConversationsViewModel ::class .java]
54-
5541 openConversationsViewModel.fetchConversations()
5642
57- binding = ActivityOpenConversationsBinding .inflate(layoutInflater)
58- setupActionBar()
59- setContentView(binding.root)
60- initSystemBars()
61- viewThemeUtils.platform.colorImageView(binding.searchOpenConversations, ColorRole .ON_SURFACE )
62- viewThemeUtils.material.colorTextInputLayout(binding.textInputLayout)
63-
6443 val user = currentUserProviderOld.currentUser.blockingGet()
6544
66- adapter = OpenConversationsAdapter (user, viewThemeUtils) { conversation -> adapterOnClick(conversation) }
67- binding.openConversationsRecyclerView.adapter = adapter
68- binding.searchOpenConversations.setOnClickListener {
69- searching = ! searching
70- handleSearchUI(searching)
71- }
72- binding.editText.doOnTextChanged { text, _, _, count ->
73- if (! text.isNullOrBlank()) {
74- openConversationsViewModel.updateSearchTerm(text.toString())
75- openConversationsViewModel.fetchConversations()
76- } else {
77- openConversationsViewModel.updateSearchTerm(" " )
78- openConversationsViewModel.fetchConversations()
45+ setContent {
46+ val colorScheme = viewThemeUtils.getColorScheme(this )
47+ val viewState by openConversationsViewModel.viewState.collectAsStateWithLifecycle()
48+ val searchTerm by openConversationsViewModel.searchTerm.collectAsStateWithLifecycle()
49+
50+ MaterialTheme (colorScheme = colorScheme) {
51+ ColoredStatusBar ()
52+ OpenConversationsScreen (
53+ viewState = viewState,
54+ searchTerm = searchTerm,
55+ userBaseUrl = user?.baseUrl,
56+ listenerInput = OpenConversationsScreenListenerInput (
57+ onSearchTermChange = { term ->
58+ openConversationsViewModel.updateSearchTerm(term)
59+ openConversationsViewModel.fetchConversations()
60+ },
61+ onConversationClick = { conversation -> navigateToChat(conversation) },
62+ onBackClick = { onBackPressedDispatcher.onBackPressed() }
63+ )
64+ )
7965 }
8066 }
81- initObservers()
82- }
83-
84- private fun handleSearchUI (show : Boolean ) {
85- if (show) {
86- binding.searchOpenConversations.visibility = View .GONE
87- binding.textInputLayout.visibility = View .VISIBLE
88- binding.editText.showKeyboardAndFocus()
89- } else {
90- binding.searchOpenConversations.visibility = View .VISIBLE
91- binding.textInputLayout.visibility = View .GONE
92- binding.editText.hideKeyboardAndFocus()
93- }
9467 }
9568
96- private fun adapterOnClick (conversation : Conversation ) {
69+ private fun navigateToChat (conversation : Conversation ) {
9770 val bundle = Bundle ()
9871 bundle.putString(BundleKeys .KEY_ROOM_TOKEN , conversation.token)
9972
100- val chatIntent = Intent (context , ChatActivity ::class .java)
73+ val chatIntent = Intent (this , ChatActivity ::class .java)
10174 chatIntent.putExtras(bundle)
10275 chatIntent.addFlags(Intent .FLAG_ACTIVITY_CLEAR_TOP )
10376 startActivity(chatIntent)
10477 }
105-
106- private fun initObservers () {
107- openConversationsViewModel.viewState.observe(this ) { state ->
108- when (state) {
109- is OpenConversationsViewModel .FetchConversationsStartState -> {
110- binding.openConversationsRecyclerView.visibility = View .GONE
111- binding.progressBarWrapper.visibility = View .VISIBLE
112- }
113- is OpenConversationsViewModel .FetchConversationsSuccessState -> {
114- binding.openConversationsRecyclerView.visibility = View .VISIBLE
115- binding.progressBarWrapper.visibility = View .GONE
116- adapter.submitList(state.conversations)
117- }
118- is OpenConversationsViewModel .FetchConversationsEmptyState -> {
119- binding.openConversationsRecyclerView.visibility = View .GONE
120- binding.progressBarWrapper.visibility = View .GONE
121-
122- binding.emptyList.emptyListView.visibility = View .VISIBLE
123- binding.emptyList.emptyListViewHeadline.text = getString(R .string.nc_no_open_conversations_headline)
124- binding.emptyList.emptyListViewText.text = getString(R .string.nc_no_open_conversations_text)
125- binding.emptyList.emptyListIcon.setImageResource(R .drawable.baseline_info_24)
126- binding.emptyList.emptyListIcon.visibility = View .VISIBLE
127- binding.emptyList.emptyListViewText.visibility = View .VISIBLE
128- }
129- is OpenConversationsViewModel .FetchConversationsErrorState -> {
130- Snackbar .make(binding.root, R .string.nc_common_error_sorry, Snackbar .LENGTH_LONG ).show()
131- }
132- else -> {}
133- }
134- }
135- }
136-
137- private fun setupActionBar () {
138- setSupportActionBar(binding.openConversationsToolbar)
139- binding.openConversationsToolbar.setNavigationOnClickListener {
140- if (searching) {
141- handleSearchUI(false )
142- searching = false
143- } else {
144- onBackPressedDispatcher.onBackPressed()
145- }
146- }
147- supportActionBar?.setDisplayHomeAsUpEnabled(true )
148- supportActionBar?.setDisplayShowHomeEnabled(true )
149- supportActionBar?.setIcon(resources!! .getColor(R .color.transparent, null ).toDrawable())
150- viewThemeUtils.material.themeToolbar(binding.openConversationsToolbar)
151- }
15278}
0 commit comments