From ea083058a68c75a7903af5ddac7ebdef0cc27a1d Mon Sep 17 00:00:00 2001 From: razeeman Date: Sun, 26 Sep 2021 16:09:33 +0300 Subject: [PATCH] code review, replace screen resolver logic with multibinding map --- .../di/NavigationDialogMapModule.kt | 133 +++++++++++++ .../di/NavigationScreenMapModule.kt | 122 ++++++++++++ .../util/simpletimetracker/di/ScreenKey.kt | 8 + .../navigation/ScreenResolverImpl.kt | 180 ++---------------- .../navigation/params/NavigationData.kt | 8 + .../navigation/params/screen/ScreenParams.kt | 3 + 6 files changed, 286 insertions(+), 168 deletions(-) create mode 100644 app/src/main/java/com/example/util/simpletimetracker/di/NavigationDialogMapModule.kt create mode 100644 app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt create mode 100644 app/src/main/java/com/example/util/simpletimetracker/di/ScreenKey.kt create mode 100644 navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/NavigationData.kt create mode 100644 navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ScreenParams.kt diff --git a/app/src/main/java/com/example/util/simpletimetracker/di/NavigationDialogMapModule.kt b/app/src/main/java/com/example/util/simpletimetracker/di/NavigationDialogMapModule.kt new file mode 100644 index 00000000..f66ab7e3 --- /dev/null +++ b/app/src/main/java/com/example/util/simpletimetracker/di/NavigationDialogMapModule.kt @@ -0,0 +1,133 @@ +package com.example.util.simpletimetracker.di + +import com.example.util.simpletimetracker.R +import com.example.util.simpletimetracker.feature_dialogs.archive.view.ArchiveDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.cardOrder.view.CardOrderDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.dateTime.DateTimeDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.duration.view.DurationDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.emojiSelection.view.EmojiSelectionDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.recordTagSelection.RecordTagSelectionDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.standard.StandardDialogFragment +import com.example.util.simpletimetracker.feature_dialogs.typesFilter.view.TypesFilterDialogFragment +import com.example.util.simpletimetracker.navigation.Screen +import com.example.util.simpletimetracker.navigation.params.NavigationData +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import dagger.multibindings.IntoMap + +@Module +@InstallIn(SingletonComponent::class) +class NavigationDialogMapModule { + + @IntoMap + @Provides + @ScreenKey(Screen.STANDARD_DIALOG) + fun standardDialog(): NavigationData { + return NavigationData( + R.id.standardDialogFragment, + StandardDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.DATE_TIME_DIALOG) + fun dateTimeDialog(): NavigationData { + return NavigationData( + R.id.dateTimeDialog, + DateTimeDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.DURATION_DIALOG) + fun durationDialog(): NavigationData { + return NavigationData( + R.id.durationDialog, + DurationDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CHART_FILTER_DIALOG) + fun chartFilterDialog(): NavigationData { + return NavigationData( + R.id.chartFilerDialogFragment, + null + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.TYPES_FILTER_DIALOG) + fun typesFilterDialog(): NavigationData { + return NavigationData( + R.id.typesFilterDialogFragment, + TypesFilterDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CARD_SIZE_DIALOG) + fun cardSizeDialog(): NavigationData { + return NavigationData( + R.id.cardSizeDialogFragment, + null + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CARD_ORDER_DIALOG) + fun cardOrderDialog(): NavigationData { + return NavigationData( + R.id.cardOrderDialogFragment, + CardOrderDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.EMOJI_SELECTION_DIALOG) + fun emojiSelectionDialog(): NavigationData { + return NavigationData( + R.id.emojiSelectionDialogFragment, + EmojiSelectionDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.ARCHIVE_DIALOG) + fun archiveDialog(): NavigationData { + return NavigationData( + R.id.archiveDialogFragment, + ArchiveDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.RECORD_TAG_SELECTION_DIALOG) + fun recordTagSelectionDialog(): NavigationData { + return NavigationData( + R.id.recordTagSelectionDialogFragment, + RecordTagSelectionDialogFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CSV_EXPORT_SETTINGS_DIALOG) + fun csvExportSettingsDialog(): NavigationData { + return NavigationData( + R.id.csvExportSettingsDialogFragment, + null + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt b/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt new file mode 100644 index 00000000..1da8213e --- /dev/null +++ b/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt @@ -0,0 +1,122 @@ +package com.example.util.simpletimetracker.di + +import com.example.util.simpletimetracker.R +import com.example.util.simpletimetracker.feature_change_category.view.ChangeCategoryFragment +import com.example.util.simpletimetracker.feature_change_record.view.ChangeRecordFragment +import com.example.util.simpletimetracker.feature_change_record_tag.view.ChangeRecordTagFragment +import com.example.util.simpletimetracker.feature_change_record_type.view.ChangeRecordTypeFragment +import com.example.util.simpletimetracker.feature_change_running_record.view.ChangeRunningRecordFragment +import com.example.util.simpletimetracker.feature_records_all.view.RecordsAllFragment +import com.example.util.simpletimetracker.feature_statistics_detail.view.StatisticsDetailFragment +import com.example.util.simpletimetracker.navigation.Screen +import com.example.util.simpletimetracker.navigation.params.NavigationData +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import dagger.multibindings.IntoMap + +@Module +@InstallIn(SingletonComponent::class) +class NavigationScreenMapModule { + + @IntoMap + @Provides + @ScreenKey(Screen.CHANGE_RECORD_TYPE) + fun changeRecordType(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_changeRecordTypeFragment, + ChangeRecordTypeFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CHANGE_RECORD_RUNNING) + fun changeRecordRunning(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_changeRunningRecordFragment, + ChangeRunningRecordFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CHANGE_RECORD_FROM_MAIN) + fun changeRecordFromMain(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_changeRecordFragment, + ChangeRecordFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CHANGE_RECORD_FROM_RECORDS_ALL) + fun changeRecordFromRecordsAll(): NavigationData { + return NavigationData( + R.id.action_recordsAllFragment_to_changeRecordFragment, + ChangeRecordFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.STATISTICS_DETAIL) + fun statisticsDetail(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_statisticsDetailFragment, + StatisticsDetailFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.RECORDS_ALL) + fun recordsAll(): NavigationData { + return NavigationData( + R.id.action_statisticsDetailFragment_to_recordsAllFragment, + RecordsAllFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CATEGORIES) + fun categories(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_categoriesFragment, + null + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.ARCHIVE) + fun archive(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_archiveFragment, + null + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CHANGE_CATEGORY) + fun changeCategory(): NavigationData { + return NavigationData( + R.id.action_categoriesFragment_to_changeCategoryFragment, + ChangeCategoryFragment::createBundle + ) + } + + @IntoMap + @Provides + @ScreenKey(Screen.CHANGE_RECORD_TAG) + fun changeRecordTag(): NavigationData { + return NavigationData( + R.id.action_categoriesFragment_to_changeRecordTagFragment, + ChangeRecordTagFragment::createBundle + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/util/simpletimetracker/di/ScreenKey.kt b/app/src/main/java/com/example/util/simpletimetracker/di/ScreenKey.kt new file mode 100644 index 00000000..dda1592a --- /dev/null +++ b/app/src/main/java/com/example/util/simpletimetracker/di/ScreenKey.kt @@ -0,0 +1,8 @@ +package com.example.util.simpletimetracker.di + +import com.example.util.simpletimetracker.navigation.Screen +import dagger.MapKey + +@Retention(AnnotationRetention.RUNTIME) +@MapKey +annotation class ScreenKey(val value: Screen) diff --git a/app/src/main/java/com/example/util/simpletimetracker/navigation/ScreenResolverImpl.kt b/app/src/main/java/com/example/util/simpletimetracker/navigation/ScreenResolverImpl.kt index fa95d456..44b6e399 100644 --- a/app/src/main/java/com/example/util/simpletimetracker/navigation/ScreenResolverImpl.kt +++ b/app/src/main/java/com/example/util/simpletimetracker/navigation/ScreenResolverImpl.kt @@ -4,189 +4,33 @@ import android.view.View import androidx.navigation.NavController import androidx.navigation.Navigator import androidx.navigation.fragment.FragmentNavigator -import com.example.util.simpletimetracker.R -import com.example.util.simpletimetracker.feature_dialogs.archive.view.ArchiveDialogFragment -import com.example.util.simpletimetracker.feature_change_category.view.ChangeCategoryFragment -import com.example.util.simpletimetracker.feature_change_record.view.ChangeRecordFragment -import com.example.util.simpletimetracker.feature_change_record_tag.view.ChangeRecordTagFragment -import com.example.util.simpletimetracker.feature_change_record_type.view.ChangeRecordTypeFragment -import com.example.util.simpletimetracker.feature_change_running_record.view.ChangeRunningRecordFragment -import com.example.util.simpletimetracker.feature_dialogs.cardOrder.view.CardOrderDialogFragment -import com.example.util.simpletimetracker.feature_dialogs.dateTime.DateTimeDialogFragment -import com.example.util.simpletimetracker.feature_dialogs.duration.view.DurationDialogFragment -import com.example.util.simpletimetracker.feature_dialogs.emojiSelection.view.EmojiSelectionDialogFragment -import com.example.util.simpletimetracker.feature_dialogs.recordTagSelection.RecordTagSelectionDialogFragment -import com.example.util.simpletimetracker.feature_dialogs.standard.StandardDialogFragment -import com.example.util.simpletimetracker.feature_dialogs.typesFilter.view.TypesFilterDialogFragment -import com.example.util.simpletimetracker.feature_records_all.view.RecordsAllFragment -import com.example.util.simpletimetracker.feature_statistics_detail.view.StatisticsDetailFragment +import com.example.util.simpletimetracker.navigation.params.NavigationData import javax.inject.Inject -class ScreenResolverImpl @Inject constructor() : ScreenResolver { +class ScreenResolverImpl @Inject constructor( + private val navigationDataMap: Map, +) : ScreenResolver { override fun navigate( navController: NavController?, screen: Screen, data: Any?, - sharedElements: Map? + sharedElements: Map?, ) { val navExtras = toNavExtras(sharedElements) - when (screen) { - // Screens - Screen.CHANGE_RECORD_TYPE -> + navigationDataMap[screen] + ?.let { navController?.navigate( - R.id.action_mainFragment_to_changeRecordTypeFragment, - ChangeRecordTypeFragment.createBundle(data), + it.navId, + it.bundleProvider?.invoke(data), null, navExtras ) - Screen.CHANGE_RECORD_RUNNING -> - navController?.navigate( - R.id.action_mainFragment_to_changeRunningRecordFragment, - ChangeRunningRecordFragment.createBundle(data), - null, - navExtras - ) - Screen.CHANGE_RECORD_FROM_MAIN -> - navController?.navigate( - R.id.action_mainFragment_to_changeRecordFragment, - ChangeRecordFragment.createBundle(data), - null, - navExtras - ) - Screen.CHANGE_RECORD_FROM_RECORDS_ALL -> - navController?.navigate( - R.id.action_recordsAllFragment_to_changeRecordFragment, - ChangeRecordFragment.createBundle(data), - null, - navExtras - ) - Screen.STATISTICS_DETAIL -> - navController?.navigate( - R.id.action_mainFragment_to_statisticsDetailFragment, - StatisticsDetailFragment.createBundle(data), - null, - navExtras - ) - Screen.RECORDS_ALL -> - navController?.navigate( - R.id.action_statisticsDetailFragment_to_recordsAllFragment, - RecordsAllFragment.createBundle(data), - null, - navExtras - ) - Screen.CATEGORIES -> - navController?.navigate( - R.id.action_mainFragment_to_categoriesFragment, - null, - null, - navExtras - ) - Screen.ARCHIVE -> - navController?.navigate( - R.id.action_mainFragment_to_archiveFragment, - null, - null, - navExtras - ) - Screen.CHANGE_CATEGORY -> - navController?.navigate( - R.id.action_categoriesFragment_to_changeCategoryFragment, - ChangeCategoryFragment.createBundle(data), - null, - navExtras - ) - Screen.CHANGE_RECORD_TAG -> - navController?.navigate( - R.id.action_categoriesFragment_to_changeRecordTagFragment, - ChangeRecordTagFragment.createBundle(data), - null, - navExtras - ) - - // Dialogs - Screen.STANDARD_DIALOG -> - navController?.navigate( - R.id.standardDialogFragment, - StandardDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.DATE_TIME_DIALOG -> - navController?.navigate( - R.id.dateTimeDialog, - DateTimeDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.DURATION_DIALOG -> - navController?.navigate( - R.id.durationDialog, - DurationDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.CHART_FILTER_DIALOG -> - navController?.navigate( - R.id.chartFilerDialogFragment, - null, - null, - navExtras - ) - Screen.TYPES_FILTER_DIALOG -> - navController?.navigate( - R.id.typesFilterDialogFragment, - TypesFilterDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.CARD_SIZE_DIALOG -> - navController?.navigate( - R.id.cardSizeDialogFragment, - null, - null, - navExtras - ) - Screen.CARD_ORDER_DIALOG -> - navController?.navigate( - R.id.cardOrderDialogFragment, - CardOrderDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.EMOJI_SELECTION_DIALOG -> - navController?.navigate( - R.id.emojiSelectionDialogFragment, - EmojiSelectionDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.ARCHIVE_DIALOG -> - navController?.navigate( - R.id.archiveDialogFragment, - ArchiveDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.RECORD_TAG_SELECTION_DIALOG -> - navController?.navigate( - R.id.recordTagSelectionDialogFragment, - RecordTagSelectionDialogFragment.createBundle(data), - null, - navExtras - ) - Screen.CSV_EXPORT_SETTINGS_DIALOG -> - navController?.navigate( - R.id.csvExportSettingsDialogFragment, - null, - null, - navExtras - ) - else -> { - // Do nothing } - } + ?: run { + if (BuildConfig.DEBUG) error("Navigation error, unknown screen: $screen") + } } private fun toNavExtras(sharedElements: Map?): Navigator.Extras { diff --git a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/NavigationData.kt b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/NavigationData.kt new file mode 100644 index 00000000..0111e8fa --- /dev/null +++ b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/NavigationData.kt @@ -0,0 +1,8 @@ +package com.example.util.simpletimetracker.navigation.params + +import android.os.Bundle + +data class NavigationData( + val navId: Int, + val bundleProvider: ((Any?) -> Bundle)?, +) \ No newline at end of file diff --git a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ScreenParams.kt b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ScreenParams.kt new file mode 100644 index 00000000..f6f0e71e --- /dev/null +++ b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ScreenParams.kt @@ -0,0 +1,3 @@ +package com.example.util.simpletimetracker.navigation.params.screen + +interface ScreenParams \ No newline at end of file -- 2.51.2