diff options
author | Jeremy Woods <jbwoods@google.com> | 2022-09-07 15:50:26 -0700 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-09-08 16:00:05 +0000 |
commit | 1efe08f610c8c884df73bfd24a5755e20cc5aa98 (patch) | |
tree | 0bc45053f08c619fab3b5f7032fc890c1917bc9b | |
parent | d545b021c2561b5031f139933c6fd0fbb580aaf6 (diff) | |
download | support-1efe08f610c8c884df73bfd24a5755e20cc5aa98.tar.gz |
Fix picture-in-picture changes in nested fragments
Since switching fragments over to the new Activity callback Consumer
APIs, FragmentActivity no longer needed to override the
onPictureInPictureModeChanged method to ensure fragments get the
onPictureInPictureModeChanged callback, and it was instead handled directly by
the FragmentManager. This includes childFragmentManagers, which
fragments were still dispatching to manually.
We should just allow all FragmentManagers to handle their own
picture-in-picture mode changes
RelNote: "Nested child fragments will no longer receive multiple
`onPictureInPictureModeChanged()` callbacks."
Test: added ProviderCallbackTest
Change-Id: Id0096df0c7c3aed66a832e0c05e81539e1a9ca26
(cherry picked from commit 99e2bfb04d8873ff7fed6c29e0e9a2c9bf3f4260)
Merged-In: Id0096df0c7c3aed66a832e0c05e81539e1a9ca26
-rw-r--r-- | fragment/fragment/src/androidTest/java/androidx/fragment/app/ProviderCallbackTest.kt | 48 | ||||
-rw-r--r-- | fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java | 1 |
2 files changed, 48 insertions, 1 deletions
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/ProviderCallbackTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/ProviderCallbackTest.kt index c6eb0375d94..ac6d5d4e755 100644 --- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/ProviderCallbackTest.kt +++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/ProviderCallbackTest.kt @@ -118,11 +118,55 @@ class ProviderCallbackTest { assertThat(child.multiWindowChangedCount).isEqualTo(1) } } + + @SdkSuppress(minSdkVersion = 26) + @Suppress("DEPRECATION") + @Test + fun onPictureInPictureModeChanged() { + with(ActivityScenario.launch(FragmentTestActivity::class.java)) { + val fragment = CallbackFragment() + + withActivity { + supportFragmentManager.beginTransaction() + .replace(R.id.content, fragment) + .commitNow() + + val newConfig = Configuration(resources.configuration) + onPictureInPictureModeChanged(true, newConfig) + } + assertThat(fragment.pictureModeChangedCount).isEqualTo(1) + } + } + + @SdkSuppress(minSdkVersion = 26) + @Test + fun onPictureInPictureModeChangedNestedFragments() { + with(ActivityScenario.launch(FragmentTestActivity::class.java)) { + val parent = StrictViewFragment(R.layout.fragment_container_view) + val child = CallbackFragment() + + withActivity { + supportFragmentManager.beginTransaction() + .replace(R.id.content, parent) + .commitNow() + + parent.childFragmentManager.beginTransaction() + .replace(R.id.fragment_container_view, child) + .commitNow() + + val newConfig = Configuration(resources.configuration) + onPictureInPictureModeChanged(true, newConfig) + } + + assertThat(child.pictureModeChangedCount).isEqualTo(1) + } + } } class CallbackFragment : StrictViewFragment() { var configChangedCount = 0 var multiWindowChangedCount = 0 + var pictureModeChangedCount = 0 override fun onConfigurationChanged(newConfig: Configuration) { configChangedCount++ @@ -131,4 +175,8 @@ class CallbackFragment : StrictViewFragment() { override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) { multiWindowChangedCount++ } + + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) { + pictureModeChangedCount++ + } } diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java index 080953f498f..ebe74710d21 100644 --- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java +++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java @@ -3210,7 +3210,6 @@ public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener void performPictureInPictureModeChanged(boolean isInPictureInPictureMode) { onPictureInPictureModeChanged(isInPictureInPictureMode); - mChildFragmentManager.dispatchPictureInPictureModeChanged(isInPictureInPictureMode); } void performConfigurationChanged(@NonNull Configuration newConfig) { |