X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Faccount_summary%2FAccountSummaryAdapter.java;h=c6c909152de2b6cb575d4130e58bd6688aee63a9;hb=2d85826653a8ba3e619afc83c5c91216a7fdb0b6;hp=5ffc62f544389cee71151b65aeb1dbf7a3e65c57;hpb=748544f53147c7e811f8b11c081ed162a3870cb3;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java index 5ffc62f5..c6c90915 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java @@ -20,6 +20,7 @@ package net.ktnx.mobileledger.ui.account_summary; import android.content.Context; import android.content.res.Resources; import android.text.TextUtils; +import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -35,32 +36,54 @@ import androidx.recyclerview.widget.RecyclerView; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.DbOpQueue; +import net.ktnx.mobileledger.model.AccountListItem; +import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerAccount; import net.ktnx.mobileledger.model.MobileLedgerProfile; +import net.ktnx.mobileledger.ui.MainModel; import net.ktnx.mobileledger.ui.activity.MainActivity; import net.ktnx.mobileledger.utils.Locker; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Locale; +import java.util.Observer; import static net.ktnx.mobileledger.utils.Logger.debug; public class AccountSummaryAdapter extends RecyclerView.Adapter { public static final int AMOUNT_LIMIT = 3; - private AsyncListDiffer listDiffer; - AccountSummaryAdapter() { - listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback() { + private final AsyncListDiffer listDiffer; + private final MainModel model; + AccountSummaryAdapter(MainModel model) { + this.model = model; + + listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NotNull LedgerAccount oldItem, - @NotNull LedgerAccount newItem) { - return TextUtils.equals(oldItem.getName(), newItem.getName()); + public boolean areItemsTheSame(@NotNull AccountListItem oldItem, + @NotNull AccountListItem newItem) { + final AccountListItem.Type oldType = oldItem.getType(); + final AccountListItem.Type newType = newItem.getType(); + if (oldType == AccountListItem.Type.HEADER) { + return newType == AccountListItem.Type.HEADER; + } + if (oldType != newType) + return false; + + return TextUtils.equals(oldItem.getAccount() + .getName(), newItem.getAccount() + .getName()); } @Override - public boolean areContentsTheSame(@NotNull LedgerAccount oldItem, - @NotNull LedgerAccount newItem) { - return oldItem.equals(newItem); + public boolean areContentsTheSame(@NotNull AccountListItem oldItem, + @NotNull AccountListItem newItem) { + if (oldItem.getType() + .equals(AccountListItem.Type.HEADER)) + return true; + return oldItem.getAccount() + .equals(newItem.getAccount()); } }); } @@ -83,26 +106,33 @@ public class AccountSummaryAdapter return listDiffer.getCurrentList() .size(); } - public void setAccounts(List newList) { + public void setAccounts(List newList) { listDiffer.submitList(newList); } - static class LedgerRowHolder extends RecyclerView.ViewHolder { - TextView tvAccountName, tvAccountAmounts; - ConstraintLayout row; - View expanderContainer; - ImageView expander; - View accountExpanderContainer; + class LedgerRowHolder extends RecyclerView.ViewHolder { + private final TextView tvAccountName, tvAccountAmounts; + private final ConstraintLayout row; + private final View expanderContainer; + private final View amountExpanderContainer; + private final View lLastUpdate; + private final TextView tvLastUpdate; + private final View vAccountNameLayout; LedgerAccount mAccount; + private AccountListItem.Type lastType; + private Observer lastUpdateObserver; public LedgerRowHolder(@NonNull View itemView) { super(itemView); row = itemView.findViewById(R.id.account_summary_row); + vAccountNameLayout = itemView.findViewById(R.id.account_name_layout); tvAccountName = itemView.findViewById(R.id.account_row_acc_name); tvAccountAmounts = itemView.findViewById(R.id.account_row_acc_amounts); expanderContainer = itemView.findViewById(R.id.account_expander_container); - expander = itemView.findViewById(R.id.account_expander); - accountExpanderContainer = + ImageView expander = itemView.findViewById(R.id.account_expander); + amountExpanderContainer = itemView.findViewById(R.id.account_row_amounts_expander_container); + lLastUpdate = itemView.findViewById(R.id.last_update_container); + tvLastUpdate = itemView.findViewById(R.id.last_update_text); itemView.setOnLongClickListener(this::onItemLongClick); tvAccountName.setOnLongClickListener(this::onItemLongClick); @@ -115,6 +145,7 @@ public class AccountSummaryAdapter expanderContainer.setOnClickListener(v -> toggleAccountExpanded()); expander.setOnClickListener(v -> toggleAccountExpanded()); tvAccountAmounts.setOnClickListener(v -> toggleAmountsExpanded()); + } private void toggleAccountExpanded() { if (!mAccount.hasSubAccounts()) @@ -126,8 +157,8 @@ public class AccountSummaryAdapter if (profile == null) { return; } - try (Locker ignored = profile.lockAccountsForWriting()) { - LedgerAccount realAccount = profile.locateAccount(mAccount.getName()); + try (Locker ignored = model.lockAccountsForWriting()) { + LedgerAccount realAccount = model.locateAccount(mAccount.getName()); if (realAccount == null) return; @@ -136,7 +167,7 @@ public class AccountSummaryAdapter } expanderContainer.animate() .rotation(mAccount.isExpanded() ? 0 : 180); - profile.updateDisplayedAccounts(); + model.updateDisplayedAccounts(); DbOpQueue.add("update accounts set expanded=? where name=? and profile=?", new Object[]{mAccount.isExpanded(), mAccount.getName(), profile.getUuid() @@ -150,11 +181,11 @@ public class AccountSummaryAdapter mAccount.toggleAmountsExpanded(); if (mAccount.amountsExpanded()) { tvAccountAmounts.setText(mAccount.getAmountsString()); - accountExpanderContainer.setVisibility(View.GONE); + amountExpanderContainer.setVisibility(View.GONE); } else { tvAccountAmounts.setText(mAccount.getAmountsString(AMOUNT_LIMIT)); - accountExpanderContainer.setVisibility(View.VISIBLE); + amountExpanderContainer.setVisibility(View.VISIBLE); } MobileLedgerProfile profile = mAccount.getProfile(); @@ -172,51 +203,114 @@ public class AccountSummaryAdapter final String accountName = mAccount.getName(); builder.setTitle(accountName); builder.setItems(R.array.acc_ctx_menu, (dialog, which) -> { - switch (which) { - case 0: - // show transactions - activity.showAccountTransactions(accountName); - break; - default: - throw new RuntimeException( - String.format("Unknown menu item id (%d)", which)); + if (which == 0) {// show transactions + activity.showAccountTransactions(accountName); + } + else { + throw new RuntimeException(String.format("Unknown menu item id (%d)", which)); } dialog.dismiss(); }); builder.show(); return true; } - public void bindToAccount(LedgerAccount acc) { - Context ctx = row.getContext(); - Resources rm = ctx.getResources(); - mAccount = acc; + public void bindToAccount(AccountListItem item) { + final AccountListItem.Type newType = item.getType(); + setType(newType); - row.setTag(acc); + switch (newType) { + case ACCOUNT: + LedgerAccount acc = item.getAccount(); - tvAccountName.setText(acc.getShortName()); + debug("accounts", String.format(Locale.US, "Binding to '%s'", acc.getName())); + Context ctx = row.getContext(); + Resources rm = ctx.getResources(); + mAccount = acc; - ConstraintLayout.LayoutParams lp = - (ConstraintLayout.LayoutParams) tvAccountName.getLayoutParams(); - lp.setMarginStart( - acc.getLevel() * rm.getDimensionPixelSize(R.dimen.thumb_row_height) / 3); + row.setTag(acc); - if (acc.hasSubAccounts()) { - expanderContainer.setVisibility(View.VISIBLE); - expanderContainer.setRotation(acc.isExpanded() ? 0 : 180); - } - else { - expanderContainer.setVisibility(View.GONE); - } + tvAccountName.setText(acc.getShortName()); + + ConstraintLayout.LayoutParams lp = + (ConstraintLayout.LayoutParams) tvAccountName.getLayoutParams(); + lp.setMarginStart( + acc.getLevel() * rm.getDimensionPixelSize(R.dimen.thumb_row_height) / + 3); + + if (acc.hasSubAccounts()) { + expanderContainer.setVisibility(View.VISIBLE); + expanderContainer.setRotation(acc.isExpanded() ? 0 : 180); + } + else { + expanderContainer.setVisibility(View.GONE); + } - int amounts = acc.getAmountCount(); - if ((amounts > AMOUNT_LIMIT) && !acc.amountsExpanded()) { - tvAccountAmounts.setText(acc.getAmountsString(AMOUNT_LIMIT)); - accountExpanderContainer.setVisibility(View.VISIBLE); + int amounts = acc.getAmountCount(); + if ((amounts > AMOUNT_LIMIT) && !acc.amountsExpanded()) { + tvAccountAmounts.setText(acc.getAmountsString(AMOUNT_LIMIT)); + amountExpanderContainer.setVisibility(View.VISIBLE); + } + else { + tvAccountAmounts.setText(acc.getAmountsString()); + amountExpanderContainer.setVisibility(View.GONE); + } + + break; + case HEADER: + setLastUpdateText(Data.lastUpdate.get()); + break; + default: + throw new IllegalStateException("Unexpected value: " + newType); } - else { - tvAccountAmounts.setText(acc.getAmountsString()); - accountExpanderContainer.setVisibility(View.GONE); + + } + void setLastUpdateText(long lastUpdate) { + final int formatFlags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR | + DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_NUMERIC_DATE; + tvLastUpdate.setText((lastUpdate == 0) ? "----" : DateUtils.formatDateTime( + tvLastUpdate.getContext(), lastUpdate, formatFlags)); + } + private void initLastUpdateObserver() { + if (lastUpdateObserver != null) + return; + + lastUpdateObserver = (o, arg) -> setLastUpdateText(Data.lastUpdate.get()); + + Data.lastUpdate.addObserver(lastUpdateObserver); + } + private void dropLastUpdateObserver() { + if (lastUpdateObserver == null) + return; + + Data.lastUpdate.deleteObserver(lastUpdateObserver); + lastUpdateObserver = null; + } + private void setType(AccountListItem.Type newType) { + if (newType == lastType) + return; + + switch (newType) { + case ACCOUNT: + row.setLongClickable(true); + amountExpanderContainer.setVisibility(View.VISIBLE); + vAccountNameLayout.setVisibility(View.VISIBLE); + tvAccountAmounts.setVisibility(View.VISIBLE); + lLastUpdate.setVisibility(View.GONE); + dropLastUpdateObserver(); + break; + case HEADER: + row.setLongClickable(false); + tvAccountAmounts.setVisibility(View.GONE); + amountExpanderContainer.setVisibility(View.GONE); + vAccountNameLayout.setVisibility(View.GONE); + lLastUpdate.setVisibility(View.VISIBLE); + initLastUpdateObserver(); + break; + default: + throw new IllegalStateException("Unexpected value: " + newType); } + + lastType = newType; } } }