/*
* Copyright (c) 2015 Ngewi Fet <ngewif@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gnucash.android.ui.common;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import org.gnucash.android.R;
import org.gnucash.android.app.GnuCashApplication;
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.BooksDbAdapter;
import org.gnucash.android.ui.account.AccountFormFragment;
import org.gnucash.android.ui.budget.BudgetAmountEditorFragment;
import org.gnucash.android.ui.budget.BudgetFormFragment;
import org.gnucash.android.ui.export.ExportFormFragment;
import org.gnucash.android.ui.passcode.PasscodeLockActivity;
import org.gnucash.android.ui.transaction.SplitEditorFragment;
import org.gnucash.android.ui.transaction.TransactionFormFragment;
import org.gnucash.android.ui.util.widget.CalculatorKeyboard;
import org.gnucash.android.util.BookUtils;
/**
* Activity for displaying forms in the application.
* The activity provides the standard close button, but it is up to the form fragments to display
* menu options (e.g. for saving etc)
* @author Ngewi Fet <ngewif@gmail.com>
*/
public class FormActivity extends PasscodeLockActivity {
private String mAccountUID;
private CalculatorKeyboard mOnBackListener;
public enum FormType {ACCOUNT, TRANSACTION, EXPORT, SPLIT_EDITOR, BUDGET, BUDGET_AMOUNT_EDITOR}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_form);
//if a parameter was passed to open an account within a specific book, then switch
String bookUID = getIntent().getStringExtra(UxArgument.BOOK_UID);
if (bookUID != null && !bookUID.equals(BooksDbAdapter.getInstance().getActiveBookUID())){
BookUtils.activateBook(bookUID);
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
assert(actionBar != null);
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
final Intent intent = getIntent();
String formtypeString = intent.getStringExtra(UxArgument.FORM_TYPE);
FormType formType = FormType.valueOf(formtypeString);
mAccountUID = intent.getStringExtra(UxArgument.SELECTED_ACCOUNT_UID);
if (mAccountUID == null){
mAccountUID = intent.getStringExtra(UxArgument.PARENT_ACCOUNT_UID);
}
if (mAccountUID != null) {
int colorCode = AccountsDbAdapter.getActiveAccountColorResource(mAccountUID);
actionBar.setBackgroundDrawable(new ColorDrawable(colorCode));
if (Build.VERSION.SDK_INT > 20)
getWindow().setStatusBarColor(GnuCashApplication.darken(colorCode));
}
switch (formType){
case ACCOUNT:
showAccountFormFragment(intent.getExtras());
break;
case TRANSACTION:
showTransactionFormFragment(intent.getExtras());
break;
case EXPORT:
showExportFormFragment(null);
break;
case SPLIT_EDITOR:
showSplitEditorFragment(intent.getExtras());
break;
case BUDGET:
showBudgetFormFragment(intent.getExtras());
break;
case BUDGET_AMOUNT_EDITOR:
showBudgetAmountEditorFragment(intent.getExtras());
break;
default:
throw new IllegalArgumentException("No form display type specified");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
setResult(RESULT_CANCELED);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Return the GUID of the account for which the form is displayed.
* If the form is a transaction form, the transaction is created within that account. If it is
* an account form, then the GUID is the parent account
* @return GUID of account
*/
public String getCurrentAccountUID() {
return mAccountUID;
}
/**
* Shows the form for creating/editing accounts
* @param args Arguments to use for initializing the form.
* This could be an account to edit or a preset for the parent account
*/
private void showAccountFormFragment(Bundle args){
AccountFormFragment accountFormFragment = AccountFormFragment.newInstance();
accountFormFragment.setArguments(args);
showFormFragment(accountFormFragment);
}
/**
* Loads the transaction insert/edit fragment and passes the arguments
* @param args Bundle arguments to be passed to the fragment
*/
private void showTransactionFormFragment(Bundle args){
TransactionFormFragment transactionFormFragment = new TransactionFormFragment();
transactionFormFragment.setArguments(args);
showFormFragment(transactionFormFragment);
}
/**
* Loads the export form fragment and passes the arguments
* @param args Bundle arguments
*/
private void showExportFormFragment(Bundle args){
ExportFormFragment exportFragment = new ExportFormFragment();
exportFragment.setArguments(args);
showFormFragment(exportFragment);
}
/**
* Load the split editor fragment
* @param args View arguments
*/
private void showSplitEditorFragment(Bundle args){
SplitEditorFragment splitEditor = SplitEditorFragment.newInstance(args);
showFormFragment(splitEditor);
}
/**
* Load the budget form
* @param args View arguments
*/
private void showBudgetFormFragment(Bundle args){
BudgetFormFragment budgetFormFragment = new BudgetFormFragment();
budgetFormFragment.setArguments(args);
showFormFragment(budgetFormFragment);
}
/**
* Load the budget amount editor fragment
* @param args Arguments
*/
private void showBudgetAmountEditorFragment(Bundle args){
BudgetAmountEditorFragment fragment = BudgetAmountEditorFragment.newInstance(args);
showFormFragment(fragment);
}
/**
* Loads the fragment into the fragment container, replacing whatever was there before
* @param fragment Fragment to be displayed
*/
private void showFormFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
public void setOnBackListener(CalculatorKeyboard keyboard) {
mOnBackListener = keyboard;
}
@Override
public void onBackPressed() {
boolean eventProcessed = false;
if (mOnBackListener != null)
eventProcessed = mOnBackListener.onBackPressed();
if (!eventProcessed)
super.onBackPressed();
}
}