Skip to content

Commit 33517f6

Browse files
committed
fix(ui): prevent snackbar crash in bottom sheet and simplify status handling
Signed-off-by: alperozturk96 <[email protected]>
1 parent 1d93966 commit 33517f6

File tree

2 files changed

+65
-44
lines changed

2 files changed

+65
-44
lines changed

app/src/main/java/com/nextcloud/ui/SetOnlineStatusBottomSheet.kt

Lines changed: 62 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,18 @@
99

1010
package com.nextcloud.ui
1111

12-
import android.annotation.SuppressLint
1312
import android.os.Bundle
1413
import android.util.Log
1514
import android.view.LayoutInflater
1615
import android.view.View
1716
import android.view.ViewGroup
1817
import android.widget.ImageView
1918
import android.widget.TextView
19+
import androidx.core.content.ContextCompat
20+
import androidx.lifecycle.lifecycleScope
2021
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
2122
import com.google.android.material.card.MaterialCardView
23+
import com.nextcloud.android.common.ui.theme.utils.ColorRole
2224
import com.nextcloud.client.account.UserAccountManager
2325
import com.nextcloud.client.core.AsyncRunner
2426
import com.nextcloud.client.di.Injectable
@@ -31,6 +33,8 @@ import com.owncloud.android.ui.activity.BaseActivity
3133
import com.owncloud.android.utils.DisplayUtils
3234
import com.owncloud.android.utils.theme.CapabilityUtils
3335
import com.owncloud.android.utils.theme.ViewThemeUtils
36+
import kotlinx.coroutines.Dispatchers
37+
import kotlinx.coroutines.launch
3438
import javax.inject.Inject
3539

3640
class SetOnlineStatusBottomSheet(val currentStatus: Status?) :
@@ -47,7 +51,6 @@ class SetOnlineStatusBottomSheet(val currentStatus: Status?) :
4751
@Inject
4852
lateinit var viewThemeUtils: ViewThemeUtils
4953

50-
@SuppressLint("DefaultLocale")
5154
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
5255
super.onViewCreated(view, savedInstanceState)
5356
accountManager = (activity as BaseActivity).userAccountManager
@@ -56,21 +59,28 @@ class SetOnlineStatusBottomSheet(val currentStatus: Status?) :
5659
updateCurrentStatusViews(it)
5760
}
5861

59-
binding.onlineStatus.setOnClickListener { setStatus(StatusType.ONLINE) }
60-
binding.awayStatus.setOnClickListener { setStatus(StatusType.AWAY) }
61-
binding.busyStatus.setOnClickListener { setStatus(StatusType.BUSY) }
62-
binding.dndStatus.setOnClickListener { setStatus(StatusType.DND) }
63-
binding.invisibleStatus.setOnClickListener { setStatus(StatusType.INVISIBLE) }
64-
65-
viewThemeUtils.files.themeStatusCardView(binding.onlineStatus)
66-
viewThemeUtils.files.themeStatusCardView(binding.awayStatus)
67-
viewThemeUtils.files.themeStatusCardView(binding.busyStatus)
68-
viewThemeUtils.files.themeStatusCardView(binding.dndStatus)
69-
viewThemeUtils.files.themeStatusCardView(binding.invisibleStatus)
62+
setupStatusViews()
7063

7164
viewThemeUtils.platform.themeDialog(binding.root)
7265

73-
binding.busyStatus.setVisibleIf(CapabilityUtils.getCapability(context).userStatusSupportsBusy.isTrue)
66+
val capability = CapabilityUtils.getCapability(context)
67+
val busyStatus = capability.userStatusSupportsBusy.isTrue
68+
binding.busyStatus.setVisibleIf(busyStatus)
69+
}
70+
71+
private fun setupStatusViews() {
72+
val statuses = listOf(
73+
binding.onlineStatus to StatusType.ONLINE,
74+
binding.awayStatus to StatusType.AWAY,
75+
binding.busyStatus to StatusType.BUSY,
76+
binding.dndStatus to StatusType.DND,
77+
binding.invisibleStatus to StatusType.INVISIBLE
78+
)
79+
80+
statuses.forEach { (view, status) ->
81+
view.setOnClickListener { setStatus(status) }
82+
viewThemeUtils.files.themeStatusCardView(view)
83+
}
7484
}
7585

7686
private fun updateCurrentStatusViews(it: Status) {
@@ -98,8 +108,16 @@ class SetOnlineStatusBottomSheet(val currentStatus: Status?) :
98108
}
99109

100110
private fun showErrorSnackbar() {
101-
DisplayUtils.showSnackMessage(view, "Failed to set status!")
102-
clearTopStatus()
111+
lifecycleScope.launch(Dispatchers.Main) {
112+
if (!isAdded) {
113+
return@launch
114+
}
115+
116+
activity?.let {
117+
DisplayUtils.showSnackMessage(it, R.string.set_online_status_bottom_sheet_error_message)
118+
}
119+
clearTopStatus()
120+
}
103121
}
104122

105123
private fun visualizeStatus(statusType: StatusType) {
@@ -116,37 +134,37 @@ class SetOnlineStatusBottomSheet(val currentStatus: Status?) :
116134
}
117135
}
118136
views.first.isChecked = true
119-
viewThemeUtils.platform.colorOnSecondaryContainerTextViewElement(views.second)
137+
viewThemeUtils.platform.colorTextView(views.second, ColorRole.ON_SECONDARY_CONTAINER)
120138
}
121139

122140
private fun clearTopStatus() {
123-
context?.let {
124-
binding.onlineHeadline.setTextColor(
125-
resources.getColor(com.nextcloud.android.common.ui.R.color.high_emphasis_text)
126-
)
127-
binding.awayHeadline.setTextColor(
128-
resources.getColor(com.nextcloud.android.common.ui.R.color.high_emphasis_text)
129-
)
130-
binding.busyHeadline.setTextColor(
131-
resources.getColor(com.nextcloud.android.common.ui.R.color.high_emphasis_text)
132-
)
133-
binding.dndHeadline.setTextColor(
134-
resources.getColor(com.nextcloud.android.common.ui.R.color.high_emphasis_text)
135-
)
136-
binding.invisibleHeadline.setTextColor(
137-
resources.getColor(com.nextcloud.android.common.ui.R.color.high_emphasis_text)
138-
)
139-
140-
binding.awayIcon.imageTintList = null
141-
binding.dndIcon.imageTintList = null
142-
binding.invisibleIcon.imageTintList = null
143-
144-
binding.onlineStatus.isChecked = false
145-
binding.awayStatus.isChecked = false
146-
binding.busyStatus.isChecked = false
147-
binding.dndStatus.isChecked = false
148-
binding.invisibleStatus.isChecked = false
149-
}
141+
val ctx = context ?: return
142+
val defaultColor = ContextCompat.getColor(
143+
ctx,
144+
com.nextcloud.android.common.ui.R.color.high_emphasis_text
145+
)
146+
147+
listOf(
148+
binding.onlineHeadline,
149+
binding.awayHeadline,
150+
binding.busyHeadline,
151+
binding.dndHeadline,
152+
binding.invisibleHeadline
153+
).forEach { it.setTextColor(defaultColor) }
154+
155+
listOf(
156+
binding.awayIcon,
157+
binding.dndIcon,
158+
binding.invisibleIcon
159+
).forEach { it.imageTintList = null }
160+
161+
listOf(
162+
binding.onlineStatus,
163+
binding.awayStatus,
164+
binding.busyStatus,
165+
binding.dndStatus,
166+
binding.invisibleStatus
167+
).forEach { it.isChecked = false }
150168
}
151169

152170
companion object {

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,9 @@
259259
<string name="upload_chooser_title">Upload from…</string>
260260
<string name="uploader_info_dirname">Folder name</string>
261261

262+
<string name="set_online_status_bottom_sheet_error_message">Failed to set status!</string>
263+
264+
262265
<string name="upload_notification_manager_start_text">%1$d / %2$d - %3$s</string>
263266

264267
<string name="folder_download_worker_ticker_id">Syncing…</string>

0 commit comments

Comments
 (0)