/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.stetho.common.android; import android.annotation.TargetApi; import android.app.Activity; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentManager; import android.content.res.Resources; import android.os.Build; import android.view.View; import javax.annotation.Nullable; @TargetApi(Build.VERSION_CODES.HONEYCOMB) final class FragmentCompatFramework extends FragmentCompat<Fragment, DialogFragment, FragmentManager, Activity> { private static final FragmentAccessorFrameworkHoneycomb sFragmentAccessor; private static final DialogFragmentAccessorFramework sDialogFragmentAccessor; private static final FragmentManagerAccessorViaReflection<FragmentManager, Fragment> sFragmentManagerAccessor = new FragmentManagerAccessorViaReflection<>(); private static final FragmentActivityAccessorFramework sFragmentActivityAccessor = new FragmentActivityAccessorFramework(); static { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { sFragmentAccessor = new FragmentAccessorFrameworkJellyBean(); } else { sFragmentAccessor = new FragmentAccessorFrameworkHoneycomb(); } sDialogFragmentAccessor = new DialogFragmentAccessorFramework(sFragmentAccessor); } @Override public Class<Fragment> getFragmentClass() { return Fragment.class; } @Override public Class<DialogFragment> getDialogFragmentClass() { return DialogFragment.class; } @Override public Class<Activity> getFragmentActivityClass() { return Activity.class; } @Override public FragmentAccessorFrameworkHoneycomb forFragment() { return sFragmentAccessor; } @Override public DialogFragmentAccessorFramework forDialogFragment() { return sDialogFragmentAccessor; } @Override public FragmentManagerAccessorViaReflection<FragmentManager, Fragment> forFragmentManager() { return sFragmentManagerAccessor; } @Override public FragmentActivityAccessorFramework forFragmentActivity() { return sFragmentActivityAccessor; } private static class FragmentAccessorFrameworkHoneycomb implements FragmentAccessor<Fragment, FragmentManager> { @Nullable @Override public FragmentManager getFragmentManager(Fragment fragment) { return fragment.getFragmentManager(); } @Override public Resources getResources(Fragment fragment) { return fragment.getResources(); } @Override public int getId(Fragment fragment) { return fragment.getId(); } @Nullable @Override public String getTag(Fragment fragment) { return fragment.getTag(); } @Nullable @Override public View getView(Fragment fragment) { return fragment.getView(); } @Nullable @Override public FragmentManager getChildFragmentManager(Fragment fragment) { return null; } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private static class FragmentAccessorFrameworkJellyBean extends FragmentAccessorFrameworkHoneycomb { @Nullable @Override public FragmentManager getChildFragmentManager(Fragment fragment) { return fragment.getChildFragmentManager(); } } private static class DialogFragmentAccessorFramework implements DialogFragmentAccessor<DialogFragment, Fragment, FragmentManager> { private final FragmentAccessor<Fragment, FragmentManager> mFragmentAccessor; public DialogFragmentAccessorFramework( FragmentAccessor<Fragment, FragmentManager> fragmentAccessor) { mFragmentAccessor = fragmentAccessor; } @Override public Dialog getDialog(DialogFragment dialogFragment) { return dialogFragment.getDialog(); } @Nullable @Override public FragmentManager getFragmentManager(Fragment fragment) { return mFragmentAccessor.getFragmentManager(fragment); } @Override public Resources getResources(Fragment fragment) { return mFragmentAccessor.getResources(fragment); } @Override public int getId(Fragment fragment) { return mFragmentAccessor.getId(fragment); } @Nullable @Override public String getTag(Fragment fragment) { return mFragmentAccessor.getTag(fragment); } @Nullable @Override public View getView(Fragment fragment) { return mFragmentAccessor.getView(fragment); } @Nullable @Override public FragmentManager getChildFragmentManager(Fragment fragment) { return mFragmentAccessor.getChildFragmentManager(fragment); } } private static class FragmentActivityAccessorFramework implements FragmentActivityAccessor<Activity, FragmentManager> { @Nullable @Override public FragmentManager getFragmentManager(Activity activity) { return activity.getFragmentManager(); } } }