package pt.rupeal.invoicexpress;
import java.util.List;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.MenuItem;
import pt.rupeal.invoicexpress.activities.AuthenticationActivity;
import pt.rupeal.invoicexpress.enums.FragmentTagsEnum;
import pt.rupeal.invoicexpress.fragments.ContactsFragment;
import pt.rupeal.invoicexpress.fragments.DashBoardFragment;
import pt.rupeal.invoicexpress.fragments.DocumentsFragment;
import pt.rupeal.invoicexpress.fragments.MoreFragment;
import pt.rupeal.invoicexpress.model.FragmentNavigationModel;
import pt.rupeal.invoicexpress.server.InvoiceXpress;
import pt.rupeal.invoicexpress.server.AuthenticationRestHandler;
import pt.rupeal.invoicexpress.widgets.TabListener;
public class MainActivity extends Activity {
private ActionBar actionBar;
private Tab dashBoardTab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// set account manager
InvoiceXpress.getInstance().setAccountManager(AccountManager.get(this));
// get android invoiceXpress saved accounts
Account[] invoiceXpressAccounts = InvoiceXpress.getInstance().getInvoiceXpressAccount();
// if there is no account then start authentication activity
if(invoiceXpressAccounts == null || invoiceXpressAccounts.length == 0) {
// get login activity
Intent intent = new Intent(this, AuthenticationActivity.class);
startActivityForResult(intent, 1);
} else {
// login & start application
login(invoiceXpressAccounts);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if(resultCode == RESULT_OK){
initActionBar();
} else if (resultCode == RESULT_CANCELED) {
finish();
}
} else if(requestCode == 2) {
if(resultCode == RESULT_OK){
actionBar.selectTab(dashBoardTab);
} else if (resultCode == RESULT_CANCELED) {
finish();
}
}
}
public void initActionBar() {
// debug
if(InvoiceXpress.DEBUG) {
Log.d(this.getClass().getCanonicalName(), "Init Action Bar");
}
// setup action bar for tabs
actionBar = super.getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setLogo(R.drawable.icon_logo);
dashBoardTab = actionBar.newTab()
.setIcon(pt.rupeal.invoicexpress.R.drawable.icon_1)
.setTabListener(new TabListener<DashBoardFragment>(
this, FragmentTagsEnum.DASHBOARD.getValue(), DashBoardFragment.class));
actionBar.addTab(dashBoardTab, true);
Tab tab = actionBar.newTab()
.setIcon(pt.rupeal.invoicexpress.R.drawable.icon_2)
.setTabListener(new TabListener<DocumentsFragment>(
this, FragmentTagsEnum.DOCUMENTS.getValue(), DocumentsFragment.class));
actionBar.addTab(tab, false);
tab = actionBar.newTab()
.setIcon(pt.rupeal.invoicexpress.R.drawable.icon_3)
.setTabListener(new TabListener<ContactsFragment>(
this, FragmentTagsEnum.CONTACTS.getValue(), ContactsFragment.class));
actionBar.addTab(tab, false);
tab = actionBar.newTab()
.setIcon(pt.rupeal.invoicexpress.R.drawable.icon_4)
.setTabListener(new TabListener<MoreFragment>(
this, FragmentTagsEnum.MORE.getValue(), MoreFragment.class));
actionBar.addTab(tab, false);
}
public ActionBar getActionBar() {
return actionBar;
}
private void login(Account[] androidAccounts) {
String password = InvoiceXpress.getInstance().getAccountManager().getPassword(androidAccounts[0]);
String[] params = new String[] {androidAccounts[0].name, password};
new AuthenticationRestHandler(this).execute(params);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
actionBar.selectTab(actionBar.getSelectedTab());
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
// check if the progress bar is visible to disable clicks
if(!InvoiceXpress.isInvoiceXpressClickable(this)) {
return;
}
// vibrate - time in milliseconds
((Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(50);
// remove fragment
if(InvoiceXpress.getInstance().hasFragment()) {
// if there is just one fragment, show alert dialog
if(InvoiceXpress.getInstance().hasOneLastFragment()) {
showAlertDialog();
return;
}
// remove last fragment based on application fragments list cache
String lastFragmentTag = InvoiceXpress.getInstance().getLastFragment().getFragmentTag();
removeFragment(lastFragmentTag);
}
}
/**
* Set, add and show new fragment
* @param mClass, Fragment class
* @param fragmentTag, Fragment tag (FragmentTagsEnum) to show
*/
public void addFragment(Class<? extends Fragment> mClass, FragmentTagsEnum fragmentTag) {
addFragment(mClass, fragmentTag, null);
}
public void addFragment(Class<? extends Fragment> mClass, FragmentTagsEnum fragmentTag, Bundle args) {
// get FragmentManager and FragmentTransaction
final FragmentManager fm = getFragmentManager();
// begin transaction
FragmentTransaction ft = fm.beginTransaction();
// detach the previous fragment
String lastFragmentTag = "";
if(InvoiceXpress.getInstance().hasFragment()) {
// get fragments
FragmentNavigationModel fragmentNavigationModel = InvoiceXpress.getInstance().getLastFragment();
// remove fragment children (for dash board or documents list fragments)
if(fragmentNavigationModel.hasChildren()) {
List<String> fragmentsTagsChildreen = fragmentNavigationModel.getFragmentsTagChildren();
for (String child : fragmentsTagsChildreen) {
Fragment fragmentToRemove = fm.findFragmentByTag(child);
ft.remove(fragmentToRemove);
}
}
// detach last attach fragment
lastFragmentTag = fragmentNavigationModel.getFragmentTag();
Fragment fragment = fm.findFragmentByTag(lastFragmentTag);
if(fragment != null) {
ft.detach(fragment);
}
}
// the indexAux is used to create an unique id for new fragment
int indexAux = InvoiceXpress.getInstance().getFragmentsSize();
// generate fragment tag string
String newfragmentTag = fragmentTag.getValue() + indexAux;
Fragment fragment = fm.findFragmentByTag(newfragmentTag);
// Do we already have this fragment? Never..
if(fragment != null) {
Log.e(this.getClass().getCanonicalName(), "addFragment - the fragment was found in fragment manager");
return;
} else {
// instantiate new fragment
fragment = Fragment.instantiate(this, mClass.getName());
// set arguments
fragment.setArguments(args);
// add fragment to fragment manager
ft.add(android.R.id.content, fragment, newfragmentTag);
// add to application cache fragments
FragmentNavigationModel fragmentNavModel = new FragmentNavigationModel(newfragmentTag);
InvoiceXpress.getInstance().getFragments().add(fragmentNavModel);
}
if(InvoiceXpress.DEBUG) {
Log.d(this.getClass().getCanonicalName(), "to: " + newfragmentTag
+ " from: " + lastFragmentTag);
}
ft.commit();
}
public void refreshFragment(int filterCode) {
refreshFragment(null, filterCode);
}
public void refreshFragment() {
refreshFragment(null, -1);
}
public void refreshFragment(Bundle args) {
refreshFragment(args, -1);
}
private void refreshFragment(Bundle args, int filterCode) {
// the refresh is about active fragment
// get last fragment
String fragmentTag = "";
FragmentNavigationModel fragmentNavModel = InvoiceXpress.getInstance().getLastFragment();
if(fragmentNavModel.hasChildren() && filterCode != -1) {
fragmentTag = InvoiceXpress.getInstance().getLastFragment().getFragmentsTagChildren().get(filterCode);
} else {
fragmentTag = InvoiceXpress.getInstance().getLastFragment().getFragmentTag();
}
if(InvoiceXpress.DEBUG) {
Log.d(this.getClass().getCanonicalName(), "Refreshing fragment " + fragmentTag);
}
final FragmentManager fm = getFragmentManager();
Fragment fragment = fm.findFragmentByTag(fragmentTag);
// this is impossible to happen
if(fragment == null) {
Log.e(this.getClass().getCanonicalName(), "Fragment to refresh dosen't exists.");
return;
}
// begin transaction
FragmentTransaction ft = fm.beginTransaction();
// detach active fragment
ft.detach(fragment);
if(args != null) {
fragment.getArguments().clear();
fragment.getArguments().putAll(args);
}
// attach active fragment for refreshing
ft.attach(fragment);
ft.commit();
}
/**
* Remove fragments, used onBackPressed
* @param fragmentTag, Fragment to hide
*/
// public void removeFragment(FragmentTagsEnum fragmentTag) {
// removeFragment(fragmentTag.getValue());
// }
public void removeFragment(String fragmentTag) {
// get fragment manager and begin a transaction
FragmentManager fm = getFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
// get fragment to remove
FragmentNavigationModel fragmentNavigationModel = InvoiceXpress.getInstance().getFragmentNavModelByFragmentTag(fragmentTag);
// remove all fragment children
if(fragmentNavigationModel.hasChildren()) {
List<String> fragmentsTagsChildren = fragmentNavigationModel.getFragmentsTagChildren();
for (String child : fragmentsTagsChildren) {
Fragment fragmentToRemove = fm.findFragmentByTag(child);
ft.remove(fragmentToRemove);
}
}
// remove fragment
Fragment fragmentToRemove = fm.findFragmentByTag(fragmentTag);
if(fragmentToRemove != null) {
ft.remove(fragmentToRemove);
}
// remove from invoice express fragment management structure
InvoiceXpress.getInstance().getFragments().remove(
InvoiceXpress.getInstance().getFragments().size() - 1);
// restore fragment if there is one
if(InvoiceXpress.getInstance().hasFragment()) {
String fragmentTagToAttach = InvoiceXpress.getInstance().getLastFragment().getFragmentTag();
Fragment fragmentToAttach = fm.findFragmentByTag(fragmentTagToAttach);
ft.attach(fragmentToAttach);
}
ft.commit();
}
private void showAlertDialog() {
// show a dialog box to confirm the exit
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
// set title
alertDialogBuilder.setTitle(R.string.app_name);
// set dialog message
alertDialogBuilder
.setMessage(R.string.dialog_exit_title)
.setCancelable(false)
.setPositiveButton(R.string.dialog_exit_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// if this button is clicked, close
// remove last fragment based on application fragments list cache
String lastFragmentTag = InvoiceXpress.getInstance().getLastFragment().getFragmentTag();
removeFragment(lastFragmentTag);
// current activity
MainActivity.this.finish();
}
})
.setNegativeButton(R.string.dialog_exit_no,new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// if this button is clicked, just close
// the dialog box and do nothing
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
}