diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bde2f7536d..a6c8f4f9ba 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,6 +35,7 @@ + diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java index f2cccdf1ea..cdc7c1b19d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/loyaltycards/LoyaltyCardsSettingsFragment.java @@ -74,7 +74,7 @@ public class LoyaltyCardsSettingsFragment extends PreferenceFragmentCompat { private GBDevice device; private void setSettingsFileSuffix(final String settingsFileSuffix) { - Bundle args = new Bundle(); + final Bundle args = new Bundle(); args.putString("settingsFileSuffix", settingsFileSuffix); setArguments(args); } @@ -113,45 +113,52 @@ static LoyaltyCardsSettingsFragment newInstance(GBDevice device) { return fragment; } - protected void reloadPreferences(String catimaPackageName) { + protected void reloadPreferences(final String catimaPackageName) { final CatimaManager catimaManager = new CatimaManager(requireContext()); final List installedCatimaPackages = catimaManager.findInstalledCatimaPackages(); final boolean catimaInstalled = !installedCatimaPackages.isEmpty(); - final ListPreference catimaPackage = findPreference(LOYALTY_CARDS_CATIMA_PACKAGE); - CatimaContentProvider catima = null; + final ListPreference catimaPackagePreference = findPreference(LOYALTY_CARDS_CATIMA_PACKAGE); - if (catimaPackage != null) { - catimaPackage.setEntries(installedCatimaPackages.toArray(new CharSequence[0])); - catimaPackage.setEntryValues(installedCatimaPackages.toArray(new CharSequence[0])); - catimaPackage.setOnPreferenceChangeListener((preference, newValue) -> { - LOG.info("Catima package changed to {}", newValue); + if (catimaPackagePreference != null) { + catimaPackagePreference.setEntries(installedCatimaPackages.toArray(new CharSequence[0])); + catimaPackagePreference.setEntryValues(installedCatimaPackages.toArray(new CharSequence[0])); + catimaPackagePreference.setVisible(installedCatimaPackages.size() > 1); + catimaPackagePreference.setOnPreferenceChangeListener((preference, newValue) -> { + LOG.info("Catima package preference changed to {}", newValue); reloadPreferences((String) newValue); return true; }); if (catimaInstalled) { // Ensure the currently selected value is actually an installed Catima package - if (StringUtils.isNullOrEmpty(catimaPackage.getValue()) || !installedCatimaPackages.contains(catimaPackage.getValue())) { - catimaPackage.setValue(installedCatimaPackages.get(0).toString()); + if (StringUtils.isNullOrEmpty(catimaPackagePreference.getValue()) || !installedCatimaPackages.contains(catimaPackagePreference.getValue())) { + catimaPackagePreference.setValue(installedCatimaPackages.get(0).toString()); } } + } - if (installedCatimaPackages.size() <= 1) { - catimaPackage.setVisible(false); - } + final String finalCatimaPackageName; - catima = new CatimaContentProvider(requireContext(), catimaPackageName != null ? catimaPackageName : catimaPackage.getValue()); + if (catimaPackageName != null) { + finalCatimaPackageName = catimaPackageName; + } else if (catimaPackagePreference != null) { + finalCatimaPackageName = catimaPackagePreference.getValue(); + } else { + LOG.warn("This should never happen - catima package not found"); + finalCatimaPackageName = "this.should.never.happen"; } - final Preference openCatima = findPreference(LOYALTY_CARDS_OPEN_CATIMA); - if (openCatima != null) { - openCatima.setVisible(catimaInstalled); - openCatima.setOnPreferenceClickListener(preference -> { - if (catimaPackage != null) { + final CatimaContentProvider catima = new CatimaContentProvider(requireContext(), finalCatimaPackageName); + + final Preference openCatimaPreference = findPreference(LOYALTY_CARDS_OPEN_CATIMA); + if (openCatimaPreference != null) { + openCatimaPreference.setVisible(catimaInstalled); + openCatimaPreference.setOnPreferenceClickListener(preference -> { + if (catimaPackagePreference != null) { final PackageManager packageManager = requireContext().getPackageManager(); - final Intent launchIntent = packageManager.getLaunchIntentForPackage(catimaPackageName != null ? catimaPackageName : catimaPackage.getValue()); + final Intent launchIntent = packageManager.getLaunchIntentForPackage(finalCatimaPackageName); if (launchIntent != null) { startActivity(launchIntent); } @@ -160,44 +167,44 @@ protected void reloadPreferences(String catimaPackageName) { }); } - final Preference catimaNotInstalled = findPreference(LOYALTY_CARDS_CATIMA_NOT_INSTALLED); - if (catimaNotInstalled != null) { - catimaNotInstalled.setVisible(!catimaInstalled); + final Preference catimaNotInstalledPreference = findPreference(LOYALTY_CARDS_CATIMA_NOT_INSTALLED); + if (catimaNotInstalledPreference != null) { + catimaNotInstalledPreference.setVisible(!catimaInstalled); } - final Preference installCatima = findPreference(LOYALTY_CARDS_INSTALL_CATIMA); - if (installCatima != null) { - installCatima.setVisible(!catimaInstalled); - installCatima.setOnPreferenceClickListener(preference -> { + final Preference installCatimaPreference = findPreference(LOYALTY_CARDS_INSTALL_CATIMA); + if (installCatimaPreference != null) { + installCatimaPreference.setVisible(!catimaInstalled); + installCatimaPreference.setOnPreferenceClickListener(preference -> { installCatima(); return true; }); } - final boolean permissionGranted = ContextCompat.checkSelfPermission(requireContext(), CatimaContentProvider.PERMISSION_READ_CARDS) == PackageManager.PERMISSION_GRANTED; - final Preference catimaPermissions = findPreference(LOYALTY_CARDS_CATIMA_PERMISSIONS); - if (catimaPermissions != null) { - catimaPermissions.setVisible(catimaInstalled && !permissionGranted); - catimaPermissions.setOnPreferenceClickListener(preference -> { + final boolean permissionGranted = ContextCompat.checkSelfPermission(requireContext(), catima.getReadPermission()) == PackageManager.PERMISSION_GRANTED; + final Preference catimaPermissionsPreference = findPreference(LOYALTY_CARDS_CATIMA_PERMISSIONS); + if (catimaPermissionsPreference != null) { + catimaPermissionsPreference.setVisible(catimaInstalled && !permissionGranted); + catimaPermissionsPreference.setOnPreferenceClickListener(preference -> { ActivityCompat.requestPermissions( requireActivity(), - new String[]{CatimaContentProvider.PERMISSION_READ_CARDS}, + new String[]{catima.getReadPermission()}, LoyaltyCardsSettingsActivity.PERMISSION_REQUEST_CODE ); return true; }); } - final boolean catimaCompatible = catima != null && catima.isCatimaCompatible(); - final Preference catimaNotCompatible = findPreference(LOYALTY_CARDS_CATIMA_NOT_COMPATIBLE); - if (catimaNotCompatible != null) { - catimaNotCompatible.setVisible(catimaInstalled && permissionGranted && !catimaCompatible); + final boolean catimaCompatible = catima.isCatimaCompatible(); + final Preference catimaNotCompatiblePreference = findPreference(LOYALTY_CARDS_CATIMA_NOT_COMPATIBLE); + if (catimaNotCompatiblePreference != null) { + catimaNotCompatiblePreference.setVisible(catimaInstalled && permissionGranted && !catimaCompatible); } - final Preference sync = findPreference(LOYALTY_CARDS_SYNC); - if (sync != null) { - sync.setEnabled(catimaInstalled); - sync.setOnPreferenceClickListener(preference -> { + final Preference syncPreference = findPreference(LOYALTY_CARDS_SYNC); + if (syncPreference != null) { + syncPreference.setEnabled(catimaInstalled && catimaCompatible && permissionGranted); + syncPreference.setOnPreferenceClickListener(preference -> { catimaManager.sync(device); return true; }); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java index 3828dfe9d9..d72447f140 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/capabilities/loyaltycards/CatimaContentProvider.java @@ -41,13 +41,12 @@ public class CatimaContentProvider { add("me.hackerchick.catima.debug"); }}; - public static final String PERMISSION_READ_CARDS = "me.hackerchick.catima.READ_CARDS"; - private final Context mContext; private final Uri versionUri; private final Uri cardsUri; private final Uri groupsUri; private final Uri cardGroupsUri; + private final String readPermission; public CatimaContentProvider(final Context context, final String catimaPackageName) { this.mContext = context; @@ -56,6 +55,11 @@ public CatimaContentProvider(final Context context, final String catimaPackageNa this.cardsUri = Uri.parse(String.format(Locale.ROOT, "content://%s/cards", catimaAuthority)); this.groupsUri = Uri.parse(String.format(Locale.ROOT, "content://%s/groups", catimaAuthority)); this.cardGroupsUri = Uri.parse(String.format(Locale.ROOT, "content://%s/card_groups", catimaAuthority)); + this.readPermission = String.format(Locale.ROOT, "%s.READ_CARDS", catimaPackageName); + } + + public String getReadPermission() { + return this.readPermission; } public boolean isCatimaCompatible() {