From 1b0fd94a8c3d55805b933478b23b456eb5830c2b Mon Sep 17 00:00:00 2001 From: Marnes Date: Fri, 1 Nov 2024 18:27:33 +0100 Subject: [PATCH 1/7] misc. linting --- .../main/java/protect/card_locker/preferences/Settings.java | 6 ++++-- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/xml/preferences.xml | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/protect/card_locker/preferences/Settings.java b/app/src/main/java/protect/card_locker/preferences/Settings.java index 52309886e..33949c573 100644 --- a/app/src/main/java/protect/card_locker/preferences/Settings.java +++ b/app/src/main/java/protect/card_locker/preferences/Settings.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.SharedPreferences; import androidx.annotation.IntegerRes; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatDelegate; import androidx.preference.PreferenceManager; @@ -15,7 +16,7 @@ import protect.card_locker.Utils; public class Settings { private final Context mContext; - private SharedPreferences mSettings; + private final SharedPreferences mSettings; public Settings(Context context) { mContext = context.getApplicationContext(); @@ -42,10 +43,11 @@ public class Settings { return mSettings.getBoolean(getResString(keyId), defaultValue); } + @Nullable public Locale getLocale() { String value = getString(R.string.settings_key_locale, ""); - if (value.length() == 0) { + if (value.isEmpty()) { return null; } diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index cfdcc6a3c..318b4a930 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -294,4 +294,4 @@ Gebruik achterzijde van kaart Verwissel kaart met de volume knoppen Gebruik de volume knoppen om te wisselen van getoonde kaart - \ No newline at end of file + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 554592d55..67dc50270 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -112,4 +112,4 @@ - \ No newline at end of file + From 6f456437f774ba9dbfe3e360aad9c1554bc4b168 Mon Sep 17 00:00:00 2001 From: Marnes Date: Tue, 29 Oct 2024 21:50:52 +0100 Subject: [PATCH 2/7] implement #1952: custom column count --- .../card_locker/CardShortcutConfigure.java | 21 ++++++++++------ .../protect/card_locker/MainActivity.java | 9 +++++++ .../main/java/protect/card_locker/Utils.java | 14 ++++++++--- .../card_locker/preferences/Settings.java | 19 ++++++++++++++ app/src/main/res/values/settings.xml | 22 ++++++++++++++++ app/src/main/res/values/strings.xml | 14 +++++++++++ app/src/main/res/xml/preferences.xml | 25 +++++++++++++++++++ 7 files changed, 112 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 14d8d7e85..53ac7526e 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -12,9 +12,9 @@ import androidx.appcompat.widget.Toolbar; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import protect.card_locker.databinding.SimpleToolbarListActivityBinding; +import protect.card_locker.preferences.Settings; /** * The configuration screen for creating a shortcut. @@ -47,15 +47,20 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo finish(); } - final RecyclerView cardList = binding.list; - GridLayoutManager layoutManager = (GridLayoutManager) cardList.getLayoutManager(); - if (layoutManager != null) { - layoutManager.setSpanCount(getResources().getInteger(R.integer.main_view_card_columns)); - } - Cursor cardCursor = DBHelper.getLoyaltyCardCursor(mDatabase, DBHelper.LoyaltyCardArchiveFilter.All); mAdapter = new LoyaltyCardCursorAdapter(this, cardCursor, this, null); - cardList.setAdapter(mAdapter); + binding.list.setAdapter(mAdapter); + } + + @Override + protected void onResume() { + super.onResume(); + + var layoutManager = (GridLayoutManager) binding.list.getLayoutManager(); + if (layoutManager != null) { + var settings = new Settings(this); + layoutManager.setSpanCount(settings.getPreferredColumnCount()); + } } private void onClickAction(int position) { diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 6b8ff2c79..33090620d 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -27,6 +27,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.SearchView; import androidx.core.splashscreen.SplashScreen; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -43,6 +44,7 @@ import java.util.concurrent.atomic.AtomicInteger; import protect.card_locker.databinding.ContentMainBinding; import protect.card_locker.databinding.MainActivityBinding; import protect.card_locker.databinding.SortingOptionBinding; +import protect.card_locker.preferences.Settings; import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener { @@ -357,6 +359,12 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mBarcodeScannerLauncher.launch(intent); }); addButton.bringToFront(); + + var layoutManager = (GridLayoutManager) mCardList.getLayoutManager(); + if (layoutManager != null) { + var settings = new Settings(this); + layoutManager.setSpanCount(settings.getPreferredColumnCount()); + } } private void displayCardSetupOptions(Menu menu, boolean shouldShow) { @@ -369,6 +377,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mLoyaltyCardCount = DBHelper.getLoyaltyCardCount(mDatabase); } + // TODO isn't this called too often, in onResume AND onCreate? private void updateLoyaltyCardList(boolean updateCount) { Group group = null; if (mGroup != null) { diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 116f60add..fc5d130a4 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -946,16 +946,22 @@ public class Utils { // This is necessary because Android's auto sizing will split over lines way before reaching the minimum font size and store names split over multiple lines are harder to scan with a quick glance so we should try to prevent it // Because we have to write the text before we can actually know the exact laid out size (trying to delay this causes bugs where the autosize fails) we have to take some... weird shortcuts + var settings = new Settings(context); // At this point textWhenNoImage.getWidth() still returns 0, so we cheat by calculating the whole width of the screen and then dividing it by the amount of columns - int textviewWidth = Resources.getSystem().getDisplayMetrics().widthPixels / context.getResources().getInteger(R.integer.main_view_card_columns); + int columnWidth = Resources.getSystem().getDisplayMetrics().widthPixels / settings.getPreferredColumnCount(); // Calculate how wide a character is and calculate how many characters fit in a line + // text size is generally based on height, so setting 1:1 as width may be fishy int characterWidth = TextViewCompat.getAutoSizeMinTextSize(textWhenNoImage); - int maxWidthPerLine = textviewWidth - textWhenNoImage.getPaddingStart() - textWhenNoImage.getPaddingEnd(); + int maxWidthPerLine = columnWidth - textWhenNoImage.getPaddingStart() - textWhenNoImage.getPaddingEnd(); - // Set amount of lines based on what could fit at most - int maxLines = ((loyaltyCard.store.length() * characterWidth) / maxWidthPerLine) + 1; + // Set number of lines based on what could fit at most + int fullTextWidth = loyaltyCard.store.length() * characterWidth; + int maxLines = (fullTextWidth / maxWidthPerLine) + 1; + // default of 20dp crushes the text + var relativePadding = (int) (columnWidth * 0.1); textWhenNoImage.setMaxLines(maxLines); + textWhenNoImage.setPadding(relativePadding, relativePadding, relativePadding, relativePadding); // Actually set the text and colour textWhenNoImage.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/protect/card_locker/preferences/Settings.java b/app/src/main/java/protect/card_locker/preferences/Settings.java index 33949c573..3a00307d9 100644 --- a/app/src/main/java/protect/card_locker/preferences/Settings.java +++ b/app/src/main/java/protect/card_locker/preferences/Settings.java @@ -1,7 +1,10 @@ package protect.card_locker.preferences; +import static android.content.res.Configuration.ORIENTATION_PORTRAIT; + import android.content.Context; import android.content.SharedPreferences; +import android.util.Log; import androidx.annotation.IntegerRes; import androidx.annotation.Nullable; @@ -15,6 +18,7 @@ import protect.card_locker.R; import protect.card_locker.Utils; public class Settings { + private static final String TAG = "Catima"; private final Context mContext; private final SharedPreferences mSettings; @@ -94,6 +98,21 @@ public class Settings { return getString(R.string.setting_key_theme_color, mContext.getResources().getString(R.string.settings_key_system_theme)); } + public int getPreferredColumnCount() { + var defaultSymbol = mContext.getResources().getString(R.string.settings_key_automatic_column_count); + var defaultColumnCount = mContext.getResources().getInteger(R.integer.main_view_card_columns); + var orientation = mContext.getResources().getConfiguration().orientation; + var columnCountPrefKey = orientation == ORIENTATION_PORTRAIT ? R.string.setting_key_column_count_portrait : R.string.setting_key_column_count_landscape; + var columnCountSetting = getString(columnCountPrefKey, defaultSymbol); + try { + // the pref may be unset or explicitly set to default + return columnCountSetting.equals(defaultSymbol) ? defaultColumnCount : Integer.parseInt(columnCountSetting); + } catch (NumberFormatException nfe) { + Log.e(TAG, "Failed to parseInt the column count pref", nfe); + return defaultColumnCount; + } + } + public boolean useVolumeKeysForNavigation() { return getBoolean(R.string.settings_key_use_volume_keys_navigation, false); } diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index c88566e05..b469a0313 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -36,6 +36,28 @@ @string/settings_brown_theme + + @string/settings_key_automatic_column_count + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + @string/settings_automatic_column_count + @string/settings_column_count_1 + @string/settings_column_count_2 + @string/settings_column_count_3 + @string/settings_column_count_4 + @string/settings_column_count_5 + @string/settings_column_count_6 + @string/settings_column_count_7 + + @string/settings_key_system_theme @string/settings_key_pink_theme diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 783c02770..0b7b08e16 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -318,6 +318,20 @@ sharedpreference_card_details_show_validity sharedpreference_card_details_show_archived_cards Card view + Cards overview + Columns in portrait mode + Columns in landscape mode + Automatic + default + 1 + 2 + 3 + 4 + 5 + 6 + 7 + pref_column_count_portrait + pref_column_count_landscape General Privacy Display options diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 67dc50270..d5a2a2a34 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -46,6 +46,31 @@ app:useSimpleSummaryProvider="true" /> + + + + + + + From faee01cde24bcae926545753e0b6e62473d3e29d Mon Sep 17 00:00:00 2001 From: Marnes Date: Fri, 1 Nov 2024 18:51:26 +0100 Subject: [PATCH 3/7] implement #1952: better values between portrait and landscape --- app/src/main/res/values/settings.xml | 20 ++++++++++++++++---- app/src/main/res/xml/preferences.xml | 8 ++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index b469a0313..ada5422e6 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -36,21 +36,33 @@ @string/settings_brown_theme - + @string/settings_key_automatic_column_count 1 2 3 4 + + + + @string/settings_automatic_column_count + @string/settings_column_count_1 + @string/settings_column_count_2 + @string/settings_column_count_3 + @string/settings_column_count_4 + + + + @string/settings_key_automatic_column_count + 3 + 4 5 6 7 - + @string/settings_automatic_column_count - @string/settings_column_count_1 - @string/settings_column_count_2 @string/settings_column_count_3 @string/settings_column_count_4 @string/settings_column_count_5 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index d5a2a2a34..37035535d 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -54,8 +54,8 @@ android:key="@string/setting_key_column_count_portrait" android:title="@string/settings_column_count_portrait" android:defaultValue="@string/settings_key_automatic_column_count" - android:entries="@array/column_count_value_strings" - android:entryValues="@array/column_count_values" + android:entries="@array/column_count_portrait_value_strings" + android:entryValues="@array/column_count_portrait_values" app:iconSpaceReserved="false" app:singleLineTitle="false" app:useSimpleSummaryProvider="true" /> @@ -64,8 +64,8 @@ android:key="@string/setting_key_column_count_landscape" android:title="@string/settings_column_count_landscape" android:defaultValue="@string/settings_key_automatic_column_count" - android:entries="@array/column_count_value_strings" - android:entryValues="@array/column_count_values" + android:entries="@array/column_count_landscape_value_strings" + android:entryValues="@array/column_count_landscape_values" app:iconSpaceReserved="false" app:singleLineTitle="false" app:useSimpleSummaryProvider="true" /> From 328c110a97902df73fb92dfd13f25c09c829ab42 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Fri, 1 Nov 2024 22:32:05 +0100 Subject: [PATCH 4/7] General cleanups --- app/src/main/java/protect/card_locker/MainActivity.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 33090620d..4a21297a6 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -251,9 +251,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mCardList.setAdapter(mAdapter); registerForContextMenu(mCardList); - mGroup = null; - updateLoyaltyCardList(true); - mBarcodeScannerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { // Exit early if the user cancelled the scan (pressed back/home) if (result.getResultCode() != RESULT_OK) { @@ -377,7 +374,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard mLoyaltyCardCount = DBHelper.getLoyaltyCardCount(mDatabase); } - // TODO isn't this called too often, in onResume AND onCreate? private void updateLoyaltyCardList(boolean updateCount) { Group group = null; if (mGroup != null) { From dc65030a63c39e9781e8921aab27c6973f02b336 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Fri, 1 Nov 2024 22:35:33 +0100 Subject: [PATCH 5/7] Padding fixes to ensure the cards scale well without changing text size in LoyaltyCardViewActivity --- .../protect/card_locker/LoyaltyCardCursorAdapter.java | 9 ++------- .../protect/card_locker/LoyaltyCardViewActivity.java | 2 +- app/src/main/java/protect/card_locker/Utils.java | 8 ++------ app/src/main/res/layout/loyalty_card_layout.xml | 3 ++- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java index 5ecb89d01..9bd1c8ff1 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardCursorAdapter.java @@ -30,6 +30,7 @@ import java.text.DateFormat; import java.util.ArrayList; import protect.card_locker.databinding.LoyaltyCardLayoutBinding; +import protect.card_locker.preferences.Settings; public class LoyaltyCardCursorAdapter extends BaseCursorAdapter { private int mCurrentSelectedIndex = -1; @@ -123,7 +124,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter + android:padding="10dp" /> Date: Fri, 1 Nov 2024 22:36:12 +0100 Subject: [PATCH 6/7] Set default card columns to 4 on big screens --- app/src/main/res/values-w600dp/integers.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-w600dp/integers.xml b/app/src/main/res/values-w600dp/integers.xml index 1993bae6f..536133da9 100644 --- a/app/src/main/res/values-w600dp/integers.xml +++ b/app/src/main/res/values-w600dp/integers.xml @@ -1,4 +1,4 @@ - 3 + 4 \ No newline at end of file From d7b8cd7e03bf496830afaf08e6e40015ce0c6fe1 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Sat, 2 Nov 2024 13:45:25 +0100 Subject: [PATCH 7/7] More consistant naming and column edge case bugfix for shortcut picker --- .../java/protect/card_locker/CardShortcutConfigure.java | 6 +++--- ...st_activity.xml => card_shortcut_configure_activity.xml} | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename app/src/main/res/layout/{simple_toolbar_list_activity.xml => card_shortcut_configure_activity.xml} (95%) diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 53ac7526e..38e0d71d5 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -13,14 +13,14 @@ import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; import androidx.recyclerview.widget.GridLayoutManager; -import protect.card_locker.databinding.SimpleToolbarListActivityBinding; +import protect.card_locker.databinding.CardShortcutConfigureActivityBinding; import protect.card_locker.preferences.Settings; /** * The configuration screen for creating a shortcut. */ public class CardShortcutConfigure extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener { - private SimpleToolbarListActivityBinding binding; + private CardShortcutConfigureActivityBinding binding; static final String TAG = "Catima"; private SQLiteDatabase mDatabase; private LoyaltyCardCursorAdapter mAdapter; @@ -28,7 +28,7 @@ public class CardShortcutConfigure extends CatimaAppCompatActivity implements Lo @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); - binding = SimpleToolbarListActivityBinding.inflate(getLayoutInflater()); + binding = CardShortcutConfigureActivityBinding.inflate(getLayoutInflater()); mDatabase = new DBHelper(this).getReadableDatabase(); // Set the result to CANCELED. This will cause nothing to happen if the diff --git a/app/src/main/res/layout/simple_toolbar_list_activity.xml b/app/src/main/res/layout/card_shortcut_configure_activity.xml similarity index 95% rename from app/src/main/res/layout/simple_toolbar_list_activity.xml rename to app/src/main/res/layout/card_shortcut_configure_activity.xml index d8d8eb541..07f2559b2 100644 --- a/app/src/main/res/layout/simple_toolbar_list_activity.xml +++ b/app/src/main/res/layout/card_shortcut_configure_activity.xml @@ -27,7 +27,7 @@