Skip to content

Commit 1737965

Browse files
committed
add option to trigger automatic export
1 parent cc394fb commit 1737965

File tree

19 files changed

+327
-47
lines changed

19 files changed

+327
-47
lines changed

app/src/main/java/com/example/util/simpletimetracker/di/NavigationDialogMapModule.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import com.example.util.simpletimetracker.navigation.params.screen.DebugMenuDial
4242
import com.example.util.simpletimetracker.navigation.params.screen.DefaultTypesSelectionDialogParams
4343
import com.example.util.simpletimetracker.navigation.params.screen.DurationDialogParams
4444
import com.example.util.simpletimetracker.navigation.params.screen.EmojiSelectionDialogParams
45+
import com.example.util.simpletimetracker.navigation.params.screen.ExportOptionsParams
4546
import com.example.util.simpletimetracker.navigation.params.screen.HelpDialogParams
4647
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
4748
import com.example.util.simpletimetracker.navigation.params.screen.PartialRestoreParams
@@ -322,6 +323,16 @@ class NavigationDialogMapModule {
322323
)
323324
}
324325

326+
@IntoMap
327+
@Provides
328+
@ScreenKey(ExportOptionsParams::class)
329+
fun exportOptionsDialogFragment(): NavigationData {
330+
return NavigationData(
331+
R.id.exportOptionsDialogFragment,
332+
BundleCreator.empty(),
333+
)
334+
}
335+
325336
@IntoMap
326337
@Provides
327338
@ScreenKey(PartialRestoreParams::class)

app/src/main/res/navigation/nav_graph.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,11 @@
364364
android:name="com.example.util.simpletimetracker.feature_settings.backupOptions.view.BackupOptionsFragment"
365365
android:label="BackupOptionsDialogFragment"
366366
tools:layout="@layout/settings_backup_options_fragment" />
367+
<dialog
368+
android:id="@+id/exportOptionsDialogFragment"
369+
android:name="com.example.util.simpletimetracker.feature_settings.exportOptions.view.ExportOptionsFragment"
370+
android:label="ExportOptionsDialogFragment"
371+
tools:layout="@layout/settings_export_options_fragment" />
367372
<dialog
368373
android:id="@+id/partialRestoreDialogFragment"
369374
android:name="com.example.util.simpletimetracker.feature_settings.partialRestore.view.PartialRestoreFragment"
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.example.util.simpletimetracker.domain.backup.interactor
22

3+
import com.example.util.simpletimetracker.domain.backup.model.ResultCode
4+
35
interface AutomaticExportInteractor {
46

57
suspend fun schedule()
@@ -8,5 +10,5 @@ interface AutomaticExportInteractor {
810

911
fun onFinished()
1012

11-
suspend fun export()
13+
suspend fun export(): ResultCode?
1214
}

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/automaticExport/interactor/AutomaticExportInteractorImpl.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ class AutomaticExportInteractorImpl @Inject constructor(
3232
automaticExportRepo.inProgress.post(false)
3333
}
3434

35-
override suspend fun export() {
35+
override suspend fun export(): ResultCode? {
3636
automaticExportRepo.inProgress.post(true)
3737

3838
val uri = prefsInteractor.getAutomaticExportUri()
3939
.takeUnless { it.isEmpty() }
4040
?: run {
4141
onFinished()
42-
return
42+
return null
4343
}
4444
val result = csvExportInteractor.saveCsvFile(
4545
uriString = uri,
@@ -57,5 +57,7 @@ class AutomaticExportInteractorImpl @Inject constructor(
5757
}
5858

5959
onFinished()
60+
61+
return result
6062
}
6163
}

features/feature_settings/api/src/main/java/com/example/util/simpletimetracker/feature_settings/api/SettingsBlock.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ enum class SettingsBlock {
116116
ExportSpreadsheetImport,
117117
ExportSpreadsheetImportHint,
118118
ExportIcs,
119+
ExportCustomized,
120+
ExportTriggerAutoBackup,
119121
ExportBottom,
120122

121123
TranslatorsTop,

features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/backupOptions/view/BackupOptionsFragment.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ import com.example.util.simpletimetracker.core.dialog.StandardDialogListener
88
import com.example.util.simpletimetracker.core.extension.blockContentScroll
99
import com.example.util.simpletimetracker.core.extension.setSkipCollapsed
1010
import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter
11-
import com.example.util.simpletimetracker.feature_base_adapter.hintBig.createHintBigAdapterDelegate
1211
import com.example.util.simpletimetracker.feature_settings.backupOptions.viewModel.BackupOptionsViewModel
1312
import com.example.util.simpletimetracker.feature_settings.views.getSettingsAdapterDelegates
14-
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
1513
import dagger.hilt.android.AndroidEntryPoint
1614
import com.example.util.simpletimetracker.feature_settings.databinding.SettingsBackupOptionsFragmentBinding as Binding
1715

features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/backupOptions/viewModel/BackupOptionsViewModel.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.example.util.simpletimetracker.feature_settings.backupOptions.viewModel
22

33
import androidx.lifecycle.LiveData
4-
import androidx.lifecycle.MutableLiveData
5-
import androidx.lifecycle.viewModelScope
64
import com.example.util.simpletimetracker.core.base.BaseViewModel
75
import com.example.util.simpletimetracker.core.base.SingleLiveEvent
86
import com.example.util.simpletimetracker.core.extension.lazySuspend
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.example.util.simpletimetracker.feature_settings.exportOptions.view
2+
3+
import android.content.Context
4+
import android.view.LayoutInflater
5+
import android.view.ViewGroup
6+
import androidx.fragment.app.viewModels
7+
import com.example.util.simpletimetracker.core.base.BaseBottomSheetFragment
8+
import com.example.util.simpletimetracker.core.extension.blockContentScroll
9+
import com.example.util.simpletimetracker.core.extension.findListeners
10+
import com.example.util.simpletimetracker.core.extension.setSkipCollapsed
11+
import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter
12+
import com.example.util.simpletimetracker.feature_settings.api.SettingsBlock
13+
import com.example.util.simpletimetracker.feature_settings.databinding.SettingsExportOptionsFragmentBinding
14+
import com.example.util.simpletimetracker.feature_settings.exportOptions.viewModel.ExportOptionsViewModel
15+
import com.example.util.simpletimetracker.feature_settings.model.AdvancedOptionsBlockClickListener
16+
import com.example.util.simpletimetracker.feature_settings.views.getSettingsAdapterDelegates
17+
import dagger.hilt.android.AndroidEntryPoint
18+
19+
@AndroidEntryPoint
20+
class ExportOptionsFragment : BaseBottomSheetFragment<SettingsExportOptionsFragmentBinding>() {
21+
22+
override val inflater: (LayoutInflater, ViewGroup?, Boolean) -> SettingsExportOptionsFragmentBinding =
23+
SettingsExportOptionsFragmentBinding::inflate
24+
25+
private val viewModel: ExportOptionsViewModel by viewModels()
26+
27+
private val contentAdapter: BaseRecyclerAdapter by lazy {
28+
BaseRecyclerAdapter(
29+
*getSettingsAdapterDelegates(
30+
onBlockClicked = viewModel::onBlockClicked,
31+
onSpinnerPositionSelected = viewModel::onSpinnerPositionSelected,
32+
).toTypedArray(),
33+
)
34+
}
35+
36+
private var listeners: List<AdvancedOptionsBlockClickListener> = emptyList()
37+
38+
override fun onAttach(context: Context) {
39+
super.onAttach(context)
40+
listeners = context.findListeners<AdvancedOptionsBlockClickListener>()
41+
}
42+
43+
override fun initDialog() {
44+
setSkipCollapsed()
45+
blockContentScroll(binding.rvExportOptionsContent)
46+
}
47+
48+
override fun initUi() = with(binding) {
49+
rvExportOptionsContent.adapter = contentAdapter
50+
rvExportOptionsContent.itemAnimator = null
51+
}
52+
53+
override fun initViewModel() = with(viewModel) {
54+
viewModel.content.observe(contentAdapter::replaceAsNew)
55+
blockClicked.observe(this@ExportOptionsFragment::onBlockClicked)
56+
spinnerPositionSelected.observe(this@ExportOptionsFragment::onSpinnerPositionSelected)
57+
dismiss.observe { dismiss() }
58+
}
59+
60+
private fun onBlockClicked(block: SettingsBlock) {
61+
listeners.forEach { it.onAdvancedOptionsBlockClicked(block) }
62+
}
63+
64+
private fun onSpinnerPositionSelected(data: Pair<SettingsBlock, Int>) {
65+
listeners.forEach { it.onAdvancedOptionsSpinnerPositionSelected(data.first, data.second) }
66+
}
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.example.util.simpletimetracker.feature_settings.exportOptions.viewModel
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.viewModelScope
5+
import com.example.util.simpletimetracker.core.base.BaseViewModel
6+
import com.example.util.simpletimetracker.core.base.SingleLiveEvent
7+
import com.example.util.simpletimetracker.core.extension.lazySuspend
8+
import com.example.util.simpletimetracker.core.extension.set
9+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
10+
import com.example.util.simpletimetracker.feature_settings.api.SettingsBlock
11+
import com.example.util.simpletimetracker.feature_settings.interactor.SettingsAdvancedOptionsUpdateInteractor
12+
import com.example.util.simpletimetracker.feature_settings.interactor.SettingsExportViewDataInteractor
13+
import dagger.hilt.android.lifecycle.HiltViewModel
14+
import kotlinx.coroutines.launch
15+
import javax.inject.Inject
16+
17+
@HiltViewModel
18+
class ExportOptionsViewModel @Inject constructor(
19+
private val settingsExportViewDataInteractor: SettingsExportViewDataInteractor,
20+
private val settingsAdvancedOptionsUpdateInteractor: SettingsAdvancedOptionsUpdateInteractor,
21+
) : BaseViewModel() {
22+
23+
val content: LiveData<List<ViewHolderType>> by lazySuspend {
24+
loadContent()
25+
}
26+
val blockClicked: LiveData<SettingsBlock> =
27+
SingleLiveEvent<SettingsBlock>()
28+
val spinnerPositionSelected: LiveData<Pair<SettingsBlock, Int>> =
29+
SingleLiveEvent<Pair<SettingsBlock, Int>>()
30+
val dismiss: LiveData<Unit> =
31+
SingleLiveEvent<Unit>()
32+
33+
init {
34+
viewModelScope.launch {
35+
settingsAdvancedOptionsUpdateInteractor.dataUpdated.collect { updateContent() }
36+
}
37+
viewModelScope.launch {
38+
settingsAdvancedOptionsUpdateInteractor.dismiss.collect { dismiss.set(Unit) }
39+
}
40+
}
41+
42+
fun onBlockClicked(block: SettingsBlock) {
43+
blockClicked.set(block)
44+
}
45+
46+
fun onSpinnerPositionSelected(block: SettingsBlock, position: Int) {
47+
spinnerPositionSelected.set(block to position)
48+
}
49+
50+
private suspend fun updateContent() {
51+
content.set(loadContent())
52+
}
53+
54+
private suspend fun loadContent(): List<ViewHolderType> {
55+
return settingsExportViewDataInteractor.executeAdvanced()
56+
}
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.example.util.simpletimetracker.feature_settings.interactor
2+
3+
import kotlinx.coroutines.channels.BufferOverflow
4+
import kotlinx.coroutines.flow.MutableSharedFlow
5+
import kotlinx.coroutines.flow.SharedFlow
6+
import kotlinx.coroutines.flow.asSharedFlow
7+
import javax.inject.Inject
8+
import javax.inject.Singleton
9+
10+
@Singleton
11+
class SettingsAdvancedOptionsUpdateInteractor @Inject constructor() {
12+
13+
val dataUpdated: SharedFlow<Unit> get() = _dataUpdated.asSharedFlow()
14+
15+
private val _dataUpdated = MutableSharedFlow<Unit>(
16+
extraBufferCapacity = 1,
17+
onBufferOverflow = BufferOverflow.DROP_OLDEST,
18+
)
19+
20+
val dismiss: SharedFlow<Unit> get() = _dismiss.asSharedFlow()
21+
22+
private val _dismiss = MutableSharedFlow<Unit>(
23+
extraBufferCapacity = 1,
24+
onBufferOverflow = BufferOverflow.DROP_OLDEST,
25+
)
26+
27+
suspend fun send() {
28+
_dataUpdated.emit(Unit)
29+
}
30+
31+
suspend fun sendDismiss() {
32+
_dismiss.emit(Unit)
33+
}
34+
}

0 commit comments

Comments
 (0)