Skip to content

Commit 65871bb

Browse files
committed
customize options menu
1 parent 1442ecb commit 65871bb

File tree

64 files changed

+906
-74
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+906
-74
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ import com.example.util.simpletimetracker.feature_dialogs.optionsDialog.OptionsL
1616
import com.example.util.simpletimetracker.feature_dialogs.recordQuickActions.view.RecordQuickActionsDialogFragment
1717
import com.example.util.simpletimetracker.feature_dialogs.recordTagSelection.RecordTagSelectionDialogFragment
1818
import com.example.util.simpletimetracker.feature_dialogs.recordTagValueSelection.view.RecordTagValueSelectionDialogFragment
19-
import com.example.util.simpletimetracker.feature_dialogs.typesSelection.view.TypesSelectionDialogFragment
2019
import com.example.util.simpletimetracker.feature_dialogs.standard.StandardDialogFragment
20+
import com.example.util.simpletimetracker.feature_dialogs.typesSelection.view.TypesSelectionDialogFragment
2121
import com.example.util.simpletimetracker.feature_records_filter.view.RecordsFilterFragment
22-
import com.example.util.simpletimetracker.feature_settings.partialRestoreSelection.view.PartialRestoreSelectionFragment
22+
import com.example.util.simpletimetracker.feature_settings.customizeOptionsMenu.CustomizeOptionsMenuDialogFragment
2323
import com.example.util.simpletimetracker.feature_settings.partialRestoreSelection.model.PartialRestoreSelectionDialogParams
24+
import com.example.util.simpletimetracker.feature_settings.partialRestoreSelection.view.PartialRestoreSelectionFragment
2425
import com.example.util.simpletimetracker.navigation.NavigationData
2526
import com.example.util.simpletimetracker.navigation.bundleCreator.BundleCreator
2627
import com.example.util.simpletimetracker.navigation.bundleCreator.bundleCreatorDelegate
@@ -31,6 +32,7 @@ import com.example.util.simpletimetracker.navigation.params.screen.CardSizeDialo
3132
import com.example.util.simpletimetracker.navigation.params.screen.ChartFilterDialogParams
3233
import com.example.util.simpletimetracker.navigation.params.screen.ColorSelectionDialogParams
3334
import com.example.util.simpletimetracker.navigation.params.screen.CustomRangeSelectionParams
35+
import com.example.util.simpletimetracker.navigation.params.screen.CustomizeOptionsMenuDialogParams
3436
import com.example.util.simpletimetracker.navigation.params.screen.DataEditDuplicateTypeDialogParams
3537
import com.example.util.simpletimetracker.navigation.params.screen.DataEditTagSelectionDialogParams
3638
import com.example.util.simpletimetracker.navigation.params.screen.DataEditTypeSelectionDialogParams
@@ -41,15 +43,15 @@ import com.example.util.simpletimetracker.navigation.params.screen.DefaultTypesS
4143
import com.example.util.simpletimetracker.navigation.params.screen.DurationDialogParams
4244
import com.example.util.simpletimetracker.navigation.params.screen.EmojiSelectionDialogParams
4345
import com.example.util.simpletimetracker.navigation.params.screen.HelpDialogParams
46+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
4447
import com.example.util.simpletimetracker.navigation.params.screen.PartialRestoreParams
4548
import com.example.util.simpletimetracker.navigation.params.screen.PomodoroSettingsParams
4649
import com.example.util.simpletimetracker.navigation.params.screen.RecordQuickActionsParams
4750
import com.example.util.simpletimetracker.navigation.params.screen.RecordTagSelectionParams
48-
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
4951
import com.example.util.simpletimetracker.navigation.params.screen.RecordTagValueSelectionParams
50-
import com.example.util.simpletimetracker.navigation.params.screen.TypesSelectionDialogParams
5152
import com.example.util.simpletimetracker.navigation.params.screen.RecordsFilterParams
5253
import com.example.util.simpletimetracker.navigation.params.screen.StandardDialogParams
54+
import com.example.util.simpletimetracker.navigation.params.screen.TypesSelectionDialogParams
5355
import dagger.Module
5456
import dagger.Provides
5557
import dagger.hilt.InstallIn
@@ -140,6 +142,16 @@ class NavigationDialogMapModule {
140142
)
141143
}
142144

145+
@IntoMap
146+
@Provides
147+
@ScreenKey(CustomizeOptionsMenuDialogParams::class)
148+
fun customizeOptionsMenuDialog(): NavigationData {
149+
return NavigationData(
150+
R.id.customizeOptionsMenuDialogFragment,
151+
bundleCreatorDelegate(CustomizeOptionsMenuDialogFragment::createBundle),
152+
)
153+
}
154+
143155
@IntoMap
144156
@Provides
145157
@ScreenKey(CardOrderDialogParams::class)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@
279279
android:name="com.example.util.simpletimetracker.feature_dialogs.cardSize.view.CardSizeDialogFragment"
280280
android:label="CardSizeDialogFragment"
281281
tools:layout="@layout/card_size_dialog_fragment" />
282+
<dialog
283+
android:id="@+id/customizeOptionsMenuDialogFragment"
284+
android:name="com.example.util.simpletimetracker.feature_settings.customizeOptionsMenu.CustomizeOptionsMenuDialogFragment"
285+
android:label="CustomizeOptionsMenuDialogFragment"
286+
tools:layout="@layout/customize_options_menu_dialog_fragment" />
282287
<dialog
283288
android:id="@+id/cardOrderDialogFragment"
284289
android:name="com.example.util.simpletimetracker.feature_dialogs.cardOrder.view.CardOrderDialogFragment"

core/src/main/java/com/example/util/simpletimetracker/core/delegates/dateSelector/mapper/DateSelectorMapper.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.example.util.simpletimetracker.domain.daysOfWeek.model.DaysInCalendar
99
import com.example.util.simpletimetracker.domain.statistics.extension.canBeSwiped
1010
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
1111
import com.example.util.simpletimetracker.feature_base_adapter.InfiniteRecyclerAdapter
12+
import com.example.util.simpletimetracker.feature_base_adapter.R
1213
import com.example.util.simpletimetracker.feature_base_adapter.dateSelector.DateSelectorDayViewData
1314
import com.example.util.simpletimetracker.feature_base_adapter.dateSelector.DateSelectorRangeViewData
1415
import com.example.util.simpletimetracker.feature_base_adapter.dateSelector.DateSelectorSingleViewData
@@ -206,19 +207,31 @@ class DateSelectorMapper @Inject constructor(
206207
val firstDayOfWeek: DayOfWeek,
207208
) {
208209
sealed interface Type {
210+
val optionsButton: Button
211+
209212
data class Records(
213+
override val optionsButton: Button,
210214
val isCalendarView: Boolean,
211215
val daysInCalendar: DaysInCalendar,
212216
) : Type
213217

214218
data class Statistics(
219+
override val optionsButton: Button,
215220
val rangeLength: RangeLength,
216221
) : Type
217222
}
218223

224+
sealed interface Button {
225+
data object Hidden : Button
226+
data class Visible(val iconResId: Int) : Button
227+
}
228+
219229
companion object {
220230
val Empty = SetupData(
221-
type = Type.Statistics(RangeLength.Day),
231+
type = Type.Statistics(
232+
optionsButton = Button.Hidden,
233+
rangeLength = RangeLength.Day,
234+
),
222235
startOfDayShift = 0,
223236
firstDayOfWeek = DayOfWeek.SUNDAY,
224237
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.example.util.simpletimetracker.core.delegates.dateSelector.viewData
2+
3+
data class DateSelectorButtonsViewData(
4+
val addButton: Button,
5+
val optionsButton: Button,
6+
) {
7+
8+
sealed interface Button {
9+
data object Hidden : Button
10+
data class Visible(val iconResId: Int) : Button
11+
}
12+
}

core/src/main/java/com/example/util/simpletimetracker/core/delegates/dateSelector/viewDelegate/DateSelectorViewDelegate.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.viewbinding.ViewBinding
1414
import androidx.viewpager2.widget.ViewPager2
1515
import com.example.util.simpletimetracker.core.base.BaseFragment
1616
import com.example.util.simpletimetracker.core.databinding.DateSelectorLayoutBinding
17+
import com.example.util.simpletimetracker.core.delegates.dateSelector.viewData.DateSelectorButtonsViewData
1718
import com.example.util.simpletimetracker.core.delegates.dateSelector.viewModelDelegate.DateSelectorViewModelDelegate
1819
import com.example.util.simpletimetracker.core.extension.changeDragSensitivity
1920
import com.example.util.simpletimetracker.core.extension.horizontalSmoothScrollWithOffset
@@ -24,6 +25,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.dateSelector.crea
2425
import com.example.util.simpletimetracker.feature_views.extension.addOnScrollListenerAdapter
2526
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
2627
import com.example.util.simpletimetracker.feature_views.extension.setOnLongClick
28+
import com.google.android.material.button.MaterialButton
2729

2830
object DateSelectorViewDelegate {
2931

@@ -71,13 +73,10 @@ object DateSelectorViewDelegate {
7173
fun <T : ViewBinding> initUx(
7274
fragment: BaseFragment<T>,
7375
binding: DateSelectorLayoutBinding,
74-
isAddButtonVisible: Boolean,
7576
onRecordAddClick: () -> Unit,
7677
onOptionsClick: () -> Unit,
7778
onOptionsLongClick: () -> Unit,
7879
) = with(fragment) {
79-
binding.btnRecordsContainerAdd.isVisible = isAddButtonVisible
80-
8180
binding.btnRecordsContainerAdd.setOnClick(throttle(onRecordAddClick))
8281
binding.btnRecordsContainerOptions.setOnClick(throttle(onOptionsClick))
8382
binding.btnRecordsContainerOptions.setOnLongClick(throttle(onOptionsLongClick))
@@ -106,6 +105,12 @@ object DateSelectorViewDelegate {
106105
binding.viewRecordsContainerBorderShadowStart.isVisible = isVisible
107106
binding.viewRecordsContainerBorderShadowEnd.isVisible = isVisible
108107
}
108+
viewModel.buttonsViewData.observe {
109+
setButtonsViewData(
110+
binding = binding,
111+
viewData = it,
112+
)
113+
}
109114
}
110115

111116
private fun getAdapter(
@@ -201,4 +206,27 @@ object DateSelectorViewDelegate {
201206
// TODO do better maybe?
202207
viewHolder.adapter.value.notifyDataSetChanged()
203208
}
209+
210+
private fun setButtonsViewData(
211+
binding: DateSelectorLayoutBinding,
212+
viewData: DateSelectorButtonsViewData,
213+
) = with(binding) {
214+
fun setData(
215+
view: MaterialButton,
216+
data: DateSelectorButtonsViewData.Button,
217+
) {
218+
when (data) {
219+
is DateSelectorButtonsViewData.Button.Visible -> {
220+
view.isVisible = true
221+
view.setIconResource(data.iconResId)
222+
}
223+
is DateSelectorButtonsViewData.Button.Hidden -> {
224+
view.isVisible = false
225+
}
226+
}
227+
}
228+
229+
setData(btnRecordsContainerAdd, viewData.addButton)
230+
setData(btnRecordsContainerOptions, viewData.optionsButton)
231+
}
204232
}

core/src/main/java/com/example/util/simpletimetracker/core/delegates/dateSelector/viewModelDelegate/DateSelectorViewModelDelegate.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ import androidx.lifecycle.MutableLiveData
55
import com.example.util.simpletimetracker.core.base.SingleLiveEvent
66
import com.example.util.simpletimetracker.core.base.ViewModelDelegate
77
import com.example.util.simpletimetracker.core.delegates.dateSelector.mapper.DateSelectorMapper
8+
import com.example.util.simpletimetracker.core.delegates.dateSelector.viewData.DateSelectorButtonsViewData
89
import com.example.util.simpletimetracker.core.delegates.dateSelector.viewData.DateSelectorScrollViewData
910
import com.example.util.simpletimetracker.core.extension.set
1011
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
12+
import com.example.util.simpletimetracker.domain.record.model.RecordsFilter
1113
import com.example.util.simpletimetracker.feature_base_adapter.InfiniteRecyclerAdapter
14+
import com.example.util.simpletimetracker.feature_base_adapter.R
15+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
1216
import javax.inject.Inject
1317

1418
class DateSelectorViewModelDelegate @Inject constructor(
@@ -18,6 +22,7 @@ class DateSelectorViewModelDelegate @Inject constructor(
1822

1923
val dateScrollPosition: LiveData<DateSelectorScrollViewData> =
2024
SingleLiveEvent<DateSelectorScrollViewData>()
25+
val buttonsViewData: LiveData<DateSelectorButtonsViewData> = MutableLiveData()
2126
val updateDatesViewData: LiveData<Unit> = SingleLiveEvent<Unit>()
2227
val borderShadowsVisibility: LiveData<Boolean> = MutableLiveData()
2328

@@ -68,6 +73,18 @@ class DateSelectorViewModelDelegate @Inject constructor(
6873
dateScrollPosition.set(scrollData)
6974
}
7075

76+
fun getOptionsButton(
77+
options: List<OptionsListParams.Item>,
78+
): DateSelectorMapper.SetupData.Button {
79+
return if (options.isEmpty()) {
80+
DateSelectorMapper.SetupData.Button.Hidden
81+
} else {
82+
val defaultIcon = R.drawable.more
83+
val icon = options.firstOrNull()?.icon?.takeIf { options.size == 1 } ?: defaultIcon
84+
DateSelectorMapper.SetupData.Button.Visible(icon)
85+
}
86+
}
87+
7188
private suspend fun setupDatesSelector() {
7289
val setupData = DateSelectorMapper.SetupData(
7390
type = parent?.getSetupData() ?: return,
@@ -80,6 +97,26 @@ class DateSelectorViewModelDelegate @Inject constructor(
8097
val shadowsVisibility = dataProvider.getCount() ==
8198
InfiniteRecyclerAdapter.DataProvider.Count.Infinite
8299
borderShadowsVisibility.set(shadowsVisibility)
100+
101+
val buttonsData = DateSelectorButtonsViewData(
102+
addButton = when (setupData.type) {
103+
is DateSelectorMapper.SetupData.Type.Records -> {
104+
DateSelectorButtonsViewData.Button.Visible(iconResId = R.drawable.plus)
105+
}
106+
is DateSelectorMapper.SetupData.Type.Statistics -> {
107+
DateSelectorButtonsViewData.Button.Hidden
108+
}
109+
},
110+
optionsButton = when (val optionsButton = setupData.type.optionsButton) {
111+
is DateSelectorMapper.SetupData.Button.Visible -> {
112+
DateSelectorButtonsViewData.Button.Visible(iconResId = optionsButton.iconResId)
113+
}
114+
is DateSelectorMapper.SetupData.Button.Hidden -> {
115+
DateSelectorButtonsViewData.Button.Hidden
116+
}
117+
},
118+
)
119+
buttonsViewData.set(buttonsData)
83120
}
84121

85122
interface Parent {

core/src/main/res/layout/date_selector_layout.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,24 @@
4747
style="@style/ContainerRangeOptionsButton"
4848
android:layout_height="0dp"
4949
android:layout_marginEnd="8dp"
50-
app:icon="@drawable/more"
50+
android:visibility="gone"
5151
app:layout_constraintBottom_toBottomOf="parent"
5252
app:layout_constraintEnd_toEndOf="parent"
53-
app:layout_constraintTop_toTopOf="parent" />
53+
app:layout_constraintTop_toTopOf="parent"
54+
tools:icon="@drawable/more"
55+
tools:visibility="visible" />
5456

5557
<com.google.android.material.button.MaterialButton
5658
android:id="@+id/btnRecordsContainerAdd"
5759
style="@style/ContainerRangeOptionsButton"
5860
android:layout_height="0dp"
5961
android:layout_marginEnd="4dp"
6062
android:visibility="gone"
61-
app:icon="@drawable/add"
6263
app:layout_constraintBottom_toBottomOf="parent"
6364
app:layout_constraintEnd_toStartOf="@id/btnRecordsContainerOptions"
6465
app:layout_constraintTop_toTopOf="parent"
66+
app:layout_goneMarginEnd="8dp"
67+
tools:icon="@drawable/add"
6568
tools:visibility="visible" />
6669

6770
</androidx.constraintlayout.widget.ConstraintLayout>

data_local/src/main/java/com/example/util/simpletimetracker/data_local/backup/BackupPrefsRepo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Compani
8888
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_DURATION_PRESENTATION_FORMAT
8989
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_ENABLE_SEARCH_ON_MAIN
9090
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_HIDDEN_COMMENT_FILTERS
91+
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_HIDDEN_CONTAINER_OPTIONS
9192
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_START_TIMER_BY_LONG_CLICK
9293
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_POMODORO_SHOW_MORE_CONTROLS
9394
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TYPE_ADDITIONAL_FIELDS_SHOWN
@@ -244,6 +245,7 @@ class BackupPrefsRepo @Inject constructor(
244245
PrefsProcessor(KEY_CATEGORY_ADDITIONAL_FIELDS_SHOWN, ::categoryAdditionalFieldsShown),
245246
PrefsProcessor(KEY_TAG_ADDITIONAL_FIELDS_SHOWN, ::tagAdditionalFieldsShown),
246247
PrefsProcessor(KEY_STATISTICS_DETAIL_STREAK_TYPE, ::statisticsDetailStreakType),
248+
PrefsProcessor(KEY_HIDDEN_CONTAINER_OPTIONS, ::hiddenContainerOptions),
247249
)
248250
}
249251

data_local/src/main/java/com/example/util/simpletimetracker/data_local/prefs/PrefsRepoImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,10 @@ class PrefsRepoImpl @Inject constructor(
453453
KEY_STATISTICS_DETAIL_STREAK_TYPE, 0,
454454
)
455455

456+
override var hiddenContainerOptions: Set<String> by prefs.delegate(
457+
KEY_HIDDEN_CONTAINER_OPTIONS, emptySet(),
458+
)
459+
456460
override fun setWidget(widgetId: Int, recordType: Long) {
457461
val key = KEY_WIDGET + widgetId
458462
logPrefsDataAccess("set $key")
@@ -735,6 +739,7 @@ class PrefsRepoImpl @Inject constructor(
735739
const val KEY_CARD_ORDER_MANUAL = "cardOrderManual"
736740
const val KEY_CATEGORY_ORDER_MANUAL = "categoryOrderManual"
737741
const val KEY_TAG_ORDER_MANUAL = "tagOrderManual"
742+
const val KEY_HIDDEN_CONTAINER_OPTIONS = "hiddenContainerOptions"
738743

739744
private const val KEY_AUTOMATIC_BACKUP_URI = "automaticBackupUri"
740745
private const val KEY_AUTOMATIC_BACKUP_ERROR = "automaticBackupError"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.example.util.simpletimetracker.domain.base
2+
3+
sealed interface ContainerOptionsModel {
4+
5+
sealed interface Records : ContainerOptionsModel {
6+
data object CalendarView : Records
7+
data object Filter : Records
8+
data object Share : Records
9+
data object BackToToday : Records
10+
data object SelectDate : Records
11+
}
12+
13+
sealed interface Statistics: ContainerOptionsModel {
14+
data object Filter : Statistics
15+
data object Share : Statistics
16+
data object BackToToday : Statistics
17+
data object SelectDate : Statistics
18+
data object SelectRange : Statistics
19+
}
20+
}

0 commit comments

Comments
 (0)