com.z299studio.pb.NavigationDrawerFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.z299studio.pb.NavigationDrawerFragment.java

Source

/*
* Copyright 2015 Qianqian Zhu <zhuqianqian.299@gmail.com> All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.z299studio.pb;

import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.Hashtable;

import com.z299studio.pb.NavigationDrawerAdapter.NavMenuItem;

public class NavigationDrawerFragment extends Fragment implements AdapterView.OnItemClickListener {

    private final String SELECTION_KEY = "current_selection";

    public interface NavigationDrawerCallbacks {
        void onNavigationDrawerItemSelected(int type, int id);
    }

    private NavigationDrawerCallbacks mCallback;
    private DrawerLayout mDrawerLayout;
    private ListView mMenuList;
    private View mFragmentContainerView;
    public ActionBarDrawerToggle mDrawerToggle;
    private NavigationDrawerAdapter mAdapter;
    private int mCategory;
    private Hashtable<Integer, Integer> mCategory2Navigation;
    private boolean mDrawerHidden;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            mCategory = savedInstanceState.getInt(SELECTION_KEY);
        } else {
            mCategory = AccountManager.ALL_CATEGORY_ID;
        }
        mCategory2Navigation = new Hashtable<>();
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (Application.getInstance() == null || Application.getInstance().getAccountManager() == null) {
            return null;
        }
        mDrawerHidden = getResources().getBoolean(R.bool.hide_drawer);
        mMenuList = (ListView) inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mAdapter = new NavigationDrawerAdapter(getActivity(), buildMenuItems());
        mMenuList.setAdapter(mAdapter);
        int position = mCategory2Navigation.get(mCategory);
        mAdapter.selectItem(null, position);
        mMenuList.setOnItemClickListener(this);
        mMenuList.setItemChecked(position, true);
        return mMenuList;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(SELECTION_KEY, mCategory);
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onResume() {
        super.onResume();
        if (Application.getInstance().queryChange(Application.DATA_OTHER)
                || Application.getInstance().queryChange(Application.DATA_ALL)) {
            mAdapter.setList(buildMenuItems());
            mAdapter.notifyDataSetChanged();
            select(AccountManager.ALL_CATEGORY_ID);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mCallback = (NavigationDrawerCallbacks) context;
        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCallback = null;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle != null) {
            return mDrawerToggle.onOptionsItemSelected(item);
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        NavMenuItem item = null;
        if (id == mCategory) {
            return;
        }
        if (mMenuList != null) {
            item = (NavMenuItem) mMenuList.getItemAtPosition(position);
            if (item.mType == NavMenuItem.MENU_SELECTION) {
                mAdapter.selectItem(view, position);
                mCategory = (int) id;
            }
            mMenuList.setItemChecked(mCategory2Navigation.get(mCategory), true);
        }

        if (mDrawerLayout != null) {
            mDrawerLayout.closeDrawer(mFragmentContainerView);
        }
        if (mCallback != null && item != null) {
            mCallback.onNavigationDrawerItemSelected(item.mType, item.mId);
        }
    }

    public void setUp(int fragmentId, DrawerLayout drawerLayout) {
        mFragmentContainerView = getActivity().findViewById(fragmentId);
        mDrawerLayout = drawerLayout;

        if (mDrawerLayout != null) {
            mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

            ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);

            mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, R.string.navigation_drawer_open,
                    R.string.navigation_drawer_close) {
                @Override
                public void onDrawerClosed(View drawerView) {
                    super.onDrawerClosed(drawerView);
                    if (!isAdded()) {
                        return;
                    }
                    getActivity().supportInvalidateOptionsMenu();
                }

                @Override
                public void onDrawerOpened(View drawerView) {
                    super.onDrawerOpened(drawerView);
                    if (!isAdded()) {
                        return;
                    }
                    getActivity().supportInvalidateOptionsMenu();
                }
            };

            mDrawerLayout.post(new Runnable() {
                @Override
                public void run() {
                    mDrawerToggle.syncState();
                }
            });

            mDrawerLayout.setDrawerListener(mDrawerToggle);
        }
    }

    private ArrayList<NavMenuItem> buildMenuItems() {
        Application app = Application.getInstance();
        Resources r = getResources();
        AccountManager am = app.getAccountManager();
        ArrayList<NavMenuItem> result = new ArrayList<>();
        int icons[] = Application.getThemedIcons();
        String[] categoryNames = app.getSortedCategoryNames();
        int[] categoryIcons = app.getSortedCategoryIcons();
        int[] categoryIds = app.getSortedCategoryIds();

        int pos = 0, i;
        if (mDrawerHidden) {
            result.add(new NavMenuItem(0, r.getString(R.string.app_name), 0, 0, NavMenuItem.MENU_HEADER));
            pos++;
        }
        result.add(new NavMenuItem(R.drawable.pb_all, r.getString(R.string.all_accounts),
                am.getAccountsCountByCategory(AccountManager.ALL_CATEGORY_ID), AccountManager.ALL_CATEGORY_ID,
                NavMenuItem.MENU_SELECTION));
        mCategory2Navigation.put(AccountManager.ALL_CATEGORY_ID, pos++);
        if (Application.Options.mShowOther) {
            result.add(new NavMenuItem(R.drawable.pb_unknown, r.getString(R.string.def_category),
                    am.getAccountsCountByCategory(AccountManager.DEFAULT_CATEGORY_ID),
                    AccountManager.DEFAULT_CATEGORY_ID, NavMenuItem.MENU_SELECTION));
            mCategory2Navigation.put(AccountManager.DEFAULT_CATEGORY_ID, pos++);
        }
        for (i = 1; i < categoryIcons.length; ++i) {
            result.add(new NavMenuItem(icons[categoryIcons[i]], categoryNames[i],
                    am.getAccountsCountByCategory(categoryIds[i]), categoryIds[i], NavMenuItem.MENU_SELECTION));
            mCategory2Navigation.put(categoryIds[i], pos++);
        }
        if (mDrawerHidden) {
            result.add(new NavMenuItem(0, null, 0, 0, NavMenuItem.MENU_SEPARATOR));
            int stringIds[] = { R.string.help, R.string.rate, R.string.settings };
            int iconIds[] = { R.drawable.ic_action_help, R.drawable.ic_rate_review, R.drawable.ic_action_settings };
            for (i = 0; i < stringIds.length; ++i) {
                result.add(new NavMenuItem(iconIds[i], r.getString(stringIds[i]), 0, stringIds[i],
                        NavMenuItem.MENU_ACTION));
            }
        }
        return result;
    }

    public void remove(int category) {
        if (category < 0) {
            mAdapter.setList(buildMenuItems());
            mAdapter.notifyDataSetChanged();
        } else {
            Integer pos = mCategory2Navigation.get(category);
            if (pos != null) {
                mAdapter.remove(pos);
                for (int p = pos; p < mAdapter.getCount(); ++p) {
                    NavMenuItem nmi = (NavMenuItem) mAdapter.getItem(p);
                    if (nmi.mType == NavMenuItem.MENU_SELECTION) {
                        mCategory2Navigation.put(nmi.mId, p);
                    }
                }
            }
        }
    }

    public void select(int category) {
        Integer pos = mCategory2Navigation.get(category);
        if (pos != null) {
            onItemClick(mMenuList, null, pos, category);
        }
    }

    public void increaseCounterInMenu(int category, int delta) {
        Integer pos = mCategory2Navigation.get(category);
        if (pos != null) {
            int firstVisiblePosition = mMenuList.getFirstVisiblePosition();
            View view = mMenuList.getChildAt(pos - firstVisiblePosition);
            mAdapter.increaseCounterInMenu(view, pos, delta);
        }
    }

    public void refreshCategoryCounters() {
        int[] cateIds = Application.getInstance().getSortedCategoryIds();
        AccountManager am = Application.getInstance().getAccountManager();
        Integer pos;
        for (int id : cateIds) {
            pos = mCategory2Navigation.get(id);
            if (pos != null) {
                mAdapter.updateCategoryCounter(null, pos, am.getAccountsCountByCategory(id));
            }
        }
        pos = mCategory2Navigation.get(AccountManager.ALL_CATEGORY_ID);
        if (pos != null) {
            mAdapter.updateCategoryCounter(null, pos,
                    am.getAccountsCountByCategory(AccountManager.ALL_CATEGORY_ID));
        }
        mAdapter.notifyDataSetChanged();
    }

    public int getCount(int categoryId) {
        Integer pos = mCategory2Navigation.get(categoryId);
        if (pos != null) {
            return mAdapter.getCounterInMenu(pos);
        }
        return 0;
    }

    public void lockDrawer(boolean lock) {
        if (mDrawerLayout != null) {
            mDrawerLayout.setDrawerLockMode(
                    lock ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
        } else {
            mMenuList.setEnabled(!lock);
        }
    }

}