Skip to content

Commit

Permalink
Fix statusBarColor in elevated state after rotation
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinBoulongne committed Jan 31, 2024
1 parent 0356ffe commit 796d676
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 15 deletions.
4 changes: 3 additions & 1 deletion app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import com.infomaniak.mail.ui.alertDialogs.DescriptionAlertDialog
import com.infomaniak.mail.ui.alertDialogs.TitleAlertDialog
import com.infomaniak.mail.ui.main.SnackbarManager
import com.infomaniak.mail.ui.main.folder.TwoPaneFragment
import com.infomaniak.mail.ui.main.folder.TwoPaneViewModel
import com.infomaniak.mail.ui.main.menu.MenuDrawerFragment
import com.infomaniak.mail.ui.main.onboarding.PermissionsOnboardingPagerFragment
import com.infomaniak.mail.ui.newMessage.NewMessageActivity
Expand All @@ -92,6 +93,7 @@ class MainActivity : BaseActivity() {

private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
private val mainViewModel: MainViewModel by viewModels()
private val twoPaneViewModel: TwoPaneViewModel by viewModels()

private val backgroundColor: Int by lazy { getColor(R.color.backgroundColor) }
private val backgroundHeaderColor: Int by lazy { getColor(R.color.backgroundHeaderColor) }
Expand Down Expand Up @@ -451,7 +453,7 @@ class MainActivity : BaseActivity() {
R.id.detailedContactBottomSheetDialog -> {
val fragment = currentFragment
if (fragment is TwoPaneFragment) {
val navigationBarColor = if (fragment.isThreadOpen() && !canDisplayBothPanes()) {
val navigationBarColor = if (twoPaneViewModel.isInThreadInPhoneMode(context = this)) {
R.color.elevatedBackground
} else {
R.color.backgroundColor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)

val statusBarColor = if (isThreadOpen() && !canDisplayBothPanes()) {
val statusBarColor = if (twoPaneViewModel.isInThreadInPhoneMode(requireContext())) {
R.color.backgroundColor
} else {
R.color.backgroundHeaderColor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ abstract class TwoPaneFragment : Fragment() {
fun areBothShown() = !isOnlyOneShown()
fun isOnlyLeftShown() = isOnlyOneShown() && !slidingPaneLayout.isOpen
fun isOnlyRightShown() = isOnlyOneShown() && slidingPaneLayout.isOpen
fun isThreadOpen() = twoPaneViewModel.currentThreadUid.value != null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Expand Down Expand Up @@ -109,7 +108,7 @@ abstract class TwoPaneFragment : Fragment() {
rightPaneFolderName.value = name

if (folderId != previousFolderId) {
if (isThreadOpen() && previousFolderId != null) closeThread()
if (isThreadOpen && previousFolderId != null) closeThread()
previousFolderId = folderId
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package com.infomaniak.mail.ui.main.folder

import android.content.Context
import android.net.Uri
import android.os.Bundle
import androidx.annotation.IdRes
Expand All @@ -31,6 +32,7 @@ import com.infomaniak.mail.data.models.message.Message
import com.infomaniak.mail.data.models.thread.Thread
import com.infomaniak.mail.ui.newMessage.NewMessageActivityArgs
import com.infomaniak.mail.utils.Utils.runCatchingRealm
import com.infomaniak.mail.utils.canDisplayBothPanes
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

Expand All @@ -42,6 +44,7 @@ class TwoPaneViewModel @Inject constructor(

val currentThreadUid: LiveData<String?> = state.getLiveData(CURRENT_THREAD_UID_KEY)

inline val isThreadOpen get() = currentThreadUid.value != null
val rightPaneFolderName = MutableLiveData<String>()
var previousFolderId: String? = null

Expand Down Expand Up @@ -91,6 +94,8 @@ class TwoPaneViewModel @Inject constructor(
)
}

fun isInThreadInPhoneMode(context: Context): Boolean = isThreadOpen && !context.canDisplayBothPanes()

data class NavData(
@IdRes val resId: Int,
val args: Bundle,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ class ThreadFragment : Fragment() {
threadAdapter.reRenderMails()
super.onConfigurationChanged(newConfig)
updateNavigationIcon()
updateElevatedStatusBarColor()
}

override fun onDestroyView() {
Expand Down Expand Up @@ -194,6 +195,17 @@ class ThreadFragment : Fragment() {
}
}

private fun updateElevatedStatusBarColor() {
if (twoPaneViewModel.isInThreadInPhoneMode(requireContext())) {
val statusBarColor = if (binding.messagesListNestedScrollView.isAtTheTop()) {
R.color.toolbarLoweredColor
} else {
R.color.toolbarElevatedColor
}
setSystemBarsColors(statusBarColor = statusBarColor, navigationBarColor = null)
}
}

private fun setupAdapter() = with(binding.messagesList) {
adapter = ThreadAdapter(
shouldLoadDistantResources = shouldLoadDistantResources(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/
package com.infomaniak.mail.ui.newMessage

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Lifecycle.Event
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import com.infomaniak.mail.databinding.FragmentNewMessageBinding
Expand Down Expand Up @@ -55,8 +55,8 @@ abstract class NewMessageManager {
}

private fun onFreeReferences(setReferencesToNull: () -> Unit) {
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _: LifecycleOwner, event: Lifecycle.Event ->
if (event == Lifecycle.Event.ON_DESTROY) setReferencesToNull()
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _: LifecycleOwner, event: Event ->
if (event == Event.ON_DESTROY) setReferencesToNull()
})
}
}
24 changes: 16 additions & 8 deletions app/src/main/java/com/infomaniak/mail/utils/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@ import androidx.core.content.res.getColorOrThrow
import androidx.core.text.toSpannable
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.Fragment
import androidx.lifecycle.*
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.Lifecycle.Event
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.navigation.NavDirections
import androidx.navigation.NavOptions
import androidx.navigation.fragment.findNavController
Expand Down Expand Up @@ -109,6 +113,7 @@ import org.jsoup.nodes.Document
import java.util.Calendar
import java.util.Date
import java.util.Scanner
import kotlin.collections.set
import kotlin.math.roundToInt

//region Type alias
Expand Down Expand Up @@ -436,6 +441,8 @@ inline infix fun <reified E : Enum<E>, V> ((E) -> V).enumValueFrom(value: V): E?
return enumValues<E>().firstOrNull { this(it) == value }
}

fun View.isAtTheTop(): Boolean = !canScrollVertically(-1)

fun Fragment.changeToolbarColorOnScroll(
toolbar: MaterialToolbar,
nestedScrollView: NestedScrollView,
Expand All @@ -446,22 +453,23 @@ fun Fragment.changeToolbarColorOnScroll(
) {
var valueAnimator: ValueAnimator? = null
var oldColor = requireContext().getColor(loweredColor)
var headerColorState = HeaderState.LOWERED

viewLifecycleOwner.lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_DESTROY) valueAnimator?.cancel()
override fun onStateChanged(source: LifecycleOwner, event: Event) {
if (event == Event.ON_DESTROY) valueAnimator?.cancel()
}
})

var headerColorState = HeaderState.LOWERED
nestedScrollView.setOnScrollChangeListener { view, _, _, _, _ ->
val isAtTheTop = !view.canScrollVertically(-1)
if (headerColorState == HeaderState.ELEVATED && !isAtTheTop) return@setOnScrollChangeListener

val isAtTheTop = view.isAtTheTop()
if (!isAtTheTop && headerColorState == HeaderState.ELEVATED) return@setOnScrollChangeListener

val newColor = view.context.getColor(if (isAtTheTop) loweredColor else elevatedColor)
headerColorState = if (isAtTheTop) HeaderState.LOWERED else HeaderState.ELEVATED
if (newColor == oldColor) return@setOnScrollChangeListener

if (oldColor == newColor) return@setOnScrollChangeListener
headerColorState = if (isAtTheTop) HeaderState.LOWERED else HeaderState.ELEVATED

valueAnimator?.cancel()
valueAnimator = UiUtils.animateColorChange(oldColor, newColor, animate = true) { color ->
Expand Down

0 comments on commit 796d676

Please sign in to comment.