Skip to content

Commit 719d0fb

Browse files
authored
Merge pull request #268 from naz013/feature/REM-912_Unify_navigation_in_the_app
REM-912 - Refactor navigation module
2 parents 389f5db + 1e2afd0 commit 719d0fb

File tree

32 files changed

+346
-258
lines changed

32 files changed

+346
-258
lines changed

app/src/main/java/com/elementary/tasks/ReminderApp.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import com.elementary.tasks.core.work.workModule
2525
import com.elementary.tasks.globalsearch.searchModule
2626
import com.elementary.tasks.googletasks.googleTaskModule
2727
import com.elementary.tasks.home.homeModule
28-
import com.elementary.tasks.navigation.ActivityNavigator
2928
import com.elementary.tasks.navigation.NavigationConsumer
29+
import com.elementary.tasks.navigation.NavigationDispatcherFactory
3030
import com.elementary.tasks.navigation.NavigationObservable
3131
import com.elementary.tasks.navigation.navigationModule
3232
import com.elementary.tasks.notes.noteModule
@@ -38,7 +38,9 @@ import com.github.naz013.feature.common.featureCommonModule
3838
import com.github.naz013.icalendar.iCalendarModule
3939
import com.github.naz013.logging.initLogging
4040
import com.github.naz013.navigation.ActivityDestination
41+
import com.github.naz013.navigation.DataDestination
4142
import com.github.naz013.navigation.Destination
43+
import com.github.naz013.navigation.navigationApiModule
4244
import com.github.naz013.repository.repositoryModule
4345
import com.github.naz013.ui.common.uiCommonModule
4446
import com.github.naz013.usecase.birthdays.birthdaysUseCaseModule
@@ -59,8 +61,8 @@ class ReminderApp : MultiDexApplication(), KoinComponent {
5961

6062
private val navigationConsumer = object : NavigationConsumer {
6163
override fun consume(destination: Destination) {
62-
if (destination is ActivityDestination) {
63-
ActivityNavigator(this@ReminderApp).navigate(destination)
64+
if (destination is ActivityDestination || destination is DataDestination) {
65+
get<NavigationDispatcherFactory>().create(destination).dispatch(destination)
6466
} else {
6567
com.github.naz013.logging.Logger.i("App", "Unknown destination: $destination")
6668
}
@@ -120,7 +122,8 @@ class ReminderApp : MultiDexApplication(), KoinComponent {
120122
birthdaysUseCaseModule,
121123
remindersUseCaseModule,
122124
notesUseCaseModule,
123-
iCalendarModule
125+
iCalendarModule,
126+
navigationApiModule
124127
)
125128
)
126129
}

app/src/main/java/com/elementary/tasks/birthdays/create/AddBirthdayViewModel.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,28 @@ import android.os.Bundle
55
import androidx.lifecycle.viewModelScope
66
import com.elementary.tasks.birthdays.work.BirthdayDeleteBackupWorker
77
import com.elementary.tasks.birthdays.work.SingleBackupWorker
8-
import com.github.naz013.appwidgets.AppWidgetUpdater
98
import com.elementary.tasks.core.arch.BaseProgressViewModel
109
import com.elementary.tasks.core.data.Commands
1110
import com.elementary.tasks.core.data.adapter.birthday.UiBirthdayEditAdapter
1211
import com.elementary.tasks.core.data.ui.birthday.UiBirthdayEdit
1312
import com.elementary.tasks.core.deeplink.BirthdayDateDeepLinkData
1413
import com.elementary.tasks.core.deeplink.DeepLinkDataParser
15-
import com.elementary.tasks.core.os.IntentDataHolder
16-
import com.github.naz013.common.contacts.ContactsReader
17-
import com.github.naz013.common.intent.IntentKeys
18-
import com.github.naz013.feature.common.coroutine.DispatcherProvider
1914
import com.elementary.tasks.core.utils.Notifier
20-
import com.github.naz013.common.datetime.DateTimeManager
2115
import com.elementary.tasks.core.utils.io.UriReader
22-
import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf
23-
import com.github.naz013.feature.common.livedata.toLiveData
2416
import com.elementary.tasks.core.utils.work.WorkerLauncher
2517
import com.github.naz013.analytics.AnalyticsEventSender
2618
import com.github.naz013.analytics.Feature
2719
import com.github.naz013.analytics.FeatureUsedEvent
20+
import com.github.naz013.appwidgets.AppWidgetUpdater
21+
import com.github.naz013.common.contacts.ContactsReader
22+
import com.github.naz013.common.datetime.DateTimeManager
23+
import com.github.naz013.common.intent.IntentKeys
2824
import com.github.naz013.domain.Birthday
25+
import com.github.naz013.feature.common.coroutine.DispatcherProvider
26+
import com.github.naz013.feature.common.livedata.toLiveData
27+
import com.github.naz013.feature.common.viewmodel.mutableLiveDataOf
2928
import com.github.naz013.logging.Logger
29+
import com.github.naz013.navigation.intent.IntentDataReader
3030
import com.github.naz013.repository.BirthdayRepository
3131
import kotlinx.coroutines.launch
3232
import org.threeten.bp.LocalDate
@@ -44,7 +44,7 @@ class AddBirthdayViewModel(
4444
private val uiBirthdayEditAdapter: UiBirthdayEditAdapter,
4545
private val uriReader: UriReader,
4646
private val appWidgetUpdater: AppWidgetUpdater,
47-
private val intentDataHolder: IntentDataHolder,
47+
private val intentDataReader: IntentDataReader,
4848
private val uiBirthdayDateFormatter: UiBirthdayDateFormatter
4949
) : BaseProgressViewModel(dispatcherProvider) {
5050

@@ -75,7 +75,7 @@ class AddBirthdayViewModel(
7575
}
7676

7777
fun onIntent() {
78-
intentDataHolder.get(IntentKeys.INTENT_ITEM, Birthday::class.java)?.run {
78+
intentDataReader.get(IntentKeys.INTENT_ITEM, Birthday::class.java)?.run {
7979
Logger.logEvent("Birthday loaded from intent")
8080
onBirthdayLoaded(this)
8181
isFromFile = true

app/src/main/java/com/elementary/tasks/core/arch/IntentActivity.kt

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package com.elementary.tasks.core.arch
22

33
import android.content.ContentResolver
4-
import android.content.Intent
54
import android.os.Bundle
65
import com.elementary.tasks.R
76
import com.elementary.tasks.core.cloud.converters.NoteToOldNoteConverter
8-
import com.elementary.tasks.core.os.IntentDataHolder
97
import com.elementary.tasks.core.utils.io.MemoryUtil
108
import com.elementary.tasks.groups.create.CreateGroupActivity
11-
import com.elementary.tasks.home.BottomNavActivity
129
import com.elementary.tasks.notes.create.CreateNoteActivity
1310
import com.elementary.tasks.places.create.CreatePlaceActivity
1411
import com.elementary.tasks.reminder.ReminderBuilderLauncher
@@ -20,19 +17,18 @@ import com.github.naz013.domain.ReminderGroup
2017
import com.github.naz013.domain.note.NoteWithImages
2118
import com.github.naz013.domain.note.OldNote
2219
import com.github.naz013.logging.Logger
23-
import com.github.naz013.navigation.DeepLinkDestination
24-
import com.github.naz013.navigation.FragmentEditBirthday
20+
import com.github.naz013.navigation.DataDestination
21+
import com.github.naz013.navigation.Navigator
2522
import com.github.naz013.ui.common.activity.LightThemedActivity
2623
import com.github.naz013.ui.common.activity.toast
2724
import com.github.naz013.ui.common.context.intentForClass
28-
import com.github.naz013.ui.common.context.startActivity
2925
import org.koin.android.ext.android.inject
3026

3127
class IntentActivity : LightThemedActivity() {
3228

3329
private val noteToOldNoteConverter by inject<NoteToOldNoteConverter>()
34-
private val intentDataHolder by inject<IntentDataHolder>()
3530
private val reminderBuilderLauncher by inject<ReminderBuilderLauncher>()
31+
private val navigator by inject<Navigator>()
3632

3733
override fun onCreate(savedInstanceState: Bundle?) {
3834
super.onCreate(savedInstanceState)
@@ -74,18 +70,7 @@ class IntentActivity : LightThemedActivity() {
7470

7571
is Birthday -> {
7672
if (any.isValid()) {
77-
intentDataHolder.putData(IntentKeys.INTENT_ITEM, any)
78-
startActivity(BottomNavActivity::class.java) {
79-
action = Intent.ACTION_VIEW
80-
putExtra(
81-
DeepLinkDestination.KEY,
82-
FragmentEditBirthday(
83-
Bundle().apply {
84-
putExtra(IntentKeys.INTENT_DEEP_LINK, true)
85-
}
86-
)
87-
)
88-
}
73+
navigator.navigate(DataDestination(any))
8974
} else {
9075
toast(getString(R.string.unsupported_file_format))
9176
}

app/src/main/java/com/elementary/tasks/core/deeplink/DeepLinkData.kt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.elementary.tasks.core.deeplink
22

3-
import com.github.naz013.ui.common.activity.DeepLinkData
3+
import com.github.naz013.navigation.DeepLinkData
44
import kotlinx.parcelize.Parcelize
55
import org.threeten.bp.LocalDate
66
import org.threeten.bp.LocalDateTime
@@ -28,17 +28,8 @@ data class GoogleTaskDateTimeDeepLinkData(
2828

2929
// Name structure, first word: prefix, second and others: parameters
3030
object IntentKey {
31-
3231
const val REMINDER_DATETIME_TYPE = "reminder_datetime_type"
3332
const val REMINDER_TODO_TYPE = "reminder_todo_type"
3433
const val BIRTHDAY_DATE = "birthday_date"
3534
const val GOOGLE_TASK_DATE_TIME = "google_task_date_time"
36-
37-
fun keys(): List<String> {
38-
return listOf(
39-
REMINDER_DATETIME_TYPE,
40-
BIRTHDAY_DATE,
41-
GOOGLE_TASK_DATE_TIME
42-
)
43-
}
4435
}

app/src/main/java/com/elementary/tasks/core/deeplink/DeepLinkDataParser.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.elementary.tasks.core.deeplink
33
import android.content.Intent
44
import android.os.Build
55
import android.os.Bundle
6-
import com.github.naz013.ui.common.activity.DeepLinkData
6+
import com.github.naz013.navigation.DeepLinkData
77

88
class DeepLinkDataParser {
99

app/src/main/java/com/elementary/tasks/core/os/IntentDataHolder.kt

Lines changed: 0 additions & 23 deletions
This file was deleted.

app/src/main/java/com/elementary/tasks/core/os/KoinModule.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,5 @@ package com.elementary.tasks.core.os
33
import org.koin.dsl.module
44

55
val osModule = module {
6-
7-
single { IntentDataHolder() }
8-
96
factory { ContextSwitcher(get()) }
107
}

app/src/main/java/com/elementary/tasks/googletasks/task/GoogleTaskViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import com.github.naz013.repository.ReminderGroupRepository
2929
import com.github.naz013.repository.ReminderRepository
3030
import com.github.naz013.repository.observer.TableChangeListenerFactory
3131
import com.github.naz013.repository.table.Table
32-
import com.github.naz013.ui.common.activity.DeepLinkData
32+
import com.github.naz013.navigation.DeepLinkData
3333
import com.github.naz013.usecase.googletasks.TasksIntentKeys
3434
import kotlinx.coroutines.launch
3535
import org.threeten.bp.LocalDate

app/src/main/java/com/elementary/tasks/home/BottomNavActivity.kt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,22 @@ import com.elementary.tasks.R
1919
import com.elementary.tasks.core.utils.params.Prefs
2020
import com.elementary.tasks.core.work.BackupSettingsWorker
2121
import com.elementary.tasks.databinding.ActivityBottomNavBinding
22-
import com.elementary.tasks.navigation.ActivityNavigator
2322
import com.elementary.tasks.navigation.FragmentCallback
2423
import com.elementary.tasks.navigation.NavigationConsumer
24+
import com.elementary.tasks.navigation.NavigationDispatcherFactory
2525
import com.elementary.tasks.navigation.NavigationObservable
2626
import com.elementary.tasks.navigation.SearchableFragmentCallback
2727
import com.elementary.tasks.navigation.SearchableFragmentQueryObserver
2828
import com.elementary.tasks.navigation.fragments.BaseNavigationFragment
2929
import com.elementary.tasks.navigation.topfragment.BaseTopFragment
3030
import com.github.naz013.feature.common.android.readParcelable
3131
import com.github.naz013.logging.Logger
32-
import com.github.naz013.navigation.ActivityDestination
32+
import com.github.naz013.navigation.DayViewScreen
3333
import com.github.naz013.navigation.DeepLinkDestination
3434
import com.github.naz013.navigation.Destination
35-
import com.github.naz013.navigation.FragmentDayView
36-
import com.github.naz013.navigation.FragmentEditBirthday
37-
import com.github.naz013.navigation.FragmentSettings
38-
import com.github.naz013.navigation.FragmentViewBirthday
35+
import com.github.naz013.navigation.EditBirthdayScreen
36+
import com.github.naz013.navigation.SettingsScreen
37+
import com.github.naz013.navigation.ViewBirthdayScreen
3938
import com.github.naz013.ui.common.activity.BindingActivity
4039
import com.github.naz013.ui.common.view.visibleGone
4140
import com.google.android.material.search.SearchView
@@ -48,6 +47,8 @@ class BottomNavActivity :
4847

4948
private val navigationObservable by inject<NavigationObservable>()
5049
private val prefs by inject<Prefs>()
50+
private val navigationDispatcherFactory by inject<NavigationDispatcherFactory>()
51+
5152
private lateinit var navController: NavController
5253
private val adsProvider = AdsProvider()
5354

@@ -57,9 +58,7 @@ class BottomNavActivity :
5758

5859
private val navigationConsumer = object : NavigationConsumer {
5960
override fun consume(destination: Destination) {
60-
if (destination is ActivityDestination) {
61-
ActivityNavigator(this@BottomNavActivity).navigate(destination)
62-
}
61+
navigationDispatcherFactory.create(destination).dispatch(destination)
6362
}
6463
}
6564

@@ -85,7 +84,7 @@ class BottomNavActivity :
8584
DeepLinkDestination::class.java
8685
)
8786
when (deepLinkDestination) {
88-
is FragmentDayView -> {
87+
is DayViewScreen -> {
8988
NavDeepLinkBuilder(this)
9089
.setGraph(R.navigation.home_nav)
9190
.setArguments(deepLinkDestination.extras)
@@ -94,15 +93,15 @@ class BottomNavActivity :
9493
.startActivities()
9594
}
9695

97-
is FragmentSettings -> {
96+
is SettingsScreen -> {
9897
NavDeepLinkBuilder(this)
9998
.setGraph(R.navigation.home_nav)
10099
.setDestination(R.id.settingsFragment)
101100
.createTaskStackBuilder()
102101
.startActivities()
103102
}
104103

105-
is FragmentEditBirthday -> {
104+
is EditBirthdayScreen -> {
106105
NavDeepLinkBuilder(this)
107106
.setGraph(R.navigation.home_nav)
108107
.setDestination(R.id.editBirthdayFragment)
@@ -111,7 +110,7 @@ class BottomNavActivity :
111110
.startActivities()
112111
}
113112

114-
is FragmentViewBirthday -> {
113+
is ViewBirthdayScreen -> {
115114
NavDeepLinkBuilder(this)
116115
.setGraph(R.navigation.home_nav)
117116
.setDestination(R.id.previewBirthdayFragment)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.elementary.tasks.navigation
2+
3+
import android.content.Context
4+
import android.os.Bundle
5+
import com.elementary.tasks.googletasks.preview.GoogleTaskPreviewActivity
6+
import com.elementary.tasks.googletasks.task.GoogleTaskActivity
7+
import com.elementary.tasks.home.BottomNavActivity
8+
import com.elementary.tasks.notes.create.CreateNoteActivity
9+
import com.elementary.tasks.notes.preview.NotePreviewActivity
10+
import com.elementary.tasks.reminder.build.BuildReminderActivity
11+
import com.elementary.tasks.reminder.preview.ReminderPreviewActivity
12+
import com.github.naz013.logging.Logger
13+
import com.github.naz013.navigation.ActivityDestination
14+
import com.github.naz013.navigation.DeepLinkDestination
15+
import com.github.naz013.navigation.DestinationScreen
16+
import com.github.naz013.navigation.EditBirthdayScreen
17+
import com.github.naz013.navigation.ViewBirthdayScreen
18+
import com.github.naz013.ui.common.context.buildIntent
19+
import com.github.naz013.ui.common.login.LoginApi
20+
21+
class ActivityNavigationDispatcher(
22+
private val context: Context
23+
) : NavigationDispatcher<ActivityDestination> {
24+
25+
override fun dispatch(destination: ActivityDestination) {
26+
Logger.i("ActivityNavigator", "Going to ${destination.screen}")
27+
val clazz = getClass(destination.screen)
28+
if (destination.isLoggedIn && destination.screen != DestinationScreen.Main) {
29+
LoginApi.openLogged(context, clazz) {
30+
destination.action?.also { setAction(it) }
31+
destination.flags?.also { addFlags(it) }
32+
destination.extras?.also {
33+
putExtras(getExtras(destination.screen, it))
34+
}
35+
}
36+
} else {
37+
context.buildIntent(clazz) {
38+
destination.action?.also { setAction(it) }
39+
destination.flags?.also { addFlags(it) }
40+
destination.extras?.also {
41+
putExtras(getExtras(destination.screen, it))
42+
}
43+
}.also {
44+
context.startActivity(it)
45+
}
46+
}
47+
}
48+
49+
private fun getExtras(destinationScreen: DestinationScreen, bundle: Bundle?): Bundle {
50+
if (bundle == null) return Bundle()
51+
return when (destinationScreen) {
52+
DestinationScreen.BirthdayCreate -> {
53+
val deepLinkDestination = EditBirthdayScreen(bundle)
54+
Bundle(bundle).apply {
55+
putParcelable(DeepLinkDestination.KEY, deepLinkDestination)
56+
}
57+
}
58+
59+
DestinationScreen.BirthdayPreview -> {
60+
val deepLinkDestination = ViewBirthdayScreen(bundle)
61+
Bundle(bundle).apply {
62+
putParcelable(DeepLinkDestination.KEY, deepLinkDestination)
63+
}
64+
}
65+
66+
else -> bundle
67+
}
68+
}
69+
70+
private fun getClass(destinationScreen: DestinationScreen): Class<*> {
71+
return when (destinationScreen) {
72+
DestinationScreen.ReminderPreview -> ReminderPreviewActivity::class.java
73+
DestinationScreen.ReminderCreate -> BuildReminderActivity::class.java
74+
DestinationScreen.NotePreview -> NotePreviewActivity::class.java
75+
DestinationScreen.NoteCreate -> CreateNoteActivity::class.java
76+
DestinationScreen.BirthdayPreview -> BottomNavActivity::class.java
77+
DestinationScreen.BirthdayCreate -> BottomNavActivity::class.java
78+
DestinationScreen.GoogleTaskPreview -> GoogleTaskPreviewActivity::class.java
79+
DestinationScreen.GoogleTaskCreate -> GoogleTaskActivity::class.java
80+
DestinationScreen.Main -> BottomNavActivity::class.java
81+
}
82+
}
83+
}

0 commit comments

Comments
 (0)