Skip to content

Commit 9bd7026

Browse files
Remember focus after navigating from Fragment to Fragment
1 parent ae69179 commit 9bd7026

9 files changed

+62
-0
lines changed

app/src/main/java/com/infomaniak/mail/ui/main/settings/SettingsFragment.kt

+6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import com.infomaniak.mail.data.LocalSettings
3737
import com.infomaniak.mail.data.models.FeatureFlag
3838
import com.infomaniak.mail.databinding.FragmentSettingsBinding
3939
import com.infomaniak.mail.ui.MainViewModel
40+
import com.infomaniak.mail.utils.UiUtils.saveFocusWhenNavigatingBack
4041
import com.infomaniak.mail.utils.extensions.animatedNavigation
4142
import com.infomaniak.mail.utils.extensions.launchSyncAutoConfigActivityForResult
4243
import com.infomaniak.mail.utils.extensions.observeNotNull
@@ -53,6 +54,11 @@ class SettingsFragment : Fragment() {
5354
@Inject
5455
lateinit var localSettings: LocalSettings
5556

57+
override fun onCreate(savedInstanceState: Bundle?) {
58+
super.onCreate(savedInstanceState)
59+
saveFocusWhenNavigatingBack(getLayout = { binding.linearLayoutContainer }, lifecycle)
60+
}
61+
5662
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
5763
return FragmentSettingsBinding.inflate(inflater, container, false).also { binding = it }.root
5864
}

app/src/main/java/com/infomaniak/mail/ui/main/settings/appearance/swipe/SwipeActionsSettingsFragment.kt

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.infomaniak.mail.R
3030
import com.infomaniak.mail.data.LocalSettings
3131
import com.infomaniak.mail.data.LocalSettings.SwipeAction
3232
import com.infomaniak.mail.databinding.FragmentSwipeActionsSettingsBinding
33+
import com.infomaniak.mail.utils.UiUtils.saveFocusWhenNavigatingBack
3334
import com.infomaniak.mail.utils.extensions.animatedNavigation
3435
import com.infomaniak.mail.utils.extensions.setSystemBarsColors
3536
import dagger.hilt.android.AndroidEntryPoint
@@ -43,6 +44,11 @@ class SwipeActionsSettingsFragment : Fragment() {
4344
@Inject
4445
lateinit var localSettings: LocalSettings
4546

47+
override fun onCreate(savedInstanceState: Bundle?) {
48+
super.onCreate(savedInstanceState)
49+
saveFocusWhenNavigatingBack(getLayout = { binding.linearLayoutContainer }, lifecycle)
50+
}
51+
4652
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
4753
return FragmentSwipeActionsSettingsBinding.inflate(inflater, container, false).also { binding = it }.root
4854
}

app/src/main/java/com/infomaniak/mail/ui/main/settings/privacy/DataManagementSettingsFragment.kt

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.infomaniak.lib.core.utils.safeBinding
2828
import com.infomaniak.mail.BuildConfig
2929
import com.infomaniak.mail.MatomoMail.trackEvent
3030
import com.infomaniak.mail.databinding.FragmentDataManagementSettingsBinding
31+
import com.infomaniak.mail.utils.UiUtils.saveFocusWhenNavigatingBack
3132
import com.infomaniak.mail.utils.extensions.animatedNavigation
3233
import com.infomaniak.mail.utils.extensions.setSystemBarsColors
3334
import dagger.hilt.android.AndroidEntryPoint
@@ -37,6 +38,11 @@ class DataManagementSettingsFragment : Fragment() {
3738

3839
private var binding: FragmentDataManagementSettingsBinding by safeBinding()
3940

41+
override fun onCreate(savedInstanceState: Bundle?) {
42+
super.onCreate(savedInstanceState)
43+
saveFocusWhenNavigatingBack(getLayout = { binding.linearLayoutContainer }, lifecycle)
44+
}
45+
4046
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
4147
return FragmentDataManagementSettingsBinding.inflate(inflater, container, false).also { binding = it }.root
4248
}

app/src/main/java/com/infomaniak/mail/ui/main/user/AccountFragment.kt

+6
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import com.infomaniak.mail.utils.ConfettiUtils
4747
import com.infomaniak.mail.utils.ConfettiUtils.ConfettiType
4848
import com.infomaniak.mail.utils.LogoutUser
4949
import com.infomaniak.mail.utils.PlayServicesUtils
50+
import com.infomaniak.mail.utils.UiUtils.saveFocusWhenNavigatingBack
5051
import com.infomaniak.mail.utils.extensions.animatedNavigation
5152
import com.infomaniak.mail.utils.extensions.bindAlertToViewLifecycle
5253
import com.infomaniak.mail.utils.extensions.setSystemBarsColors
@@ -83,6 +84,11 @@ class AccountFragment : Fragment(), MailboxListFragment {
8384
@Inject
8485
lateinit var descriptionDialog: DescriptionAlertDialog
8586

87+
override fun onCreate(savedInstanceState: Bundle?) {
88+
super.onCreate(savedInstanceState)
89+
saveFocusWhenNavigatingBack(getLayout = { binding.constraintLayoutContainer }, lifecycle)
90+
}
91+
8692
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
8793
return FragmentAccountBinding.inflate(inflater, container, false).also { binding = it }.root
8894
}

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

+34
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,20 @@ import android.animation.ValueAnimator
2222
import android.content.Context
2323
import android.graphics.Color
2424
import android.os.Build
25+
import android.view.View
26+
import android.view.ViewGroup
2527
import android.view.Window
2628
import android.widget.TextView
2729
import androidx.annotation.ColorInt
2830
import androidx.annotation.FloatRange
31+
import androidx.annotation.IdRes
2932
import androidx.appcompat.content.res.AppCompatResources
3033
import androidx.core.graphics.toColor
3134
import androidx.core.graphics.toColorInt
3235
import androidx.core.view.isGone
36+
import androidx.lifecycle.DefaultLifecycleObserver
37+
import androidx.lifecycle.Lifecycle
38+
import androidx.lifecycle.LifecycleOwner
3339
import com.infomaniak.mail.R
3440
import com.infomaniak.mail.data.models.correspondent.Correspondent
3541
import com.infomaniak.mail.utils.extensions.updateNavigationBarColor
@@ -156,4 +162,32 @@ object UiUtils {
156162
}
157163

158164
fun dividerDrawable(context: Context) = AppCompatResources.getDrawable(context, R.drawable.divider)
165+
166+
fun saveFocusWhenNavigatingBack(getLayout: () -> ViewGroup, lifecycle: Lifecycle) {
167+
val lifecycleObserver = object : DefaultLifecycleObserver {
168+
@IdRes
169+
private var lastFocusViewId: Int? = null
170+
171+
override fun onDestroy(owner: LifecycleOwner) {
172+
lifecycle.removeObserver(this)
173+
super.onDestroy(owner)
174+
}
175+
176+
override fun onStart(owner: LifecycleOwner) {
177+
super.onStart(owner)
178+
lastFocusViewId?.let { viewId ->
179+
getLayout().findViewById<View>(viewId).requestFocus()
180+
}
181+
}
182+
183+
override fun onStop(owner: LifecycleOwner) {
184+
getLayout().focusedChild?.let {
185+
lastFocusViewId = it.id
186+
}
187+
super.onStop(owner)
188+
}
189+
}
190+
191+
lifecycle.addObserver(lifecycleObserver)
192+
}
159193
}

app/src/main/res/layout/fragment_account.xml

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
android:layout_weight="1">
3636

3737
<androidx.constraintlayout.widget.ConstraintLayout
38+
android:id="@+id/constraintLayoutContainer"
3839
android:layout_width="match_parent"
3940
android:layout_height="match_parent">
4041

app/src/main/res/layout/fragment_data_management_settings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
android:layout_height="match_parent">
2727

2828
<LinearLayout
29+
android:id="@+id/linearLayoutContainer"
2930
android:layout_width="match_parent"
3031
android:layout_height="wrap_content"
3132
android:orientation="vertical">

app/src/main/res/layout/fragment_settings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
android:scrollbars="none">
3232

3333
<LinearLayout
34+
android:id="@+id/linearLayoutContainer"
3435
android:layout_width="match_parent"
3536
android:layout_height="match_parent"
3637
android:clipToPadding="false"

app/src/main/res/layout/fragment_swipe_actions_settings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
android:layout_height="match_parent">
3030

3131
<LinearLayout
32+
android:id="@+id/linearLayoutContainer"
3233
android:layout_width="match_parent"
3334
android:layout_height="match_parent"
3435
android:clipChildren="false"

0 commit comments

Comments
 (0)