package pt.rupeal.invoicexpress.server; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import org.apache.http.HttpHost; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.Fragment; import android.content.Context; import pt.rupeal.invoicexpress.enums.DocumentStatusEnum; import pt.rupeal.invoicexpress.enums.DocumentTypeEnum; import pt.rupeal.invoicexpress.enums.FragmentTagsEnum; import pt.rupeal.invoicexpress.fragments.DashBoardFragment.DashBoardFilterFragment; import pt.rupeal.invoicexpress.model.AccountModel; import pt.rupeal.invoicexpress.model.AccountDetailsModel; import pt.rupeal.invoicexpress.model.AccountsModel; import pt.rupeal.invoicexpress.model.ChartModel; import pt.rupeal.invoicexpress.model.ContactModel; import pt.rupeal.invoicexpress.model.DocumentsFilterModel; import pt.rupeal.invoicexpress.model.FragmentNavigationModel; import pt.rupeal.invoicexpress.utils.ContactsComparable; import pt.rupeal.invoicexpress.utils.StatusGraphs; import pt.rupeal.invoicexpress.utils.StringUtil; public class InvoiceXpress { public static final boolean DEBUG = false; public static final String INVOICE_EXPRESS_URL = "https://www.invoicexpress.net"; public static final String LOGIN_URL = INVOICE_EXPRESS_URL + "/login.xml"; public static final String EMAIL_INVOICEXPRESS_SUPPORT = "support@invoicexpress.com"; public static final String ACCOUNT_ANDROID_INVOICEXPRESS_TYPE = "pt.rupeal.invoicexpress"; private static final boolean USE_PROXY = false; private static final int TIMEOUT_CONNECTION = 5000; private static final int TIMEOUT_SOCKET = 5000; private static InvoiceXpress instance; // screen width and height private int width = -1; private int height = -1; private AccountManager accountManager; /** * accounts management */ private AccountsModel accounts; /** * for back button */ private List<FragmentNavigationModel> fragmentsTags; private ChartModel charts; private boolean isChartsRequested; private Map<String, DocumentsFilterModel> documents; private Map<String, ContactModel> contacts; private boolean isContactsRequested; private StatusGraphs statusGraphs; private AsyncTask<?, ?, ?> asyncTaskActive; private InvoiceXpress() { // fragments for back fragmentsTags = new ArrayList<FragmentNavigationModel>(); // dash board charts = new ChartModel(); // account accounts = new AccountsModel(); // documents initDocuments(); // contacts contacts = new HashMap<String, ContactModel>(); } public static InvoiceXpress getInstance() { if(instance == null){ instance = new InvoiceXpress(); } return instance; } public void clear() { // dash board charts = new ChartModel(); isChartsRequested = false; // documents initDocuments(); // contacts contacts = new HashMap<String, ContactModel>(); isContactsRequested = false; } public List<FragmentNavigationModel> getFragments() { return fragmentsTags; } public FragmentNavigationModel getLastFragment() { if(!fragmentsTags.isEmpty()) { return fragmentsTags.get(fragmentsTags.size() - 1); } else { return null; } } public boolean hasFragment() { return !fragmentsTags.isEmpty(); } public boolean hasOneLastFragment() { return fragmentsTags.size() == 1; } /** * Get fragments size is used to get a valid number and help me to create a mechanism of fragments management. * With this method i can assure that it is generated an unique fragment name for each fragment, even the new fragment is already in used. * @return */ public int getFragmentsSize() { return fragmentsTags.size(); } public FragmentNavigationModel getFragmentNavModelByFragmentTag(String fragmentTag) { for (FragmentNavigationModel fragmentNavModel : fragmentsTags) { if(fragmentNavModel.getFragmentTag().equals(fragmentTag)) { return fragmentNavModel; } } return null; } public final int getScreenWidth(Activity activity) { if(width == -1) { width = activity.getWindowManager().getDefaultDisplay().getWidth(); } return width; } public final int getScreenHeight(Activity activity) { if(height == -1) { height = activity.getWindowManager().getDefaultDisplay().getHeight(); } return height; } public static HttpParams getHttpParameters() { HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. // The default value is zero, that means the timeout is not used. HttpConnectionParams.setConnectionTimeout(httpParameters, InvoiceXpress.TIMEOUT_CONNECTION); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. HttpConnectionParams.setSoTimeout(httpParameters, InvoiceXpress.TIMEOUT_SOCKET); if(USE_PROXY) { HttpHost proxy = new HttpHost("10.159.32.155", 8080); httpParameters.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); } return httpParameters; } public void setAccountManager(AccountManager accountmanager) { this.accountManager = accountmanager; } public AccountManager getAccountManager() { return accountManager; } public Account[] getInvoiceXpressAccount() { return accountManager.getAccountsByType(ACCOUNT_ANDROID_INVOICEXPRESS_TYPE); } public AccountsModel getAccount() { return accounts; } public void setAccounts(AccountsModel accounts) { this.accounts = accounts; } public List<AccountModel> getAccounts() { return accounts.getAccounts(); } public void setAccounts(List<AccountModel> accounts) { this.accounts.getAccounts().addAll(accounts); } public AccountModel getActiveAccount() { return accounts.getAccountActive(); } public void setActiveAccount(AccountModel account) { accounts.setAccountActive(account); } public AccountDetailsModel getActiveAccountDetails() { return accounts.getAccountDetailsActive(); } public void setActiveAccountDetails(AccountDetailsModel activeAccountDetails) { accounts.setAccountDetailsActive(activeAccountDetails); } private void initDocuments() { documents = new HashMap<String, DocumentsFilterModel>(); documents.put(DocumentTypeEnum.ALL.getValue(), new DocumentsFilterModel()); documents.put(DocumentTypeEnum.INVOICE.getValue(), new DocumentsFilterModel()); documents.put(DocumentTypeEnum.SIMPLIFIEDINVOICE.getValue(), new DocumentsFilterModel()); documents.put(DocumentTypeEnum.CASHINVOICE.getValue(), new DocumentsFilterModel()); documents.put(DocumentTypeEnum.CREDITNOTE.getValue(), new DocumentsFilterModel()); documents.put(DocumentTypeEnum.DEBITNOTE.getValue(), new DocumentsFilterModel()); documents.put(DocumentTypeEnum.RECEIPT.getValue(), new DocumentsFilterModel());} public DocumentsFilterModel getDocuments(String docType) { return documents.get(docType); } public void setDocuments(String docType, DocumentsFilterModel documents) { this.documents.put(docType, documents); } public boolean existsDocumentsTemp(String docType) { return documents.get(docType) != null && documents.get(docType).getDocuments() != null && !documents.get(docType).getDocuments().isEmpty(); } public Map<DocumentStatusEnum, List<DocumentStatusEnum>> getStatusGraphs(String documentType) { if(statusGraphs == null) { statusGraphs = new StatusGraphs(); } if(DocumentTypeEnum.CASHINVOICE.getValue().equals(documentType)) { return statusGraphs.getCashInvoiceGraph(); } else if(DocumentTypeEnum.RECEIPT.getValue().equals(documentType)) { return statusGraphs.getReceiptGraph(); } else if(DocumentTypeEnum.CREDITNOTE.getValue().equals(documentType)) { return statusGraphs.getCreditNoteGraph(); } else if(DocumentTypeEnum.DEBITNOTE.getValue().equals(documentType)) { return statusGraphs.getDebitNoteGraph(); } else if(DocumentTypeEnum.INVOICE.getValue().equals(documentType)) { return statusGraphs.getInvoiceGraph(); } else if(DocumentTypeEnum.SIMPLIFIEDINVOICE.getValue().equals(documentType)) { return statusGraphs.getSimplifiedInvoiceGraph(); } return null; } public ChartModel getCharts() { return charts; } public void setCharts(ChartModel charts) { this.charts = charts; } public void setCharts(ChartModel charts, int filterCode) { switch (filterCode) { case DashBoardFilterFragment.FILTER_CODE_INVOICING: this.charts.setInvoicingChartData(charts.getInvoicingChartData()); break; case DashBoardFilterFragment.FILTER_CODE_TREASURY: this.charts.setTreasuryChartData(charts.getTreasuryChartData()); break; case DashBoardFilterFragment.FILTER_CODE_QUARTERLY: this.charts.setQuartersChartData(charts.getQuartersChartData()); break; case DashBoardFilterFragment.FILTER_CODE_TOPDEBTORS: this.charts.setDebtorsChartData(charts.getDebtorsChartData()); break; default: break; } } public boolean isChartsRequested() { return isChartsRequested; } public void setChartsRequested(boolean isChartsRequested) { this.isChartsRequested = isChartsRequested; } public Map<String, ContactModel> getContacts() { return contacts; } public void setContacts(Map<String, ContactModel> contacts) { this.contacts = contacts; } public List<ContactModel> getContactsSorted() { List<ContactModel> contactsList = new ArrayList<ContactModel>(contacts.values()); Collections.sort(contactsList, new ContactsComparable()); return sortContactsSetFirstAttribute(contactsList); } private List<ContactModel> sortContactsSetFirstAttribute(List<ContactModel> contacts){ if(contacts.isEmpty()) { return contacts; } contacts.get(0).setFirst(true); for(int i=1; i < contacts.size(); i++) { if(StringUtil.getFirstCharInLowerCase(contacts.get(i).getName()) != StringUtil.getFirstCharInLowerCase(contacts.get(i-1).getName())) { contacts.get(i).setFirst(true); } else { continue; } } return contacts; } public boolean isContactsRequested() { return isContactsRequested; } public void setContactsRequested(boolean isContactsRequested) { this.isContactsRequested = isContactsRequested; } public static boolean isInvoiceXpressClickable(Context context) { Fragment progressbarFragment = ((Activity) context).getFragmentManager().findFragmentByTag(FragmentTagsEnum.DIALOG_PROGRESS.getValue()); if(progressbarFragment != null) { return !progressbarFragment.isVisible(); } return true; } public static boolean isPortugueseLocale() { return Locale.getDefault().getDisplayLanguage().equals("português"); } public AsyncTask<?, ?, ?> getAsyncTaskActive() { return asyncTaskActive; } public void setAsyncTaskActive(AsyncTask<?, ?, ?> asyncTaskActive) { this.asyncTaskActive = asyncTaskActive; } }