@@ -12,22 +12,19 @@ package it.niedermann.owncloud.notes.accountswitcher
1212import android.annotation.SuppressLint
1313import android.content.Context
1414import android.os.Bundle
15- import android.os.Handler
16- import android.os.Looper
1715import android.view.LayoutInflater
1816import android.view.View
1917import android.view.ViewGroup
2018import android.view.inputmethod.InputMethodManager
2119import android.widget.AdapterView
2220import android.widget.AdapterView.OnItemSelectedListener
2321import android.widget.ArrayAdapter
24- import androidx.annotation.VisibleForTesting
2522import androidx.lifecycle.lifecycleScope
2623import 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
3026import com.owncloud.android.lib.resources.users.Status
27+ import com.owncloud.android.lib.resources.users.StatusType
3128import com.vanniktech.emoji.EmojiManager
3229import com.vanniktech.emoji.EmojiPopup
3330import com.vanniktech.emoji.google.GoogleEmojiProvider
@@ -36,19 +33,16 @@ import com.vanniktech.emoji.installForceSingleEmoji
3633import it.niedermann.owncloud.notes.R
3734import it.niedermann.owncloud.notes.accountswitcher.adapter.PredefinedStatusClickListener
3835import 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
3938import 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
4339import it.niedermann.owncloud.notes.branding.BrandedBottomSheetDialogFragment
4440import it.niedermann.owncloud.notes.branding.BrandingUtil
4541import it.niedermann.owncloud.notes.databinding.SetStatusMessageBottomSheetBinding
4642import 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
5043import kotlinx.coroutines.Dispatchers
5144import kotlinx.coroutines.launch
45+ import kotlinx.coroutines.withContext
5246import java.util.Calendar
5347import java.util.Locale
5448
@@ -70,50 +64,53 @@ private const val LAST_SECOND_OF_MINUTE = 59
7064private const val CLEAR_AT_TYPE_PERIOD = " period"
7165private 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}
0 commit comments