@@ -45,6 +45,10 @@ import androidx.webkit.ServiceWorkerControllerCompat
45
45
import androidx.webkit.WebViewFeature
46
46
import com.duckduckgo.anvil.annotations.InjectWith
47
47
import com.duckduckgo.app.browser.BrowserViewModel.Command
48
+ import com.duckduckgo.app.browser.animations.slideAndFadeInFromLeft
49
+ import com.duckduckgo.app.browser.animations.slideAndFadeInFromRight
50
+ import com.duckduckgo.app.browser.animations.slideAndFadeOutToLeft
51
+ import com.duckduckgo.app.browser.animations.slideAndFadeOutToRight
48
52
import com.duckduckgo.app.browser.databinding.ActivityBrowserBinding
49
53
import com.duckduckgo.app.browser.databinding.IncludeExperimentalOmnibarToolbarMockupBinding
50
54
import com.duckduckgo.app.browser.databinding.IncludeExperimentalOmnibarToolbarMockupBottomBinding
@@ -777,13 +781,11 @@ open class BrowserActivity : DuckDuckGoActivity() {
777
781
isDuckChatVisible = false
778
782
val fragment = duckAiFragment
779
783
if (fragment?.isVisible == true ) {
780
- val transaction = supportFragmentManager.beginTransaction()
781
- transaction.setCustomAnimations(
782
- com.duckduckgo.mobile.android.R .anim.slide_from_right,
783
- com.duckduckgo.mobile.android.R .anim.slide_to_right,
784
- )
785
- transaction.hide(fragment)
786
- transaction.commit()
784
+ animateDuckAiFragmentOut {
785
+ val transaction = supportFragmentManager.beginTransaction()
786
+ transaction.hide(fragment)
787
+ transaction.commit()
788
+ }
787
789
}
788
790
}
789
791
@@ -803,6 +805,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
803
805
}
804
806
805
807
private fun launchNewDuckChat (duckChatUrl : String? ) {
808
+ val wasFragmentVisible = duckAiFragment?.isVisible ? : false
806
809
val fragment = DuckChatWebViewFragment ().apply {
807
810
duckChatUrl?.let {
808
811
arguments = Bundle ().apply {
@@ -813,22 +816,41 @@ open class BrowserActivity : DuckDuckGoActivity() {
813
816
814
817
duckAiFragment = fragment
815
818
val transaction = supportFragmentManager.beginTransaction()
816
- transaction.setCustomAnimations(
817
- com.duckduckgo.mobile.android.R .anim.slide_from_right,
818
- com.duckduckgo.mobile.android.R .anim.slide_to_right,
819
- )
820
819
transaction.replace(binding.duckAiFragmentContainer.id, fragment)
821
820
transaction.commit()
821
+
822
+ if (! wasFragmentVisible) {
823
+ // If the fragment was already visible but needs to be force-reloaded, we don't want to animate it in again.
824
+ animateDuckAiFragmentIn()
825
+ }
822
826
}
823
827
824
828
private fun restoreDuckChat (fragment : DuckChatWebViewFragment ) {
829
+ if (fragment.isVisible) {
830
+ return
831
+ }
832
+
825
833
val transaction = supportFragmentManager.beginTransaction()
826
- transaction.setCustomAnimations(
827
- com.duckduckgo.mobile.android.R .anim.slide_from_right,
828
- com.duckduckgo.mobile.android.R .anim.slide_to_right,
829
- )
830
834
transaction.show(fragment)
831
835
transaction.commit()
836
+
837
+ animateDuckAiFragmentIn()
838
+ }
839
+
840
+ private fun animateDuckAiFragmentIn () {
841
+ val duckAiContainer = binding.duckAiFragmentContainer
842
+ val browserContainer = if (swipingTabsFeature.isEnabled) binding.tabPager else binding.fragmentContainer
843
+
844
+ duckAiContainer.slideAndFadeInFromRight()
845
+ browserContainer.slideAndFadeOutToLeft()
846
+ }
847
+
848
+ private fun animateDuckAiFragmentOut (onComplete : () -> Unit ) {
849
+ val duckAiContainer = binding.duckAiFragmentContainer
850
+ val browserContainer = if (swipingTabsFeature.isEnabled) binding.tabPager else binding.fragmentContainer
851
+
852
+ duckAiContainer.slideAndFadeOutToRight(onComplete)
853
+ browserContainer.slideAndFadeInFromLeft()
832
854
}
833
855
834
856
private fun configureOnBackPressedListener () {
0 commit comments