package org.gnucash.android.ui.transaction; import android.app.Activity; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.TableLayout; import android.widget.TextView; import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; import org.gnucash.android.db.adapter.AccountsDbAdapter; import org.gnucash.android.db.adapter.ScheduledActionDbAdapter; import org.gnucash.android.db.adapter.TransactionsDbAdapter; import org.gnucash.android.model.Money; import org.gnucash.android.model.ScheduledAction; import org.gnucash.android.model.Split; import org.gnucash.android.model.Transaction; import org.gnucash.android.ui.common.FormActivity; import org.gnucash.android.ui.common.UxArgument; import org.gnucash.android.ui.passcode.PasscodeLockActivity; import java.text.DateFormat; import java.util.Date; import java.util.MissingFormatArgumentException; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * Activity for displaying transaction information * @author Ngewi Fet <ngewif@gmail.com> */ public class TransactionDetailActivity extends PasscodeLockActivity { @BindView(R.id.trn_description) TextView mTransactionDescription; @BindView(R.id.trn_time_and_date) TextView mTimeAndDate; @BindView(R.id.trn_recurrence) TextView mRecurrence; @BindView(R.id.trn_notes) TextView mNotes; @BindView(R.id.toolbar) Toolbar mToolBar; @BindView(R.id.transaction_account) TextView mTransactionAccount; @BindView(R.id.balance_debit) TextView mDebitBalance; @BindView(R.id.balance_credit) TextView mCreditBalance; @BindView(R.id.fragment_transaction_details) TableLayout mDetailTableLayout; private String mTransactionUID; private String mAccountUID; public static final int REQUEST_EDIT_TRANSACTION = 0x10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_transaction_detail); mTransactionUID = getIntent().getStringExtra(UxArgument.SELECTED_TRANSACTION_UID); mAccountUID = getIntent().getStringExtra(UxArgument.SELECTED_ACCOUNT_UID); if (mTransactionUID == null || mAccountUID == null){ throw new MissingFormatArgumentException("You must specify both the transaction and account GUID"); } ButterKnife.bind(this); setSupportActionBar(mToolBar); ActionBar actionBar = getSupportActionBar(); assert actionBar != null; actionBar.setElevation(0); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); actionBar.setDisplayShowTitleEnabled(false); bindViews(); int themeColor = AccountsDbAdapter.getActiveAccountColorResource(mAccountUID); actionBar.setBackgroundDrawable(new ColorDrawable(themeColor)); mToolBar.setBackgroundColor(themeColor); if (Build.VERSION.SDK_INT > 20) getWindow().setStatusBarColor(GnuCashApplication.darken(themeColor)); } class SplitAmountViewHolder { @BindView(R.id.split_account_name) TextView accountName; @BindView(R.id.split_debit) TextView splitDebit; @BindView(R.id.split_credit) TextView splitCredit; View itemView; public SplitAmountViewHolder(View view, Split split){ itemView = view; ButterKnife.bind(this, view); AccountsDbAdapter accountsDbAdapter = AccountsDbAdapter.getInstance(); accountName.setText(accountsDbAdapter.getAccountFullName(split.getAccountUID())); Money quantity = split.getFormattedQuantity(); TextView balanceView = quantity.isNegative() ? splitDebit : splitCredit; TransactionsActivity.displayBalance(balanceView, quantity); } } /** * Reads the transaction information from the database and binds it to the views */ private void bindViews(){ TransactionsDbAdapter transactionsDbAdapter = TransactionsDbAdapter.getInstance(); Transaction transaction = transactionsDbAdapter.getRecord(mTransactionUID); mTransactionDescription.setText(transaction.getDescription()); mTransactionAccount.setText(getString(R.string.label_inside_account_with_name, AccountsDbAdapter.getInstance().getAccountFullName(mAccountUID))); AccountsDbAdapter accountsDbAdapter = AccountsDbAdapter.getInstance(); Money accountBalance = accountsDbAdapter.getAccountBalance(mAccountUID, -1, transaction.getTimeMillis()); TextView balanceTextView = accountBalance.isNegative() ? mDebitBalance : mCreditBalance; TransactionsActivity.displayBalance(balanceTextView, accountBalance); boolean useDoubleEntry = GnuCashApplication.isDoubleEntryEnabled(); LayoutInflater inflater = LayoutInflater.from(this); int index = 0; for (Split split : transaction.getSplits()) { if (!useDoubleEntry && split.getAccountUID().equals( accountsDbAdapter.getImbalanceAccountUID(split.getValue().getCommodity()))) { //do now show imbalance accounts for single entry use case continue; } View view = inflater.inflate(R.layout.item_split_amount_info, mDetailTableLayout, false); SplitAmountViewHolder viewHolder = new SplitAmountViewHolder(view, split); mDetailTableLayout.addView(viewHolder.itemView, index++); } Date trnDate = new Date(transaction.getTimeMillis()); String timeAndDate = DateFormat.getDateInstance(DateFormat.FULL).format(trnDate); mTimeAndDate.setText(timeAndDate); if (transaction.getScheduledActionUID() != null){ ScheduledAction scheduledAction = ScheduledActionDbAdapter.getInstance().getRecord(transaction.getScheduledActionUID()); mRecurrence.setText(scheduledAction.getRepeatString()); findViewById(R.id.row_trn_recurrence).setVisibility(View.VISIBLE); } else { findViewById(R.id.row_trn_recurrence).setVisibility(View.GONE); } if (transaction.getNote() != null && !transaction.getNote().isEmpty()){ mNotes.setText(transaction.getNote()); findViewById(R.id.row_trn_notes).setVisibility(View.VISIBLE); } else { findViewById(R.id.row_trn_notes).setVisibility(View.GONE); } } /** * Refreshes the transaction information */ private void refresh(){ removeSplitItemViews(); bindViews(); } /** * Remove the split item views from the transaction detail prior to refreshing them */ private void removeSplitItemViews(){ long splitCount = TransactionsDbAdapter.getInstance().getSplitCount(mTransactionUID); mDetailTableLayout.removeViews(0, (int)splitCount); mDebitBalance.setText(""); mCreditBalance.setText(""); } @OnClick(R.id.fab_edit_transaction) public void editTransaction(){ Intent createTransactionIntent = new Intent(this.getApplicationContext(), FormActivity.class); createTransactionIntent.setAction(Intent.ACTION_INSERT_OR_EDIT); createTransactionIntent.putExtra(UxArgument.SELECTED_ACCOUNT_UID, mAccountUID); createTransactionIntent.putExtra(UxArgument.SELECTED_TRANSACTION_UID, mTransactionUID); createTransactionIntent.putExtra(UxArgument.FORM_TYPE, FormActivity.FormType.TRANSACTION.name()); startActivityForResult(createTransactionIntent, REQUEST_EDIT_TRANSACTION); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; default: return super.onOptionsItemSelected(item); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK){ refresh(); } } }