From 547dd55240fdd20535aae67eea1cb6b0e1479959 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 1 Oct 2022 10:31:27 +0530 Subject: [PATCH 1/6] gradle: Drop buildToolsVersion Not required as the latest one is always used Signed-off-by: Aayush Gupta --- app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 31128be4b..df344be99 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,6 @@ spotbugs { android { compileSdkVersion 31 - buildToolsVersion "31.0.0" defaultConfig { applicationId "me.hackerchick.catima" From 24a5efd5f85c0ad1b2cc227db5f2552d32c408c1 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 1 Oct 2022 13:12:12 +0530 Subject: [PATCH 2/6] gradle: Migrate to new plugins and dependency management system Signed-off-by: Aayush Gupta --- app/build.gradle | 6 ++++-- build.gradle | 24 +++--------------------- settings.gradle | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index df344be99..c5d535d37 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,9 @@ import com.github.spotbugs.snom.SpotBugsTask -apply plugin: 'com.android.application' -apply plugin: 'com.github.spotbugs' +plugins { + id 'com.android.application' + id 'com.github.spotbugs' +} spotbugs { ignoreFailures = false diff --git a/build.gradle b/build.gradle index 760ab47c1..8132cb54c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,29 +1,11 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - repositories { - google() - mavenCentral() - maven { url "https://jitpack.io" } - gradlePluginPortal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.0.4' - classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } +plugins { + id 'com.android.application' version '7.0.4' apply false + id 'com.github.spotbugs' version "4.7.5" apply false } allprojects { - repositories { - google() - mavenCentral() - maven { url "https://jitpack.io" } - gradlePluginPortal() - } tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:deprecation" } diff --git a/settings.gradle b/settings.gradle index e7b4def49..8b4f17817 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,17 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url "https://jitpack.io" } + } +} +rootProject.name = "Catima" include ':app' From fa510e3ffa540361472f8cbcb83579f830549c97 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 1 Oct 2022 13:18:20 +0530 Subject: [PATCH 3/6] gradle: Switch to new Int only SDK version properties Signed-off-by: Aayush Gupta --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c5d535d37..abc01d64e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,12 +13,12 @@ spotbugs { } android { - compileSdkVersion 31 + compileSdk 31 defaultConfig { applicationId "me.hackerchick.catima" - minSdkVersion 21 - targetSdkVersion 31 + minSdk 21 + targetSdk 31 versionCode 114 versionName "2.20.0" From 635ec748b3a7dd86b6966cd4ce903c81d4b033ab Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sun, 2 Oct 2022 10:42:57 +0530 Subject: [PATCH 4/6] Catima: Migrate to view binding Signed-off-by: Aayush Gupta --- app/build.gradle | 4 ++ .../protect/card_locker/AboutActivity.java | 28 ++++---- .../card_locker/BarcodeSelectorActivity.java | 14 ++-- .../card_locker/BarcodeSelectorAdapter.java | 8 ++- .../card_locker/CardShortcutConfigure.java | 11 ++-- .../card_locker/GroupCursorAdapter.java | 33 ++++++---- .../card_locker/ImportExportActivity.java | 13 ++-- .../card_locker/LoyaltyCardCursorAdapter.java | 47 +++++++------ .../card_locker/LoyaltyCardEditActivity.java | 66 ++++++++++--------- .../card_locker/LoyaltyCardViewActivity.java | 45 +++++++------ .../protect/card_locker/MainActivity.java | 46 ++++++++----- .../card_locker/ManageGroupActivity.java | 16 +++-- .../card_locker/ManageGroupsActivity.java | 14 ++-- .../protect/card_locker/ScanActivity.java | 17 +++-- .../preferences/SettingsActivity.java | 7 +- app/src/main/res/layout/archive_activity.xml | 4 +- app/src/main/res/layout/main_activity.xml | 4 +- .../res/layout/manage_groups_activity.xml | 4 +- 18 files changed, 231 insertions(+), 150 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index abc01d64e..c77b9f489 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,10 @@ android { } } + buildFeatures { + viewBinding true + } + bundle { language { enableSplit = false diff --git a/app/src/main/java/protect/card_locker/AboutActivity.java b/app/src/main/java/protect/card_locker/AboutActivity.java index 2900aa2c3..6b12477cf 100644 --- a/app/src/main/java/protect/card_locker/AboutActivity.java +++ b/app/src/main/java/protect/card_locker/AboutActivity.java @@ -26,16 +26,20 @@ import androidx.appcompat.widget.Toolbar; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.text.HtmlCompat; +import protect.card_locker.databinding.AboutActivityBinding; + public class AboutActivity extends CatimaAppCompatActivity implements View.OnClickListener { + private AboutActivityBinding binding; private static final String TAG = "Catima"; ConstraintLayout version_history, translate, license, repo, privacy, error, credits, rate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + binding = AboutActivityBinding.inflate(getLayoutInflater()); setTitle(R.string.about); - setContentView(R.layout.about_activity); - Toolbar toolbar = findViewById(R.id.toolbar); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -94,21 +98,21 @@ public class AboutActivity extends CatimaAppCompatActivity implements View.OnCli Log.w(TAG, "Package name not found", e); } - TextView copyright = findViewById(R.id.credits_sub); + TextView copyright = binding.creditsSub; copyright.setText(String.format(getString(R.string.app_copyright_fmt), year)); - TextView vHistory = findViewById(R.id.version_history_sub); + TextView vHistory = binding.versionHistorySub; vHistory.setText(String.format(getString(R.string.debug_version_fmt), version)); setTitle(String.format(getString(R.string.about_title_fmt), appName)); - version_history = findViewById(R.id.version_history); - translate = findViewById(R.id.translate); - license = findViewById(R.id.license); - repo = findViewById(R.id.repo); - privacy = findViewById(R.id.privacy); - error = findViewById(R.id.report_error); - credits = findViewById(R.id.credits); - rate = findViewById(R.id.rate); + version_history = binding.versionHistory; + translate = binding.translate; + license = binding.license; + repo = binding.repo; + privacy = binding.privacy; + error = binding.reportError; + credits = binding.credits; + rate = binding.rate; version_history.setOnClickListener(this); translate.setOnClickListener(this); diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java index e33df1614..3397949aa 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; +import protect.card_locker.databinding.BarcodeSelectorActivityBinding; + /** * This activity is callable and will allow a user to enter * barcode data and generate all barcodes possible for @@ -26,6 +28,7 @@ import androidx.appcompat.widget.Toolbar; * data and type will be returned to the caller. */ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements BarcodeSelectorAdapter.BarcodeSelectorListener { + private BarcodeSelectorActivityBinding binding; private static final String TAG = "Catima"; // Result this activity will return @@ -40,17 +43,18 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + binding = BarcodeSelectorActivityBinding.inflate(getLayoutInflater()); setTitle(R.string.selectBarcodeTitle); - setContentView(R.layout.barcode_selector_activity); - Toolbar toolbar = findViewById(R.id.toolbar); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } - EditText cardId = findViewById(R.id.cardId); - ListView mBarcodeList = findViewById(R.id.barcodes); + EditText cardId = binding.cardId; + ListView mBarcodeList = binding.barcodes; mAdapter = new BarcodeSelectorAdapter(this, new ArrayList<>(), this); mBarcodeList.setAdapter(mAdapter); @@ -66,7 +70,7 @@ public class BarcodeSelectorActivity extends CatimaAppCompatActivity implements runOnUiThread(() -> { generateBarcodes(s.toString()); - View noBarcodeButtonView = findViewById(R.id.noBarcode); + View noBarcodeButtonView = binding.noBarcode; setButtonListener(noBarcodeButtonView, s.toString()); noBarcodeButtonView.setEnabled(s.length() > 0); }); diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java b/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java index def91e389..c12f9f99a 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorAdapter.java @@ -13,6 +13,7 @@ import android.widget.TextView; import java.util.ArrayList; import protect.card_locker.async.TaskHandler; +import protect.card_locker.databinding.BarcodeLayoutBinding; public class BarcodeSelectorAdapter extends ArrayAdapter { private static final String TAG = "Catima"; @@ -51,9 +52,10 @@ public class BarcodeSelectorAdapter extends ArrayAdapter if (convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); - convertView = inflater.inflate(R.layout.barcode_layout, parent, false); - viewHolder.image = convertView.findViewById(R.id.barcodeImage); - viewHolder.text = convertView.findViewById(R.id.barcodeName); + BarcodeLayoutBinding barcodeLayoutBinding = BarcodeLayoutBinding.inflate(inflater, parent, false); + convertView = barcodeLayoutBinding.getRoot(); + viewHolder.image = barcodeLayoutBinding.barcodeImage; + viewHolder.text = barcodeLayoutBinding.barcodeName; convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 9782162fb..a34916a63 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -14,10 +14,13 @@ import androidx.core.content.pm.ShortcutManagerCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import protect.card_locker.databinding.SimpleToolbarListActivityBinding; + /** * The configuration screen for creating a shortcut. */ public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener { + private SimpleToolbarListActivityBinding binding; static final String TAG = "Catima"; private SQLiteDatabase mDatabase; private LoyaltyCardCursorAdapter mAdapter; @@ -25,15 +28,15 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); - + binding = SimpleToolbarListActivityBinding.inflate(getLayoutInflater()); mDatabase = new DBHelper(this).getReadableDatabase(); // Set the result to CANCELED. This will cause nothing to happen if the // aback button is pressed. setResult(RESULT_CANCELED); - setContentView(R.layout.simple_toolbar_list_activity); - Toolbar toolbar = findViewById(R.id.toolbar); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; toolbar.setTitle(R.string.shortcutSelectCard); setSupportActionBar(toolbar); @@ -50,7 +53,7 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo finish(); } - final RecyclerView cardList = findViewById(R.id.list); + final RecyclerView cardList = binding.list; GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager(); if (layoutManager != null) { layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns)); diff --git a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java index 770e6795c..96b350d08 100644 --- a/app/src/main/java/protect/card_locker/GroupCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/GroupCursorAdapter.java @@ -7,11 +7,13 @@ import android.database.sqlite.SQLiteDatabase; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.widget.AppCompatImageButton; import androidx.recyclerview.widget.RecyclerView; + +import protect.card_locker.databinding.GroupLayoutBinding; import protect.card_locker.preferences.Settings; public class GroupCursorAdapter extends BaseCursorAdapter { @@ -33,9 +35,14 @@ public class GroupCursorAdapter extends BaseCursorAdapter { AlertDialog.Builder builder = new AlertDialog.Builder(ImportExportActivity.this); builder.setTitle(R.string.exportPassword); @@ -158,11 +161,11 @@ public class ImportExportActivity extends CatimaAppCompatActivity { }); // Check that there is a file manager available - Button importFilesystem = findViewById(R.id.importOptionFilesystemButton); + Button importFilesystem = binding.importOptionFilesystemButton; importFilesystem.setOnClickListener(v -> chooseImportType(false)); // Check that there is an app that data can be imported from - Button importApplication = findViewById(R.id.importOptionApplicationButton); + Button importApplication = binding.importOptionApplicationButton; importApplication.setOnClickListener(v -> chooseImportType(true)); } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index bb8041eba..0dd48a4d1 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -24,10 +24,13 @@ import java.util.ArrayList; import java.util.Currency; import java.util.Date; +import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.graphics.BlendModeColorFilterCompat; import androidx.core.graphics.BlendModeCompat; import androidx.recyclerview.widget.RecyclerView; + +import protect.card_locker.databinding.LoyaltyCardLayoutBinding; import protect.card_locker.preferences.Settings; public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { @@ -82,10 +85,15 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { inputListener.onRowClicked(getAdapterPosition()); inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index fcc3d11ae..3530923bb 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -20,6 +20,7 @@ import android.os.LocaleList; import android.text.Editable; import android.text.InputType; import android.util.Log; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -77,8 +78,11 @@ import androidx.core.content.FileProvider; import androidx.exifinterface.media.ExifInterface; import androidx.fragment.app.DialogFragment; import protect.card_locker.async.TaskHandler; +import protect.card_locker.databinding.LayoutChipChoiceBinding; +import protect.card_locker.databinding.LoyaltyCardEditActivityBinding; public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { + private LoyaltyCardEditActivityBinding binding; private static final String TAG = "Catima"; private final String STATE_TAB_INDEX = "savedTab"; @@ -244,7 +248,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { @Override public void onSaveInstanceState(@NonNull Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); - tabs = findViewById(R.id.tabs); + tabs = binding.tabs; savedInstanceState.putInt(STATE_TAB_INDEX, tabs.getSelectedTabPosition()); savedInstanceState.putParcelable(STATE_TEMP_CARD, tempLoyaltyCard); savedInstanceState.putInt(STATE_REQUESTED_IMAGE, mRequestedImage); @@ -281,7 +285,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { tempLoyaltyCard = savedInstanceState.getParcelable(STATE_TEMP_CARD); super.onRestoreInstanceState(savedInstanceState); - tabs = findViewById(R.id.tabs); + tabs = binding.tabs; tabs.selectTab(tabs.getTabAt(savedInstanceState.getInt(STATE_TAB_INDEX))); mRequestedImage = savedInstanceState.getInt(STATE_REQUESTED_IMAGE); mFrontImageUnsaved = savedInstanceState.getInt(STATE_FRONT_IMAGE_UNSAVED) == 1; @@ -297,9 +301,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - setContentView(R.layout.loyalty_card_edit_activity); - toolbar = findViewById(R.id.toolbar); + binding = LoyaltyCardEditActivityBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + toolbar = binding.toolbar; setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -316,28 +320,28 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { currencies.put(currency.getSymbol(), currency); } - tabs = findViewById(R.id.tabs); - thumbnail = findViewById(R.id.thumbnail); - thumbnailEditIcon = findViewById(R.id.thumbnailEditIcon); - storeFieldEdit = findViewById(R.id.storeNameEdit); - noteFieldEdit = findViewById(R.id.noteEdit); - groupsChips = findViewById(R.id.groupChips); - expiryField = findViewById(R.id.expiryField); - balanceField = findViewById(R.id.balanceField); - balanceCurrencyField = findViewById(R.id.balanceCurrencyField); - cardIdFieldView = findViewById(R.id.cardIdView); - barcodeIdField = findViewById(R.id.barcodeIdField); - barcodeTypeField = findViewById(R.id.barcodeTypeField); - barcodeImage = findViewById(R.id.barcode); + tabs = binding.tabs; + thumbnail = binding.thumbnail; + thumbnailEditIcon = binding.thumbnailEditIcon; + storeFieldEdit = binding.storeNameEdit; + noteFieldEdit = binding.noteEdit; + groupsChips = binding.groupChips; + expiryField = binding.expiryField; + balanceField = binding.balanceField; + balanceCurrencyField = binding.balanceCurrencyField; + cardIdFieldView = binding.cardIdView; + barcodeIdField = binding.barcodeIdField; + barcodeTypeField = binding.barcodeTypeField; + barcodeImage = binding.barcode; barcodeImage.setClipToOutline(true); - barcodeImageLayout = findViewById(R.id.barcodeLayout); - barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); - cardImageFrontHolder = findViewById(R.id.frontImageHolder); - cardImageBackHolder = findViewById(R.id.backImageHolder); - cardImageFront = findViewById(R.id.frontImage); - cardImageBack = findViewById(R.id.backImage); + barcodeImageLayout = binding.barcodeLayout; + barcodeCaptureLayout = binding.barcodeCaptureLayout; + cardImageFrontHolder = binding.frontImageHolder; + cardImageBackHolder = binding.backImageHolder; + cardImageFront = binding.frontImage; + cardImageBack = binding.backImage; - enterButton = findViewById(R.id.enterButton); + enterButton = binding.enterButton; barcodeImageGenerationFinishedCallback = () -> { if (!(boolean) barcodeImage.getTag()) { @@ -834,7 +838,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { } for (Group group : DBHelper.getGroups(mDatabase)) { - Chip chip = (Chip) getLayoutInflater().inflate(R.layout.layout_chip_choice, groupsChips, false); + LayoutChipChoiceBinding chipChoiceBinding = LayoutChipChoiceBinding + .inflate(LayoutInflater.from(groupsChips.getContext()), groupsChips, false); + Chip chip = chipChoiceBinding.getRoot(); chip.setText(group._id); chip.setTag(group); @@ -906,7 +912,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { cardImageFrontHolder.setOnClickListener(new ChooseCardImage()); cardImageBackHolder.setOnClickListener(new ChooseCardImage()); - FloatingActionButton saveButton = findViewById(R.id.fabSave); + FloatingActionButton saveButton = binding.fabSave; saveButton.setOnClickListener(v -> doSave()); saveButton.bringToFront(); @@ -1498,9 +1504,9 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { return; } - View cardPart = findViewById(R.id.cardPart); - View optionsPart = findViewById(R.id.optionsPart); - View picturesPart = findViewById(R.id.picturesPart); + View cardPart = binding.cardPart; + View optionsPart = binding.optionsPart; + View picturesPart = binding.picturesPart; if (getString(R.string.card).equals(part)) { cardPart.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index b301cf5f0..6a9ceff30 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -64,9 +64,11 @@ import java.util.Arrays; import java.util.List; import protect.card_locker.async.TaskHandler; +import protect.card_locker.databinding.LoyaltyCardViewLayoutBinding; import protect.card_locker.preferences.Settings; public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements GestureDetector.OnGestureListener { + private LoyaltyCardViewLayoutBinding binding; private static final String TAG = "Catima"; private GestureDetector mGestureDetector; @@ -311,6 +313,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } super.onCreate(savedInstanceState); + binding = LoyaltyCardViewLayoutBinding.inflate(getLayoutInflater()); settings = new Settings(this); @@ -332,30 +335,30 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements extractIntentFields(getIntent()); - setContentView(R.layout.loyalty_card_view_layout); + setContentView(binding.getRoot()); database = new DBHelper(this).getWritableDatabase(); importURIHelper = new ImportURIHelper(this); - coordinatorLayout = findViewById(R.id.coordinator_layout); - mainLayout = findViewById(R.id.mainLayout); - cardIdFieldView = findViewById(R.id.cardIdView); - storeName = findViewById(R.id.storeName); - maximizeButton = findViewById(R.id.maximizeButton); - mainImage = findViewById(R.id.mainImage); + coordinatorLayout = binding.coordinatorLayout; + mainLayout = binding.mainLayout; + cardIdFieldView = binding.cardIdView; + storeName = binding.storeName; + maximizeButton = binding.maximizeButton; + mainImage = binding.mainImage; mainImage.setClipToOutline(true); - dotIndicator = findViewById(R.id.dotIndicator); - minimizeButton = findViewById(R.id.minimizeButton); - collapsingToolbarLayout = findViewById(R.id.collapsingToolbarLayout); - appBarLayout = findViewById(R.id.app_bar_layout); - bottomAppBar = findViewById(R.id.bottom_app_bar); - iconImage = findViewById(R.id.icon_image); - portraitToolbar = findViewById(R.id.toolbar); - landscapeToolbar = findViewById(R.id.toolbar_landscape); + dotIndicator = binding.dotIndicator; + minimizeButton = binding.minimizeButton; + collapsingToolbarLayout = binding.collapsingToolbarLayout; + appBarLayout = binding.appBarLayout; + bottomAppBar = binding.bottomAppBar; + iconImage = binding.iconImage; + portraitToolbar = binding.toolbar; + landscapeToolbar = binding.toolbarLandscape; - bottomAppBarInfoButton = findViewById(R.id.button_show_info); - bottomAppBarPreviousButton = findViewById(R.id.button_previous); - bottomAppBarNextButton = findViewById(R.id.button_next); + bottomAppBarInfoButton = binding.buttonShowInfo; + bottomAppBarPreviousButton = binding.buttonPrevious; + bottomAppBarNextButton = binding.buttonNext; barcodeImageGenerationFinishedCallback = () -> { if (!(boolean) mainImage.getTag()) { @@ -370,8 +373,8 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements } }; - centerGuideline = findViewById(R.id.centerGuideline); - barcodeScaler = findViewById(R.id.barcodeScaler); + centerGuideline = binding.centerGuideline; + barcodeScaler = binding.barcodeScaler; barcodeScaler.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { @@ -409,7 +412,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements maximizeButton.setOnClickListener(v -> setFullscreen(true)); minimizeButton.setOnClickListener(v -> setFullscreen(false)); - editButton = findViewById(R.id.fabEdit); + editButton = binding.fabEdit; editButton.setOnClickListener(v -> { Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); Bundle bundle = new Bundle(); diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index ec9a101dd..95a796b72 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -12,6 +12,7 @@ import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; @@ -47,9 +48,16 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import protect.card_locker.databinding.ArchiveActivityBinding; +import protect.card_locker.databinding.ContentMainBinding; +import protect.card_locker.databinding.MainActivityBinding; +import protect.card_locker.databinding.SortingOptionBinding; import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener { + private MainActivityBinding binding; + private ArchiveActivityBinding archiveActivityBinding; + private ContentMainBinding contentMainBinding; private static final String TAG = "Catima"; public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent"; @@ -68,6 +76,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard private View mHelpSection; private View mNoMatchingCardsText; private View mNoGroupCardsText; + private TabLayout groupsTabLayout; private boolean mArchiveMode; public static final String BUNDLE_ARCHIVE_MODE = "archiveMode"; @@ -163,7 +172,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id); } - TabLayout.Tab tab = ((TabLayout) findViewById(R.id.groups)).getTabAt(selectedTab); + TabLayout.Tab tab = groupsTabLayout.getTabAt(selectedTab); mGroup = tab != null ? tab.getTag() : null; updateLoyaltyCardList(true); @@ -231,17 +240,22 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard SplashScreen.installSplashScreen(this); super.onCreate(inputSavedInstanceState); if(!mArchiveMode) { + binding = MainActivityBinding.inflate(getLayoutInflater()); setTitle(R.string.app_name); - setContentView(R.layout.main_activity); + setContentView(binding.getRoot()); + setSupportActionBar(binding.toolbar); + groupsTabLayout = binding.groups; + contentMainBinding = ContentMainBinding.bind(binding.include.getRoot()); } else{ + archiveActivityBinding = ArchiveActivityBinding.inflate(getLayoutInflater()); setTitle(R.string.archiveList); - setContentView(R.layout.archive_activity); + setContentView(archiveActivityBinding.getRoot()); + setSupportActionBar(archiveActivityBinding.toolbar); + groupsTabLayout = archiveActivityBinding.groups; + contentMainBinding = ContentMainBinding.bind(archiveActivityBinding.include.getRoot()); } - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - if(mArchiveMode){ ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -251,7 +265,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mDatabase = new DBHelper(this).getWritableDatabase(); - TabLayout groupsTabLayout = findViewById(R.id.groups); groupsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { @@ -283,10 +296,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard View.OnTouchListener gestureTouchListener = (v, event) -> mGestureDetector.onTouchEvent(event); - mHelpSection = findViewById(R.id.helpSection); - mNoMatchingCardsText = findViewById(R.id.noMatchingCardsText); - mNoGroupCardsText = findViewById(R.id.noGroupCardsText); - mCardList = findViewById(R.id.list); + mHelpSection = contentMainBinding.helpSection; + mNoMatchingCardsText = contentMainBinding.noMatchingCardsText; + mNoGroupCardsText = contentMainBinding.noGroupCardsText; + mCardList = contentMainBinding.list; mNoMatchingCardsText.setOnTouchListener(gestureTouchListener); mCardList.setOnTouchListener(gestureTouchListener); @@ -374,7 +387,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard } // Start of active tab logic - TabLayout groupsTabLayout = findViewById(R.id.groups); updateTabGroups(groupsTabLayout); // Restore settings from Shared Preference @@ -407,7 +419,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard // End of active tab logic if (!mArchiveMode) { - FloatingActionButton addButton = findViewById(R.id.fabAdd); + FloatingActionButton addButton = binding.fabAdd; addButton.setOnClickListener(v -> { Intent intent = new Intent(getApplicationContext(), ScanActivity.class); @@ -562,7 +574,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard public boolean onQueryTextChange(String newText) { mFilter = newText; - TabLayout groupsTabLayout = findViewById(R.id.groups); TabLayout.Tab currentTab = groupsTabLayout.getTabAt(groupsTabLayout.getSelectedTabPosition()); mGroup = currentTab != null ? currentTab.getTag() : null; @@ -612,10 +623,12 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(R.string.sort_by); - final View customLayout = getLayoutInflater().inflate(R.layout.sorting_option, null); + SortingOptionBinding sortingOptionBinding = SortingOptionBinding + .inflate(LayoutInflater.from(MainActivity.this), null, false); + final View customLayout = sortingOptionBinding.getRoot(); builder.setView(customLayout); - CheckBox showReversed = (CheckBox) customLayout.findViewById(R.id.checkBox_reverse); + CheckBox showReversed = sortingOptionBinding.checkBoxReverse; showReversed.setChecked(mOrderDirection == DBHelper.LoyaltyCardOrderDirection.Descending); @@ -736,7 +749,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard return false; } - TabLayout groupsTabLayout = findViewById(R.id.groups); if (groupsTabLayout.getTabCount() < 2) { return false; } diff --git a/app/src/main/java/protect/card_locker/ManageGroupActivity.java b/app/src/main/java/protect/card_locker/ManageGroupActivity.java index 4b5174dc4..c07843e49 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupActivity.java +++ b/app/src/main/java/protect/card_locker/ManageGroupActivity.java @@ -25,8 +25,11 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.RecyclerView; +import protect.card_locker.databinding.ActivityManageGroupBinding; + public class ManageGroupActivity extends CatimaAppCompatActivity implements ManageGroupCursorAdapter.CardAdapterListener { + private ActivityManageGroupBinding binding; private SQLiteDatabase mDatabase; private ManageGroupCursorAdapter mAdapter; @@ -43,17 +46,18 @@ public class ManageGroupActivity extends CatimaAppCompatActivity implements Mana @Override protected void onCreate(Bundle inputSavedInstanceState) { super.onCreate(inputSavedInstanceState); - setContentView(R.layout.activity_manage_group); - Toolbar toolbar = findViewById(R.id.toolbar); + binding = ActivityManageGroupBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; setSupportActionBar(toolbar); mDatabase = new DBHelper(this).getWritableDatabase(); - noGroupCardsText = findViewById(R.id.noGroupCardsText); - mCardList = findViewById(R.id.list); - FloatingActionButton saveButton = findViewById(R.id.fabSave); + noGroupCardsText = binding.include.noGroupCardsText; + mCardList = binding.include.list; + FloatingActionButton saveButton = binding.fabSave; - mGroupNameText = findViewById(R.id.editTextGroupName); + mGroupNameText = binding.editTextGroupName; mGroupNameText.addTextChangedListener(new TextWatcher() { @Override diff --git a/app/src/main/java/protect/card_locker/ManageGroupsActivity.java b/app/src/main/java/protect/card_locker/ManageGroupsActivity.java index 07b92bd93..afbb2fd0f 100644 --- a/app/src/main/java/protect/card_locker/ManageGroupsActivity.java +++ b/app/src/main/java/protect/card_locker/ManageGroupsActivity.java @@ -24,7 +24,10 @@ import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import protect.card_locker.databinding.ManageGroupsActivityBinding; + public class ManageGroupsActivity extends CatimaAppCompatActivity implements GroupCursorAdapter.GroupAdapterListener { + private ManageGroupsActivityBinding binding; private static final String TAG = "Catima"; private SQLiteDatabase mDatabase; @@ -35,9 +38,10 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + binding = ManageGroupsActivityBinding.inflate(getLayoutInflater()); setTitle(R.string.groups); - setContentView(R.layout.manage_groups_activity); - Toolbar toolbar = findViewById(R.id.toolbar); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -51,12 +55,12 @@ public class ManageGroupsActivity extends CatimaAppCompatActivity implements Gro protected void onResume() { super.onResume(); - FloatingActionButton addButton = findViewById(R.id.fabAdd); + FloatingActionButton addButton = binding.fabAdd; addButton.setOnClickListener(v -> createGroup()); addButton.bringToFront(); - mGroupList = findViewById(R.id.list); - mHelpText = findViewById(R.id.helpText); + mGroupList = binding.include.list; + mHelpText = binding.include.helpText; // Init group list RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); diff --git a/app/src/main/java/protect/card_locker/ScanActivity.java b/app/src/main/java/protect/card_locker/ScanActivity.java index a5a7df2d9..a3cc90648 100644 --- a/app/src/main/java/protect/card_locker/ScanActivity.java +++ b/app/src/main/java/protect/card_locker/ScanActivity.java @@ -26,6 +26,9 @@ import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; +import protect.card_locker.databinding.CustomBarcodeScannerBinding; +import protect.card_locker.databinding.ScanActivityBinding; + /** * Custom Scannner Activity extending from Activity to display a custom layout form scanner view. *

@@ -33,6 +36,8 @@ import androidx.appcompat.widget.Toolbar; * originally licensed under Apache 2.0 */ public class ScanActivity extends CatimaAppCompatActivity { + private ScanActivityBinding binding; + private CustomBarcodeScannerBinding customBarcodeScannerBinding; private static final String TAG = "Catima"; private CaptureManager capture; @@ -56,9 +61,11 @@ public class ScanActivity extends CatimaAppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + binding = ScanActivityBinding.inflate(getLayoutInflater()); + customBarcodeScannerBinding = CustomBarcodeScannerBinding.bind(binding.zxingBarcodeScanner); setTitle(R.string.scanCardBarcode); - setContentView(R.layout.scan_activity); - Toolbar toolbar = findViewById(R.id.toolbar); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -69,10 +76,10 @@ public class ScanActivity extends CatimaAppCompatActivity { manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData())); photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData())); - findViewById(R.id.add_from_image).setOnClickListener(this::addFromImage); - findViewById(R.id.add_manually).setOnClickListener(this::addManually); + customBarcodeScannerBinding.addFromImage.setOnClickListener(this::addFromImage); + customBarcodeScannerBinding.addManually.setOnClickListener(this::addManually); - barcodeScannerView = findViewById(R.id.zxing_barcode_scanner); + barcodeScannerView = binding.zxingBarcodeScanner; // Even though we do the actual decoding with the barcodeScannerView // CaptureManager needs to be running to show the camera and scanning bar diff --git a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java index 3d9d09529..4cc47c1a3 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -26,18 +26,21 @@ import protect.card_locker.CatimaAppCompatActivity; import protect.card_locker.MainActivity; import protect.card_locker.R; import protect.card_locker.Utils; +import protect.card_locker.databinding.SettingsActivityBinding; public class SettingsActivity extends CatimaAppCompatActivity { + private SettingsActivityBinding binding; private final static String RELOAD_MAIN_STATE = "mReloadMain"; private SettingsFragment fragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + binding = SettingsActivityBinding.inflate(getLayoutInflater()); setTitle(R.string.settings); - setContentView(R.layout.settings_activity); - Toolbar toolbar = findViewById(R.id.toolbar); + setContentView(binding.getRoot()); + Toolbar toolbar = binding.toolbar; setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { diff --git a/app/src/main/res/layout/archive_activity.xml b/app/src/main/res/layout/archive_activity.xml index bc4e3e86e..03ae97283 100644 --- a/app/src/main/res/layout/archive_activity.xml +++ b/app/src/main/res/layout/archive_activity.xml @@ -27,6 +27,8 @@ - + diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index b9a960aad..86a0cc8ad 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -36,6 +36,8 @@ - + diff --git a/app/src/main/res/layout/manage_groups_activity.xml b/app/src/main/res/layout/manage_groups_activity.xml index 4142e5e8e..df265ba36 100644 --- a/app/src/main/res/layout/manage_groups_activity.xml +++ b/app/src/main/res/layout/manage_groups_activity.xml @@ -29,6 +29,8 @@ - + From f63a25f5829ee9bdace7cf71c1b8bf6f5333cc2c Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sun, 2 Oct 2022 18:12:02 +0530 Subject: [PATCH 5/6] gradle: Move lint params to specific config Signed-off-by: Aayush Gupta --- app/build.gradle | 3 +-- app/lint.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 app/lint.xml diff --git a/app/build.gradle b/app/build.gradle index c77b9f489..1e85d85bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,8 +59,7 @@ android { } lintOptions { - disable "GoogleAppIndexingWarning", "ButtonStyle", "AlwaysShowAction", - "MissingTranslation", "MissingPrefix" + lintConfig file("lint.xml") } sourceSets { diff --git a/app/lint.xml b/app/lint.xml new file mode 100644 index 000000000..c1c28e55d --- /dev/null +++ b/app/lint.xml @@ -0,0 +1,8 @@ + + + + + + + + From 887424af80befe9b9e99b4a2181796c80e26bcd6 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 4 Oct 2022 23:49:20 +0530 Subject: [PATCH 6/6] spotbugs: Exclude gradle generated view binding classes Spot bugs complains about EI_EXPOSE_REP and BC_UNCONFIRMED_CAST bugs in these classes but they are being generated by Gradle and are out of our control if we want to use view binding to interact with the views. Ref: https://developer.android.com/topic/libraries/view-binding Signed-off-by: Aayush Gupta --- app/config/spotbugs/exclude.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/config/spotbugs/exclude.xml b/app/config/spotbugs/exclude.xml index 8f7997b7c..dbcb297d4 100644 --- a/app/config/spotbugs/exclude.xml +++ b/app/config/spotbugs/exclude.xml @@ -6,5 +6,8 @@ + + +