X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;ds=inline;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Ftemplates%2FTemplateDetailsAdapter.java;h=aee8511ccb0135da963f12ef2dbc05e38f818e0c;hb=507ea8d8fd3cec4a04a6db73ddc0520b9e048d8e;hp=1f371f35766b833e73965abe6833a7a72e06c891;hpb=2a8d217777a84affbb6808b55b263df7a284f0e8;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplateDetailsAdapter.java b/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplateDetailsAdapter.java index 1f371f35..aee8511c 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplateDetailsAdapter.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplateDetailsAdapter.java @@ -17,9 +17,12 @@ package net.ktnx.mobileledger.ui.templates; +import android.annotation.SuppressLint; +import android.content.res.Resources; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -28,6 +31,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.AsyncListDiffer; import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import net.ktnx.mobileledger.R; @@ -54,8 +58,11 @@ import java.util.regex.Pattern; class TemplateDetailsAdapter extends RecyclerView.Adapter { private static final String D_TEMPLATE_UI = "template-ui"; private final AsyncListDiffer differ; - public TemplateDetailsAdapter() { + private final TemplateDetailsViewModel mModel; + private final ItemTouchHelper itemTouchHelper; + public TemplateDetailsAdapter(TemplateDetailsViewModel model) { super(); + mModel = model; setHasStableIds(true); differ = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback() { @Override @@ -90,6 +97,97 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter dropTargets, int curX, int curY) { + RecyclerView.ViewHolder best = null; + int bestDistance = 0; + for (RecyclerView.ViewHolder v : dropTargets) { + if (v == selected) + continue; + + final int viewTop = v.itemView.getTop(); + int distance = Math.abs(viewTop - curY); + if (best == null) { + best = v; + bestDistance = distance; + } + else { + if (distance < bestDistance) { + bestDistance = distance; + best = v; + } + } + } + + Logger.debug("dnd", "Best target is " + best); + return best; + } + @Override + public boolean canDropOver(@NonNull RecyclerView recyclerView, + @NonNull RecyclerView.ViewHolder current, + @NonNull RecyclerView.ViewHolder target) { + final int adapterPosition = target.getAdapterPosition(); + + // first item is immovable + if (adapterPosition == 0) + return false; + + return super.canDropOver(recyclerView, current, target); + } + @Override + public int getMovementFlags(@NonNull RecyclerView recyclerView, + @NonNull RecyclerView.ViewHolder viewHolder) { + int flags = 0; + // the top item (transaction params) is always there + final int adapterPosition = viewHolder.getAdapterPosition(); + if (adapterPosition > 0) + flags |= makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, + ItemTouchHelper.UP | ItemTouchHelper.DOWN) | + makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, + ItemTouchHelper.START | ItemTouchHelper.END); + + return flags; + } + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, + @NonNull RecyclerView.ViewHolder viewHolder, + @NonNull RecyclerView.ViewHolder target) { + + final int fromPosition = viewHolder.getAdapterPosition(); + final int toPosition = target.getAdapterPosition(); + mModel.moveItem(fromPosition, toPosition); + + return true; + } + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + int pos = viewHolder.getAdapterPosition(); + mModel.removeItem(pos); + } + }); + } + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + + itemTouchHelper.attachToRecyclerView(recyclerView); + } + @Override + public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) { + super.onDetachedFromRecyclerView(recyclerView); + + itemTouchHelper.attachToRecyclerView(null); } @Override public long getItemId(int position) { @@ -373,15 +471,16 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter selectHeaderDetailSource(v, - HeaderDetail.DATE_MONTH)); - b.templateDetailsMonthSource.setOnClickListener(v -> selectHeaderDetailSource(v, - HeaderDetail.DATE_MONTH)); + b.templateDetailsMonthSourceLabel.setOnClickListener( + v -> selectHeaderDetailSource(v, HeaderDetail.DATE_MONTH)); + b.templateDetailsMonthSource.setOnClickListener( + v -> selectHeaderDetailSource(v, HeaderDetail.DATE_MONTH)); if (header.hasLiteralDateDay()) { b.templateDetailsDaySource.setText(R.string.template_details_source_literal); final Integer dateDay = header.getDateDay(); - b.templateDetailsDateDay.setText((dateDay == null) ? null : String.valueOf(dateDay)); + b.templateDetailsDateDay.setText( + (dateDay == null) ? null : String.valueOf(dateDay)); b.templateDetailsDateDayLayout.setVisibility(View.VISIBLE); } else { @@ -390,11 +489,14 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter selectHeaderDetailSource(v, HeaderDetail.DATE_DAY)); - b.templateDetailsDaySource.setOnClickListener(v -> selectHeaderDetailSource(v, HeaderDetail.DATE_DAY)); + b.templateDetailsDaySourceLabel.setOnClickListener( + v -> selectHeaderDetailSource(v, HeaderDetail.DATE_DAY)); + b.templateDetailsDaySource.setOnClickListener( + v -> selectHeaderDetailSource(v, HeaderDetail.DATE_DAY)); if (header.hasLiteralTransactionDescription()) { - b.templateTransactionDescriptionSource.setText(R.string.template_details_source_literal); + b.templateTransactionDescriptionSource.setText( + R.string.template_details_source_literal); b.transactionDescription.setText(header.getTransactionDescription()); b.transactionDescriptionLayout.setVisibility(View.VISIBLE); } @@ -405,11 +507,14 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter selectHeaderDetailSource(v, HeaderDetail.DESCRIPTION)); - b.templateTransactionDescriptionSource.setOnClickListener(v -> selectHeaderDetailSource(v, HeaderDetail.DESCRIPTION)); + b.templateTransactionDescriptionSourceLabel.setOnClickListener( + v -> selectHeaderDetailSource(v, HeaderDetail.DESCRIPTION)); + b.templateTransactionDescriptionSource.setOnClickListener( + v -> selectHeaderDetailSource(v, HeaderDetail.DESCRIPTION)); if (header.hasLiteralTransactionComment()) { - b.templateTransactionCommentSource.setText(R.string.template_details_source_literal); + b.templateTransactionCommentSource.setText( + R.string.template_details_source_literal); b.transactionComment.setText(header.getTransactionComment()); b.transactionCommentLayout.setVisibility(View.VISIBLE); } @@ -542,16 +647,37 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter getItem().setNegateAmount(isChecked)); + b.negateAmountSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { + getItem().setNegateAmount(isChecked); + b.templateDetailsNegateAmountText.setText( + isChecked ? R.string.template_account_change_amount_sign + : R.string.template_account_keep_amount_sign); + }); + final View.OnClickListener negLabelClickListener = + (view) -> b.negateAmountSwitch.toggle(); + b.templateDetailsNegateAmountLabel.setOnClickListener(negLabelClickListener); + b.templateDetailsNegateAmountText.setOnClickListener(negLabelClickListener); + manageAccountLabelDrag(); + } + @SuppressLint("ClickableViewAccessibility") + public void manageAccountLabelDrag() { + b.patternAccountLabel.setOnTouchListener((v, event) -> { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + itemTouchHelper.startDrag(this); + } + return false; + }); } @Override void bind(TemplateDetailsItem item) { - String groupNoText = b.getRoot() - .getResources() - .getString(R.string.template_item_match_group_source); + final Resources resources = b.getRoot() + .getResources(); + String groupNoText = resources.getString(R.string.template_item_match_group_source); TemplateDetailsItem.AccountRow accRow = item.asAccountRowItem(); + b.patternAccountLabel.setText(String.format(Locale.US, + resources.getString(R.string.template_details_account_row_label), + accRow.getPosition())); if (accRow.hasLiteralAccountName()) { b.templateDetailsAccountNameLayout.setVisibility(View.VISIBLE); b.templateDetailsAccountName.setText(accRow.getAccountName()); @@ -586,6 +712,8 @@ class TemplateDetailsAdapter extends RecyclerView.Adapter