Skip to content

Commit a5ff826

Browse files
Merge pull request #5913 from nextcloud/feat/noid/openConversationsList
⚒️ Migrate open conversations list to composables
2 parents 28f6fdc + 91794a5 commit a5ff826

7 files changed

Lines changed: 694 additions & 202 deletions

File tree

app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt

Lines changed: 30 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -8,145 +8,71 @@ package com.nextcloud.talk.openconversations
88

99
import android.content.Intent
1010
import 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
1414
import androidx.lifecycle.ViewModelProvider
15+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1516
import 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
1917
import com.nextcloud.talk.activities.BaseActivity
20-
import com.nextcloud.talk.api.NcApi
2118
import com.nextcloud.talk.application.NextcloudTalkApplication
2219
import com.nextcloud.talk.chat.ChatActivity
23-
import com.nextcloud.talk.databinding.ActivityOpenConversationsBinding
20+
import com.nextcloud.talk.components.ColoredStatusBar
2421
import com.nextcloud.talk.models.json.conversations.Conversation
25-
import com.nextcloud.talk.openconversations.adapters.OpenConversationsAdapter
2622
import com.nextcloud.talk.openconversations.viewmodels.OpenConversationsViewModel
23+
import com.nextcloud.talk.utils.adjustUIForAPILevel35
2724
import com.nextcloud.talk.utils.bundle.BundleKeys
28-
import com.vanniktech.ui.hideKeyboardAndFocus
29-
import com.vanniktech.ui.showKeyboardAndFocus
3025
import javax.inject.Inject
3126

3227
@AutoInjector(NextcloudTalkApplication::class)
3328
class 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

Comments
 (0)