Skip to content

Commit 7c290bd

Browse files
committed
add SetStatusMessageBottomSheet
Signed-off-by: alperozturk <[email protected]>
1 parent dc51a2c commit 7c290bd

16 files changed

+278
-277
lines changed

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import android.graphics.drawable.LayerDrawable;
1515
import android.net.Uri;
1616
import android.os.Bundle;
17-
import android.view.View;
1817

1918
import androidx.annotation.NonNull;
2019
import androidx.fragment.app.DialogFragment;
@@ -86,7 +85,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
8685
});
8786

8887
binding.statusMessage.setOnClickListener(v -> {
89-
final var setStatusMessageDialog = new SetStatusMessageBottomSheet(accountManager.user, currentStatus);
88+
final var setStatusMessageDialog = new SetStatusMessageBottomSheet();
9089
setStatusMessageDialog.show(requireActivity().getSupportFragmentManager(), "fragment_set_status_message");
9190
dismiss();
9291
});

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/SetStatusMessageBottomSheet.kt

Lines changed: 90 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,19 @@ package it.niedermann.owncloud.notes.accountswitcher
1212
import android.annotation.SuppressLint
1313
import android.content.Context
1414
import android.os.Bundle
15-
import android.os.Handler
16-
import android.os.Looper
1715
import android.view.LayoutInflater
1816
import android.view.View
1917
import android.view.ViewGroup
2018
import android.view.inputmethod.InputMethodManager
2119
import android.widget.AdapterView
2220
import android.widget.AdapterView.OnItemSelectedListener
2321
import android.widget.ArrayAdapter
24-
import androidx.annotation.VisibleForTesting
2522
import androidx.lifecycle.lifecycleScope
2623
import androidx.recyclerview.widget.LinearLayoutManager
27-
import com.nextcloud.common.User
28-
import com.owncloud.android.lib.resources.users.ClearAt
29-
import com.owncloud.android.lib.resources.users.PredefinedStatus
24+
import com.nextcloud.android.sso.helper.SingleAccountHelper
25+
import com.owncloud.android.lib.common.utils.Log_OC
3026
import com.owncloud.android.lib.resources.users.Status
27+
import com.owncloud.android.lib.resources.users.StatusType
3128
import com.vanniktech.emoji.EmojiManager
3229
import com.vanniktech.emoji.EmojiPopup
3330
import com.vanniktech.emoji.google.GoogleEmojiProvider
@@ -36,19 +33,16 @@ import com.vanniktech.emoji.installForceSingleEmoji
3633
import it.niedermann.owncloud.notes.R
3734
import it.niedermann.owncloud.notes.accountswitcher.adapter.PredefinedStatusClickListener
3835
import it.niedermann.owncloud.notes.accountswitcher.adapter.PredefinedStatusListAdapter
36+
import it.niedermann.owncloud.notes.accountswitcher.model.ExposedClearAt
37+
import it.niedermann.owncloud.notes.accountswitcher.model.ExposedPredefinedStatus
3938
import it.niedermann.owncloud.notes.accountswitcher.repository.UserStatusRepository
40-
import it.niedermann.owncloud.notes.accountswitcher.task.ClearStatusTask
41-
import it.niedermann.owncloud.notes.accountswitcher.task.SetPredefinedCustomStatusTask
42-
import it.niedermann.owncloud.notes.accountswitcher.task.SetUserDefinedCustomStatusTask
4339
import it.niedermann.owncloud.notes.branding.BrandedBottomSheetDialogFragment
4440
import it.niedermann.owncloud.notes.branding.BrandingUtil
4541
import it.niedermann.owncloud.notes.databinding.SetStatusMessageBottomSheetBinding
4642
import it.niedermann.owncloud.notes.shared.util.DisplayUtils
47-
import it.niedermann.owncloud.notes.util.runner.AsyncRunner
48-
import it.niedermann.owncloud.notes.util.runner.ThreadPoolAsyncRunner
49-
import it.niedermann.owncloud.notes.util.storage.UserStorage
5043
import kotlinx.coroutines.Dispatchers
5144
import kotlinx.coroutines.launch
45+
import kotlinx.coroutines.withContext
5246
import java.util.Calendar
5347
import java.util.Locale
5448

@@ -70,50 +64,53 @@ private const val LAST_SECOND_OF_MINUTE = 59
7064
private const val CLEAR_AT_TYPE_PERIOD = "period"
7165
private const val CLEAR_AT_TYPE_END_OF = "end-of"
7266

73-
class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
67+
class SetStatusMessageBottomSheet :
7468
BrandedBottomSheetDialogFragment(R.layout.set_status_message_bottom_sheet),
75-
PredefinedStatusClickListener{
69+
PredefinedStatusClickListener {
70+
companion object {
71+
private const val TAG = "SetStatusMessageBottomSheet"
72+
}
7673

7774
private lateinit var binding: SetStatusMessageBottomSheetBinding
7875

79-
private lateinit var repository: UserStatusRepository
80-
private lateinit var predefinedStatus: ArrayList<PredefinedStatus>
76+
private var repository: UserStatusRepository? = null
8177
private lateinit var adapter: PredefinedStatusListAdapter
8278
private var selectedPredefinedMessageId: String? = null
8379
private var clearAt: Long? = -1
8480
private lateinit var popup: EmojiPopup
8581

86-
lateinit var asyncRunner: AsyncRunner
87-
8882
override fun onCreate(savedInstanceState: Bundle?) {
8983
super.onCreate(savedInstanceState)
90-
91-
val uiHandler = Handler(Looper.getMainLooper())
92-
asyncRunner = ThreadPoolAsyncRunner(uiHandler, 4, "io")
93-
predefinedStatus = UserStorage.readPredefinedStatus(requireContext())
94-
95-
lifecycleScope.launch(Dispatchers.IO) {
96-
97-
}
98-
repository = UserStatusRepository(requireContext())
9984
EmojiManager.install(GoogleEmojiProvider())
10085
}
10186

102-
@SuppressLint("DefaultLocale")
103-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
104-
super.onViewCreated(view, savedInstanceState)
105-
accountManager = (activity as BaseActivity).userAccountManager
106-
107-
currentStatus?.let {
108-
updateCurrentStatusViews(it)
87+
private fun initRepository() {
88+
lifecycleScope.launch(Dispatchers.IO) {
89+
val ssoAccount =
90+
SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext()) ?: return@launch
91+
repository = UserStatusRepository(requireContext(), ssoAccount)
92+
val predefinedStatus = repository?.fetchPredefinedStatuses() ?: arrayListOf()
93+
val currentStatus = repository?.fetchUserStatus() ?: Status(StatusType.OFFLINE, "", "", -1)
94+
95+
withContext(Dispatchers.Main) {
96+
updateCurrentStatusViews(currentStatus)
97+
initPredefinedStatusAdapter(predefinedStatus)
98+
}
10999
}
100+
}
110101

102+
private fun initPredefinedStatusAdapter(predefinedStatus: ArrayList<ExposedPredefinedStatus>) {
111103
adapter = PredefinedStatusListAdapter(this, requireContext())
112-
if (this::predefinedStatus.isInitialized) {
113-
adapter.list = predefinedStatus
114-
}
104+
Log_OC.d(TAG, "PredefinedStatusListAdapter initialized")
105+
adapter.list = predefinedStatus
115106
binding.predefinedStatusList.adapter = adapter
116107
binding.predefinedStatusList.layoutManager = LinearLayoutManager(context)
108+
}
109+
110+
@SuppressLint("DefaultLocale")
111+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
112+
super.onViewCreated(view, savedInstanceState)
113+
initRepository()
117114

118115
binding.clearStatus.setOnClickListener { clearStatus() }
119116
binding.setStatus.setOnClickListener { setStatusMessage() }
@@ -129,30 +126,34 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
129126
binding.emoji.installForceSingleEmoji()
130127
binding.emoji.installDisableKeyboardInput(popup)
131128

132-
val adapter = ArrayAdapter<String>(requireContext(), android.R.layout.simple_spinner_item)
133-
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
134-
adapter.add(getString(R.string.dontClear))
135-
adapter.add(getString(R.string.thirtyMinutes))
136-
adapter.add(getString(R.string.oneHour))
137-
adapter.add(getString(R.string.fourHours))
138-
adapter.add(getString(R.string.today))
139-
adapter.add(getString(R.string.thisWeek))
129+
clearStatusAdapter()
130+
}
131+
132+
private fun clearStatusAdapter() {
133+
val adapter =
134+
ArrayAdapter<String>(requireContext(), android.R.layout.simple_spinner_item).apply {
135+
setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
136+
add(getString(R.string.dontClear))
137+
add(getString(R.string.thirtyMinutes))
138+
add(getString(R.string.oneHour))
139+
add(getString(R.string.fourHours))
140+
add(getString(R.string.today))
141+
add(getString(R.string.thisWeek))
142+
}
140143

141144
binding.clearStatusAfterSpinner.apply {
142145
this.adapter = adapter
143-
onItemClickListener = object : OnItemSelectedListener, AdapterView.OnItemClickListener {
144-
override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) {
146+
onItemSelectedListener = object : OnItemSelectedListener {
147+
override fun onItemSelected(
148+
parent: AdapterView<*>,
149+
view: View?,
150+
position: Int,
151+
id: Long
152+
) {
145153
setClearStatusAfterValue(position)
146154
}
147155

148156
override fun onNothingSelected(parent: AdapterView<*>?) = Unit
149-
150-
override fun onItemClick(
151-
parent: AdapterView<*>?,
152-
view: View?,
153-
position: Int,
154-
id: Long
155-
) = Unit
156157
}
157158
}
158159
}
@@ -180,7 +181,11 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
180181
binding.remainingClearTime.apply {
181182
binding.clearStatusMessageTextView.text = getString(R.string.clear)
182183
visibility = View.VISIBLE
183-
text = DisplayUtils.getRelativeTimestamp(context, it.clearAt * ONE_SECOND_IN_MILLIS, true)
184+
text = DisplayUtils.getRelativeTimestamp(
185+
context,
186+
it.clearAt * ONE_SECOND_IN_MILLIS,
187+
true
188+
)
184189
.toString()
185190
.replaceFirstChar { it.lowercase(Locale.getDefault()) }
186191
setOnClickListener {
@@ -208,7 +213,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
208213
POS_FOUR_HOURS -> {
209214
// four hours
210215
System.currentTimeMillis() / ONE_SECOND_IN_MILLIS +
211-
FOUR_HOURS * ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS
216+
FOUR_HOURS * ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS
212217
}
213218

214219
POS_TODAY -> {
@@ -230,7 +235,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
230235
}
231236
}
232237

233-
private fun clearAtToUnixTime(clearAt: ClearAt?): Long = when {
238+
private fun clearAtToUnixTime(clearAt: ExposedClearAt?): Long = when {
234239
clearAt?.type == CLEAR_AT_TYPE_PERIOD -> {
235240
System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + clearAt.time.toLong()
236241
}
@@ -255,53 +260,51 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
255260
private fun dateToSeconds(date: Calendar) = date.timeInMillis / ONE_SECOND_IN_MILLIS
256261

257262
private fun clearStatus() {
258-
asyncRunner.postQuickTask(
259-
ClearStatusTask(accountManager.currentOwnCloudAccount?.savedAccount, context),
260-
{ dismiss(it) }
261-
)
263+
lifecycleScope.launch(Dispatchers.IO) {
264+
val result = repository?.clearStatus()
265+
dismiss(result)
266+
}
262267
}
263268

264269
private fun setStatusMessage() {
265270
if (selectedPredefinedMessageId != null) {
266-
asyncRunner.postQuickTask(
267-
SetPredefinedCustomStatusTask(
268-
selectedPredefinedMessageId!!,
269-
clearAt,
270-
accountManager.currentOwnCloudAccount?.savedAccount,
271-
context
272-
),
273-
{ dismiss(it) }
274-
)
271+
lifecycleScope.launch(Dispatchers.IO) {
272+
val result = repository?.setPredefinedStatus(selectedPredefinedMessageId!!, clearAt)
273+
dismiss(result)
274+
}
275275
} else {
276-
asyncRunner.postQuickTask(
277-
SetUserDefinedCustomStatusTask(
276+
lifecycleScope.launch(Dispatchers.IO) {
277+
val result = repository?.setCustomStatus(
278278
binding.customStatusInput.text.toString(),
279279
binding.emoji.text.toString(),
280-
clearAt,
281-
accountManager.currentOwnCloudAccount?.savedAccount,
282-
context
283-
),
284-
{ dismiss(it) }
285-
)
280+
clearAt
281+
)
282+
dismiss(result)
283+
}
286284
}
287285
}
288286

289-
private fun dismiss(boolean: Boolean) {
290-
if (boolean) {
287+
private suspend fun dismiss(boolean: Boolean?) = withContext(Dispatchers.Main) {
288+
if (boolean == true) {
291289
dismiss()
292290
} else {
293-
DisplayUtils.showSnackMessage(view, view?.resources?.getString(R.string.error_setting_status_message))
291+
val message = view?.resources?.getString(R.string.error_setting_status_message)
292+
DisplayUtils.showSnackMessage(view, message)
294293
}
295294
}
296295

297-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
296+
override fun onCreateView(
297+
inflater: LayoutInflater,
298+
container: ViewGroup?,
299+
savedInstanceState: Bundle?
300+
): View {
298301
binding = SetStatusMessageBottomSheetBinding.inflate(layoutInflater, container, false)
299302
return binding.root
300303
}
301304

302-
override fun onClick(predefinedStatus: PredefinedStatus) {
305+
override fun onClick(predefinedStatus: ExposedPredefinedStatus) {
303306
selectedPredefinedMessageId = predefinedStatus.id
304-
clearAt = clearAtToUnixTime(predefinedStatus.clearAt)
307+
clearAt = clearAtToUnixTime(predefinedStatus.exposedClearAt)
305308
binding.emoji.setText(predefinedStatus.icon)
306309
binding.customStatusInput.text?.clear()
307310
binding.customStatusInput.text?.append(predefinedStatus.message)
@@ -310,7 +313,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
310313
binding.clearStatusAfterSpinner.visibility = View.VISIBLE
311314
binding.clearStatusMessageTextView.text = getString(R.string.clear_status_after)
312315

313-
val clearAt = predefinedStatus.clearAt
316+
val clearAt = predefinedStatus.exposedClearAt
314317
if (clearAt == null) {
315318
binding.clearStatusAfterSpinner.setSelection(0)
316319
} else {
@@ -322,7 +325,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
322325
setClearStatusAfterValue(binding.clearStatusAfterSpinner.selectedItemPosition)
323326
}
324327

325-
private fun updateClearAtViewsForPeriod(clearAt: ClearAt) {
328+
private fun updateClearAtViewsForPeriod(clearAt: ExposedClearAt) {
326329
when (clearAt.time) {
327330
"1800" -> binding.clearStatusAfterSpinner.setSelection(POS_HALF_AN_HOUR)
328331
"3600" -> binding.clearStatusAfterSpinner.setSelection(POS_AN_HOUR)
@@ -331,17 +334,11 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) :
331334
}
332335
}
333336

334-
private fun updateClearAtViewsForEndOf(clearAt: ClearAt) {
337+
private fun updateClearAtViewsForEndOf(clearAt: ExposedClearAt) {
335338
when (clearAt.time) {
336339
"day" -> binding.clearStatusAfterSpinner.setSelection(POS_TODAY)
337340
"week" -> binding.clearStatusAfterSpinner.setSelection(POS_END_OF_WEEK)
338341
else -> binding.clearStatusAfterSpinner.setSelection(POS_DONT_CLEAR)
339342
}
340343
}
341-
342-
@VisibleForTesting
343-
fun setPredefinedStatus(predefinedStatus: ArrayList<PredefinedStatus>) {
344-
adapter.list = predefinedStatus
345-
binding.predefinedStatusList.adapter?.notifyDataSetChanged()
346-
}
347344
}

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/adapter/PredefinedStatusClickListener.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
*/
88
package it.niedermann.owncloud.notes.accountswitcher.adapter
99

10-
import com.owncloud.android.lib.resources.users.PredefinedStatus
10+
import it.niedermann.owncloud.notes.accountswitcher.model.ExposedPredefinedStatus
1111

1212
interface PredefinedStatusClickListener {
13-
fun onClick(predefinedStatus: PredefinedStatus)
13+
fun onClick(predefinedStatus: ExposedPredefinedStatus)
1414
}

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/adapter/PredefinedStatusListAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import android.content.Context
1111
import android.view.LayoutInflater
1212
import android.view.ViewGroup
1313
import androidx.recyclerview.widget.RecyclerView
14-
import com.owncloud.android.lib.resources.users.PredefinedStatus
14+
import it.niedermann.owncloud.notes.accountswitcher.model.ExposedPredefinedStatus
1515
import it.niedermann.owncloud.notes.databinding.PredefinedStatusBinding
1616

1717
class PredefinedStatusListAdapter(private val clickListener: PredefinedStatusClickListener, val context: Context) :
1818
RecyclerView.Adapter<PredefinedStatusViewHolder>() {
19-
internal var list: List<PredefinedStatus> = emptyList()
19+
internal var list: List<ExposedPredefinedStatus> = emptyList()
2020

2121
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PredefinedStatusViewHolder {
2222
val itemBinding = PredefinedStatusBinding.inflate(LayoutInflater.from(parent.context), parent, false)

app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/adapter/PredefinedStatusViewHolder.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@ package it.niedermann.owncloud.notes.accountswitcher.adapter
99

1010
import android.content.Context
1111
import androidx.recyclerview.widget.RecyclerView
12-
import com.owncloud.android.lib.resources.users.PredefinedStatus
1312
import it.niedermann.owncloud.notes.R
13+
import it.niedermann.owncloud.notes.accountswitcher.model.ExposedPredefinedStatus
1414
import it.niedermann.owncloud.notes.databinding.PredefinedStatusBinding
1515
import it.niedermann.owncloud.notes.shared.util.DisplayUtils
1616

1717
private const val ONE_SECOND_IN_MILLIS = 1000
1818

1919
class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : RecyclerView.ViewHolder(binding.root) {
2020

21-
fun bind(status: PredefinedStatus, clickListener: PredefinedStatusClickListener, context: Context) {
21+
fun bind(status: ExposedPredefinedStatus, clickListener: PredefinedStatusClickListener, context: Context) {
2222
binding.root.setOnClickListener { clickListener.onClick(status) }
2323
binding.icon.text = status.icon
2424
binding.name.text = status.message
2525

26-
if (status.clearAt == null) {
26+
if (status.exposedClearAt == null) {
2727
binding.clearAt.text = context.getString(R.string.dontClear)
2828
} else {
29-
val clearAt = status.clearAt!!
29+
val clearAt = status.exposedClearAt
3030
if (clearAt.type == "period") {
3131
binding.clearAt.text = DisplayUtils.getRelativeTimestamp(
3232
context,

0 commit comments

Comments
 (0)