From a843b5a1b9cb422dee25b2500843d8680d306150 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Mon, 2 Aug 2021 22:58:06 +0200 Subject: [PATCH] Make lint happier --- .../java/protect/card_locker/DBHelper.java | 3 + .../main/java/protect/card_locker/Group.java | 8 +- .../card_locker/GroupCursorAdapter.java | 103 ++++++--- .../card_locker/LoyaltyCardCursorAdapter.java | 57 ++--- .../card_locker/ManageGroupsActivity.java | 197 ++++++++---------- .../protect/card_locker/ScanActivity.java | 3 + .../res/layout/custom_barcode_scanner.xml | 2 - app/src/main/res/layout/group_layout.xml | 14 +- app/src/main/res/layout/group_main.xml | 9 +- 9 files changed, 193 insertions(+), 203 deletions(-) diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index 237e882bd..371ce0682 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -754,6 +754,9 @@ public class DBHelper extends SQLiteOpenHelper db.endTransaction(); } + // Reorder after delete to ensure no bad order IDs + reorderGroups(getGroups()); + return success; } diff --git a/app/src/main/java/protect/card_locker/Group.java b/app/src/main/java/protect/card_locker/Group.java index 9846abe73..1d5de8603 100644 --- a/app/src/main/java/protect/card_locker/Group.java +++ b/app/src/main/java/protect/card_locker/Group.java @@ -5,16 +5,18 @@ import android.database.Cursor; public class Group { public final String _id; + public final int order; - public Group(final String _id) - { + public Group(final String _id, final int order) { this._id = _id; + this.order = order; } public static Group toGroup(Cursor cursor) { String _id = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbGroups.ID)); + int order = cursor.getInt(cursor.getColumnIndexOrThrow(DBHelper.LoyaltyCardDbGroups.ORDER)); - return new Group(_id); + return new Group(_id, order); } } diff --git a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java index c1dfdd939..d9e28c17d 100644 --- a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java @@ -2,55 +2,102 @@ package protect.card_locker; import android.content.Context; import android.database.Cursor; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.CursorAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.TextView; +import java.math.BigDecimal; +import java.text.DateFormat; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatImageButton; +import androidx.cardview.widget.CardView; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.preferences.Settings; -class GroupCursorAdapter extends CursorAdapter +class GroupCursorAdapter extends BaseCursorAdapter { - Settings settings; - DBHelper db; + Settings mSettings; + private final Cursor mCursor; + private final Context mContext; + private final GroupCursorAdapter.GroupAdapterListener mListener; + DBHelper mDb; - public GroupCursorAdapter(Context context, Cursor cursor) - { - super(context, cursor, 0); - settings = new Settings(context); - - db = new DBHelper(context); + public GroupCursorAdapter(Context inputContext, Cursor inputCursor, GroupCursorAdapter.GroupAdapterListener inputListener) { + super(inputCursor); + mSettings = new Settings(inputContext); + mCursor = inputCursor; + mContext = inputContext; + mListener = inputListener; + mDb = new DBHelper(inputContext); } - // The newView method is used to inflate a new view and return it, - // you don't bind any data to the view at this point. + @NonNull @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) + public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType) { - return LayoutInflater.from(context).inflate(R.layout.group_layout, parent, false); + View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.group_layout, inputParent, false); + return new GroupCursorAdapter.GroupListItemViewHolder(itemView); } - // The bindView method is used to bind all data to a given view - // such as setting the text on a TextView. - @Override - public void bindView(View view, Context context, Cursor cursor) + public Cursor getCursor() { - // Find fields to populate in inflated template - TextView nameField = view.findViewById(R.id.name); - TextView countField = view.findViewById(R.id.cardCount); + return mCursor; + } - // Extract properties from cursor - Group group = Group.toGroup(cursor); + public void onBindViewHolder(GroupCursorAdapter.GroupListItemViewHolder inputHolder, Cursor inputCursor) { + Group group = Group.toGroup(inputCursor); - Integer groupCardCount = db.getGroupCardCount(group._id); + inputHolder.mName.setText(group._id); - // Populate fields with extracted properties - nameField.setText(group._id); + int groupCardCount = mDb.getGroupCardCount(group._id); + inputHolder.mCardCount.setText(mContext.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount)); - countField.setText(context.getResources().getQuantityString(R.plurals.groupCardCount, groupCardCount, groupCardCount)); + inputHolder.mName.setTextSize(mSettings.getFontSizeMax(mSettings.getMediumFont())); + inputHolder.mCardCount.setTextSize(mSettings.getFontSizeMax(mSettings.getSmallFont())); - nameField.setTextSize(settings.getFontSizeMax(settings.getMediumFont())); - countField.setTextSize(settings.getFontSizeMax(settings.getSmallFont())); + applyClickEvents(inputHolder); + } + + private void applyClickEvents(GroupListItemViewHolder inputHolder) + { + inputHolder.mMoveDown.setOnClickListener(view -> mListener.onMoveDownButtonClicked(inputHolder.itemView)); + inputHolder.mMoveUp.setOnClickListener(view -> mListener.onMoveUpButtonClicked(inputHolder.itemView)); + inputHolder.mEdit.setOnClickListener(view -> mListener.onEditButtonClicked(inputHolder.itemView)); + inputHolder.mDelete.setOnClickListener(view -> mListener.onDeleteButtonClicked(inputHolder.itemView)); + } + + public interface GroupAdapterListener + { + void onMoveDownButtonClicked(View view); + void onMoveUpButtonClicked(View view); + void onEditButtonClicked(View view); + void onDeleteButtonClicked(View view); + } + + public class GroupListItemViewHolder extends RecyclerView.ViewHolder + { + public TextView mName, mCardCount; + public AppCompatImageButton mMoveUp, mMoveDown, mEdit, mDelete; + + public GroupListItemViewHolder(View inputView) { + super(inputView); + mName = inputView.findViewById(R.id.name); + mCardCount = inputView.findViewById(R.id.cardCount); + mMoveUp = inputView.findViewById(R.id.moveUp); + mMoveDown = inputView.findViewById(R.id.moveDown); + mEdit = inputView.findViewById(R.id.edit); + mDelete = inputView.findViewById(R.id.delete); + } } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index f3b0f3f7d..201ad7627 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -111,53 +111,20 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter mListener.onIconClicked(inputPosition)); + inputHolder.mRow.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition)); + inputHolder.mInformationContainer.setOnClickListener(inputView -> mListener.onRowClicked(inputPosition)); + + inputHolder.mRow.setOnLongClickListener(inputView -> { + mListener.onRowLongClicked(inputPosition); + inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + return true; }); - inputHolder.mRow.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View inputView) - { - mListener.onRowClicked(inputPosition); - } - }); - - inputHolder.mInformationContainer.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View inputView) - { - mListener.onRowClicked(inputPosition); - } - }); - - inputHolder.mRow.setOnLongClickListener(new View.OnLongClickListener() - { - @Override - public boolean onLongClick(View inputView) - { - mListener.onRowLongClicked(inputPosition); - inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - return true; - } - }); - - inputHolder.mInformationContainer.setOnLongClickListener(new View.OnLongClickListener() - { - @Override - public boolean onLongClick(View inputView) - { - mListener.onRowLongClicked(inputPosition); - inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - return true; - } + inputHolder.mInformationContainer.setOnLongClickListener(inputView -> { + mListener.onRowLongClicked(inputPosition); + inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + return true; }); } diff --git a/app/src/main/java/protect/card_locker/ManageGroupsActivity.java b/app/src/main/java/protect/card_locker/ManageGroupsActivity.java index 16b697d89..101248744 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupsActivity.java +++ b/app/src/main/java/protect/card_locker/ManageGroupsActivity.java @@ -12,6 +12,7 @@ import android.view.WindowManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; +import android.widget.RelativeLayout; import android.widget.TextView; import com.google.android.material.floatingactionbutton.FloatingActionButton; @@ -22,12 +23,16 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; -public class ManageGroupsActivity extends AppCompatActivity +public class ManageGroupsActivity extends AppCompatActivity implements GroupCursorAdapter.GroupAdapterListener { private static final String TAG = "Catima"; - private final DBHelper db = new DBHelper(this); + private final DBHelper mDb = new DBHelper(this); + GroupCursorAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) @@ -63,25 +68,27 @@ public class ManageGroupsActivity extends AppCompatActivity private void updateGroupList() { - final ListView groupList = findViewById(R.id.list); + final RecyclerView groupList = findViewById(R.id.list); final TextView helpText = findViewById(R.id.helpText); - final DBHelper db = new DBHelper(this); - if(db.getGroupCount() > 0) - { - groupList.setVisibility(View.VISIBLE); - helpText.setVisibility(View.GONE); - } - else - { + if (mDb.getGroupCount() == 0) { groupList.setVisibility(View.GONE); helpText.setVisibility(View.VISIBLE); + + return; } - Cursor groupCursor = db.getGroupCursor(); + groupList.setVisibility(View.VISIBLE); + helpText.setVisibility(View.GONE); - final GroupCursorAdapter adapter = new GroupCursorAdapter(this, groupCursor); - groupList.setAdapter(adapter); + Cursor groupCursor = mDb.getGroupCursor(); + + RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); + groupList.setLayoutManager(mLayoutManager); + groupList.setItemAnimator(new DefaultItemAnimator()); + + mAdapter = new GroupCursorAdapter(this, groupCursor, this); + groupList.setAdapter(mAdapter); registerForContextMenu(groupList); } @@ -108,69 +115,6 @@ public class ManageGroupsActivity extends AppCompatActivity return super.onOptionsItemSelected(item); } - public void moveGroupUp(View view) { - moveGroup(view, true); - } - - public void moveGroupDown(View view) { - moveGroup(view, false); - } - - public void editGroup(View view) { - final String groupName = getGroupname(view); - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.enter_group_name); - final EditText input = new EditText(this); - input.setInputType(InputType.TYPE_CLASS_TEXT); - input.setText(groupName); - builder.setView(input); - - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - db.updateGroup(groupName, input.getText().toString()); - updateGroupList(); - } - }); - builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - input.requestFocus(); - } - - public void deleteGroup(View view) { - final String groupName = getGroupname(view); - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.deleteConfirmationGroup); - builder.setMessage(groupName); - - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - db.deleteGroup(groupName); - updateGroupList(); - // Delete may change ordering, so invalidate - invalidateHomescreenActiveTab(); - } - }); - builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - } - private void createGroup() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.enter_group_name); @@ -178,51 +122,28 @@ public class ManageGroupsActivity extends AppCompatActivity input.setInputType(InputType.TYPE_CLASS_TEXT); builder.setView(input); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - db.insertGroup(input.getText().toString()); - updateGroupList(); - } - }); - builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } + builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> { + mDb.insertGroup(input.getText().toString()); + updateGroupList(); }); + builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel()); AlertDialog dialog = builder.create(); dialog.show(); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); input.requestFocus(); } - private String getGroupname(View view) { - LinearLayout parentRow = (LinearLayout) view.getParent().getParent(); - TextView groupNameTextView = parentRow.findViewById(R.id.name); + private String getGroupName(View view) { + TextView groupNameTextView = view.findViewById(R.id.name); return (String) groupNameTextView.getText(); } private void moveGroup(View view, boolean up) { - final String groupName = getGroupname(view); + List groups = mDb.getGroups(); + final String groupName = getGroupName(view); - List groups = db.getGroups(); - - int currentIndex = -1; - Integer newIndex; - - // Get current index in group list - for (int i = 0; i < groups.size(); i++) { - if (groups.get(i)._id.equals(groupName)) { - currentIndex = i; - - break; - } - } - - if (currentIndex == -1) { - throw new IndexOutOfBoundsException(); - } + int currentIndex = mDb.getGroup(groupName).order; + int newIndex; // Reinsert group in correct position if (up) { @@ -240,12 +161,64 @@ public class ManageGroupsActivity extends AppCompatActivity groups.add(newIndex, group); // Update database - db.reorderGroups(groups); + mDb.reorderGroups(groups); // Update UI - updateGroupList(); + mAdapter.notifyItemMoved(currentIndex, newIndex); // Ordering may have changed, so invalidate invalidateHomescreenActiveTab(); } + + @Override + public void onMoveDownButtonClicked(View view) { + moveGroup(view, false); + } + + @Override + public void onMoveUpButtonClicked(View view) { + moveGroup(view, true); + } + + @Override + public void onEditButtonClicked(View view) { + final String groupName = getGroupName(view); + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.enter_group_name); + final EditText input = new EditText(this); + input.setInputType(InputType.TYPE_CLASS_TEXT); + input.setText(groupName); + builder.setView(input); + + builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> { + String newGroupName = input.getText().toString(); + mDb.updateGroup(groupName, newGroupName); + updateGroupList(); + }); + builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel()); + AlertDialog dialog = builder.create(); + dialog.show(); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + input.requestFocus(); + } + + @Override + public void onDeleteButtonClicked(View view) { + final String groupName = getGroupName(view); + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.deleteConfirmationGroup); + builder.setMessage(groupName); + + builder.setPositiveButton(getString(R.string.ok), (dialog, which) -> { + mDb.deleteGroup(groupName); + updateGroupList(); + // Delete may change ordering, so invalidate + invalidateHomescreenActiveTab(); + }); + builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel()); + AlertDialog dialog = builder.create(); + dialog.show(); + } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/ScanActivity.java b/app/src/main/java/protect/card_locker/ScanActivity.java index 9294cad12..305d73a67 100644 --- a/app/src/main/java/protect/card_locker/ScanActivity.java +++ b/app/src/main/java/protect/card_locker/ScanActivity.java @@ -60,6 +60,9 @@ public class ScanActivity extends AppCompatActivity { extractIntentFields(getIntent()); + findViewById(R.id.add_from_image).setOnClickListener(this::addFromImage); + findViewById(R.id.add_manually).setOnClickListener(this::addManually); + barcodeScannerView = findViewById(R.id.zxing_barcode_scanner); // Even though we do the actual decoding with the barcodeScannerView diff --git a/app/src/main/res/layout/custom_barcode_scanner.xml b/app/src/main/res/layout/custom_barcode_scanner.xml index e6ccacfd4..fc679fa88 100644 --- a/app/src/main/res/layout/custom_barcode_scanner.xml +++ b/app/src/main/res/layout/custom_barcode_scanner.xml @@ -30,14 +30,12 @@ android:id="@+id/add_from_image" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:onClick="addFromImage" android:text="@string/addFromImage" />