Skip to content

Commit

Permalink
feat: mass op can mark transactions pending, restored, unreconciled
Browse files Browse the repository at this point in the history
improve mass op action legibility

#60
  • Loading branch information
tiberiusteng committed Jan 30, 2025
1 parent aad67da commit 2f00b6a
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 4 deletions.
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="tw.tib.financisto"
android:versionName="2025-01-25" android:versionCode="173"
android:versionName="2025-01-31" android:versionCode="174"
android:installLocation="internalOnly">

<supports-screens
Expand Down
115 changes: 113 additions & 2 deletions app/src/main/java/tw/tib/financisto/activity/MassOpFragment.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package tw.tib.financisto.activity;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.os.BuildCompat;
import androidx.core.content.ContextCompat;

import tw.tib.financisto.R;
import tw.tib.financisto.adapter.BlotterListAdapter;
Expand Down Expand Up @@ -62,7 +66,71 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
applyFilter();
}
spOperation.setPrompt(getString(R.string.mass_operations));
spOperation.setAdapter(EnumUtils.createSpinnerAdapter(getContext(), operations));
spOperation.setAdapter(new SpinnerAdapter() {
private LayoutInflater inflater;

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {

}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {

}

@Override
public int getCount() {
return operations.length;
}

@Override
public Object getItem(int position) {
return operations[position];
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public boolean hasStableIds() {
return false;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Context context = getContext();
if (inflater == null) inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.mass_op_action_item, parent, false);
TextView indicator = view.findViewById(R.id.indicator);
TextView title = view.findViewById(R.id.center);
title.setText(context.getString(operations[position].getTitleId()));
indicator.setBackgroundColor(ContextCompat.getColor(context, operations[position].getColor()));
return view;
}

@Override
public int getItemViewType(int position) {
return 0;
}

@Override
public int getViewTypeCount() {
return 1;
}

@Override
public boolean isEmpty() {
return false;
}
});
prepareTransactionActionGrid();

emptyText = view.findViewById(android.R.id.empty);
Expand Down Expand Up @@ -117,24 +185,66 @@ protected ListAdapter createAdapter(Cursor cursor) {
}

private enum MassOp implements LocalizableEnum{
PENDING(R.string.mass_operations_mark_pending_all) {
@Override
public void apply(DatabaseAdapter db, long[] ids) {
db.markPendingSelectedTransactions(ids);
}
@Override
public int getColor() {
return R.color.pending_transaction_color;
}
},
RESTORED(R.string.mass_operations_mark_restored_all) {
@Override
public void apply(DatabaseAdapter db, long[] ids) {
db.markRestoredSelectedTransactions(ids);
}
@Override
public int getColor() {
return R.color.restored_transaction_color;
}
},
UNRECONCILED(R.string.mass_operations_mark_unreconciled_all) {
@Override
public void apply(DatabaseAdapter db, long[] ids) {
db.markUnreconciledSelectedTransactions(ids);
}
@Override
public int getColor() {
return R.color.unreconciled_transaction_color;
}
},
CLEAR(R.string.mass_operations_clear_all){
@Override
public void apply(DatabaseAdapter db, long[] ids) {
db.clearSelectedTransactions(ids);
}
@Override
public int getColor() {
return R.color.cleared_transaction_color;
}
},
RECONCILE(R.string.mass_operations_reconcile){
@Override
public void apply(DatabaseAdapter db, long[] ids) {
db.reconcileSelectedTransactions(ids);
}
@Override
public int getColor() {
return R.color.reconciled_transaction_color;
}
},
DELETE(R.string.mass_operations_delete){
@Override
public void apply(DatabaseAdapter db, long[] ids) {
db.deleteSelectedTransactions(ids);
db.rebuildRunningBalances();
}
@Override
public int getColor() {
return R.color.holo_red_dark;
}
};

private final int titleId;
Expand All @@ -143,6 +253,7 @@ public void apply(DatabaseAdapter db, long[] ids) {
this.titleId = titleId;
}

public abstract int getColor();
public abstract void apply(DatabaseAdapter db, long[] ids);

@Override
Expand Down
29 changes: 29 additions & 0 deletions app/src/main/java/tw/tib/financisto/db/DatabaseAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,35 @@ public EnumMap<SystemAttribute, String> getSystemAttributesForTransaction(long t
}
}

/**
* Sets status=RS (Restored) for the selected transactions
*
* @param ids selected transactions' ids
*/
public void markRestoredSelectedTransactions(long[] ids) {
String sql = "UPDATE " + DatabaseHelper.TRANSACTION_TABLE + " SET " + DatabaseHelper.TransactionColumns.status + "='" + TransactionStatus.RS + "'";
runInTransaction(sql, ids);
}

/**
* Sets status=PN (Pending) for the selected transactions
*
* @param ids selected transactions' ids
*/
public void markPendingSelectedTransactions(long[] ids) {
String sql = "UPDATE " + DatabaseHelper.TRANSACTION_TABLE + " SET " + DatabaseHelper.TransactionColumns.status + "='" + TransactionStatus.PN + "'";
runInTransaction(sql, ids);
}

/**
* Sets status=UR (Unreconciled) for the selected transactions
*
* @param ids selected transactions' ids
*/
public void markUnreconciledSelectedTransactions(long[] ids) {
String sql = "UPDATE " + DatabaseHelper.TRANSACTION_TABLE + " SET " + DatabaseHelper.TransactionColumns.status + "='" + TransactionStatus.UR + "'";
runInTransaction(sql, ids);
}

/**
* Sets status=CL (Cleared) for the selected transactions
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/res/layout/blotter_mass_op.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@
<LinearLayout android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:layout_width="fill_parent"
android:paddingTop="2dp"
android:paddingBottom="2dp"
style="@style/MassOpActionDropdown">
<Spinner
android:id="@+id/spOperation"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_height="@dimen/select_entry_height"
android:layout_gravity="center_vertical" />
</LinearLayout>
<FrameLayout
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/res/layout/mass_op_action_item.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/select_entry_height">

<TextView
android:id="@+id/indicator"
android:layout_width="6sp"
android:layout_height="0dp"
android:layout_marginLeft="1sp"
android:background="@color/unreconciled_transaction_color"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />

<TextView
android:id="@+id/center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="-1sp"
android:layout_marginStart="4sp"
android:paddingTop="1sp"
android:singleLine="true"
android:text="center"
android:textAppearance="@style/ListPrimary"
app:layout_constraintStart_toEndOf="@id/indicator"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
3 changes: 3 additions & 0 deletions app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,9 @@
<string name="card_issuer_unionpay">UnionPay</string>
<string name="account_type_paypal">PayPal</string>
<string name="mass_operations_use_filter">以過濾條件搜尋交易</string>
<string name="mass_operations_mark_restored_all">全部標記復原</string>
<string name="mass_operations_mark_pending_all">全部標記擱置</string>
<string name="mass_operations_mark_unreconciled_all">全部標記未對帳</string>
<string name="mass_operations_clear_all">全部清算</string>
<string name="mass_operations_reconcile">全部對帳</string>
<string name="mass_operations_delete">全部刪除</string>
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,9 @@
<string name="mass_operations">Mass operations</string>
<string name="account_type_paypal">PayPal</string>
<string name="mass_operations_use_filter">Use filter to search for transactions</string>
<string name="mass_operations_mark_restored_all">Mark Restored all</string>
<string name="mass_operations_mark_pending_all">Mark Pending all</string>
<string name="mass_operations_mark_unreconciled_all">Mark Unreconciled all</string>
<string name="mass_operations_clear_all">Clear all</string>
<string name="mass_operations_reconcile">Reconcile all</string>
<string name="mass_operations_delete">Delete all</string>
Expand Down

0 comments on commit 2f00b6a

Please sign in to comment.