package pt.rupeal.invoicexpress.widgets;
import java.util.List;
import pt.rupeal.invoicexpress.MainActivity;
import pt.rupeal.invoicexpress.R;
import pt.rupeal.invoicexpress.enums.FragmentTagsEnum;
import pt.rupeal.invoicexpress.fragments.AboutFragment;
import pt.rupeal.invoicexpress.fragments.AccountDetailsFragment;
import pt.rupeal.invoicexpress.fragments.AccountsFragment;
import pt.rupeal.invoicexpress.fragments.ContactDetailsFragment;
import pt.rupeal.invoicexpress.fragments.ContactsFragment;
import pt.rupeal.invoicexpress.fragments.DashBoardFragment;
import pt.rupeal.invoicexpress.fragments.DocumentDetailsFragment;
import pt.rupeal.invoicexpress.fragments.DocumentsFragment;
import pt.rupeal.invoicexpress.fragments.DocumentsListFragment;
import pt.rupeal.invoicexpress.fragments.DocumentsListFragment.DocumentFilterFragment;
import pt.rupeal.invoicexpress.fragments.EmailFragment;
import pt.rupeal.invoicexpress.fragments.ItemDetailsFragment;
import pt.rupeal.invoicexpress.fragments.MoreFragment;
import pt.rupeal.invoicexpress.model.FragmentNavigationModel;
import pt.rupeal.invoicexpress.server.AccountDetailsRestHandler;
import pt.rupeal.invoicexpress.server.AsyncTask;
import pt.rupeal.invoicexpress.server.ChartRestHandler;
import pt.rupeal.invoicexpress.server.ContactsRestHandler;
import pt.rupeal.invoicexpress.server.InvoiceXpress;
import android.app.ActionBar.Tab;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.widget.Toast;
public class TabListener<T extends Fragment> implements android.app.ActionBar.TabListener {
private final MainActivity mActivity;
private final String mTag;
private final Class<T> mClass;
/** Constructor used each time a new tab is created.
* @param activity The host Activity, used to instantiate the fragment
* @param tag The identifier tag for the fragment
* @param clz The fragment's Class, used to instantiate the fragment
*/
public TabListener(MainActivity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
/* The following are each of the ActionBar.TabListener callbacks */
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// get active async task
AsyncTask<?, ?, ?> asyncTaskActive = InvoiceXpress.getInstance().getAsyncTaskActive();
if(asyncTaskActive != null) {
// if the active async task is the account details task and it's running then the application will cancel it and show a warning message
if(asyncTaskActive instanceof AccountDetailsRestHandler && asyncTaskActive.cancel(true)) {
Toast.makeText(mActivity, R.string.error_actionbar_navigation, Toast.LENGTH_LONG).show();
return;
} else {
// cancel active async task
asyncTaskActive.cancel(true);
// dismiss progress bar
asyncTaskActive.dismissProgressBar();
}
}
// remove all fragments, to prevent breaking fragments
removeAllFragments(ft);
// the wanted fragment is dash board and there is no data chart
if(FragmentTagsEnum.DASHBOARD.getValue().equals(mTag)) {
if(!InvoiceXpress.getInstance().isChartsRequested()) {
String[] params = new String[] {String.valueOf(DocumentFilterFragment.NO_FILTER)};
ChartRestHandler restHandler = new ChartRestHandler(mActivity);
InvoiceXpress.getInstance().setAsyncTaskActive(restHandler);
restHandler.execute(params);
updateToSelectedTabIcon(tab);
return;
}
// the wanted fragment is contacts and there are no contacts
} else if(FragmentTagsEnum.CONTACTS.getValue().equals(mTag)) {
if(!InvoiceXpress.getInstance().isContactsRequested()) {
String[] params = new String[] {"false", ""};
ContactsRestHandler restHandler = new ContactsRestHandler(mActivity);
InvoiceXpress.getInstance().setAsyncTaskActive(restHandler);
restHandler.execute(params);
updateToSelectedTabIcon(tab);
return;
}
}
// the indexAux is used to create an unique id for new fragment
int indexAux = InvoiceXpress.getInstance().getFragmentsSize();
Fragment fragment = Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, fragment, mTag + indexAux);
FragmentNavigationModel fragmentNavModel = new FragmentNavigationModel(fragment.getTag());
InvoiceXpress.getInstance().getFragments().add(fragmentNavModel);
// update selected icon
updateToSelectedTabIcon(tab);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// update tab icon
updateToUnSelectedTabIcon(tab);
}
private void removeAllFragments(FragmentTransaction ft) {
List<FragmentNavigationModel> fragmentsNavModel = InvoiceXpress.getInstance().getFragments();
for (FragmentNavigationModel fragmentNavModel : fragmentsNavModel) {
if(fragmentNavModel.hasChildren()) {
List<String> fragmentsTagsChildren = fragmentNavModel.getFragmentsTagChildren();
for (String fragmentTagChild : fragmentsTagsChildren) {
Fragment fragment = mActivity.getFragmentManager().findFragmentByTag(fragmentTagChild);
if(fragment != null) {
ft.remove(fragment);
}
}
}
Fragment fragment = mActivity.getFragmentManager().findFragmentByTag(fragmentNavModel.getFragmentTag());
if(fragment != null) {
ft.remove(fragment);
}
}
// clear application cache fragments
InvoiceXpress.getInstance().getFragments().clear();
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
onTabUnselected(tab, ft);
onTabSelected(tab, ft);
}
public static final String TAB_POSITION = "tab_position";
private void updateToSelectedTabIcon(Tab tab) {
switch (tab.getPosition()) {
case 0:
tab.setIcon(R.drawable.icon_1_selected);
break;
case 1:
tab.setIcon(R.drawable.icon_2_selected);
break;
case 2:
tab.setIcon(R.drawable.icon_3_selected);
break;
case 3:
tab.setIcon(R.drawable.icon_4_selected);
break;
default:
break;
}
if(mClass.getName().equals(DashBoardFragment.class.getName())) {
mActivity.getActionBar().setTitle(mActivity.getResources().getString(R.string.dashBoard_actionBar_title));
} else if(mClass.getName().equals(DocumentsFragment.class.getName())) {
mActivity.getActionBar().setTitle(mActivity.getResources().getString(R.string.documents_actionBar_title));
} else if(mClass.getName().equals(DocumentsListFragment.class.getName())) {
} else if(mClass.getName().equals(DocumentDetailsFragment.class.getName())) {
} else if(mClass.getName().equals(ItemDetailsFragment.class.getName())) {
} else if(mClass.getName().equals(ContactsFragment.class.getName())) {
mActivity.getActionBar().setTitle(mActivity.getResources().getString(R.string.conctacs_actionBar_title));
} else if(mClass.getName().equals(ContactDetailsFragment.class.getName())) {
} else if(mClass.getName().equals(MoreFragment.class.getName())) {
mActivity.getActionBar().setTitle(mActivity.getResources().getString(R.string.more_actionBar_title));
} else if(mClass.getName().equals(AccountDetailsFragment.class.getName())) {
} else if(mClass.getName().equals(AccountsFragment.class.getName())) {
} else if(mClass.getName().equals(AboutFragment.class.getName())) {
} else if(mClass.getName().equals(EmailFragment.class.getName())) {
}
}
private void updateToUnSelectedTabIcon(Tab tab) {
switch (tab.getPosition()) {
case 0:
tab.setIcon(R.drawable.icon_1);
break;
case 1:
tab.setIcon(R.drawable.icon_2);
break;
case 2:
tab.setIcon(R.drawable.icon_3);
break;
case 3:
tab.setIcon(R.drawable.icon_4);
break;
default:
break;
}
}
}