From cd916f24a30ea4717ae2c0e66dfeac3355f56869 Mon Sep 17 00:00:00 2001 From: Clara Bayarri Date: Mon, 13 Jun 2016 13:14:51 +0100 Subject: [PATCH] Throw ISE when adding a non-public non-static fragment class instance to a transaction Bug: 25925078 Change-Id: Ifb25a0899fe4f64174a3d37b863481bd238fcce7 --- core/java/android/app/BackStackRecord.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java index 1e2cc2662018..00ed21f6908b 100644 --- a/core/java/android/app/BackStackRecord.java +++ b/core/java/android/app/BackStackRecord.java @@ -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) { -- 2.11.0