From 156a38a1df3d924d47a2ae32432e5574a43ddb10 Mon Sep 17 00:00:00 2001 From: Jonas Bark Date: Thu, 25 Mar 2021 17:58:27 +0100 Subject: [PATCH] event handling #1 --- .../facebook/react/uimanager/events/Event.kt | 14 ++++++++++ .../react/uimanager/events/EventDispatcher.kt | 5 ++++ .../com/flutter/stripe/StripeAndroidPlugin.kt | 4 ++- .../stripe/StripeSdkCardPlatformView.kt | 26 +++++++++++++++++-- .../StripeSdkCardPlatformViewFactory.kt | 10 +++---- .../reactnativestripesdk/CardChangedEvent.kt | 9 +++++-- .../reactnativestripesdk/CardFocusEvent.kt | 9 +++++-- .../reactnativestripesdk/StripeSdkCardView.kt | 13 +++++----- 8 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/Event.kt create mode 100644 stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/EventDispatcher.kt diff --git a/stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/Event.kt b/stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/Event.kt new file mode 100644 index 000000000..a84fc7c4d --- /dev/null +++ b/stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/Event.kt @@ -0,0 +1,14 @@ +package com.facebook.react.uimanager.events + +import com.facebook.react.bridge.WritableMap + +open class Event(viewTag: Int) { + + open fun getEventName(): String { + TODO("Not yet implemented") + } + + open fun serializeEventData(): WritableMap { + TODO("Not yet implemented") + } +} diff --git a/stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/EventDispatcher.kt b/stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/EventDispatcher.kt new file mode 100644 index 000000000..b11607b2b --- /dev/null +++ b/stripe_android/android/src/main/kotlin/com/facebook/react/uimanager/events/EventDispatcher.kt @@ -0,0 +1,5 @@ +package com.facebook.react.uimanager.events + +interface EventDispatcher { + fun dispatchEvent(event: Event<*>) +} diff --git a/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeAndroidPlugin.kt b/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeAndroidPlugin.kt index 5af12e7ae..cc47a49a0 100644 --- a/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeAndroidPlugin.kt +++ b/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeAndroidPlugin.kt @@ -24,7 +24,9 @@ class StripeAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { channel = MethodChannel(flutterPluginBinding.binaryMessenger, "flutter.stripe/payments") channel.setMethodCallHandler(this) - flutterPluginBinding.platformViewRegistry.registerViewFactory("flutter.stripe/card_field", StripeSdkCardPlatformViewFactory()) + flutterPluginBinding + .platformViewRegistry + .registerViewFactory("flutter.stripe/card_field", StripeSdkCardPlatformViewFactory(channel)) } override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { diff --git a/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformView.kt b/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformView.kt index 2f704ba74..7df96c389 100644 --- a/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformView.kt +++ b/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformView.kt @@ -2,16 +2,38 @@ package com.flutter.stripe import android.content.Context import android.view.View +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.uimanager.events.Event +import com.facebook.react.uimanager.events.EventDispatcher import com.reactnativestripesdk.StripeSdkCardView +import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.platform.PlatformView -class StripeSdkCardPlatformView(context: Context, id: Int, creationParams: Map?): PlatformView { +class StripeSdkCardPlatformView(context: Context, private val channel: MethodChannel, id: Int, creationParams: Map?): PlatformView { - private val cardView: StripeSdkCardView = StripeSdkCardView(context) + private val cardView: StripeSdkCardView by lazy { + val eventHandler = object: EventDispatcher { + override fun dispatchEvent(event: Event<*>) { + channel.invokeMethod(event.getEventName(), event.serializeEventData()) + } + } + StripeSdkCardView(context, eventHandler).apply { + if (creationParams?.containsKey("cardStyle") == true) { + setCardStyle(creationParams["cardStyle"] as ReadableMap) + } + if (creationParams?.containsKey("placeholder") == true) { + setPlaceHolders(creationParams["placeholder"] as ReadableMap) + } + if (creationParams?.containsKey("postalCodeEnabled") == true) { + setPostalCodeEnabled(creationParams["postalCodeEnabled"] as Boolean) + } + } + } override fun getView(): View = cardView override fun dispose() { + } } \ No newline at end of file diff --git a/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformViewFactory.kt b/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformViewFactory.kt index 4d2c4da91..730434c8d 100644 --- a/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformViewFactory.kt +++ b/stripe_android/android/src/main/kotlin/com/flutter/stripe/StripeSdkCardPlatformViewFactory.kt @@ -1,15 +1,15 @@ package com.flutter.stripe import android.content.Context -import android.view.View -import com.reactnativestripesdk.StripeSdkCardView +import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.StandardMessageCodec import io.flutter.plugin.platform.PlatformView import io.flutter.plugin.platform.PlatformViewFactory -class StripeSdkCardPlatformViewFactory: PlatformViewFactory(StandardMessageCodec.INSTANCE) { +class StripeSdkCardPlatformViewFactory(private val channel: MethodChannel) : PlatformViewFactory(StandardMessageCodec.INSTANCE) { + override fun create(context: Context, viewId: Int, args: Any?): PlatformView { - val creationParams = args as Map? - return StripeSdkCardPlatformView(context, viewId, creationParams) + val creationParams = args as? Map? + return StripeSdkCardPlatformView(context, channel, viewId, creationParams) } } diff --git a/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardChangedEvent.kt b/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardChangedEvent.kt index 83ea8c0ce..fbeb56df1 100644 --- a/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardChangedEvent.kt +++ b/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardChangedEvent.kt @@ -2,14 +2,19 @@ package com.reactnativestripesdk import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.WritableMap +import com.facebook.react.uimanager.events.Event -internal class CardChangedEvent constructor(viewTag: Int, private val cardDetails: MutableMap, private val postalCodeEnabled: Boolean, private val complete: Boolean) { +internal class CardChangedEvent constructor(viewTag: Int, private val cardDetails: MutableMap, private val postalCodeEnabled: Boolean, private val complete: Boolean): Event(viewTag) { + + override fun getEventName(): String { + return EVENT_NAME + } private fun getValOr(map: MutableMap, key: String, default: String? = null): String? { return if ((map[key] as CharSequence).isNotEmpty()) map[key] as String? else default } - private fun serializeEventData(): WritableMap { + override fun serializeEventData(): WritableMap { val eventData = Arguments.createMap() eventData.putString("number", cardDetails["number"].toString()) val expMonth = getValOr(cardDetails, "expiryMonth", null) diff --git a/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardFocusEvent.kt b/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardFocusEvent.kt index cb45cdaff..f049dd5ca 100644 --- a/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardFocusEvent.kt +++ b/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/CardFocusEvent.kt @@ -7,10 +7,15 @@ package com.reactnativestripesdk import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.WritableMap +import com.facebook.react.uimanager.events.Event -internal class CardFocusEvent constructor(viewTag: Int, private val focusField: String?) { +internal class CardFocusEvent constructor(viewTag: Int, private val focusField: String?): Event(viewTag) { - private fun serializeEventData(): WritableMap { + override fun getEventName(): String { + return EVENT_NAME + } + + override fun serializeEventData(): WritableMap { val eventData = Arguments.createMap() eventData.putString("focusedField", focusField) diff --git a/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/StripeSdkCardView.kt b/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/StripeSdkCardView.kt index 7f6b82691..f1f75e6fb 100644 --- a/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/StripeSdkCardView.kt +++ b/stripe_android/android/src/main/kotlin/com/reactnativestripesdk/StripeSdkCardView.kt @@ -5,23 +5,22 @@ import android.content.res.ColorStateList import android.graphics.Color import android.text.Editable import android.text.TextWatcher -import android.view.View -import android.view.ViewGroup import android.widget.FrameLayout import com.facebook.react.bridge.ReadableMap -import com.stripe.android.databinding.CardInputWidgetBinding +import com.facebook.react.uimanager.events.EventDispatcher import com.google.android.material.shape.CornerFamily import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel +import com.stripe.android.databinding.CardInputWidgetBinding import com.stripe.android.view.CardInputListener import com.stripe.android.view.CardInputWidget -class StripeSdkCardView(context: Context) : FrameLayout(context) { +class StripeSdkCardView(context: Context, private val mEventDispatcher: EventDispatcher) : FrameLayout(context) { private var mCardWidget: CardInputWidget private val cardDetails: MutableMap = mutableMapOf("number" to "", "cvc" to "", "expiryMonth" to "", "expiryYear" to "", "postalCode" to "") init { - mCardWidget = CardInputWidget(context); + mCardWidget = CardInputWidget(context) addView(mCardWidget) setListeners() @@ -129,7 +128,7 @@ class StripeSdkCardView(context: Context) : FrameLayout(context) { fun onCardChanged() { val complete = mCardWidget.cardParams != null - //mEventDispatcher?.dispatchEvent(CardChangedEvent(id, cardDetails, mCardWidget.postalCodeEnabled, complete)) + mEventDispatcher?.dispatchEvent(CardChangedEvent(id, cardDetails, mCardWidget.postalCodeEnabled, complete)) } private fun setListeners() { @@ -138,7 +137,7 @@ class StripeSdkCardView(context: Context) : FrameLayout(context) { override fun onExpirationComplete() {} override fun onCvcComplete() {} override fun onFocusChange(focusField: CardInputListener.FocusField) { - //mEventDispatcher?.dispatchEvent( CardFocusEvent(id, focusField.name)) + mEventDispatcher?.dispatchEvent( CardFocusEvent(id, focusField.name)) } })