package org.theotech.ceaselessandroid.util; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.content.Context; import android.os.Bundle; import android.support.design.widget.NavigationView; import android.util.Log; import org.theotech.ceaselessandroid.R; import org.theotech.ceaselessandroid.activity.MainActivity; import org.theotech.ceaselessandroid.fragment.AboutFragment; import org.theotech.ceaselessandroid.fragment.AddNoteFragment; import org.theotech.ceaselessandroid.fragment.ContactUsFragment; import org.theotech.ceaselessandroid.fragment.FragmentState; import org.theotech.ceaselessandroid.fragment.HelpFragment; import org.theotech.ceaselessandroid.fragment.HomeFragment; import org.theotech.ceaselessandroid.fragment.JournalFragment; import org.theotech.ceaselessandroid.fragment.PeopleFragment; import org.theotech.ceaselessandroid.fragment.PersonFragment; import org.theotech.ceaselessandroid.fragment.SettingsFragment; /** * Created by uberx on 10/8/15. */ public class FragmentUtils { private static final String TAG = FragmentUtils.class.getSimpleName(); public static void loadFragment(Activity activity, FragmentManager fragmentManager, NavigationView navigation, int resourceId) { loadFragment(activity, fragmentManager, navigation, resourceId, (Bundle) null); } public static void loadFragment(Activity activity, FragmentManager fragmentManager, NavigationView navigation, int resourceId, Bundle loadingFragmentState /* state of the fragment being loaded */) { loadFragment(activity, fragmentManager, navigation, resourceId, loadingFragmentState, null); } public static void loadFragment(Activity activity, FragmentManager fragmentManager, NavigationView navigation, int resourceId, FragmentState backStackInfo) { loadFragment(activity, fragmentManager, navigation, resourceId, null, backStackInfo); } public static void loadFragment(Activity activity, FragmentManager fragmentManager, NavigationView navigation, int resourceId, Bundle loadingFragmentState /* state of the fragment being loaded */, FragmentState backStackInfo) { Fragment fragment = getFragmentForResourceId(resourceId); String fragmentTag = getFragmentTagForResourceId(activity, resourceId); Fragment fragmentForTag = fragmentManager.findFragmentByTag(fragmentTag); if (fragment != null && (fragmentForTag == null || !fragmentForTag.isVisible())) { if (backStackInfo != null) { MainActivity main = (MainActivity) activity; main.getFragmentBackStackManager().add(backStackInfo); if (resourceId == R.id.nav_home) { // if the user tapped Home in the navigation // ensure we treat it as if it were the first time the fragment // were created (e.g. showing the first page instead of where they left off) main.setHomeFragmentCreated(false); } } fragment.setArguments(loadingFragmentState); fragmentManager.beginTransaction().replace(R.id.fragment, fragment, fragmentTag).commit(); if (navigation != null && fragmentTag != null) { navigation.setCheckedItem(getNavigationItemIdForFragmentName(activity, fragmentTag)); } activity.setTitle(fragmentTag); } else { Log.d(TAG, String.format("Required fragment %s already visible, not reloading", fragmentTag)); } } private static Fragment getFragmentForResourceId(int resourceId) { if (resourceId == R.id.nav_home) { return new HomeFragment(); } else if (resourceId == R.id.nav_people) { return new PeopleFragment(); } else if (resourceId == R.id.nav_journal) { return new JournalFragment(); } else if (resourceId == R.id.nav_settings) { return new SettingsFragment(); } else if (resourceId == R.id.nav_help) { return new HelpFragment(); } else if (resourceId == R.id.nav_contact_us) { return new ContactUsFragment(); } else if (resourceId == R.id.nav_rate_this_app) { return new HomeFragment(); } else if (resourceId == R.id.show_more_people) { return new HomeFragment(); } else if (resourceId == R.id.person_add_note) { return new AddNoteFragment(); } else if (resourceId == R.id.person_card) { return new PersonFragment(); } else if (resourceId == R.id.add_note_fragment) { return new AddNoteFragment(); } else if (resourceId == R.id.nav_about) { return new AboutFragment(); } return null; } private static String getFragmentTagForResourceId(Context context, int resourceId) { if (resourceId == R.id.nav_home) { return context.getString(R.string.nav_home); } else if (resourceId == R.id.nav_people) { return context.getString(R.string.nav_people); } else if (resourceId == R.id.nav_journal) { return context.getString(R.string.nav_journal); } else if (resourceId == R.id.nav_settings) { return context.getString(R.string.nav_settings); } else if (resourceId == R.id.nav_help) { return context.getString(R.string.nav_help); } else if (resourceId == R.id.nav_contact_us) { return context.getString(R.string.nav_contact_us); } else if (resourceId == R.id.nav_rate_this_app) { return context.getString(R.string.nav_rate_this_app); } else if (resourceId == R.id.nav_about) { return context.getString(R.string.nav_about); } else if (resourceId == R.id.person_add_note) { return context.getString(R.string.person_add_note); } return null; } public static Integer getNavigationItemIdForFragmentName(Context context, String fragmentName) { if (fragmentName.equals(context.getString(R.string.nav_home))) { return R.id.nav_home; } else if (fragmentName.equals(context.getString(R.string.nav_people))) { return R.id.nav_people; } else if (fragmentName.equals(context.getString(R.string.nav_journal))) { return R.id.nav_journal; } else if (fragmentName.equals(context.getString(R.string.nav_settings))) { return R.id.nav_settings; } else if (fragmentName.equals(context.getString(R.string.nav_help))) { return R.id.nav_help; } else if (fragmentName.equals(context.getString(R.string.nav_contact_us))) { return R.id.nav_contact_us; } else if (fragmentName.equals(context.getString(R.string.nav_rate_this_app))) { return R.id.nav_rate_this_app; } else if (fragmentName.equals(context.getString(R.string.nav_about))) { return R.id.nav_about; } else if (fragmentName.equals(context.getString(R.string.person_add_note))) { return R.id.nav_journal; } else if (fragmentName.equals(context.getString(R.string.person_view))) { return R.id.person_card; } return null; } }