com.vinexs.eeb.BaseFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.vinexs.eeb.BaseFragment.java

Source

/*
 * Copyright (c) 2015. Vin @ vinexs.com (MIT License)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package com.vinexs.eeb;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;

import com.vinexs.R;
import com.vinexs.tool.Utility;

@SuppressWarnings("unused")
public abstract class BaseFragment extends Fragment {

    protected final String TAG = getClass().getSimpleName();

    /**
     * Should be overwrite in onCreate method by extended class.
     */
    protected Boolean noClickThroughView = true;

    /**
     * Will be fill in onCreate method.
     */
    protected Bundle args = null;
    protected Context context = null;

    public String getBreadCrumbTitle() {
        if (args == null || !args.containsKey("breadCrumbTitle")) {
            return null;
        }
        return args.getString("breadCrumbTitle");
    }

    public String getBreadCrumbShortTitle() {
        if (args == null || !args.containsKey("breadCrumbShortTitle")) {
            return null;
        }
        return args.getString("breadCrumbShortTitle");
    }

    public String getFragmentName() {
        if (args == null || !args.containsKey("fragmentName")) {
            return getClass().getSimpleName();
        }
        return args.getString("fragmentName");
    }

    public int getFragmentId() {
        if (args == null || !args.containsKey("fragmentId")) {
            return 0;
        }
        return args.getInt("fragmentId");
    }

    public BaseActivity getBaseActivity() {
        return (BaseActivity) getActivity();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        args = getArguments();
        context = getActivity();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        // Fix API > 11  IllegalStateException -> Can not perform this action after onSaveInstanceState.
        outState.putBoolean("onSaveInstanceState", true); // WORKAROUND_FOR_BUG_19917
        super.onSaveInstanceState(outState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        int layoutResId = getLayoutResId();
        if (layoutResId == 0) {
            return null;
        }
        return inflater.inflate(layoutResId, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (noClickThroughView) {
            view.setOnTouchListener(new OnTouchListener() {
                @Override
                @SuppressLint("ClickableViewAccessibility")
                public boolean onTouch(View view, MotionEvent event) {
                    return true;
                }
            });
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        int toolbarResId = getToolbarResId();
        if (toolbarResId != 0 && getView() != null) {
            Toolbar toolbar = (Toolbar) getView().findViewById(toolbarResId);
            if (toolbar != null) {
                getBaseActivity().setToolbar(toolbar);
            } else {
                Log.d(TAG, "Assigned Toolbar cannot be found.");
            }
        }
    }

    public abstract int getLayoutResId();

    public abstract int getToolbarResId();

    // ================  Fragments Control =========================

    public Fragment getExistFragment(String fragName) {
        return getActivity().getSupportFragmentManager().findFragmentByTag(fragName);
    }

    public Boolean isOnTop() {
        FragmentManager fragMgr = getActivity().getSupportFragmentManager();
        FragmentManager.BackStackEntry backEntry = fragMgr
                .getBackStackEntryAt(fragMgr.getBackStackEntryCount() - 1);
        String backEntryName = backEntry.getName();
        return backEntryName != null && backEntryName.equals(getFragmentName());
    }

    public void addFragment(Fragment fragment) {
        addFragment(R.id.frame_content, fragment);
    }

    public void addFragment(int viewId, Fragment fragment) {
        if (fragment.isAdded()) {
            return;
        }
        FragmentManager fragMgr = getActivity().getSupportFragmentManager();
        FragmentTransaction transaction = fragMgr.beginTransaction();
        FragmentManager.BackStackEntry lastEntry = fragMgr.getBackStackEntryCount() == 0 ? null
                : fragMgr.getBackStackEntryAt(fragMgr.getBackStackEntryCount() - 1);
        // Transaction options
        String fragName = fragment.getClass().getSimpleName();
        String breadCrumbTitle;
        String breadCrumbShortTitle;
        int animationEnter = 0;
        int animationExit = 0;
        Boolean addToBackStack = false;
        // Fill options
        Bundle args = fragment.getArguments();
        if (args != null) {
            if (args.containsKey("animationEnter") && args.containsKey("animationExit")) {
                animationEnter = args.getInt("animationEnter");
                animationExit = args.getInt("animationExit");
            }
            if (args.containsKey("breadCrumbTitle")) {
                breadCrumbTitle = args.getString("breadCrumbTitle");
            } else {
                breadCrumbTitle = (lastEntry != null) ? lastEntry.getBreadCrumbTitle().toString()
                        : Utility.getAppName(getActivity());
            }
            if (args.containsKey("breadCrumbShortTitle")) {
                breadCrumbShortTitle = args.getString("breadCrumbShortTitle");
            } else {
                breadCrumbShortTitle = (lastEntry != null) ? lastEntry.getBreadCrumbShortTitle().toString()
                        : Utility.getAppName(getActivity());
            }
            if (args.containsKey("fragmentName")) {
                fragName = args.getString("fragmentName");
            }
            if (args.containsKey("addToBackStack")) {
                addToBackStack = args.getBoolean("addToBackStack");
            }
        } else {
            breadCrumbTitle = (lastEntry != null) ? lastEntry.getBreadCrumbTitle().toString()
                    : Utility.getAppName(getActivity());
            breadCrumbShortTitle = (lastEntry != null) ? lastEntry.getBreadCrumbShortTitle().toString()
                    : Utility.getAppName(getActivity());
        }
        // Set option to fragment manager
        if (animationEnter != 0 && animationExit != 0) {
            transaction.setCustomAnimations(animationEnter, animationExit);
        }
        if (breadCrumbTitle != null && !breadCrumbTitle.isEmpty()) {
            transaction.setBreadCrumbTitle(breadCrumbTitle);
        }
        if (breadCrumbShortTitle != null && !breadCrumbShortTitle.isEmpty()) {
            transaction.setBreadCrumbShortTitle(breadCrumbShortTitle);
        }
        if (transaction.isAddToBackStackAllowed() && addToBackStack) {
            transaction.addToBackStack(fragName);
        }
        // Add fragment
        transaction.add(viewId, fragment, fragName).commitAllowingStateLoss();
    }

    public void replaceFragment(Fragment fragment) {
        replaceFragment(R.id.frame_content, fragment);
    }

    public void replaceFragment(int viewId, Fragment fragment) {
        if (fragment.isAdded()) {
            return;
        }
        FragmentManager fragMgr = getActivity().getSupportFragmentManager();
        FragmentTransaction transaction = fragMgr.beginTransaction();
        FragmentManager.BackStackEntry lastEntry = fragMgr.getBackStackEntryCount() == 0 ? null
                : fragMgr.getBackStackEntryAt(fragMgr.getBackStackEntryCount() - 1);
        // Transaction options
        String fragName = fragment.getClass().getSimpleName();
        String breadCrumbTitle;
        String breadCrumbShortTitle;
        int animationEnter = 0;
        int animationExit = 0;
        Boolean addToBackStack = true;
        // Fill options
        Bundle args = fragment.getArguments();
        if (args != null) {
            if (args.containsKey("animationEnter") && args.containsKey("animationExit")) {
                animationEnter = args.getInt("animationEnter");
                animationExit = args.getInt("animationExit");
            }
            if (args.containsKey("breadCrumbTitle")) {
                breadCrumbTitle = args.getString("breadCrumbTitle");
            } else {
                breadCrumbTitle = (lastEntry != null) ? lastEntry.getBreadCrumbTitle().toString()
                        : Utility.getAppName(getActivity());
            }
            if (args.containsKey("breadCrumbShortTitle")) {
                breadCrumbShortTitle = args.getString("breadCrumbShortTitle");
            } else {
                breadCrumbShortTitle = (lastEntry != null) ? lastEntry.getBreadCrumbShortTitle().toString()
                        : Utility.getAppName(getActivity());
            }
            if (args.containsKey("fragmentName")) {
                fragName = args.getString("fragmentName");
            }
            if (args.containsKey("addToBackStack")) {
                addToBackStack = args.getBoolean("addToBackStack");
            }
        } else {
            breadCrumbTitle = (lastEntry != null) ? lastEntry.getBreadCrumbTitle().toString()
                    : Utility.getAppName(getActivity());
            breadCrumbShortTitle = (lastEntry != null) ? lastEntry.getBreadCrumbShortTitle().toString()
                    : Utility.getAppName(getActivity());
        }
        // Set option to fragment manager
        if (animationEnter != 0 && animationExit != 0) {
            transaction.setCustomAnimations(animationEnter, animationExit);
        }
        if (breadCrumbTitle != null && !breadCrumbTitle.isEmpty()) {
            transaction.setBreadCrumbTitle(breadCrumbTitle);
        }
        if (breadCrumbShortTitle != null && !breadCrumbShortTitle.isEmpty()) {
            transaction.setBreadCrumbShortTitle(breadCrumbShortTitle);
        }
        if (transaction.isAddToBackStackAllowed() && addToBackStack) {
            transaction.addToBackStack(fragName);
        }
        // Replace fragment
        transaction.replace(viewId, fragment, fragName).commitAllowingStateLoss();
    }

    public void showFragment(Fragment fragment) {
        if (!fragment.isAdded()) {
            return;
        }
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        transaction.show(fragment).commitAllowingStateLoss();
    }

    public void hideFragment(Fragment fragment) {
        if (!fragment.isAdded()) {
            return;
        }
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        transaction.hide(fragment).commitAllowingStateLoss();
    }

    public void removeFragment(Fragment fragment) {
        if (!fragment.isAdded()) {
            return;
        }
        FragmentManager manager = getActivity().getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.remove(fragment).commitAllowingStateLoss();
        Bundle args = fragment.getArguments();
        if (args != null && args.containsKey("breadCrumbTitle")) {
            manager.popBackStack();
        }
    }

    public void removeSelf() {
        removeFragment(this);
    }

}