Java tutorial
/* * This file is a part of Budget with Envelopes. * Copyright 2013 Michael Howell <michael@notriddle.com> * * Budget is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Budget is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Budget. If not, see <http://www.gnu.org/licenses/>. */ package com.notriddle.budget; import android.app.ActionBar; import android.app.Activity; import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; public class EnvelopesActivity extends LockedActivity implements OkFragment.OnDismissListener, ListView.OnItemClickListener, ColorFragment.OnColorChangeListener { ListView mNavDrawer; NavAdapter mNavAdapter; DrawerLayout mDrawerLayout; ActionBarDrawerToggle mNavToggle; ColorDrawable mActionBarColor; View mCustomActionBarView; int mColor; @Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.activity); setupActionBarBackground(); setupDrawer(); if (state == null) { final Intent i = getIntent(); final Bundle args = i.getExtras(); final Uri data = i.getData(); final String fragmentName = data != null ? data.getHost() : EnvelopesFragment.class.getName(); try { topFragment(Class.forName(fragmentName), FragmentTransaction.TRANSIT_FRAGMENT_FADE, args); } catch (Exception e) { throw new Error(e); } } else { configureFragment(getFragmentManager().findFragmentById(R.id.content_frame)); } } private void setupActionBarBackground() { mColor = 0xFFEEEEEE; mActionBarColor = new ColorDrawable(mColor); getActionBar().setBackgroundDrawable(mActionBarColor); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { mActionBarColor.setCallback(new Drawable.Callback() { @Override public void invalidateDrawable(Drawable who) { getActionBar().setBackgroundDrawable(who); } @Override public void scheduleDrawable(Drawable who, Runnable what, long when) { } @Override public void unscheduleDrawable(Drawable who, Runnable what) { } }); } } private void setupDrawer() { mNavDrawer = (ListView) findViewById(R.id.left_drawer); mNavAdapter = new NavAdapter(this); mNavDrawer.setAdapter(mNavAdapter); mNavDrawer.setOnItemClickListener(this); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mNavToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawerOpen_button, R.string.drawerClose_button) { @Override public void onDrawerClosed(View v) { super.onDrawerClosed(v); ActionBar ab = getActionBar(); ab.setTitle(getTitle()); invalidateOptionsMenu(); if (mCustomActionBarView != null) { ab.setCustomView(mCustomActionBarView); ab.setDisplayShowTitleEnabled(false); ab.setDisplayShowCustomEnabled(true); } } @Override public void onDrawerSlide(View v, float off) { super.onDrawerSlide(v, off); int allIn = mColor; int allOut = 0xFFEEEEEE; int result = Color.rgb((int) (Color.red(allIn) * (1 - off) + Color.red(allOut) * off), (int) (Color.green(allIn) * (1 - off) + Color.green(allOut) * off), (int) (Color.blue(allIn) * (1 - off) + Color.blue(allOut) * off)); mActionBarColor.setColor(result); } @Override public void onDrawerOpened(View v) { super.onDrawerOpened(v); ActionBar ab = getActionBar(); ab.setTitle(getString(R.string.app_name)); invalidateOptionsMenu(); if (mCustomActionBarView != null) { ab.setDisplayShowTitleEnabled(true); ab.setDisplayShowCustomEnabled(false); ab.setCustomView(null); } } }; mDrawerLayout.setDrawerListener(mNavToggle); getActionBar().setHomeButtonEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public void onPostCreate(Bundle state) { super.onPostCreate(state); mNavToggle.syncState(); } @Override public void onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); mNavToggle.onConfigurationChanged(config); } @Override public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { mDrawerLayout.closeDrawers(); topFragment(mNavAdapter.getItem(pos), FragmentTransaction.TRANSIT_FRAGMENT_FADE, null); } @Override public void onResume() { super.onResume(); (new AsyncTask<Object, Object, Object>() { protected Object doInBackground(Object... o) { EnvelopesOpenHelper.playLog(EnvelopesActivity.this); return null; } protected void onPostExecute(Object o) { // do nothing. } }).execute(); } @Override public void onDismiss() { onBackPressed(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean drawerOpen = mDrawerLayout.isDrawerOpen(mNavDrawer); int l = menu.size(); for (int i = 0; i != l; ++i) { menu.getItem(i).setVisible(!drawerOpen); } return super.onPrepareOptionsMenu(menu); } public void topFragment(Class<?> cls, int transition, Bundle args) { Fragment frag = Fragment.instantiate(this, cls.getName(), args); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); fragmentManager.beginTransaction().replace(R.id.content_frame, frag).setTransition(transition).commit(); fragmentManager.executePendingTransactions(); configureFragment(frag); } public void switchFragment(Class<?> cls, String name, Bundle args) { Fragment frag = Fragment.instantiate(this, cls.getName(), args); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, frag).addToBackStack(name) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit(); fragmentManager.executePendingTransactions(); configureFragment(frag); } @Override public void onBackPressed() { FragmentManager fragmentManager = getFragmentManager(); if (mDrawerLayout.isDrawerOpen(mNavDrawer)) { mDrawerLayout.closeDrawers(); } else if (fragmentManager.getBackStackEntryCount() != 0) { fragmentManager.popBackStackImmediate(); configureFragment(fragmentManager.findFragmentById(R.id.content_frame)); } else { super.onBackPressed(); } } private void configureFragment(Fragment frag) { ActionBar ab = getActionBar(); if (frag instanceof TitleFragment) { TitleFragment tFrag = (TitleFragment) frag; setTitle(tFrag.getTitle()); ab.setTitle(getTitle()); boolean isTopLevel = false; for (int i = 0; i != mNavAdapter.getCount(); ++i) { if (mNavAdapter.getItem(i) == frag.getClass()) { mNavDrawer.setItemChecked(i, true); isTopLevel = true; break; } else { mNavDrawer.setItemChecked(i, false); } } mNavToggle.setDrawerIndicatorEnabled(isTopLevel); } else { throw new Error("Top-level fragment must be a TitleFragment"); } if (frag instanceof DialogFragment) { DialogFragment dFrag = (DialogFragment) frag; dFrag.setShowsDialog(false); } if (frag instanceof ColorFragment) { ColorFragment cFrag = (ColorFragment) frag; onColorChange(cFrag.getColor()); } else { onColorChange(0); } if (frag instanceof CustomActionBarFragment) { CustomActionBarFragment cFrag = (CustomActionBarFragment) frag; mCustomActionBarView = cFrag.onCreateActionBarView(getLayoutInflater()); ab.setCustomView(mCustomActionBarView); ab.setDisplayShowTitleEnabled(false); ab.setDisplayShowCustomEnabled(true); } else { mCustomActionBarView = null; ab.setDisplayShowTitleEnabled(true); ab.setDisplayShowCustomEnabled(false); ab.setCustomView(null); } } @Override public void onColorChange(int color) { mColor = color == 0 ? 0xFFEEEEEE : color; mActionBarColor.setColor(mColor); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mNavToggle.onOptionsItemSelected(item)) { return true; } switch (item.getItemId()) { case android.R.id.home: topFragment(EnvelopesFragment.class, FragmentTransaction.TRANSIT_FRAGMENT_CLOSE, null); return true; } return super.onOptionsItemSelected(item); } }