ConversationsListController: clean up a bit

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-08-18 17:12:01 +02:00
parent 929d6b3964
commit f148c0e3c0
No known key found for this signature in database
GPG key ID: 2585783189A62105

View file

@ -27,7 +27,6 @@ import android.animation.AnimatorInflater
import android.annotation.SuppressLint
import android.app.SearchManager
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
@ -140,7 +139,6 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.parceler.Parcels
import retrofit2.HttpException
import java.util.Collections
import java.util.Objects
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@ -292,7 +290,7 @@ class ConversationsListController(bundle: Bundle) :
private fun initSearchView() {
if (activity != null) {
val searchManager = activity!!.getSystemService(Context.SEARCH_SERVICE) as SearchManager
val searchManager = activity!!.getSystemService(Context.SEARCH_SERVICE) as SearchManager?
if (searchItem != null) {
searchView = MenuItemCompat.getActionView(searchItem) as SearchView
viewThemeUtils.themeSearchView(searchView!!)
@ -351,7 +349,7 @@ class ConversationsListController(bundle: Bundle) :
showSearchView(activity, searchView, searchItem)
searchView!!.setQuery(adapter!!.getFilter(String::class.java), false)
}
activity.binding.searchText.setOnClickListener { v: View? ->
activity.binding.searchText.setOnClickListener {
showSearchView(activity, searchView, searchItem)
viewThemeUtils.themeStatusBar(activity, searchView!!)
}
@ -372,8 +370,8 @@ class ConversationsListController(bundle: Bundle) :
adapter!!.setHeadersShown(true)
adapter!!.updateDataSet(searchableConversationItems, false)
adapter!!.showAllHeaders()
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isEnabled = false
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isEnabled = false
}
return true
}
@ -385,10 +383,10 @@ class ConversationsListController(bundle: Bundle) :
if (searchHelper != null) {
// cancel any pending searches
searchHelper!!.cancelSearch()
binding.swipeRefreshLayoutView!!.isRefreshing = false
binding.swipeRefreshLayoutView.isRefreshing = false
}
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isEnabled = true
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isEnabled = true
}
searchView!!.onActionViewCollapsed()
val activity = getActivity() as MainActivity?
@ -403,7 +401,7 @@ class ConversationsListController(bundle: Bundle) :
viewThemeUtils.resetStatusBar(activity, activity.binding.searchToolbar)
}
}
val layoutManager = binding.recyclerView!!.layoutManager as SmoothScrollLinearLayoutManager?
val layoutManager = binding.recyclerView.layoutManager as SmoothScrollLinearLayoutManager?
layoutManager?.scrollToPositionWithOffset(0, 0)
return true
}
@ -491,21 +489,21 @@ class ConversationsListController(bundle: Bundle) :
}
if (adapterWasNull) {
adapterWasNull = false
binding.loadingContent!!.visibility = View.GONE
binding.loadingContent.visibility = View.GONE
}
if (ocs!!.data!!.size > 0) {
if (binding.emptyLayout!!.visibility != View.GONE) {
binding.emptyLayout!!.visibility = View.GONE
if (ocs!!.data!!.isNotEmpty()) {
if (binding.emptyLayout.visibility != View.GONE) {
binding.emptyLayout.visibility = View.GONE
}
if (binding.swipeRefreshLayoutView!!.visibility != View.VISIBLE) {
binding.swipeRefreshLayoutView!!.visibility = View.VISIBLE
if (binding.swipeRefreshLayoutView.visibility != View.VISIBLE) {
binding.swipeRefreshLayoutView.visibility = View.VISIBLE
}
} else {
if (binding.emptyLayout!!.visibility != View.VISIBLE) {
binding.emptyLayout!!.visibility = View.VISIBLE
if (binding.emptyLayout.visibility != View.VISIBLE) {
binding.emptyLayout.visibility = View.VISIBLE
}
if (binding.swipeRefreshLayoutView!!.visibility != View.GONE) {
binding.swipeRefreshLayoutView!!.visibility = View.GONE
if (binding.swipeRefreshLayoutView.visibility != View.GONE) {
binding.swipeRefreshLayoutView.visibility = View.GONE
}
}
for (conversation in ocs.data!!) {
@ -515,8 +513,7 @@ class ConversationsListController(bundle: Bundle) :
) {
continue
}
var headerTitle: String
headerTitle = resources!!.getString(R.string.conversations)
val headerTitle: String = resources!!.getString(R.string.conversations)
var genericTextHeaderItem: GenericTextHeaderItem
if (!callHeaderItems.containsKey(headerTitle)) {
genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils)
@ -547,31 +544,31 @@ class ConversationsListController(bundle: Bundle) :
adapter!!.updateDataSet(conversationItems, false)
Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong())
fetchOpenConversations(apiVersion)
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isRefreshing = false
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isRefreshing = false
}
}, { throwable: Throwable ->
handleHttpExceptions(throwable)
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isRefreshing = false
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isRefreshing = false
}
dispose(roomsQueryDisposable)
}) {
dispose(roomsQueryDisposable)
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isRefreshing = false
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isRefreshing = false
}
isRefreshing = false
}
}
private fun sortConversations(conversationItems: List<AbstractFlexibleItem<*>>) {
Collections.sort(conversationItems) { o1: AbstractFlexibleItem<*>, o2: AbstractFlexibleItem<*> ->
val (_, _, _, _, _, _, _, _, _, _, _, _, _, favorite, lastActivity) = (o1 as ConversationItem).model
val (_, _, _, _, _, _, _, _, _, _, _, _, _, favorite1, lastActivity1) = (o2 as ConversationItem).model
private fun sortConversations(conversationItems: MutableList<AbstractFlexibleItem<*>>) {
conversationItems.sortWith { o1: AbstractFlexibleItem<*>, o2: AbstractFlexibleItem<*> ->
val conversation1 = (o1 as ConversationItem).model
val conversation2 = (o2 as ConversationItem).model
CompareToBuilder()
.append(favorite1, favorite)
.append(lastActivity1, lastActivity)
.append(conversation2.favorite, conversation1.favorite)
.append(conversation2.lastActivity, conversation1.lastActivity)
.toComparison()
}
}
@ -643,10 +640,10 @@ class ConversationsListController(bundle: Bundle) :
@SuppressLint("ClickableViewAccessibility")
private fun prepareViews() {
layoutManager = SmoothScrollLinearLayoutManager(Objects.requireNonNull(activity))
binding.recyclerView!!.layoutManager = layoutManager
binding.recyclerView!!.setHasFixedSize(true)
binding.recyclerView!!.adapter = adapter
binding.recyclerView!!.addOnScrollListener(object : RecyclerView.OnScrollListener() {
binding.recyclerView.layoutManager = layoutManager
binding.recyclerView.setHasFixedSize(true)
binding.recyclerView.adapter = adapter
binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
@ -654,24 +651,24 @@ class ConversationsListController(bundle: Bundle) :
}
}
})
binding.recyclerView!!.setOnTouchListener { v: View, event: MotionEvent? ->
binding.recyclerView.setOnTouchListener { v: View, _: MotionEvent? ->
if (isAttached && (!isBeingDestroyed || !isDestroyed)) {
val imm = activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0)
}
false
}
binding.swipeRefreshLayoutView!!.setOnRefreshListener { fetchData() }
viewThemeUtils.themeSwipeRefreshLayout(binding.swipeRefreshLayoutView!!)
binding.emptyLayout!!.setOnClickListener { v: View? -> showNewConversationsScreen() }
binding.floatingActionButton!!.setOnClickListener { v: View? ->
binding.swipeRefreshLayoutView.setOnRefreshListener { fetchData() }
viewThemeUtils.themeSwipeRefreshLayout(binding.swipeRefreshLayoutView)
binding.emptyLayout.setOnClickListener { showNewConversationsScreen() }
binding.floatingActionButton.setOnClickListener {
run(context)
showNewConversationsScreen()
}
viewThemeUtils.themeFAB(binding.floatingActionButton!!)
viewThemeUtils.themeFAB(binding.floatingActionButton)
if (activity != null && activity is MainActivity) {
val activity = activity as MainActivity?
activity!!.binding.switchAccountButton.setOnClickListener { v: View? ->
activity!!.binding.switchAccountButton.setOnClickListener {
if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
newFragment.show(
@ -687,13 +684,13 @@ class ConversationsListController(bundle: Bundle) :
}
}
}
binding.newMentionPopupBubble!!.hide()
binding.newMentionPopupBubble!!.setPopupBubbleListener {
binding.recyclerView!!.smoothScrollToPosition(
binding.newMentionPopupBubble.hide()
binding.newMentionPopupBubble.setPopupBubbleListener {
binding.recyclerView.smoothScrollToPosition(
nextUnreadConversationScrollPosition
)
}
viewThemeUtils.colorMaterialButtonPrimaryFilled(binding.newMentionPopupBubble!!)
viewThemeUtils.colorMaterialButtonPrimaryFilled(binding.newMentionPopupBubble)
}
private fun checkToShowUnreadBubble() {
@ -709,14 +706,14 @@ class ConversationsListController(bundle: Bundle) :
) && position > lastVisibleItem
) {
nextUnreadConversationScrollPosition = position
if (!binding.newMentionPopupBubble!!.isShown) {
binding.newMentionPopupBubble!!.show()
if (!binding.newMentionPopupBubble.isShown) {
binding.newMentionPopupBubble.show()
}
return
}
}
nextUnreadConversationScrollPosition = 0
binding.newMentionPopupBubble!!.hide()
binding.newMentionPopupBubble.hide()
} catch (e: NullPointerException) {
Log.d(
TAG,
@ -738,10 +735,8 @@ class ConversationsListController(bundle: Bundle) :
}
private fun dispose(disposable: Disposable?) {
var disposable = disposable
if (disposable != null && !disposable.isDisposed) {
disposable.dispose()
disposable = null
} else if (disposable == null && roomsQueryDisposable != null && !roomsQueryDisposable!!.isDisposed) {
roomsQueryDisposable!!.dispose()
roomsQueryDisposable = null
@ -776,7 +771,7 @@ class ConversationsListController(bundle: Bundle) :
}
}
fun onQueryTextChange(newText: String?) {
private fun onQueryTextChange(newText: String?) {
if (!TextUtils.isEmpty(searchQuery)) {
val filter = searchQuery
searchQuery = ""
@ -817,8 +812,8 @@ class ConversationsListController(bundle: Bundle) :
@SuppressLint("CheckResult") // handled by helper
private fun startMessageSearch(search: String?) {
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isRefreshing = true
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isRefreshing = true
}
searchHelper?.startMessageSearch(search!!)
?.subscribeOn(Schedulers.io())
@ -832,7 +827,7 @@ class ConversationsListController(bundle: Bundle) :
@SuppressLint("CheckResult") // handled by helper
private fun loadMoreMessages() {
binding.swipeRefreshLayoutView!!.isRefreshing = true
binding.swipeRefreshLayoutView.isRefreshing = true
val observable = searchHelper!!.loadMore()
observable?.observeOn(AndroidSchedulers.mainThread())
?.subscribe({ results: MessageSearchResults -> onMessageSearchResult(results) }) { throwable: Throwable ->
@ -906,9 +901,9 @@ class ConversationsListController(bundle: Bundle) :
private fun handleSharedData() {
collectDataFromIntent()
if (!textToPaste!!.isEmpty()) {
if (textToPaste!!.isNotEmpty()) {
openConversation(textToPaste)
} else if (filesToShare != null && !filesToShare!!.isEmpty()) {
} else if (filesToShare != null && filesToShare!!.isNotEmpty()) {
showSendFilesConfirmDialog()
} else {
Toast.makeText(context, context.resources.getString(R.string.nc_common_error_sorry), Toast.LENGTH_LONG)
@ -923,8 +918,7 @@ class ConversationsListController(bundle: Bundle) :
val filename = getFileName(Uri.parse(file), context)
fileNamesWithLineBreaks.append(filename).append("\n")
}
val confirmationQuestion: String
confirmationQuestion = if (filesToShare!!.size == 1) {
val confirmationQuestion: String = if (filesToShare!!.size == 1) {
String.format(
resources!!.getString(R.string.nc_upload_confirm_send_single),
selectedConversation!!.displayName
@ -935,19 +929,19 @@ class ConversationsListController(bundle: Bundle) :
selectedConversation!!.displayName
)
}
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton!!.context)
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton.context)
.setIcon(viewThemeUtils.colorMaterialAlertDialogIcon(context, R.drawable.upload))
.setTitle(confirmationQuestion)
.setMessage(fileNamesWithLineBreaks.toString())
.setPositiveButton(R.string.nc_yes) { dialog: DialogInterface?, which: Int ->
.setPositiveButton(R.string.nc_yes) { _, _ ->
upload()
openConversation()
}
.setNegativeButton(R.string.nc_no) { dialog: DialogInterface?, which: Int ->
.setNegativeButton(R.string.nc_no) { _, _ ->
Log.d(TAG, "sharing files aborted, going back to share-to screen")
showShareToScreen = true
}
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton!!.context, dialogBuilder)
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton.context, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
@ -1037,7 +1031,7 @@ class ConversationsListController(bundle: Bundle) :
return
}
try {
var filesToShareArray: Array<String?>? = arrayOfNulls(filesToShare!!.size)
var filesToShareArray: Array<String?> = arrayOfNulls(filesToShare!!.size)
filesToShareArray = filesToShare!!.toArray(filesToShareArray)
val data = Data.Builder()
.putStringArray(UploadAndShareFilesWorker.DEVICE_SOURCEFILES, filesToShareArray)
@ -1125,11 +1119,11 @@ class ConversationsListController(bundle: Bundle) :
) {
val conversation = Parcels.unwrap<Conversation>(conversationMenuBundle!!.getParcelable(KEY_ROOM))
if (conversation != null) {
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton!!.context)
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton.context)
.setIcon(viewThemeUtils.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) { dialog: DialogInterface?, which: Int ->
.setPositiveButton(R.string.nc_delete) { _, _ ->
val data = Data.Builder()
data.putLong(
KEY_INTERNAL_USER_ID,
@ -1139,10 +1133,10 @@ class ConversationsListController(bundle: Bundle) :
conversationMenuBundle = null
deleteConversation(data.build())
}
.setNegativeButton(R.string.nc_cancel) { dialog: DialogInterface?, which: Int ->
.setNegativeButton(R.string.nc_cancel) { _, _ ->
conversationMenuBundle = null
}
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton!!.context, dialogBuilder)
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton.context, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
@ -1154,12 +1148,12 @@ class ConversationsListController(bundle: Bundle) :
private fun showUnauthorizedDialog() {
if (activity != null) {
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton!!.context)
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton.context)
.setIcon(viewThemeUtils.colorMaterialAlertDialogIcon(context, R.drawable.ic_delete_black_24dp))
.setTitle(R.string.nc_dialog_invalid_password)
.setMessage(R.string.nc_dialog_reauth_or_delete)
.setCancelable(false)
.setPositiveButton(R.string.nc_delete) { dialog: DialogInterface?, which: Int ->
.setPositiveButton(R.string.nc_delete) { _, _ ->
val otherUserExists = userManager
.scheduleUserForDeletionWithId(currentUser!!.id!!)
.blockingGet()
@ -1178,7 +1172,7 @@ class ConversationsListController(bundle: Bundle) :
)
}
}
.setNegativeButton(R.string.nc_settings_reauthorize) { dialog: DialogInterface?, which: Int ->
.setNegativeButton(R.string.nc_settings_reauthorize) { _, _ ->
router.pushController(
RouterTransaction.with(
WebViewLoginController(currentUser!!.baseUrl, true)
@ -1187,7 +1181,7 @@ class ConversationsListController(bundle: Bundle) :
.popChangeHandler(VerticalChangeHandler())
)
}
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton!!.context, dialogBuilder)
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton.context, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
@ -1197,12 +1191,12 @@ class ConversationsListController(bundle: Bundle) :
}
private fun showServerEOLDialog() {
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton!!.context)
val dialogBuilder = MaterialAlertDialogBuilder(binding.floatingActionButton.context)
.setIcon(viewThemeUtils.colorMaterialAlertDialogIcon(context, R.drawable.ic_warning_white))
.setTitle(R.string.nc_settings_server_eol_title)
.setMessage(R.string.nc_settings_server_eol)
.setCancelable(false)
.setPositiveButton(R.string.nc_settings_remove_account) { dialog: DialogInterface?, which: Int ->
.setPositiveButton(R.string.nc_settings_remove_account) { _, _ ->
val otherUserExists = userManager
.scheduleUserForDeletionWithId(currentUser!!.id!!)
.blockingGet()
@ -1221,15 +1215,15 @@ class ConversationsListController(bundle: Bundle) :
)
}
}
.setNegativeButton(R.string.nc_cancel) { dialog: DialogInterface?, which: Int ->
if (userManager.users.blockingGet().size > 0) {
.setNegativeButton(R.string.nc_cancel) { _, _ ->
if (userManager.users.blockingGet().isNotEmpty()) {
router.pushController(RouterTransaction.with(SwitchAccountController()))
} else {
activity!!.finishAffinity()
activity!!.finish()
}
}
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton!!.context, dialogBuilder)
viewThemeUtils.colorMaterialAlertDialogBackground(binding.floatingActionButton.context, dialogBuilder)
val dialog = dialogBuilder.show()
viewThemeUtils.colorTextButtons(
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
@ -1243,11 +1237,11 @@ class ConversationsListController(bundle: Bundle) :
WorkManager.getInstance().enqueue(deleteConversationWorker)
}
fun onMessageSearchResult(results: MessageSearchResults) {
if (searchView!!.query.length > 0) {
private fun onMessageSearchResult(results: MessageSearchResults) {
if (searchView!!.query.isNotEmpty()) {
clearMessageSearchResults()
val entries = results.messages
if (entries.size > 0) {
if (entries.isNotEmpty()) {
val adapterItems: MutableList<AbstractFlexibleItem<*>> = ArrayList(entries.size + 1)
for (i in entries.indices) {
val showHeader = i == 0
@ -1265,18 +1259,18 @@ class ConversationsListController(bundle: Bundle) :
adapterItems.add(LoadMoreResultsItem)
}
adapter!!.addItems(0, adapterItems)
binding.recyclerView!!.scrollToPosition(0)
binding.recyclerView.scrollToPosition(0)
}
}
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isRefreshing = false
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isRefreshing = false
}
}
fun onMessageSearchError(throwable: Throwable) {
private fun onMessageSearchError(throwable: Throwable) {
handleHttpExceptions(throwable)
if (binding.swipeRefreshLayoutView != null) {
binding.swipeRefreshLayoutView!!.isRefreshing = false
withNullableControllerViewBinding {
binding.swipeRefreshLayoutView.isRefreshing = false
}
}