From 6f456437f774ba9dbfe3e360aad9c1554bc4b168 Mon Sep 17 00:00:00 2001 From: Marnes Date: Tue, 29 Oct 2024 21:50:52 +0100 Subject: [PATCH] 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" /> + + + + + + +