Skip to content

Commit f8d298f

Browse files
FabianDeveltevincent
authored andcommitted
refactor(Extensions): Move all navigation extensions to own file
1 parent 6e6d858 commit f8d298f

File tree

2 files changed

+125
-98
lines changed

2 files changed

+125
-98
lines changed

app/src/main/java/com/infomaniak/mail/utils/Extensions.kt

-98
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import android.content.res.Configuration
2828
import android.content.res.TypedArray
2929
import android.net.Uri
3030
import android.os.Build
31-
import android.os.Bundle
3231
import android.text.Html
3332
import android.text.Spannable
3433
import android.text.Spanned
@@ -49,9 +48,6 @@ import androidx.lifecycle.Lifecycle.Event
4948
import androidx.lifecycle.LifecycleEventObserver
5049
import androidx.lifecycle.LifecycleOwner
5150
import androidx.lifecycle.LiveData
52-
import androidx.navigation.NavDirections
53-
import androidx.navigation.NavOptions
54-
import androidx.navigation.fragment.findNavController
5551
import androidx.recyclerview.widget.RecyclerView
5652
import androidx.viewpager2.widget.ViewPager2
5753
import com.airbnb.lottie.LottieAnimationView
@@ -78,28 +74,17 @@ import com.infomaniak.mail.data.models.Folder.FolderRole
7874
import com.infomaniak.mail.data.models.correspondent.Correspondent
7975
import com.infomaniak.mail.data.models.correspondent.MergedContact
8076
import com.infomaniak.mail.data.models.correspondent.Recipient
81-
import com.infomaniak.mail.data.models.draft.Draft.DraftMode
8277
import com.infomaniak.mail.data.models.message.Message
83-
import com.infomaniak.mail.ui.MainActivity
8478
import com.infomaniak.mail.ui.alertDialogs.BaseAlertDialog
8579
import com.infomaniak.mail.ui.alertDialogs.DescriptionAlertDialog
8680
import com.infomaniak.mail.ui.login.IlluColors.IlluColors
87-
import com.infomaniak.mail.ui.login.LoginActivity
88-
import com.infomaniak.mail.ui.login.LoginActivityArgs
89-
import com.infomaniak.mail.ui.login.NoMailboxActivity
9081
import com.infomaniak.mail.ui.main.SnackbarManager
9182
import com.infomaniak.mail.ui.main.folder.DateSeparatorItemDecoration
9283
import com.infomaniak.mail.ui.main.folder.HeaderItemDecoration
9384
import com.infomaniak.mail.ui.main.folder.ThreadListAdapter
9485
import com.infomaniak.mail.ui.main.thread.MessageWebViewClient
9586
import com.infomaniak.mail.ui.main.thread.RoundedBackgroundSpan
9687
import com.infomaniak.mail.ui.main.thread.ThreadFragment.HeaderState
97-
import com.infomaniak.mail.ui.main.thread.actions.AttachmentActionsBottomSheetDialog
98-
import com.infomaniak.mail.ui.newMessage.NewMessageActivityArgs
99-
import com.infomaniak.mail.ui.noValidMailboxes.NoValidMailboxesActivity
100-
import com.infomaniak.mail.utils.AccountUtils.NO_MAILBOX_USER_ID_KEY
101-
import com.infomaniak.mail.utils.AttachmentIntentUtils.AttachmentIntentType
102-
import com.infomaniak.mail.utils.AttachmentIntentUtils.createDownloadDialogNavArgs
10388
import com.infomaniak.mail.utils.Utils.isPermanentDeleteFolder
10489
import com.infomaniak.mail.utils.Utils.kSyncAccountUri
10590
import io.realm.kotlin.MutableRealm
@@ -251,57 +236,6 @@ fun WebView.initWebViewClientAndBridge(
251236
}
252237
//endregion
253238

254-
//region Navigation
255-
fun Fragment.animatedNavigation(directions: NavDirections, currentClassName: String? = null) {
256-
if (canNavigate(currentClassName)) findNavController().navigate(directions, getAnimatedNavOptions())
257-
}
258-
259-
fun Fragment.animatedNavigation(@IdRes resId: Int, args: Bundle? = null, currentClassName: String? = null) {
260-
if (canNavigate(currentClassName)) findNavController().navigate(resId, args, getAnimatedNavOptions())
261-
}
262-
263-
fun getAnimatedNavOptions() = NavOptions
264-
.Builder()
265-
.setEnterAnim(R.anim.fragment_swipe_enter)
266-
.setExitAnim(R.anim.fragment_swipe_exit)
267-
.setPopEnterAnim(R.anim.fragment_swipe_pop_enter)
268-
.setPopExitAnim(R.anim.fragment_swipe_pop_exit)
269-
.build()
270-
271-
fun Fragment.safeNavigateToNewMessageActivity(
272-
draftMode: DraftMode,
273-
previousMessageUid: String,
274-
currentClassName: String? = null,
275-
shouldLoadDistantResources: Boolean = false,
276-
) {
277-
safeNavigateToNewMessageActivity(
278-
args = NewMessageActivityArgs(
279-
arrivedFromExistingDraft = false,
280-
draftMode = draftMode,
281-
previousMessageUid = previousMessageUid,
282-
shouldLoadDistantResources = shouldLoadDistantResources,
283-
).toBundle(),
284-
currentClassName = currentClassName,
285-
)
286-
}
287-
288-
fun Fragment.safeNavigateToNewMessageActivity(args: Bundle? = null, currentClassName: String? = null) {
289-
if (canNavigate(currentClassName)) (requireActivity() as MainActivity).navigateToNewMessageActivity(args)
290-
}
291-
292-
fun Fragment.navigateToDownloadProgressDialog(
293-
attachment: Attachment,
294-
attachmentIntentType: AttachmentIntentType,
295-
currentClassName: String = AttachmentActionsBottomSheetDialog::class.java.name,
296-
) {
297-
safeNavigate(
298-
resId = R.id.downloadAttachmentProgressDialog,
299-
args = attachment.createDownloadDialogNavArgs(attachmentIntentType),
300-
currentClassName = currentClassName,
301-
)
302-
}
303-
//endregion
304-
305239
//region API
306240
inline fun <reified T> ApiResponse<T>.throwErrorAsException(): Nothing = throw getApiException()
307241

@@ -529,38 +463,6 @@ fun Context.isUserAlreadySynchronized(): Boolean {
529463
} ?: false
530464
}
531465

532-
fun Context.getLoginActivityIntent(args: LoginActivityArgs? = null, shouldClearStack: Boolean = false): Intent {
533-
return Intent(this, LoginActivity::class.java).apply {
534-
if (shouldClearStack) clearStack()
535-
args?.toBundle()?.let(::putExtras)
536-
}
537-
}
538-
539-
fun Context.launchLoginActivity(args: LoginActivityArgs? = null) {
540-
getLoginActivityIntent(args).also(::startActivity)
541-
}
542-
543-
fun Context.launchNoValidMailboxesActivity() {
544-
Intent(this, NoValidMailboxesActivity::class.java).apply {
545-
clearStack()
546-
}.also(::startActivity)
547-
}
548-
549-
fun Context.launchNoMailboxActivity(userId: Int? = null, shouldStartLoginActivity: Boolean = false) {
550-
val noMailboxActivityIntent = Intent(this, NoMailboxActivity::class.java).putExtra(NO_MAILBOX_USER_ID_KEY, userId)
551-
val intentsArray = if (shouldStartLoginActivity) {
552-
arrayOf(getLoginActivityIntent(shouldClearStack = true), noMailboxActivityIntent)
553-
} else {
554-
arrayOf(noMailboxActivityIntent)
555-
}
556-
557-
startActivities(intentsArray)
558-
}
559-
560-
fun Fragment.launchSyncAutoConfigActivityForResult() {
561-
(requireActivity() as MainActivity).navigateToSyncAutoConfigActivity()
562-
}
563-
564466
fun TextInputLayout.setOnClearTextClickListener(trackerCallback: () -> Unit) {
565467
setEndIconOnClickListener {
566468
editText?.text?.clear()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Infomaniak Mail - Android
3+
* Copyright (C) 2024 Infomaniak Network SA
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.infomaniak.mail.utils
19+
20+
import android.content.Context
21+
import android.content.Intent
22+
import android.os.Bundle
23+
import androidx.annotation.IdRes
24+
import androidx.fragment.app.Fragment
25+
import androidx.navigation.NavDirections
26+
import androidx.navigation.NavOptions
27+
import androidx.navigation.fragment.findNavController
28+
import com.infomaniak.lib.core.utils.canNavigate
29+
import com.infomaniak.lib.core.utils.clearStack
30+
import com.infomaniak.lib.core.utils.safeNavigate
31+
import com.infomaniak.mail.R
32+
import com.infomaniak.mail.data.models.Attachment
33+
import com.infomaniak.mail.data.models.draft.Draft
34+
import com.infomaniak.mail.ui.MainActivity
35+
import com.infomaniak.mail.ui.login.LoginActivity
36+
import com.infomaniak.mail.ui.login.LoginActivityArgs
37+
import com.infomaniak.mail.ui.login.NoMailboxActivity
38+
import com.infomaniak.mail.ui.main.thread.actions.AttachmentActionsBottomSheetDialog
39+
import com.infomaniak.mail.ui.newMessage.NewMessageActivityArgs
40+
import com.infomaniak.mail.ui.noValidMailboxes.NoValidMailboxesActivity
41+
import com.infomaniak.mail.utils.AttachmentIntentUtils.createDownloadDialogNavArgs
42+
43+
fun getAnimatedNavOptions() = NavOptions
44+
.Builder()
45+
.setEnterAnim(R.anim.fragment_swipe_enter)
46+
.setExitAnim(R.anim.fragment_swipe_exit)
47+
.setPopEnterAnim(R.anim.fragment_swipe_pop_enter)
48+
.setPopExitAnim(R.anim.fragment_swipe_pop_exit)
49+
.build()
50+
51+
fun Fragment.animatedNavigation(directions: NavDirections, currentClassName: String? = null) {
52+
if (canNavigate(currentClassName)) findNavController().navigate(directions, getAnimatedNavOptions())
53+
}
54+
55+
fun Fragment.animatedNavigation(@IdRes resId: Int, args: Bundle? = null, currentClassName: String? = null) {
56+
if (canNavigate(currentClassName)) findNavController().navigate(resId, args, getAnimatedNavOptions())
57+
}
58+
59+
fun Fragment.safeNavigateToNewMessageActivity(
60+
draftMode: Draft.DraftMode,
61+
previousMessageUid: String,
62+
currentClassName: String? = null,
63+
shouldLoadDistantResources: Boolean = false,
64+
) {
65+
safeNavigateToNewMessageActivity(
66+
args = NewMessageActivityArgs(
67+
arrivedFromExistingDraft = false,
68+
draftMode = draftMode,
69+
previousMessageUid = previousMessageUid,
70+
shouldLoadDistantResources = shouldLoadDistantResources,
71+
).toBundle(),
72+
currentClassName = currentClassName,
73+
)
74+
}
75+
76+
fun Fragment.safeNavigateToNewMessageActivity(args: Bundle? = null, currentClassName: String? = null) {
77+
if (canNavigate(currentClassName)) (requireActivity() as MainActivity).navigateToNewMessageActivity(args)
78+
}
79+
80+
fun Fragment.navigateToDownloadProgressDialog(
81+
attachment: Attachment,
82+
attachmentIntentType: AttachmentIntentUtils.AttachmentIntentType,
83+
currentClassName: String = AttachmentActionsBottomSheetDialog::class.java.name,
84+
) {
85+
safeNavigate(
86+
resId = R.id.downloadAttachmentProgressDialog,
87+
args = attachment.createDownloadDialogNavArgs(attachmentIntentType),
88+
currentClassName = currentClassName,
89+
)
90+
}
91+
92+
//region Launch Activities
93+
fun Context.getLoginActivityIntent(args: LoginActivityArgs? = null, shouldClearStack: Boolean = false): Intent {
94+
return Intent(this, LoginActivity::class.java).apply {
95+
if (shouldClearStack) clearStack()
96+
args?.toBundle()?.let(::putExtras)
97+
}
98+
}
99+
100+
fun Context.launchLoginActivity(args: LoginActivityArgs? = null) {
101+
getLoginActivityIntent(args).also(::startActivity)
102+
}
103+
104+
fun Context.launchNoValidMailboxesActivity() {
105+
Intent(this, NoValidMailboxesActivity::class.java).apply {
106+
clearStack()
107+
}.also(::startActivity)
108+
}
109+
110+
fun Context.launchNoMailboxActivity(userId: Int? = null, shouldStartLoginActivity: Boolean = false) {
111+
val noMailboxActivityIntent =
112+
Intent(this, NoMailboxActivity::class.java).putExtra(AccountUtils.NO_MAILBOX_USER_ID_KEY, userId)
113+
val intentsArray = if (shouldStartLoginActivity) {
114+
arrayOf(getLoginActivityIntent(shouldClearStack = true), noMailboxActivityIntent)
115+
} else {
116+
arrayOf(noMailboxActivityIntent)
117+
}
118+
119+
startActivities(intentsArray)
120+
}
121+
122+
fun Fragment.launchSyncAutoConfigActivityForResult() {
123+
(requireActivity() as MainActivity).navigateToSyncAutoConfigActivity()
124+
}
125+
//endregion

0 commit comments

Comments
 (0)