Added onMultiWindowChanged and onPictureInPictureChanged methods to Fragement class

Bug: 26688489
Change-Id: I611444b29199b4686c9f78dbdd33c9b71820aec4
diff --git a/api/current.txt b/api/current.txt
index 61ae1e0..19490ea 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4422,9 +4422,11 @@
     method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
     method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
     method public void onLowMemory();
+    method public void onMultiWindowChanged(boolean);
     method public boolean onOptionsItemSelected(android.view.MenuItem);
     method public void onOptionsMenuClosed(android.view.Menu);
     method public void onPause();
+    method public void onPictureInPictureChanged(boolean);
     method public void onPrepareOptionsMenu(android.view.Menu);
     method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
     method public void onResume();
@@ -4505,9 +4507,11 @@
     method public void dispatchDestroy();
     method public void dispatchDestroyView();
     method public void dispatchLowMemory();
+    method public void dispatchMultiWindowChanged(boolean);
     method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
     method public void dispatchOptionsMenuClosed(android.view.Menu);
     method public void dispatchPause();
+    method public void dispatchPictureInPictureChanged(boolean);
     method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
     method public void dispatchResume();
     method public void dispatchStart();
diff --git a/api/system-current.txt b/api/system-current.txt
index 321d817..796407b 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4555,9 +4555,11 @@
     method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
     method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
     method public void onLowMemory();
+    method public void onMultiWindowChanged(boolean);
     method public boolean onOptionsItemSelected(android.view.MenuItem);
     method public void onOptionsMenuClosed(android.view.Menu);
     method public void onPause();
+    method public void onPictureInPictureChanged(boolean);
     method public void onPrepareOptionsMenu(android.view.Menu);
     method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
     method public void onResume();
@@ -4638,9 +4640,11 @@
     method public void dispatchDestroy();
     method public void dispatchDestroyView();
     method public void dispatchLowMemory();
+    method public void dispatchMultiWindowChanged(boolean);
     method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
     method public void dispatchOptionsMenuClosed(android.view.Menu);
     method public void dispatchPause();
+    method public void dispatchPictureInPictureChanged(boolean);
     method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
     method public void dispatchResume();
     method public void dispatchStart();
diff --git a/api/test-current.txt b/api/test-current.txt
index ad45752..8ec5b1f 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -4422,9 +4422,11 @@
     method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
     method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
     method public void onLowMemory();
+    method public void onMultiWindowChanged(boolean);
     method public boolean onOptionsItemSelected(android.view.MenuItem);
     method public void onOptionsMenuClosed(android.view.Menu);
     method public void onPause();
+    method public void onPictureInPictureChanged(boolean);
     method public void onPrepareOptionsMenu(android.view.Menu);
     method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
     method public void onResume();
@@ -4505,9 +4507,11 @@
     method public void dispatchDestroy();
     method public void dispatchDestroyView();
     method public void dispatchLowMemory();
+    method public void dispatchMultiWindowChanged(boolean);
     method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
     method public void dispatchOptionsMenuClosed(android.view.Menu);
     method public void dispatchPause();
+    method public void dispatchPictureInPictureChanged(boolean);
     method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
     method public void dispatchResume();
     method public void dispatchStart();
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 378e448..acd4ab8 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1837,6 +1837,7 @@
     public void onMultiWindowChanged(boolean inMultiWindow) {
         if (DEBUG_LIFECYCLE) Slog.v(TAG,
                 "onMultiWindowChanged " + this + ": " + inMultiWindow);
+        mFragments.dispatchMultiWindowChanged(inMultiWindow);
         if (mWindow != null) {
             mWindow.onMultiWindowChanged();
         }
@@ -1862,9 +1863,11 @@
      *
      * @param inPictureInPicture True if the activity is in picture-in-picture mode.
      */
+    @CallSuper
     public void onPictureInPictureChanged(boolean inPictureInPicture) {
         if (DEBUG_LIFECYCLE) Slog.v(TAG,
                 "onPictureInPictureChanged " + this + ": " + inPictureInPicture);
+        mFragments.dispatchPictureInPictureChanged(inPictureInPicture);
     }
 
     /**
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index 20eaf0b..688c9f8 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -1576,6 +1576,25 @@
     public void onSaveInstanceState(Bundle outState) {
     }
 
+    /**
+     * Called when the Fragment's activity changes from fullscreen mode to multi-window mode and
+     * visa-versa. This is generally tied to {@link Activity#onMultiWindowChanged} of the containing
+     * Activity.
+     *
+     * @param inMultiWindow True if the activity is in multi-window mode.
+     */
+    public void onMultiWindowChanged(boolean inMultiWindow) {
+    }
+
+    /**
+     * Called by the system when the activity changes to and from picture-in-picture mode. This is
+     * generally tied to {@link Activity#onPictureInPictureChanged} of the containing Activity.
+     *
+     * @param inPictureInPicture True if the activity is in picture-in-picture mode.
+     */
+    public void onPictureInPictureChanged(boolean inPictureInPicture) {
+    }
+
     public void onConfigurationChanged(Configuration newConfig) {
         mCalled = true;
     }
@@ -2308,6 +2327,20 @@
         }
     }
 
+    void performMultiWindowChanged(boolean inMultiWindow) {
+        onMultiWindowChanged(inMultiWindow);
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchMultiWindowChanged(inMultiWindow);
+        }
+    }
+
+    void performPictureInPictureChanged(boolean inPictureInPicture) {
+        onPictureInPictureChanged(inPictureInPicture);
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchPictureInPictureChanged(inPictureInPicture);
+        }
+    }
+
     void performConfigurationChanged(Configuration newConfig) {
         onConfigurationChanged(newConfig);
         if (mChildFragmentManager != null) {
diff --git a/core/java/android/app/FragmentController.java b/core/java/android/app/FragmentController.java
index 28dadfa..a9270bc 100644
--- a/core/java/android/app/FragmentController.java
+++ b/core/java/android/app/FragmentController.java
@@ -219,6 +219,28 @@
     }
 
     /**
+     * Lets all Fragments managed by the controller's FragmentManager know the multi-window mode of
+     * the activity changed.
+     * <p>Call when the multi-window mode of the activity changed.
+     *
+     * @see Fragment#onMultiWindowChanged
+     */
+    public void dispatchMultiWindowChanged(boolean inMultiWindow) {
+        mHost.mFragmentManager.dispatchMultiWindowChanged(inMultiWindow);
+    }
+
+    /**
+     * Lets all Fragments managed by the controller's FragmentManager know the picture-in-picture
+     * mode of the activity changed.
+     * <p>Call when the picture-in-picture mode of the activity changed.
+     *
+     * @see Fragment#onPictureInPictureChanged
+     */
+    public void dispatchPictureInPictureChanged(boolean inPictureInPicture) {
+        mHost.mFragmentManager.dispatchPictureInPictureChanged(inPictureInPicture);
+    }
+
+    /**
      * Lets all Fragments managed by the controller's FragmentManager
      * know a configuration change occurred.
      * <p>Call when there is a configuration change.
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 84ae09d..32fec84 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -1987,7 +1987,31 @@
         mContainer = null;
         mParent = null;
     }
-    
+
+    public void dispatchMultiWindowChanged(boolean inMultiWindow) {
+        if (mAdded == null) {
+            return;
+        }
+        for (int i = mAdded.size() - 1; i >= 0; --i) {
+            final Fragment f = mAdded.get(i);
+            if (f != null) {
+                f.performMultiWindowChanged(inMultiWindow);
+            }
+        }
+    }
+
+    public void dispatchPictureInPictureChanged(boolean inPictureInPicture) {
+        if (mAdded == null) {
+            return;
+        }
+        for (int i = mAdded.size() - 1; i >= 0; --i) {
+            final Fragment f = mAdded.get(i);
+            if (f != null) {
+                f.performPictureInPictureChanged(inPictureInPicture);
+            }
+        }
+    }
+
     public void dispatchConfigurationChanged(Configuration newConfig) {
         if (mAdded != null) {
             for (int i=0; i<mAdded.size(); i++) {