OSDN Git Service

Throw ISE when adding a non-public non-static fragment class instance to a transaction
authorClara Bayarri <clarabayarri@google.com>
Mon, 13 Jun 2016 12:14:51 +0000 (13:14 +0100)
committerClara Bayarri <clarabayarri@google.com>
Thu, 16 Jun 2016 09:59:37 +0000 (10:59 +0100)
Bug: 25925078
Change-Id: Ifb25a0899fe4f64174a3d37b863481bd238fcce7

core/java/android/app/BackStackRecord.java

index 1e2cc26..00ed21f 100644 (file)
@@ -17,6 +17,7 @@
 package android.app;
 
 import android.graphics.Rect;
+import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
@@ -35,6 +36,7 @@ import com.android.internal.util.FastPrintWriter;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -462,6 +464,19 @@ final class BackStackRecord extends FragmentTransaction implements
     }
 
     private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
+        if (mManager.mHost.getContext() != null) {
+            final int targetSdkVersion =
+                    mManager.mHost.getContext().getApplicationInfo().targetSdkVersion;
+            final Class fragmentClass = fragment.getClass();
+            final int modifiers = fragmentClass.getModifiers();
+            // TODO: make the check N_MR1 or O
+            if (targetSdkVersion > Build.VERSION_CODES.N && (fragmentClass.isAnonymousClass()
+                    || !Modifier.isPublic(modifiers)
+                    || (fragmentClass.isMemberClass() && !Modifier.isStatic(modifiers)))) {
+                throw new IllegalStateException("Fragment must be a public static class to be "
+                        + "properly recreated on configuration change.");
+            }
+        }
         fragment.mFragmentManager = mManager;
 
         if (tag != null) {