aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Woods <jbwoods@google.com>2022-09-07 15:50:26 -0700
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-09-08 16:00:05 +0000
commit1efe08f610c8c884df73bfd24a5755e20cc5aa98 (patch)
tree0bc45053f08c619fab3b5f7032fc890c1917bc9b
parentd545b021c2561b5031f139933c6fd0fbb580aaf6 (diff)
downloadsupport-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.kt48
-rw-r--r--fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java1
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) {