I support a gift card application, and part of the merchant-facing user experience involves allowing the merchant to swipe a card to register it for a customer, check the balance on an existing account, or refund a transaction. To do this, we use the ACTION_SECURE_CARD_DATA intent on other Clover devices.
Intent i = new Intent(); i.setAction(Intents.ACTION_SECURE_CARD_DATA); i.putExtra(Intents.EXTRA_TRANSACTION_TYPE, Intents.TRANSACTION_TYPE_CARD_DATA); i.putExtra(Intents.EXTRA_CARD_DATA_MESSAGE, "Swipe gift card");
On the Station Duo, it hangs: the app becomes nonresponsive on the merchant-facing screen, nothing changes on the customer-facing screen, and the logs fill with this:
2021-07-02 11:43:03.196 18045-22116/? I/ActivityManager: START u0 {act=clover.intent.action.START_SECURE_CARD_DATA cmp=com.clover.payment.executor.secure/.PaymentActivity (has extras)} from uid 10064 2021-07-02 11:43:03.196 22368-22511/? I/zygote64: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0 2021-07-02 11:43:03.197 22368-22511/? I/OpenGLRenderer: Initialized EGL, version 1.4 2021-07-02 11:43:03.197 22368-22511/? D/OpenGLRenderer: Swap behavior 2 2021-07-02 11:43:03.201 22268-22268/? W/Instrumentation: Check start activity result, res: 0 2021-07-02 11:43:03.203 22268-22268/? I/LeafcutterCardDataRequestorActivity: onResume(CommonActivity.java:328)[main]: @70cb555 +onResume 2021-07-02 11:43:03.205 22268-22268/? I/LeafcutterCardDataRequestorActivity: onForeground(CommonActivity.java:352)[main]: @70cb555 +onForeground 2021-07-02 11:43:03.207 22268-22268/? I/LeafcutterCardDataRequestorActivity: onForeground(CommonActivity.java:367)[main]: @70cb555 -onForeground 2021-07-02 11:43:03.208 22268-22268/? I/LeafcutterCardDataRequestorActivity: onResume(CommonActivity.java:335)[main]: @70cb555 -onResume 2021-07-02 11:43:03.208 22268-22268/? W/Activity: An activity without a UI must call finish() before onResume() completes 2021-07-02 11:43:03.209 22268-22514/? I/SetupAsyncTask: doInBackground(SetupAsyncTask.java:43)[AsyncTask #4]: LeafcutterCardDataRequestorActivity @70cb555 2021-07-02 11:43:03.213 22268-22268/? I/LeafcutterCardDataRequestorActivity: onPause(CommonActivity.java:455)[main]: @70cb555 +onPause 2021-07-02 11:43:03.213 22268-22268/? I/LeafcutterCardDataRequestorActivity: onBackground(CommonActivity.java:479)[main]: @70cb555 +onBackground 2021-07-02 11:43:03.215 22268-22268/? I/LeafcutterCardDataRequestorActivity: onBackground(CommonActivity.java:495)[main]: @70cb555 -onBackground 2021-07-02 11:43:03.215 22268-22268/? I/LeafcutterCardDataRequestorActivity: onPause(CommonActivity.java:462)[main]: @70cb555 -onPause 2021-07-02 11:43:03.217 22467-22467/? W/RichInputMethodSubtype: Can't find emoji subtype 2021-07-02 11:43:03.217 22467-22467/? W/RichInputMethodSubtype: No input method subtype found; returning dummy subtype: Multi-lingual subtype: android.view.inputmethod.InputMethodSubtype@d78b2ed0, zz 2021-07-02 11:43:03.231 18045-22047/? I/ActivityManager: START u0 {act=com.clover.intent.action.START_LEAFCUTTER_READ_CARD_DATA cmp=com.clover.payment.builder.pay/com.clover.payment.requestor.carddata.LeafcutterCardDataRequestorActivity (has extras)} from uid 10065 2021-07-02 11:43:03.236 22368-22368/? W/Instrumentation: Check start activity result, res: 0 2021-07-02 11:43:03.238 22368-22368/? I/PaymentActivity: onCreate(BaseActivity.java:84)[main]: created 2021-07-02 11:43:03.242 22368-22368/? I/PaymentActivity: onStart(BaseActivity.java:137)[main]: started 2021-07-02 11:43:03.242 22268-22514/? I/SetupAsyncTask: doInBackground(SetupAsyncTask.java:59)[AsyncTask #4]: LeafcutterCardDataRequestorActivity @70cb555 success: false isCancelled: true 2021-07-02 11:43:03.243 22268-22268/? I/SetupAsyncTask: onCancelled(SetupAsyncTask.java:130)[main]: commonActivity: true 2021-07-02 11:43:03.244 22268-22268/? I/SetupAsyncTask: onCancelled(SetupAsyncTask.java:136)[main]: LeafcutterCardDataRequestorActivity @70cb555 isFinishing: false, resumed: false 2021-07-02 11:43:03.245 22368-22368/? I/PaymentActivity: onResume(BaseActivity.java:155)[main]: resumed 2021-07-02 11:43:03.245 22268-22268/? D/EmployeeConnector: on service success: ResultStatus{statusCode=OK, statusMessage=null} 2021-07-02 11:43:03.249 22368-22368/? I/PaymentActivity: onPause(BaseActivity.java:131)[main]: paused 2021-07-02 11:43:03.261 22497-22497/? I/ContactsPerf: VoicemailContentProvider.onCreate start 2021-07-02 11:43:03.262 847-847/? D/SurfaceFlinger: duplicate layer name: changing com.clover.payment.executor.secure/com.clover.payment.executor.secure.PaymentActivity to com.clover.payment.executor.secure/com.clover.payment.executor.secure.PaymentActivity#1 2021-07-02 11:43:03.263 22268-22268/? I/LeafcutterCardDataRequestorActivity: onCreate(CommonActivity.java:186)[main]: @5b4140e +onCreate: null 2021-07-02 11:43:03.270 22268-22268/? I/LeafcutterCardDataRequestorActivity: onCreate(CommonActivity.java:227)[main]: @5b4140e -onCreate 2021-07-02 11:43:03.271 22497-22497/? I/ContactsPerf: VoicemailContentProvider.onCreate finish 2021-07-02 11:43:03.275 22268-22268/? I/LeafcutterCardDataRequestorActivity: onStart(CommonActivity.java:1136)[main]: @5b4140e +onStart 2021-07-02 11:43:03.275 22497-22518/? D/ContactsDatabaseHelper: WAL enabled for contacts2.db: true 2021-07-02 11:43:03.278 22268-22268/? I/LeafcutterCardDataRequestorActivity: onStart(CommonActivity.java:1162)[main]: @5b4140e -onStart
How can we either launch a card read successfully, or detect whether a given device has the ability to return card details for gift cards? This seems to return true:
Platform2.supportsFeature(this, Platform2.Feature.SECURE_PAYMENTS)
So we can't gate it on that.