diff --git a/app/build.gradle b/app/build.gradle index a5ada6698..2bd5c10c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,6 +77,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + implementation 'androidx.exifinterface:exifinterface:1.3.3' implementation 'androidx.preference:preference:1.1.1' implementation 'com.google.android.material:material:1.4.0' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' @@ -86,7 +87,7 @@ dependencies { implementation 'com.google.zxing:core:3.4.1' implementation 'org.apache.commons:commons-csv:1.8' implementation 'com.jaredrummler:colorpicker:1.1.0' - implementation 'com.github.invissvenska:NumberPickerPreference:1.0.2' + implementation 'com.github.invissvenska:NumberPickerPreference:1.0.3' implementation 'net.lingala.zip4j:zip4j:2.8.0' // SpotBugs diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java index 31d79de36..24f898edc 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java @@ -4,8 +4,6 @@ import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.util.Pair; import android.view.MenuItem; @@ -94,14 +92,8 @@ public class BarcodeSelectorActivity extends AppCompatActivity barcodeViewMap.put(BarcodeFormat.UPC_E.name(), new Pair<>(R.id.upceBarcode, R.id.upceBarcodeText)); EditText cardId = findViewById(R.id.cardId); - cardId.addTextChangedListener(new TextWatcher() + cardId.addTextChangedListener(new SimpleTextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) - { - // Noting to do - } - @Override public void onTextChanged(CharSequence s, int start, int before, int count) { @@ -113,12 +105,6 @@ public class BarcodeSelectorActivity extends AppCompatActivity setButtonListener(noBarcodeButtonView, s.toString()); noBarcodeButtonView.setEnabled(s.length() > 0); } - - @Override - public void afterTextChanged(Editable s) - { - // Noting to do - } }); final Bundle b = getIntent().getExtras(); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index 84075b1a3..b51e273e4 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -12,7 +12,6 @@ import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; -import android.media.ExifInterface; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -21,7 +20,6 @@ import android.os.LocaleList; import android.provider.MediaStore; import android.text.Editable; import android.text.InputType; -import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -71,6 +69,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.content.FileProvider; +import androidx.exifinterface.media.ExifInterface; import androidx.fragment.app.DialogFragment; public class LoyaltyCardEditActivity extends AppCompatActivity @@ -248,34 +247,22 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } }; - storeFieldEdit.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } - + storeFieldEdit.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { updateTempState(LoyaltyCardField.store, s.toString()); generateIcon(s.toString()); } - - @Override - public void afterTextChanged(Editable s) { } }); - noteFieldEdit.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } - + noteFieldEdit.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { updateTempState(LoyaltyCardField.note, s.toString()); } - - @Override - public void afterTextChanged(Editable s) { } }); - expiryField.addTextChangedListener(new TextWatcher() { + expiryField.addTextChangedListener(new SimpleTextWatcher() { CharSequence lastValue; @Override @@ -314,10 +301,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } }); - balanceField.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } - + balanceField.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { @@ -330,15 +314,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity e.printStackTrace(); } } - - @Override - public void afterTextChanged(Editable s) { } }); - balanceCurrencyField.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } - + balanceCurrencyField.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Currency currency; @@ -394,7 +372,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } }); - cardIdFieldView.addTextChangedListener(new TextWatcher() { + cardIdFieldView.addTextChangedListener(new SimpleTextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { if (initDone && !onResuming) { @@ -414,12 +392,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity public void onTextChanged(CharSequence s, int start, int before, int count) { updateTempState(LoyaltyCardField.cardId, s.toString()); } - - @Override - public void afterTextChanged(Editable s) { } }); - barcodeIdField.addTextChangedListener(new TextWatcher() { + barcodeIdField.addTextChangedListener(new SimpleTextWatcher() { CharSequence lastValue; @Override @@ -478,10 +453,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity } }); - barcodeTypeField.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } - + barcodeTypeField.addTextChangedListener(new SimpleTextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!s.toString().isEmpty()) { diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 541bb9f49..63687dc8b 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -29,6 +29,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -340,7 +341,7 @@ public class MainActivity extends AppCompatActivity implements LoyaltyCardCursor MenuItem searchItem = mMenu.findItem(R.id.action_search); searchItem.collapseActionView(); } - recreate(); + ActivityCompat.recreate(this); return; } diff --git a/app/src/main/java/protect/card_locker/ShortcutHelper.java b/app/src/main/java/protect/card_locker/ShortcutHelper.java index 915e57526..5c8d61987 100644 --- a/app/src/main/java/protect/card_locker/ShortcutHelper.java +++ b/app/src/main/java/protect/card_locker/ShortcutHelper.java @@ -1,13 +1,12 @@ package protect.card_locker; -import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; -import android.content.pm.ShortcutInfo; -import android.content.pm.ShortcutManager; import android.graphics.Bitmap; -import android.graphics.drawable.Icon; -import android.os.Build; + +import androidx.core.content.pm.ShortcutInfoCompat; +import androidx.core.content.pm.ShortcutManagerCompat; +import androidx.core.graphics.drawable.IconCompat; import java.util.Collections; import java.util.Comparator; @@ -30,13 +29,9 @@ class ShortcutHelper * card exceeds the max number of shortcuts, then the least recently * used card shortcut is discarded. */ - @TargetApi(25) static void updateShortcuts(Context context, LoyaltyCard card, Intent intent) { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) - { - ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class); - LinkedList list = new LinkedList<>(shortcutManager.getDynamicShortcuts()); + LinkedList list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context)); DBHelper dbHelper = new DBHelper(context); @@ -44,21 +39,7 @@ class ShortcutHelper // Sort the shortcuts by rank, so working with the relative order will be easier. // This sorts so that the lowest rank is first. - Collections.sort(list, new Comparator() - { - @Override - public int compare(ShortcutInfo o1, ShortcutInfo o2) - { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) - { - return o1.getRank() - o2.getRank(); - } - else - { - return 0; - } - } - }); + Collections.sort(list, Comparator.comparingInt(ShortcutInfoCompat::getRank)); Integer foundIndex = null; @@ -77,7 +58,7 @@ class ShortcutHelper // If the item is already found, then the list needs to be // reordered, so that the selected item now has the lowest // rank, thus letting it survive longer. - ShortcutInfo found = list.remove(foundIndex.intValue()); + ShortcutInfoCompat found = list.remove(foundIndex.intValue()); list.addFirst(found); } else @@ -90,7 +71,7 @@ class ShortcutHelper list.pollLast(); } - ShortcutInfo shortcut = new ShortcutInfo.Builder(context, Integer.toString(card.id)) + ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(context, Integer.toString(card.id)) .setShortLabel(card.store) .setLongLabel(card.store) .setIntent(intent) @@ -99,53 +80,49 @@ class ShortcutHelper list.addFirst(shortcut); } - LinkedList finalList = new LinkedList<>(); + LinkedList finalList = new LinkedList<>(); // The ranks are now updated; the order in the list is the rank. for(int index = 0; index < list.size(); index++) { - ShortcutInfo prevShortcut = list.get(index); + ShortcutInfoCompat prevShortcut = list.get(index); Intent shortcutIntent = prevShortcut.getIntent(); Bitmap iconBitmap = Utils.generateIcon(context, dbHelper.getLoyaltyCard(Integer.parseInt(prevShortcut.getId())), true).getLetterTile(); - Icon icon; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { - icon = Icon.createWithAdaptiveBitmap(iconBitmap); - } else { - icon = Icon.createWithBitmap(iconBitmap); - } + + IconCompat icon = IconCompat.createWithAdaptiveBitmap(iconBitmap); // Prevent instances of the view activity from piling up; if one exists let this // one replace it. shortcutIntent.setFlags(shortcutIntent.getFlags() | Intent.FLAG_ACTIVITY_SINGLE_TOP); - ShortcutInfo updatedShortcut = new ShortcutInfo.Builder(context, prevShortcut.getId()) - .setShortLabel(prevShortcut.getShortLabel()) - .setLongLabel(prevShortcut.getLongLabel()) - .setIntent(shortcutIntent) - .setIcon(icon) - .setRank(index) - .build(); + final CharSequence longLabel = prevShortcut.getLongLabel(); + + ShortcutInfoCompat updatedShortcut = null; + if (longLabel != null) { + updatedShortcut = new ShortcutInfoCompat.Builder(context, prevShortcut.getId()) + .setShortLabel(prevShortcut.getShortLabel()) + .setLongLabel(longLabel) + .setIntent(shortcutIntent) + .setIcon(icon) + .setRank(index) + .build(); + } finalList.addLast(updatedShortcut); } - shortcutManager.setDynamicShortcuts(finalList); - } + ShortcutManagerCompat.setDynamicShortcuts(context, finalList); } /** * Remove the given card id from the app shortcuts, if such a * shortcut exists. */ - @TargetApi(25) static void removeShortcut(Context context, int cardId) { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) - { - ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class); - List list = shortcutManager.getDynamicShortcuts(); + List list = ShortcutManagerCompat.getDynamicShortcuts(context); String shortcutId = Integer.toString(cardId); @@ -158,7 +135,6 @@ class ShortcutHelper } } - shortcutManager.setDynamicShortcuts(list); - } + ShortcutManagerCompat.setDynamicShortcuts(context, list); } } diff --git a/app/src/main/java/protect/card_locker/SimpleTextWatcher.java b/app/src/main/java/protect/card_locker/SimpleTextWatcher.java new file mode 100644 index 000000000..d6483b4a8 --- /dev/null +++ b/app/src/main/java/protect/card_locker/SimpleTextWatcher.java @@ -0,0 +1,15 @@ +package protect.card_locker; + +import android.text.Editable; +import android.text.TextWatcher; + +public class SimpleTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { } + + @Override + public void afterTextChanged(Editable s) { } +} diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index f948acfe8..93e61613e 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -7,7 +7,6 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; -import android.media.ExifInterface; import android.provider.MediaStore; import android.util.Log; import android.widget.Toast; @@ -34,6 +33,7 @@ import java.util.GregorianCalendar; import java.util.HashMap; import androidx.core.graphics.ColorUtils; +import androidx.exifinterface.media.ExifInterface; public class Utils { private static final String TAG = "Catima"; 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 c6f7fb776..b9198cb2c 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -6,6 +6,7 @@ import android.view.MenuItem; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.app.ActivityCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; @@ -79,7 +80,7 @@ public class SettingsActivity extends AppCompatActivity FragmentActivity activity = getActivity(); if (activity != null) { - activity.recreate(); + ActivityCompat.recreate(activity); } return true; } diff --git a/build.gradle b/build.gradle index 3c3650631..80f0a7843 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { repositories { google() - jcenter() + mavenCentral() maven { url "https://jitpack.io" } gradlePluginPortal() } @@ -20,6 +20,7 @@ buildscript { allprojects { repositories { google() + mavenCentral() maven { url "https://jitpack.io" } gradlePluginPortal() }