Merge tag 'android-6.0.1_r3' into 601r3

Android 6.0.1 release 3

* tag 'android-6.0.1_r3':
  Retain fragment loaders
  Set host when restoring a fragment
  Fix minor doc bug on DocumentFile.
  [RenderScript] pass correct length of ains to BLAS functions.

Change-Id: I42f6bc8d255d65c04c09b32f2e75d13702c7c6a5
diff --git a/v4/java/android/support/v4/app/Fragment.java b/v4/java/android/support/v4/app/Fragment.java
index 79f21ff..48fc495 100644
--- a/v4/java/android/support/v4/app/Fragment.java
+++ b/v4/java/android/support/v4/app/Fragment.java
@@ -272,9 +272,6 @@
 
     // If set this fragment is being retained across the current config change.
     boolean mRetaining;
-
-    // If set this fragment's loaders are being retained across the current config change.
-    boolean mRetainLoader;
     
     // If set this fragment has menu items to contribute.
     boolean mHasMenu;
@@ -2153,7 +2150,7 @@
                 mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
             }
             if (mLoaderManager != null) {
-                if (mRetainLoader) {
+                if (mHost.getRetainLoaders()) {
                     mLoaderManager.doRetain();
                 } else {
                     mLoaderManager.doStop();
diff --git a/v4/java/android/support/v4/app/FragmentController.java b/v4/java/android/support/v4/app/FragmentController.java
index dbf9ee7..5d647b0 100644
--- a/v4/java/android/support/v4/app/FragmentController.java
+++ b/v4/java/android/support/v4/app/FragmentController.java
@@ -346,7 +346,6 @@
      */
     public void doLoaderStop(boolean retain) {
         mHost.doLoaderStop(retain);
-        mHost.mFragmentManager.setRetainLoader(retain);
     }
 
     /**
diff --git a/v4/java/android/support/v4/app/FragmentHostCallback.java b/v4/java/android/support/v4/app/FragmentHostCallback.java
index fb4410f..5d6145a 100644
--- a/v4/java/android/support/v4/app/FragmentHostCallback.java
+++ b/v4/java/android/support/v4/app/FragmentHostCallback.java
@@ -42,9 +42,14 @@
     private final Handler mHandler;
     final int mWindowAnimations;
     final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl();
+    /** The loader managers for individual fragments [i.e. Fragment#getLoaderManager()] */
     private SimpleArrayMap<String, LoaderManager> mAllLoaderManagers;
+    /** Whether or not fragment loaders should retain their state */
+    private boolean mRetainLoaders;
+    /** The loader manger for the fragment host [i.e. Activity#getLoaderManager()] */
     private LoaderManagerImpl mLoaderManager;
     private boolean mCheckedForLoaderManager;
+    /** Whether or not the fragment host loader manager was started */
     private boolean mLoadersStarted;
 
     public FragmentHostCallback(Context context, Handler handler, int windowAnimations) {
@@ -197,6 +202,10 @@
     void onAttachFragment(Fragment fragment) {
     }
 
+    boolean getRetainLoaders() {
+        return mRetainLoaders;
+    }
+
     void doLoaderStart() {
         if (mLoadersStarted) {
             return;
@@ -217,6 +226,8 @@
 
     // retain -- whether to stop the loader or retain it
     void doLoaderStop(boolean retain) {
+        mRetainLoaders = retain;
+
         if (mLoaderManager == null) {
             return;
         }
diff --git a/v4/java/android/support/v4/app/FragmentManager.java b/v4/java/android/support/v4/app/FragmentManager.java
index 8e1a2fc..adf8892 100644
--- a/v4/java/android/support/v4/app/FragmentManager.java
+++ b/v4/java/android/support/v4/app/FragmentManager.java
@@ -918,17 +918,6 @@
         }
     }
 
-    void setRetainLoader(boolean retain) {
-        if (mActive != null) {
-            for (int i=0; i<mActive.size(); i++) {
-                Fragment f = mActive.get(i);
-                if (f != null) {
-                    f.mRetainLoader = retain;
-                }
-            }
-        }
-    }
-
     void moveToState(Fragment f, int newState, int transit, int transitionStyle,
             boolean keepActive) {
         // Fragments that are not currently added will sit in the onCreate() state.
@@ -2264,6 +2253,7 @@
             // This fragment was retained from a previous instance; get it
             // going now.
             fragment.mInLayout = true;
+            fragment.mHost = mHost;
             // If this fragment is newly instantiated (either right now, or
             // from last saved state), then give it the attributes to
             // initialize itself.
diff --git a/v4/java/android/support/v4/provider/DocumentFile.java b/v4/java/android/support/v4/provider/DocumentFile.java
index 0529da8..95e9117 100644
--- a/v4/java/android/support/v4/provider/DocumentFile.java
+++ b/v4/java/android/support/v4/provider/DocumentFile.java
@@ -86,7 +86,7 @@
 
     /**
      * Create a {@link DocumentFile} representing the filesystem tree rooted at
-     * the given {@link Uri}. This doesn't give you any additional access to the
+     * the given {@link File}. This doesn't give you any additional access to the
      * underlying files beyond what your app already has.
      * <p>
      * {@link #getUri()} will return {@code file://} Uris for files explored
diff --git a/v8/renderscript/jni/android_renderscript_RenderScript.cpp b/v8/renderscript/jni/android_renderscript_RenderScript.cpp
index 32243fc..9d69a2d 100644
--- a/v8/renderscript/jni/android_renderscript_RenderScript.cpp
+++ b/v8/renderscript/jni/android_renderscript_RenderScript.cpp
@@ -605,11 +605,11 @@
     if (mUseInc) {
         dispatchTab.ContextFinish((RsContext)con);
         dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
-                                          in_allocs, sizeof(in_allocs), nullptr,
+                                          in_allocs, NELEM(in_allocs), nullptr,
                                           &call, sizeof(call), nullptr, 0);
     } else {
         dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
-                                       in_allocs, sizeof(in_allocs), nullptr,
+                                       in_allocs, NELEM(in_allocs), nullptr,
                                        &call, sizeof(call), nullptr, 0);
     }
 }
@@ -645,11 +645,11 @@
     if (mUseInc) {
         dispatchTab.ContextFinish((RsContext)con);
         dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
-                                          in_allocs, sizeof(in_allocs), nullptr,
+                                          in_allocs, NELEM(in_allocs), nullptr,
                                           &call, sizeof(call), nullptr, 0);
     } else {
         dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
-                                        in_allocs, sizeof(in_allocs), nullptr,
+                                        in_allocs, NELEM(in_allocs), nullptr,
                                         &call, sizeof(call), nullptr, 0);
     }
 }
@@ -688,11 +688,11 @@
     if (mUseInc) {
         dispatchTab.ContextFinish((RsContext)con);
         dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
-                                          in_allocs, sizeof(in_allocs), nullptr,
+                                          in_allocs, NELEM(in_allocs), nullptr,
                                           &call, sizeof(call), nullptr, 0);
     } else {
         dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
-                                       in_allocs, sizeof(in_allocs), nullptr,
+                                       in_allocs, NELEM(in_allocs), nullptr,
                                        &call, sizeof(call), nullptr, 0);
     }
 }
@@ -731,11 +731,11 @@
     if (mUseInc) {
         dispatchTab.ContextFinish((RsContext)con);
         dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
-                                          in_allocs, sizeof(in_allocs), nullptr,
+                                          in_allocs, NELEM(in_allocs), nullptr,
                                           &call, sizeof(call), nullptr, 0);
     } else {
         dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
-                                        in_allocs, sizeof(in_allocs), nullptr,
+                                        in_allocs, NELEM(in_allocs), nullptr,
                                         &call, sizeof(call), nullptr, 0);
     }
 }
@@ -764,11 +764,11 @@
     if (mUseInc) {
         dispatchTab.ContextFinish((RsContext)con);
         dispatchTabInc.ScriptForEachMulti((RsContext)incCon, (RsScript)id, 0,
-                                          in_allocs, sizeof(in_allocs), nullptr,
+                                          in_allocs, NELEM(in_allocs), nullptr,
                                           &call, sizeof(call), nullptr, 0);
     } else {
         dispatchTab.ScriptForEachMulti((RsContext)con, (RsScript)id, 0,
-                                        in_allocs, sizeof(in_allocs), nullptr,
+                                        in_allocs, NELEM(in_allocs), nullptr,
                                         &call, sizeof(call), nullptr, 0);
     }
 }