The Open Event Organizer Android App allows creating events from the app itself. But organizers had to enter the payment information every time. To solve this problem, the PR#1058 was opened which saves the Organizers’ payment preferences in Event Settings.
The Open Event project offers 5 types of payment options:
Online:
1. Paypal
2. Stripe
Offline:
3. Cash payment
4. Bank Transfer
5. Cheques
Each of the above need the payment specific details to be saved. And stuffing all of them into a single Event Settings screen isn’t a good option. Therefore the following navigation was desired:
Event Settings -> Payment Preferences -> All options with their preferences
Android Developer guide references a simple method to achieve the above, which is by using nested preference screens. But unfortunately, there’s a bug in the support library and it cannot be implemented with PreferenceFragmentCompat
So we had to apply a hack to the UI. We set an OnPreferenceClickListener as follows:
public class EventSettingsFragment extends PreferenceFragmentCompat { … @Override public void onCreatePreferencesFix(@Nullable Bundle bundle, String rootKey) { … findPreference(“payment_preferences”).setOnPreferenceClickListener(preference -> { |
Once the preference item “Payment Preferences” is clicked, we initiate a fragment transaction opening the Payment Preferences screen, and add it to the fragment back stack.
For each payment option, we have two things to consider:
- Is that payment option supported by the organizer?
- If yes, we need to store the necessary details in order to direct the payment to the organizer.
We are also keeping track of whether the organizer wants to keep using the same payment preferences for future events as well. This way we save the organizer’s effort of entering payment details for each new event.
<?xml version=“1.0” encoding=“utf-8”?> <PreferenceScreen xmlns:android=“http://schemas.android.com/apk/res/android”> <CheckBoxPreference android:key=“use_payment_prefs” android:title=“@string/use_payment_prefs” android:summaryOn=“@string/using_payment_preferences” android:summaryOff=“@string/not_using_payment_preferences” android:defaultValue=“false” /> <PreferenceCategory android:title=“Bank Transfer”> <CheckBoxPreference android:key=“accept_bank_transfers” android:title=“@string/accept_payment_by_bank_transfer” android:defaultValue=“false”/> <EditTextPreference android:key=“bank_details” android:title=“@string/bank_details” /> </PreferenceCategory> … </PreferenceScreen> |
Now the only thing remaining is to set payment preferences once the Event Creation form is opened. Hence the following method is called in CreateEventPresenter sets the payment details for each option that the organizer has already saved the information for. It does this by using constants named like PREF… all declared in the Constants.java file.
using a custom Preference class which abstracts away some boilerplate code for us.
public void setPaymentPreferences(Preferences preferences) { if (preferences.getBoolean(PREF_USE_PAYMENT_PREFS, false)) { … event.setCanPayByBank( preferences.getBoolean(PREF_ACCEPT_BANK_TRANSFER, false) ); event.setBankDetails( preferences.getString(PREF_BANK_DETAILS, null) ); … getView().setPaymentBinding(event); } } |
This is how the result looks like:
Resources
- Save key-value data | Android Developers
https://developer.android.com/training/data-storage/shared-preferences - Android developer fundamentals course practicals
https://google-developer-training.gitbooks.io/android-developer-fundamentals-course-practicals/content/en/Unit%204/91_p_shared_preferences.html - Working with Android Shared Preferences
https://android.i-visionblog.com/working-with-android-shared-preferences-4668efa298a8