package com.myMinistry.ui;
import static com.myMinistry.util.LogUtils.LOGE;
import static com.myMinistry.util.LogUtils.makeLogTag;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBar.TabListener;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.myMinistry.FragmentActivityStatus;
import com.myMinistry.R;
import com.myMinistry.fragments.DBBackupsFragment;
import com.myMinistry.fragments.DBBackupsListFragment;
import com.myMinistry.fragments.DBScheduleFragment;
import com.myMinistry.fragments.EntryTypeManagerFrag;
import com.myMinistry.fragments.HouseholdersFragment;
import com.myMinistry.fragments.PublicationFragment;
import com.myMinistry.fragments.PublicationManagerFrag;
import com.myMinistry.fragments.PublishersFragment;
import com.myMinistry.fragments.SummaryFragment;
import com.myMinistry.fragments.TimeEditorFragment;
import com.myMinistry.provider.MinistryDatabase;
import com.myMinistry.util.HelpUtils;
import com.myMinistry.util.PrefUtils;
import com.myMinistry.util.UIUtils;
@SuppressWarnings("deprecation")
public class MainActivity extends ActionBarActivity implements FragmentActivityStatus, TabListener {
private static final String TAG = makeLogTag(MainActivity.class);
private boolean execute_tab = false;
private boolean is_dual_pane = false;
private Handler mHandler;
private ViewGroup mDrawerItemsListContainer;
// symbols for navdrawer items (indices must correspond to array below). This is
// not a list of items that are necessarily *present* in the Nav Drawer; rather,
// it's a list of all possible items.
protected static final int NAVDRAWER_ITEM_SUMMARY = 0;
protected static final int NAVDRAWER_ITEM_PUBLICATIONS = 1;
protected static final int NAVDRAWER_ITEM_HOUSEHOLDERS = 2;
protected static final int NAVDRAWER_ITEM_PUBLISHERS = 3;
protected static final int NAVDRAWER_ITEM_ENTRY_TYPES = 4;
protected static final int NAVDRAWER_ITEM_BACKUPS = 5;
protected static final int NAVDRAWER_ITEM_SETTINGS = 6;
protected static final int NAVDRAWER_ITEM_HELP = 7;
protected static final int NAVDRAWER_ITEM_TIME_ENTRY = 8;
protected static final int NAVDRAWER_ITEM_INVALID = -1;
protected static final int NAVDRAWER_ITEM_SEPARATOR = -2;
public static final int SUMMARY_ID = NAVDRAWER_ITEM_SUMMARY;
public static final int TIME_ENTRY_ID = NAVDRAWER_ITEM_TIME_ENTRY;
protected static final int NAVDRAWER_ITEM_DEFAULT = NAVDRAWER_ITEM_SUMMARY;
// titles for navdrawer items (indices must correspond to the above)
private static final int[] NAVDRAWER_TITLE_RES_ID = new int[]{
R.string.navdrawer_item_summary,
R.string.navdrawer_item_publications,
R.string.navdrawer_item_householders,
R.string.navdrawer_item_publishers,
R.string.navdrawer_item_entry_types,
R.string.navdrawer_item_backups,
R.string.navdrawer_item_settings,
R.string.navdrawer_item_help
};
// icons for navdrawer items (indices must correspond to above array)
private static final int[] NAVDRAWER_ICON_RES_ID = new int[] {
R.drawable.ic_drawer_report,
R.drawable.ic_drawer_publications,
R.drawable.ic_drawer_householders,
R.drawable.ic_drawer_publisher,
R.drawable.ic_drawer_entry_types,
R.drawable.ic_drawer_db,
R.drawable.ic_drawer_settings,
R.drawable.ic_drawer_help
};
// delay to launch navdrawer item, to allow close animation to play
private static final int NAVDRAWER_LAUNCH_DELAY = 250;
// fade in and fade out durations for the main content when switching between
// different Activities of the app through the Nav Drawer
private static final int MAIN_CONTENT_FADEOUT_DURATION = 150;
private static final int MAIN_CONTENT_FADEIN_DURATION = 250;
// list of navdrawer items that were actually added to the navdrawer, in order
private ArrayList<Integer> mNavDrawerItems = new ArrayList<Integer>();
// views that correspond to each navdrawer item, null if not yet created
private View[] mNavDrawerItemViews = null;
private FragmentManager fm;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
//private CharSequence mTitle;
//private CharSequence mDrawerTitle;
private Boolean firstLoad = true;
@Override
public void onResume() {
super.onResume();
changeLang(PrefUtils.getLocale(getApplicationContext()));
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
changeLang(PrefUtils.getLocale(getApplicationContext()));
mHandler = new Handler();
fm = getSupportFragmentManager();
//mTitle = mDrawerTitle = getTitle();
//mDrawerTitle = getTitle();
is_dual_pane = findViewById(R.id.secondary_fragment_container) != null;
// Set a toolbar to replace the action bar.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
if(HelpUtils.isApplicationUpdated(this)) {
MinistryDatabase.getInstance(getApplicationContext()).getWritableDatabase();
final ProgressDialog ringProgressDialog = ProgressDialog.show(this, getResources().getString(R.string.updating_app), getResources().getString(R.string.please_be_patient), true);
ringProgressDialog.setCancelable(true);
new Thread(new Runnable() {
@Override
public void run() {
try {
HelpUtils.doApplicationUpdatedWork(getApplicationContext());
} catch (Exception e) {
}
ringProgressDialog.dismiss();
}
}).start();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void setTitle(CharSequence title)
{
/*
if(title != mDrawerTitle)
mTitle = title;
*/
getSupportActionBar().setTitle(title);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
setupNavDrawer();
onNavDrawerItemClicked(getDefaultNavDrawerItem());
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
View mainContent = findViewById(R.id.primary_fragment_container);
if (mainContent != null) {
mainContent.setAlpha(0);
mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADEIN_DURATION);
} else {
LOGE(TAG, "No view with ID primary_fragment_container to fade in.");
}
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(mDrawerToggle != null)
mDrawerToggle.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggles
}
public boolean goToNavDrawerItem(int itemId) {
execute_tab = false;
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment frag = fm.findFragmentById(R.id.primary_fragment_container);
boolean is_dual_pane = findViewById(R.id.secondary_fragment_container) != null;
switch (itemId) {
case NAVDRAWER_ITEM_SUMMARY:
getSupportActionBar().setTitle(R.string.navdrawer_item_summary);
Calendar date = Calendar.getInstance(Locale.getDefault());
if(!(frag instanceof SummaryFragment)) {
if(firstLoad)
PrefUtils.setSummaryMonthAndYear(this, date);
new SummaryFragment();
SummaryFragment f = SummaryFragment.newInstance(PrefUtils.getPublisherId(this));
// test
ft.replace(R.id.primary_fragment_container, f);
if(!firstLoad)
ft.addToBackStack(null);
ft.commit();
}
else {
date.set(Calendar.MONTH, PrefUtils.getSummaryMonth(this, date));
date.set(Calendar.YEAR, PrefUtils.getSummaryYear(this, date));
SummaryFragment f = (SummaryFragment) fm.findFragmentById(R.id.primary_fragment_container);
f.setPublisherId(PrefUtils.getPublisherId(this));
f.setDate(date);
f.calculateSummaryValues();
f.refresh(SummaryFragment.DIRECTION_NO_CHANGE);
}
firstLoad = false;
return true;
case NAVDRAWER_ITEM_PUBLICATIONS:
//getSupportActionBar().removeAllTabs();
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_publications).setTabListener(this));
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_publication_types).setTabListener(this));
if(!(frag instanceof PublicationFragment)) {
PublicationFragment f = new PublicationFragment().newInstance();
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
ft.addToBackStack(null);
ft.commit();
}
return true;
case NAVDRAWER_ITEM_HOUSEHOLDERS:
//getSupportActionBar().removeAllTabs();
if(!is_dual_pane) {
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_householders).setTabListener(this));
}
if(!(frag instanceof HouseholdersFragment)) {
HouseholdersFragment f = new HouseholdersFragment().newInstance();
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
ft.addToBackStack(null);
ft.commit();
}
return true;
case NAVDRAWER_ITEM_PUBLISHERS:
//getSupportActionBar().removeAllTabs();
if(!is_dual_pane) {
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_publishers).setTabListener(this));
}
if(!(frag instanceof PublishersFragment)) {
PublishersFragment f = new PublishersFragment().newInstance();
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
ft.addToBackStack(null);
ft.commit();
}
return true;
case NAVDRAWER_ITEM_ENTRY_TYPES:
//getSupportActionBar().removeAllTabs();
if(!is_dual_pane) {
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_entry_types).setTabListener(this));
}
if(!(frag instanceof EntryTypeManagerFrag)) {
EntryTypeManagerFrag f = new EntryTypeManagerFrag().newInstance();
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
ft.addToBackStack(null);
ft.commit();
}
return true;
case NAVDRAWER_ITEM_BACKUPS:
//getSupportActionBar().removeAllTabs();
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_backups).setTabListener(this));
//getSupportActionBar().addTab(getSupportActionBar().newTab().setText(R.string.tab_item_schedule_backups).setTabListener(this));
if(!(frag instanceof DBBackupsFragment)) {
if(is_dual_pane) {
DBBackupsFragment f = new DBBackupsFragment().newInstance();
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
ft.addToBackStack(null);
ft.commit();
}
else {
DBBackupsListFragment f = new DBBackupsListFragment().newInstance();
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
ft.addToBackStack(null);
ft.commit();
}
}
return true;
case NAVDRAWER_ITEM_SETTINGS:
startActivity(new Intent(getApplicationContext(), SettingsActivity.class));
return true;
case NAVDRAWER_ITEM_HELP:
String url = getApplicationContext().getString(R.string.link_faqs);
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
return true;
case NAVDRAWER_ITEM_TIME_ENTRY:
int LAYOUT_ID = (is_dual_pane) ? R.id.secondary_fragment_container : R.id.primary_fragment_container;
frag = fm.findFragmentById(LAYOUT_ID);
TimeEditorFragment f = new TimeEditorFragment().newInstanceForPublisher(PrefUtils.getPublisherId(this));
ft.replace(LAYOUT_ID, f);
ft.commit();
return true;
}
return false;
}
public void setPublisherId(int _ID,String _name) {
onNavDrawerItemClicked(getDefaultNavDrawerItem());
}
@Override
public boolean isDrawerOpen() {
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(GravityCompat.START);
}
// Sets up the navigation drawer as appropriate.
private void setupNavDrawer() {
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
if (mDrawerLayout == null) {
return;
}
mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,R.drawable.ic_navigation_drawer,R.string.drawer_open,R.string.drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
//setTitle(mTitle);
supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
//setTitle(mDrawerTitle);
supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
@Override
public void onDrawerStateChanged(int newState) {
supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle(R.string.navdrawer_item_summary);
// populate the navdrawer with the correct items
populateNavDrawer();
mDrawerToggle.syncState();
// When the user runs the app for the first time, we want to land them with the
// navigation drawer open. But just the first time.
if (!PrefUtils.hasOpenedBefore(this)) {
// first run of the app starts with the navdrawer open
PrefUtils.markOpenedBefore(this);
mDrawerLayout.openDrawer(GravityCompat.START);
}
}
/** Populates the navigation drawer with the appropriate items. */
private void populateNavDrawer() {
mNavDrawerItems.clear();
mNavDrawerItems.add(NAVDRAWER_ITEM_SUMMARY);
mNavDrawerItems.add(NAVDRAWER_ITEM_PUBLICATIONS);
mNavDrawerItems.add(NAVDRAWER_ITEM_HOUSEHOLDERS);
mNavDrawerItems.add(NAVDRAWER_ITEM_PUBLISHERS);
mNavDrawerItems.add(NAVDRAWER_ITEM_ENTRY_TYPES);
mNavDrawerItems.add(NAVDRAWER_ITEM_BACKUPS);
mNavDrawerItems.add(NAVDRAWER_ITEM_SEPARATOR);
mNavDrawerItems.add(NAVDRAWER_ITEM_SETTINGS);
mNavDrawerItems.add(NAVDRAWER_ITEM_HELP);
createNavDrawerItems();
}
private void createNavDrawerItems() {
mDrawerItemsListContainer = (ViewGroup) findViewById(R.id.navdrawer_items_list);
if (mDrawerItemsListContainer == null) {
return;
}
mNavDrawerItemViews = new View[mNavDrawerItems.size()];
mDrawerItemsListContainer.removeAllViews();
int i = 0;
for (int itemId : mNavDrawerItems) {
mNavDrawerItemViews[i] = makeNavDrawerItem(itemId, mDrawerItemsListContainer);
mDrawerItemsListContainer.addView(mNavDrawerItemViews[i]);
++i;
}
}
private View makeNavDrawerItem(final int itemId, ViewGroup container) {
boolean selected = getDefaultNavDrawerItem() == itemId;
int layoutToInflate = 0;
if (itemId == NAVDRAWER_ITEM_SEPARATOR) {
layoutToInflate = R.layout.navdrawer_separator;
} else {
layoutToInflate = R.layout.navdrawer_item;
}
View view = getLayoutInflater().inflate(layoutToInflate, container, false);
if (isSeparator(itemId)) {
// we are done
UIUtils.setAccessibilityIgnore(view);
return view;
}
ImageView iconView = (ImageView) view.findViewById(R.id.icon);
TextView titleView = (TextView) view.findViewById(R.id.title);
int iconId = itemId >= 0 && itemId < NAVDRAWER_ICON_RES_ID.length ? NAVDRAWER_ICON_RES_ID[itemId] : 0;
int titleId = itemId >= 0 && itemId < NAVDRAWER_TITLE_RES_ID.length ? NAVDRAWER_TITLE_RES_ID[itemId] : 0;
// set icon and text
iconView.setVisibility(iconId > 0 ? View.VISIBLE : View.GONE);
if (iconId > 0) {
iconView.setImageResource(iconId);
}
titleView.setText(getString(titleId));
formatNavDrawerItem(view, itemId, selected);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onNavDrawerItemClicked(itemId);
}
});
return view;
}
private boolean isSeparator(int itemId) {
return itemId == NAVDRAWER_ITEM_SEPARATOR;
}
private int getDefaultNavDrawerItem() {
return NAVDRAWER_ITEM_DEFAULT;
}
private void formatNavDrawerItem(View view, int itemId, boolean selected) {
if (isSeparator(itemId)) {
// not applicable
return;
}
//ImageView iconView = (ImageView) view.findViewById(R.id.icon);
TextView titleView = (TextView) view.findViewById(R.id.title);
// configure its appearance according to whether or not it's selected
titleView.setTextColor(selected ?
getResources().getColor(R.color.navdrawer_text_color_selected) :
getResources().getColor(R.color.navdrawer_text_color));
/*
iconView.setColorFilter(selected ?
getResources().getColor(R.color.navdrawer_icon_tint_selected) :
getResources().getColor(R.color.navdrawer_icon_tint));
*/
if(selected)
setTitle(titleView.getText());
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
private void onNavDrawerItemClicked(final int itemId) {
// launch the target Activity after a short delay, to allow the close animation to play
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
goToNavDrawerItem(itemId);
}
}, NAVDRAWER_LAUNCH_DELAY);
// change the active item on the list so the user can see the item changed
setSelectedNavDrawerItem(itemId);
// fade out the main content
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
View mainContent = findViewById(R.id.primary_fragment_container);
if (mainContent != null) {
mainContent.animate().alpha(0).setDuration(MAIN_CONTENT_FADEOUT_DURATION);
mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADEIN_DURATION);
}
}
if(isDrawerOpen())
mDrawerLayout.closeDrawer(GravityCompat.START);
}
/**
* Sets up the given navdrawer item's appearance to the selected state. Note: this could
* also be accomplished (perhaps more cleanly) with state-based layouts.
*/
private void setSelectedNavDrawerItem(int itemId) {
if (mNavDrawerItemViews != null) {
for (int i = 0; i < mNavDrawerItemViews.length; i++) {
if (i < mNavDrawerItems.size()) {
int thisItemId = mNavDrawerItems.get(i);
formatNavDrawerItem(mNavDrawerItemViews[i], thisItemId, itemId == thisItemId);
}
}
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) { }
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) { }
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if(execute_tab) {
if(fm.findFragmentById(R.id.primary_fragment_container) != null) {
if(tab.getText().equals(getApplicationContext().getResources().getString(R.string.tab_item_publications))) {
Fragment frag = fm.findFragmentById(R.id.primary_fragment_container);
PublicationFragment f = new PublicationFragment().newInstance();;
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
} else if(tab.getText().equals(getApplicationContext().getResources().getString(R.string.tab_item_publication_types))) {
Fragment frag = fm.findFragmentById(R.id.primary_fragment_container);
PublicationManagerFrag f = new PublicationManagerFrag().newInstance();;
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if(frag != null)
ft.remove(frag);
ft.add(R.id.primary_fragment_container, f);
} else if(tab.getText().equals(getApplicationContext().getResources().getString(R.string.tab_item_backups))) {
int LAYOUT_ID = (is_dual_pane) ? R.id.secondary_fragment_container : R.id.primary_fragment_container;
Fragment frag = fm.findFragmentById(LAYOUT_ID);
DBBackupsListFragment f = new DBBackupsListFragment().newInstance();;
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if(frag != null)
ft.remove(frag);
ft.add(LAYOUT_ID, f);
} else if(tab.getText().equals(getApplicationContext().getResources().getString(R.string.tab_item_schedule_backups))) {
int LAYOUT_ID = (is_dual_pane) ? R.id.secondary_fragment_container : R.id.primary_fragment_container;
Fragment frag = fm.findFragmentById(LAYOUT_ID);
DBScheduleFragment f = new DBScheduleFragment().newInstance();;
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if(frag != null)
ft.remove(frag);
ft.add(LAYOUT_ID, f);
}
}
}
execute_tab = true;
}
public void changeLang(String lang) {
if (lang.equalsIgnoreCase(""))
return;
Locale myLocale = new Locale(lang);
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
config.locale = myLocale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
}