@exodus/react-native-wallet 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +268 -0
  3. package/android/build.gradle +103 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifestNew.xml +2 -0
  6. package/android/src/main/java/com/expensify/wallet/Utils.kt +148 -0
  7. package/android/src/main/java/com/expensify/wallet/WalletModule.kt +380 -0
  8. package/android/src/main/java/com/expensify/wallet/WalletPackage.kt +48 -0
  9. package/android/src/main/java/com/expensify/wallet/components/RNAddToWalletButtonManager.kt +19 -0
  10. package/android/src/main/java/com/expensify/wallet/components/RNAddToWalletButtonView.kt +42 -0
  11. package/android/src/main/java/com/expensify/wallet/error/InvalidNetworkError.kt +6 -0
  12. package/android/src/main/java/com/expensify/wallet/event/OnCardActivatedEvent.kt +18 -0
  13. package/android/src/main/java/com/expensify/wallet/model/CardData.kt +12 -0
  14. package/android/src/main/java/com/expensify/wallet/model/CardStatus.kt +15 -0
  15. package/android/src/main/java/com/expensify/wallet/model/TokenizationStatus.kt +7 -0
  16. package/android/src/main/java/com/expensify/wallet/model/WalletData.kt +7 -0
  17. package/android/src/main/res/drawable/add_to_googlewallet_button_content.xml +7 -0
  18. package/android/src/main/res/drawable/badge_add_to_googlewallet_button_content.xml +7 -0
  19. package/android/src/main/res/drawable/googlewallet_button_background.xml +5 -0
  20. package/android/src/main/res/drawable/googlewallet_button_overlay.xml +11 -0
  21. package/android/src/main/res/drawable-af/add_to_googlewallet_button_content.xml +31 -0
  22. package/android/src/main/res/drawable-af/badge_add_to_googlewallet_button_content.xml +31 -0
  23. package/android/src/main/res/drawable-am/add_to_googlewallet_button_content.xml +34 -0
  24. package/android/src/main/res/drawable-am/badge_add_to_googlewallet_button_content.xml +34 -0
  25. package/android/src/main/res/drawable-ar/add_to_googlewallet_button_content.xml +7 -0
  26. package/android/src/main/res/drawable-ar/badge_add_to_googlewallet_button_content.xml +7 -0
  27. package/android/src/main/res/drawable-az/add_to_googlewallet_button_content.xml +7 -0
  28. package/android/src/main/res/drawable-az/badge_add_to_googlewallet_button_content.xml +7 -0
  29. package/android/src/main/res/drawable-bg/add_to_googlewallet_button_content.xml +7 -0
  30. package/android/src/main/res/drawable-bg/badge_add_to_googlewallet_button_content.xml +7 -0
  31. package/android/src/main/res/drawable-bn/add_to_googlewallet_button_content.xml +31 -0
  32. package/android/src/main/res/drawable-bn/badge_add_to_googlewallet_button_content.xml +31 -0
  33. package/android/src/main/res/drawable-br/add_to_googlewallet_button_content.xml +7 -0
  34. package/android/src/main/res/drawable-br/badge_add_to_googlewallet_button_content.xml +7 -0
  35. package/android/src/main/res/drawable-bs/add_to_googlewallet_button_content.xml +7 -0
  36. package/android/src/main/res/drawable-bs/badge_add_to_googlewallet_button_content.xml +7 -0
  37. package/android/src/main/res/drawable-by/add_to_googlewallet_button_content.xml +7 -0
  38. package/android/src/main/res/drawable-by/badge_add_to_googlewallet_button_content.xml +7 -0
  39. package/android/src/main/res/drawable-ca/add_to_googlewallet_button_content.xml +7 -0
  40. package/android/src/main/res/drawable-ca/badge_add_to_googlewallet_button_content.xml +7 -0
  41. package/android/src/main/res/drawable-cz/add_to_googlewallet_button_content.xml +7 -0
  42. package/android/src/main/res/drawable-cz/badge_add_to_googlewallet_button_content.xml +7 -0
  43. package/android/src/main/res/drawable-de/add_to_googlewallet_button_content.xml +7 -0
  44. package/android/src/main/res/drawable-de/badge_add_to_googlewallet_button_content.xml +7 -0
  45. package/android/src/main/res/drawable-dk/add_to_googlewallet_button_content.xml +7 -0
  46. package/android/src/main/res/drawable-dk/badge_add_to_googlewallet_button_content.xml +7 -0
  47. package/android/src/main/res/drawable-en-rau/add_to_googlewallet_button_content.xml +7 -0
  48. package/android/src/main/res/drawable-en-rau/badge_add_to_googlewallet_button_content.xml +7 -0
  49. package/android/src/main/res/drawable-en-rca/add_to_googlewallet_button_content.xml +7 -0
  50. package/android/src/main/res/drawable-en-rca/badge_add_to_googlewallet_button_content.xml +7 -0
  51. package/android/src/main/res/drawable-en-rgb/add_to_googlewallet_button_content.xml +7 -0
  52. package/android/src/main/res/drawable-en-rgb/badge_add_to_googlewallet_button_content.xml +7 -0
  53. package/android/src/main/res/drawable-en-rin/add_to_googlewallet_button_content.xml +7 -0
  54. package/android/src/main/res/drawable-en-rin/badge_add_to_googlewallet_button_content.xml +7 -0
  55. package/android/src/main/res/drawable-en-rsg/add_to_googlewallet_button_content.xml +7 -0
  56. package/android/src/main/res/drawable-en-rsg/badge_add_to_googlewallet_button_content.xml +7 -0
  57. package/android/src/main/res/drawable-en-rus/add_to_googlewallet_button_content.xml +7 -0
  58. package/android/src/main/res/drawable-en-rus/badge_add_to_googlewallet_button_content.xml +7 -0
  59. package/android/src/main/res/drawable-en-rza/add_to_googlewallet_button_content.xml +7 -0
  60. package/android/src/main/res/drawable-en-rza/badge_add_to_googlewallet_button_content.xml +7 -0
  61. package/android/src/main/res/drawable-es-res/add_to_googlewallet_button_content.xml +7 -0
  62. package/android/src/main/res/drawable-es-res/badge_add_to_googlewallet_button_content.xml +7 -0
  63. package/android/src/main/res/drawable-es-rus/add_to_googlewallet_button_content.xml +7 -0
  64. package/android/src/main/res/drawable-es-rus/badge_add_to_googlewallet_button_content.xml +7 -0
  65. package/android/src/main/res/drawable-et/add_to_googlewallet_button_content.xml +7 -0
  66. package/android/src/main/res/drawable-et/badge_add_to_googlewallet_button_content.xml +7 -0
  67. package/android/src/main/res/drawable-fa/add_to_googlewallet_button_content.xml +31 -0
  68. package/android/src/main/res/drawable-fa/badge_add_to_googlewallet_button_content.xml +34 -0
  69. package/android/src/main/res/drawable-fl/add_to_googlewallet_button_content.xml +7 -0
  70. package/android/src/main/res/drawable-fl/badge_add_to_googlewallet_button_content.xml +7 -0
  71. package/android/src/main/res/drawable-fp/add_to_googlewallet_button_content.xml +7 -0
  72. package/android/src/main/res/drawable-fp/badge_add_to_googlewallet_button_content.xml +7 -0
  73. package/android/src/main/res/drawable-fr-rca/add_to_googlewallet_button_content.xml +7 -0
  74. package/android/src/main/res/drawable-fr-rca/badge_add_to_googlewallet_button_content.xml +7 -0
  75. package/android/src/main/res/drawable-fr-rfr/add_to_googlewallet_button_content.xml +7 -0
  76. package/android/src/main/res/drawable-fr-rfr/badge_add_to_googlewallet_button_content.xml +7 -0
  77. package/android/src/main/res/drawable-gr/add_to_googlewallet_button_content.xml +7 -0
  78. package/android/src/main/res/drawable-gr/badge_add_to_googlewallet_button_content.xml +7 -0
  79. package/android/src/main/res/drawable-hdpi/googlepay_button_background_image.9.png +0 -0
  80. package/android/src/main/res/drawable-he/add_to_googlewallet_button_content.xml +7 -0
  81. package/android/src/main/res/drawable-he/badge_add_to_googlewallet_button_content.xml +7 -0
  82. package/android/src/main/res/drawable-hr/add_to_googlewallet_button_content.xml +7 -0
  83. package/android/src/main/res/drawable-hr/badge_add_to_googlewallet_button_content.xml +7 -0
  84. package/android/src/main/res/drawable-hu/add_to_googlewallet_button_content.xml +7 -0
  85. package/android/src/main/res/drawable-hu/badge_add_to_googlewallet_button_content.xml +7 -0
  86. package/android/src/main/res/drawable-hy/add_to_googlewallet_button_content.xml +7 -0
  87. package/android/src/main/res/drawable-hy/badge_add_to_googlewallet_button_content.xml +7 -0
  88. package/android/src/main/res/drawable-id/add_to_googlewallet_button_content.xml +7 -0
  89. package/android/src/main/res/drawable-id/badge_add_to_googlewallet_button_content.xml +7 -0
  90. package/android/src/main/res/drawable-is/add_to_googlewallet_button_content.xml +7 -0
  91. package/android/src/main/res/drawable-is/badge_add_to_googlewallet_button_content.xml +7 -0
  92. package/android/src/main/res/drawable-it/add_to_googlewallet_button_content.xml +7 -0
  93. package/android/src/main/res/drawable-it/badge_add_to_googlewallet_button_content.xml +7 -0
  94. package/android/src/main/res/drawable-jp/add_to_googlewallet_button_content.xml +7 -0
  95. package/android/src/main/res/drawable-jp/badge_add_to_googlewallet_button_content.xml +7 -0
  96. package/android/src/main/res/drawable-ka/add_to_googlewallet_button_content.xml +7 -0
  97. package/android/src/main/res/drawable-ka/badge_add_to_googlewallet_button_content.xml +7 -0
  98. package/android/src/main/res/drawable-kh/add_to_googlewallet_button_content.xml +33 -0
  99. package/android/src/main/res/drawable-kh/badge_add_to_googlewallet_button_content.xml +33 -0
  100. package/android/src/main/res/drawable-kk/add_to_googlewallet_button_content.xml +7 -0
  101. package/android/src/main/res/drawable-kk/badge_add_to_googlewallet_button_content.xml +7 -0
  102. package/android/src/main/res/drawable-ky/add_to_googlewallet_button_content.xml +7 -0
  103. package/android/src/main/res/drawable-ky/badge_add_to_googlewallet_button_content.xml +7 -0
  104. package/android/src/main/res/drawable-lo/add_to_googlewallet_button_content.xml +31 -0
  105. package/android/src/main/res/drawable-lo/badge_add_to_googlewallet_button_content.xml +31 -0
  106. package/android/src/main/res/drawable-lt/add_to_googlewallet_button_content.xml +7 -0
  107. package/android/src/main/res/drawable-lt/badge_add_to_googlewallet_button_content.xml +7 -0
  108. package/android/src/main/res/drawable-lv/add_to_googlewallet_button_content.xml +7 -0
  109. package/android/src/main/res/drawable-lv/badge_add_to_googlewallet_button_content.xml +7 -0
  110. package/android/src/main/res/drawable-mdpi/googlepay_button_background_image.9.png +0 -0
  111. package/android/src/main/res/drawable-mk/add_to_googlewallet_button_content.xml +7 -0
  112. package/android/src/main/res/drawable-mk/badge_add_to_googlewallet_button_content.xml +7 -0
  113. package/android/src/main/res/drawable-mn/add_to_googlewallet_button_content.xml +31 -0
  114. package/android/src/main/res/drawable-mn/badge_add_to_googlewallet_button_content.xml +31 -0
  115. package/android/src/main/res/drawable-my/add_to_googlewallet_button_content.xml +31 -0
  116. package/android/src/main/res/drawable-my/badge_add_to_googlewallet_button_content.xml +31 -0
  117. package/android/src/main/res/drawable-ne/add_to_googlewallet_button_content.xml +28 -0
  118. package/android/src/main/res/drawable-ne/badge_add_to_googlewallet_button_content.xml +31 -0
  119. package/android/src/main/res/drawable-nl/add_to_googlewallet_button_content.xml +7 -0
  120. package/android/src/main/res/drawable-nl/badge_add_to_googlewallet_button_content.xml +7 -0
  121. package/android/src/main/res/drawable-no/add_to_googlewallet_button_content.xml +7 -0
  122. package/android/src/main/res/drawable-no/badge_add_to_googlewallet_button_content.xml +7 -0
  123. package/android/src/main/res/drawable-pl/add_to_googlewallet_button_content.xml +7 -0
  124. package/android/src/main/res/drawable-pl/badge_add_to_googlewallet_button_content.xml +7 -0
  125. package/android/src/main/res/drawable-pt/add_to_googlewallet_button_content.xml +7 -0
  126. package/android/src/main/res/drawable-pt/badge_add_to_googlewallet_button_content.xml +7 -0
  127. package/android/src/main/res/drawable-ro/add_to_googlewallet_button_content.xml +7 -0
  128. package/android/src/main/res/drawable-ro/badge_add_to_googlewallet_button_content.xml +7 -0
  129. package/android/src/main/res/drawable-ru/add_to_googlewallet_button_content.xml +7 -0
  130. package/android/src/main/res/drawable-ru/badge_add_to_googlewallet_button_content.xml +7 -0
  131. package/android/src/main/res/drawable-se/add_to_googlewallet_button_content.xml +7 -0
  132. package/android/src/main/res/drawable-se/badge_add_to_googlewallet_button_content.xml +7 -0
  133. package/android/src/main/res/drawable-si/add_to_googlewallet_button_content.xml +31 -0
  134. package/android/src/main/res/drawable-si/badge_add_to_googlewallet_button_content.xml +31 -0
  135. package/android/src/main/res/drawable-sk/add_to_googlewallet_button_content.xml +7 -0
  136. package/android/src/main/res/drawable-sk/badge_add_to_googlewallet_button_content.xml +7 -0
  137. package/android/src/main/res/drawable-sl/add_to_googlewallet_button_content.xml +7 -0
  138. package/android/src/main/res/drawable-sl/badge_add_to_googlewallet_button_content.xml +7 -0
  139. package/android/src/main/res/drawable-sq/add_to_googlewallet_button_content.xml +7 -0
  140. package/android/src/main/res/drawable-sq/badge_add_to_googlewallet_button_content.xml +7 -0
  141. package/android/src/main/res/drawable-sr/add_to_googlewallet_button_content.xml +7 -0
  142. package/android/src/main/res/drawable-sr/badge_add_to_googlewallet_button_content.xml +7 -0
  143. package/android/src/main/res/drawable-sw/add_to_googlewallet_button_content.xml +31 -0
  144. package/android/src/main/res/drawable-sw/badge_add_to_googlewallet_button_content.xml +31 -0
  145. package/android/src/main/res/drawable-th/add_to_googlewallet_button_content.xml +7 -0
  146. package/android/src/main/res/drawable-th/badge_add_to_googlewallet_button_content.xml +7 -0
  147. package/android/src/main/res/drawable-tr/add_to_googlewallet_button_content.xml +7 -0
  148. package/android/src/main/res/drawable-tr/badge_add_to_googlewallet_button_content.xml +7 -0
  149. package/android/src/main/res/drawable-uk/add_to_googlewallet_button_content.xml +7 -0
  150. package/android/src/main/res/drawable-uk/badge_add_to_googlewallet_button_content.xml +7 -0
  151. package/android/src/main/res/drawable-ur/add_to_googlewallet_button_content.xml +34 -0
  152. package/android/src/main/res/drawable-ur/badge_add_to_googlewallet_button_content.xml +34 -0
  153. package/android/src/main/res/drawable-uz/add_to_googlewallet_button_content.xml +7 -0
  154. package/android/src/main/res/drawable-uz/badge_add_to_googlewallet_button_content.xml +7 -0
  155. package/android/src/main/res/drawable-vi/add_to_googlewallet_button_content.xml +7 -0
  156. package/android/src/main/res/drawable-vi/badge_add_to_googlewallet_button_content.xml +7 -0
  157. package/android/src/main/res/drawable-xhdpi/googlepay_button_background_image.9.png +0 -0
  158. package/android/src/main/res/drawable-xxhdpi/googlepay_button_background_image.9.png +0 -0
  159. package/android/src/main/res/drawable-xxxhdpi/googlepay_button_background_image.9.png +0 -0
  160. package/android/src/main/res/drawable-zh-rhk/add_to_googlewallet_button_content.xml +7 -0
  161. package/android/src/main/res/drawable-zh-rhk/badge_add_to_googlewallet_button_content.xml +7 -0
  162. package/android/src/main/res/drawable-zh-rtw/add_to_googlewallet_button_content.xml +7 -0
  163. package/android/src/main/res/drawable-zh-rtw/badge_add_to_googlewallet_button_content.xml +7 -0
  164. package/android/src/main/res/layout/add_to_googlewallet_badge.xml +35 -0
  165. package/android/src/main/res/layout/add_to_googlewallet_button.xml +34 -0
  166. package/android/src/main/res/values/googlewallet_strings.xml +7 -0
  167. package/android/src/paper/java/com/expensify/wallet/NativeWalletSpec.java +83 -0
  168. package/assets/buttons/android_button.svg +16 -0
  169. package/assets/buttons/ios_button.svg +259 -0
  170. package/assets/hero-image.png +0 -0
  171. package/assets/signature-dark.png +0 -0
  172. package/assets/signature-light.png +0 -0
  173. package/ios/RNAddToWalletButtonBridge.m +8 -0
  174. package/ios/RNWallet.h +13 -0
  175. package/ios/RNWallet.mm +153 -0
  176. package/ios/WalletManager.swift +297 -0
  177. package/ios/components/RNAddToWalletButtonManager.swift +13 -0
  178. package/ios/components/RNAddToWalletButtonView.swift +67 -0
  179. package/ios/stucts/AddPassResponse.swift +36 -0
  180. package/ios/stucts/CardInfo.swift +37 -0
  181. package/ios/stucts/WalletEncryptedPayload.swift +27 -0
  182. package/lib/commonjs/AddToWalletButton.js +83 -0
  183. package/lib/commonjs/AddToWalletButton.js.map +1 -0
  184. package/lib/commonjs/NativeWallet.js +22 -0
  185. package/lib/commonjs/NativeWallet.js.map +1 -0
  186. package/lib/commonjs/index.js +156 -0
  187. package/lib/commonjs/index.js.map +1 -0
  188. package/lib/commonjs/utils.js +38 -0
  189. package/lib/commonjs/utils.js.map +1 -0
  190. package/lib/module/AddToWalletButton.js +76 -0
  191. package/lib/module/AddToWalletButton.js.map +1 -0
  192. package/lib/module/NativeWallet.js +17 -0
  193. package/lib/module/NativeWallet.js.map +1 -0
  194. package/lib/module/index.js +132 -0
  195. package/lib/module/index.js.map +1 -0
  196. package/lib/module/utils.js +32 -0
  197. package/lib/module/utils.js.map +1 -0
  198. package/lib/typescript/src/AddToWalletButton.d.ts +16 -0
  199. package/lib/typescript/src/AddToWalletButton.d.ts.map +1 -0
  200. package/lib/typescript/src/NativeWallet.d.ts +77 -0
  201. package/lib/typescript/src/NativeWallet.d.ts.map +1 -0
  202. package/lib/typescript/src/index.d.ts +22 -0
  203. package/lib/typescript/src/index.d.ts.map +1 -0
  204. package/lib/typescript/src/utils.d.ts +5 -0
  205. package/lib/typescript/src/utils.d.ts.map +1 -0
  206. package/package.json +157 -0
  207. package/react-native-wallet.podspec +36 -0
  208. package/src/AddToWalletButton.tsx +78 -0
  209. package/src/NativeWallet.ts +115 -0
  210. package/src/index.tsx +184 -0
  211. package/src/utils.ts +35 -0
@@ -0,0 +1,380 @@
1
+ package com.expensify.wallet
2
+
3
+ import android.app.Activity
4
+ import android.app.Activity.RESULT_CANCELED
5
+ import android.app.Activity.RESULT_OK
6
+ import android.content.ActivityNotFoundException
7
+ import android.content.Intent
8
+ import com.facebook.react.bridge.ActivityEventListener
9
+ import com.facebook.react.bridge.Arguments
10
+ import com.facebook.react.bridge.Promise
11
+ import com.facebook.react.bridge.PromiseImpl
12
+ import com.facebook.react.bridge.ReactApplicationContext
13
+ import com.facebook.react.bridge.ReactContext
14
+ import com.facebook.react.bridge.ReactMethod
15
+ import com.facebook.react.bridge.ReadableMap
16
+ import com.facebook.react.bridge.WritableMap
17
+ import com.facebook.react.modules.core.DeviceEventManagerModule
18
+ import com.google.android.gms.tapandpay.TapAndPay
19
+ import com.google.android.gms.tapandpay.TapAndPayClient
20
+ import com.google.android.gms.tapandpay.issuer.PushTokenizeRequest
21
+ import kotlinx.coroutines.CoroutineScope
22
+ import kotlinx.coroutines.Dispatchers
23
+ import kotlinx.coroutines.launch
24
+ import kotlinx.coroutines.SupervisorJob
25
+ import kotlinx.coroutines.cancel
26
+ import com.expensify.wallet.Utils.getAsyncResult
27
+ import com.expensify.wallet.Utils.toCardData
28
+ import com.expensify.wallet.error.InvalidNetworkError
29
+ import com.expensify.wallet.event.OnCardActivatedEvent
30
+ import com.expensify.wallet.model.CardStatus
31
+ import com.expensify.wallet.model.TokenizationStatus
32
+ import com.expensify.wallet.model.WalletData
33
+ import com.google.android.gms.common.api.ApiException
34
+ import kotlinx.coroutines.Deferred
35
+ import java.nio.charset.Charset
36
+ import java.util.Locale
37
+
38
+
39
+ class WalletModule internal constructor(context: ReactApplicationContext) :
40
+ NativeWalletSpec(context) {
41
+ companion object {
42
+ const val NAME = "RNWallet"
43
+ const val REQUEST_CODE_PUSH_TOKENIZE: Int = 0xA001
44
+ const val REQUEST_CREATE_WALLET: Int = 0xA002
45
+
46
+ const val E_SDK_API = "SDK API Error"
47
+ const val E_OPERATION_FAILED = "E_OPERATION_FAILED"
48
+ const val E_INVALID_DATA = "E_INVALID_DATA"
49
+ }
50
+
51
+ private val activity: Activity
52
+ get() = reactApplicationContext.currentActivity ?: throw ActivityNotFoundException()
53
+
54
+ private val tapAndPayClient: TapAndPayClient
55
+ get() = TapAndPay.getClient(activity)
56
+ private var pendingCreateWalletPromise: Promise? = null
57
+ private var pendingPushTokenizePromise: Promise? = null
58
+ private val moduleScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
59
+
60
+ override fun initialize() {
61
+ super.initialize()
62
+ reactApplicationContext.addActivityEventListener(cardListener)
63
+ }
64
+
65
+ override fun invalidate() {
66
+ super.invalidate()
67
+ moduleScope.cancel()
68
+ reactApplicationContext.removeActivityEventListener(cardListener)
69
+ }
70
+
71
+ private val cardListener = object : ActivityEventListener {
72
+ override fun onActivityResult(
73
+ activity: Activity, requestCode: Int, resultCode: Int, data: Intent?
74
+ ) {
75
+ if (requestCode == REQUEST_CREATE_WALLET) {
76
+ pendingCreateWalletPromise?.resolve(resultCode == RESULT_OK)
77
+ pendingCreateWalletPromise = null
78
+ } else if (requestCode == REQUEST_CODE_PUSH_TOKENIZE) {
79
+ val localPromise = pendingPushTokenizePromise
80
+ pendingPushTokenizePromise = null
81
+ if (resultCode == RESULT_OK) {
82
+ if (data == null) {
83
+ localPromise?.reject(E_OPERATION_FAILED, "Tokenization returned RESULT_OK but intent data was null")
84
+ return
85
+ }
86
+ val tokenId = data.getStringExtra(TapAndPay.EXTRA_ISSUER_TOKEN_ID).toString()
87
+ sendEvent(
88
+ context,
89
+ OnCardActivatedEvent.NAME,
90
+ OnCardActivatedEvent("active", tokenId).toMap()
91
+ )
92
+ localPromise?.resolve(TokenizationStatus.SUCCESS.code)
93
+ } else if (resultCode == RESULT_CANCELED) {
94
+ sendEvent(
95
+ context,
96
+ OnCardActivatedEvent.NAME,
97
+ OnCardActivatedEvent("canceled", null).toMap()
98
+ )
99
+ localPromise?.resolve(TokenizationStatus.CANCELED.code)
100
+ } else {
101
+ localPromise?.reject(E_OPERATION_FAILED, "Tokenization failed with resultCode=$resultCode")
102
+ }
103
+ }
104
+ }
105
+
106
+ override fun onNewIntent(intent: Intent) {}
107
+ }
108
+
109
+ @ReactMethod
110
+ override fun ensureGoogleWalletInitialized(promise: Promise) {
111
+ val localPromise = PromiseImpl({ _ ->
112
+ promise.resolve(true)
113
+ }, { _ ->
114
+ pendingCreateWalletPromise = promise
115
+ tapAndPayClient.createWallet(activity, REQUEST_CREATE_WALLET)
116
+ })
117
+ getWalletId(localPromise)
118
+ }
119
+
120
+ @ReactMethod
121
+ override fun checkWalletAvailability(promise: Promise) {
122
+ tapAndPayClient.environment.addOnCompleteListener { task ->
123
+ promise.resolve(task.isSuccessful)
124
+ }
125
+
126
+ @ReactMethod
127
+ override fun getSecureWalletInfo(promise: Promise) {
128
+ moduleScope.launch {
129
+ try {
130
+ val walletId = getWalletIdAsync()
131
+ val hardwareId = getHardwareIdAsync()
132
+ val walletData = WalletData(
133
+ platform = "android", deviceID = hardwareId.await(), walletAccountID = walletId.await()
134
+ )
135
+
136
+ val walletDataMap: WritableMap = Arguments.createMap().apply {
137
+ putString("platform", walletData.platform)
138
+ putString("deviceID", walletData.deviceID)
139
+ putString("walletAccountID", walletData.walletAccountID)
140
+ }
141
+
142
+ promise.resolve(walletDataMap)
143
+ } catch (e: ApiException) {
144
+ promise.reject(E_SDK_API, e.localizedMessage)
145
+ } catch (e: Exception) {
146
+ promise.reject(E_OPERATION_FAILED, "Failed to retrieve IDs: ${e.localizedMessage}")
147
+ }
148
+ }
149
+ }
150
+
151
+ @ReactMethod
152
+ override fun getCardStatusBySuffix(last4Digits: String, promise: Promise) {
153
+ tapAndPayClient.listTokens()
154
+ .addOnCompleteListener { task ->
155
+ if (!task.isSuccessful || task.result == null) {
156
+ promise.resolve(CardStatus.NOT_FOUND_IN_WALLET.code)
157
+ return@addOnCompleteListener
158
+ }
159
+ task.result.find { it.fpanLastFour == last4Digits }?.let {
160
+ promise.resolve(
161
+ getCardStatusCode(it.tokenState)
162
+ )
163
+ } ?: promise.resolve(CardStatus.NOT_FOUND_IN_WALLET.code)
164
+ }
165
+ .addOnFailureListener { e ->
166
+ promise.reject(E_OPERATION_FAILED, "getCardStatusBySuffix: ${e.localizedMessage}")
167
+ }
168
+ }
169
+
170
+ @ReactMethod
171
+ override fun getCardStatusByIdentifier(identifier: String, tsp: String, promise: Promise) {
172
+ tapAndPayClient.getTokenStatus(getTokenServiceProvider(tsp), identifier)
173
+ .addOnCompleteListener { task ->
174
+ if (!task.isSuccessful || task.result == null) {
175
+ promise.resolve(CardStatus.NOT_FOUND_IN_WALLET.code)
176
+ return@addOnCompleteListener
177
+ }
178
+ task.result?.let {
179
+ promise.resolve(
180
+ getCardStatusCode(it.tokenState)
181
+ )
182
+ } ?: promise.resolve(CardStatus.NOT_FOUND_IN_WALLET.code)
183
+ }
184
+ .addOnFailureListener { e ->
185
+ promise.reject(E_OPERATION_FAILED, "getCardStatusByIdentifier: ${e.localizedMessage}")
186
+ }
187
+ }
188
+
189
+ @ReactMethod
190
+ override fun addCardToGoogleWallet(
191
+ data: ReadableMap, promise: Promise
192
+ ) {
193
+ if (pendingPushTokenizePromise != null) {
194
+ return promise.reject(E_OPERATION_FAILED, "A tokenization request is already in progress")
195
+ }
196
+ try {
197
+ val cardData = data.toCardData() ?: return promise.reject(E_INVALID_DATA, "Insufficient data")
198
+ val cardNetwork = getCardNetwork(cardData.network)
199
+ val tokenServiceProvider = getTokenServiceProvider(cardData.network)
200
+ val displayName = getDisplayName(data, cardData.network)
201
+ pendingPushTokenizePromise = promise
202
+
203
+ val pushTokenizeRequest = PushTokenizeRequest.Builder()
204
+ .setOpaquePaymentCard(cardData.opaquePaymentCard.toByteArray(Charset.forName("UTF-8")))
205
+ .setNetwork(cardNetwork)
206
+ .setTokenServiceProvider(tokenServiceProvider)
207
+ .setDisplayName(displayName)
208
+ .setLastDigits(cardData.lastDigits)
209
+ .setUserAddress(cardData.userAddress)
210
+ .build()
211
+
212
+ tapAndPayClient.pushTokenize(
213
+ activity, pushTokenizeRequest, REQUEST_CODE_PUSH_TOKENIZE
214
+ )
215
+ } catch (e: java.lang.Exception) {
216
+ promise.reject(e)
217
+ }
218
+ }
219
+
220
+ @ReactMethod
221
+ override fun resumeAddCardToGoogleWallet(data: ReadableMap, promise: Promise) {
222
+ if (pendingPushTokenizePromise != null) {
223
+ return promise.reject(E_OPERATION_FAILED, "A tokenization request is already in progress")
224
+ }
225
+ try {
226
+ val tokenReferenceID = data.getString("tokenReferenceID")
227
+ ?: return promise.reject(E_INVALID_DATA, "Missing tokenReferenceID")
228
+
229
+ val network = data.getString("network")
230
+ ?: return promise.reject(E_INVALID_DATA, "Missing network")
231
+
232
+ val cardNetwork = getCardNetwork(network)
233
+ val tokenServiceProvider = getTokenServiceProvider(network)
234
+ val displayName = getDisplayName(data, network)
235
+ pendingPushTokenizePromise = promise
236
+
237
+ tapAndPayClient.tokenize(
238
+ activity,
239
+ tokenReferenceID,
240
+ tokenServiceProvider,
241
+ displayName,
242
+ cardNetwork,
243
+ REQUEST_CODE_PUSH_TOKENIZE
244
+ )
245
+ } catch (e: java.lang.Exception) {
246
+ promise.reject(e)
247
+ }
248
+ }
249
+
250
+ @ReactMethod
251
+ override fun listTokens(promise: Promise) {
252
+ tapAndPayClient.listTokens()
253
+ .addOnCompleteListener { task ->
254
+ if (!task.isSuccessful || task.result == null) {
255
+ promise.resolve(Arguments.createArray())
256
+ return@addOnCompleteListener
257
+ }
258
+
259
+ val tokensArray = Arguments.createArray()
260
+ task.result.forEach { tokenInfo ->
261
+ val tokenData = Arguments.createMap().apply {
262
+ putString("identifier", tokenInfo.issuerTokenId)
263
+ putString("lastDigits", tokenInfo.fpanLastFour)
264
+ putInt("tokenState", tokenInfo.tokenState)
265
+ }
266
+ tokensArray.pushMap(tokenData)
267
+ }
268
+
269
+ promise.resolve(tokensArray)
270
+ }
271
+ .addOnFailureListener { e ->
272
+ promise.reject(E_OPERATION_FAILED, "listTokens: ${e.localizedMessage}")
273
+ }
274
+ }
275
+
276
+ private fun getWalletId(promise: Promise) {
277
+ tapAndPayClient.activeWalletId.addOnCompleteListener { task ->
278
+ if (task.isSuccessful) {
279
+ val walletId = task.result
280
+ if (walletId != null) {
281
+ promise.resolve(walletId)
282
+ }
283
+ }
284
+ }.addOnFailureListener { e ->
285
+ promise.reject(E_OPERATION_FAILED, "Wallet id retrieval failed: ${e.localizedMessage}")
286
+ }
287
+ }
288
+
289
+ private fun getHardwareId(promise: Promise) {
290
+ tapAndPayClient.stableHardwareId.addOnCompleteListener { task ->
291
+ if (task.isSuccessful) {
292
+ val hardwareId = task.result
293
+ promise.resolve(hardwareId)
294
+ }
295
+ }.addOnFailureListener { e ->
296
+ promise.reject(E_OPERATION_FAILED, "Stable hardware id retrieval failed: ${e.localizedMessage}")
297
+ }
298
+ }
299
+
300
+ private fun getCardStatusCode(code: Int): Int {
301
+ return when (code) {
302
+ TapAndPay.TOKEN_STATE_ACTIVE -> CardStatus.ACTIVE.code
303
+ TapAndPay.TOKEN_STATE_PENDING -> CardStatus.PENDING.code
304
+ TapAndPay.TOKEN_STATE_SUSPENDED -> CardStatus.SUSPENDED.code
305
+ TapAndPay.TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION -> CardStatus.REQUIRE_AUTHORIZATION.code
306
+ TapAndPay.TOKEN_STATE_FELICA_PENDING_PROVISIONING -> CardStatus.PENDING.code
307
+ else -> CardStatus.NOT_FOUND_IN_WALLET.code
308
+ }
309
+ }
310
+
311
+ private fun getCardNetwork(network: String): Int {
312
+ return when (network.uppercase(Locale.getDefault())) {
313
+ "VISA" -> TapAndPay.CARD_NETWORK_VISA
314
+ "MASTERCARD" -> TapAndPay.CARD_NETWORK_MASTERCARD
315
+ "AMEX" -> TapAndPay.CARD_NETWORK_AMEX
316
+ "DISCOVER" -> TapAndPay.CARD_NETWORK_DISCOVER
317
+ else -> throw InvalidNetworkError()
318
+ }
319
+ }
320
+
321
+ private fun getTokenServiceProvider(network: String): Int {
322
+ return when (network.uppercase(Locale.getDefault())) {
323
+ "VISA" -> TapAndPay.TOKEN_PROVIDER_VISA
324
+ "MASTERCARD" -> TapAndPay.TOKEN_PROVIDER_MASTERCARD
325
+ "AMEX" -> TapAndPay.TOKEN_PROVIDER_AMEX
326
+ "DISCOVER" -> TapAndPay.TOKEN_PROVIDER_DISCOVER
327
+ else -> throw InvalidNetworkError()
328
+ }
329
+ }
330
+
331
+ private suspend fun getWalletIdAsync(): Deferred<String> =
332
+ getAsyncResult(String::class.java) { promise ->
333
+ getWalletId(promise)
334
+ }
335
+
336
+ private suspend fun getHardwareIdAsync(): Deferred<String> =
337
+ getAsyncResult(String::class.java) { promise ->
338
+ getHardwareId(promise)
339
+ }
340
+
341
+ private fun getDisplayName(data: ReadableMap, network: String): String {
342
+ data.getString("cardHolderName")?.let { name ->
343
+ if (name.isNotEmpty()) return name
344
+ }
345
+
346
+ data.getString("lastDigits")?.let { digits ->
347
+ if (digits.isNotEmpty()) {
348
+ return "${network.uppercase(Locale.getDefault())} Card *$digits"
349
+ }
350
+ }
351
+
352
+ return "${network.uppercase(Locale.getDefault())} Card"
353
+ }
354
+
355
+ private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap?) {
356
+ reactContext
357
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
358
+ .emit(eventName, params)
359
+ }
360
+
361
+ override fun IOSPresentAddPaymentPassView(cardData: ReadableMap?, promise: Promise?) {
362
+ // no-op
363
+ }
364
+
365
+ override fun IOSHandleAddPaymentPassResponse(payload: ReadableMap?, promise: Promise?) {
366
+ // no-op
367
+ }
368
+
369
+ override fun addListener(eventType: String?) {
370
+ // no-op
371
+ }
372
+
373
+ override fun removeListeners(count: Double) {
374
+ // no-op
375
+ }
376
+
377
+ override fun getName(): String {
378
+ return NAME
379
+ }
380
+ }
@@ -0,0 +1,48 @@
1
+ package com.expensify.wallet
2
+
3
+ import com.expensify.wallet.components.RNAddToWalletButtonManager
4
+ import com.facebook.react.BaseReactPackage
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.bridge.NativeModule
7
+ import com.facebook.react.module.annotations.ReactModuleList
8
+ import com.facebook.react.module.model.ReactModuleInfoProvider
9
+ import com.facebook.react.module.model.ReactModuleInfo
10
+ import java.util.HashMap
11
+ import com.facebook.react.uimanager.ViewManager
12
+
13
+ // Fool auto linking for older versions that do not support BaseReactPackage.
14
+ // public class WalletPackage implements TurboReactPackage {
15
+ @ReactModuleList(
16
+ nativeModules = [
17
+ WalletModule::class,
18
+ ],
19
+ )
20
+ class WalletPackage : BaseReactPackage() {
21
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
22
+ return if (name == WalletModule.NAME) {
23
+ WalletModule(reactContext)
24
+ } else {
25
+ null
26
+ }
27
+ }
28
+
29
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
30
+ return ReactModuleInfoProvider {
31
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
32
+ val isTurboModule: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
33
+ moduleInfos[WalletModule.NAME] = ReactModuleInfo(
34
+ WalletModule.NAME,
35
+ WalletModule.NAME,
36
+ canOverrideExistingModule = false,
37
+ needsEagerInit = false,
38
+ hasConstants = true,
39
+ isCxxModule = false,
40
+ isTurboModule
41
+ )
42
+ moduleInfos
43
+ }
44
+ }
45
+
46
+ override fun createViewManagers(reactContext: com.facebook.react.bridge.ReactApplicationContext)
47
+ : List<ViewManager<*, *>> = listOf(RNAddToWalletButtonManager())
48
+ }
@@ -0,0 +1,19 @@
1
+ package com.expensify.wallet.components
2
+
3
+ import com.facebook.react.uimanager.SimpleViewManager
4
+ import com.facebook.react.uimanager.ThemedReactContext
5
+ import com.facebook.react.uimanager.annotations.ReactProp
6
+
7
+ class RNAddToWalletButtonManager : SimpleViewManager<RNAddToWalletButtonView>() {
8
+
9
+ override fun getName(): String = "RNAddToWalletButton"
10
+
11
+ override fun createViewInstance(reactContext: ThemedReactContext): RNAddToWalletButtonView {
12
+ return RNAddToWalletButtonView(reactContext)
13
+ }
14
+
15
+ @ReactProp(name = "buttonType")
16
+ fun setButtonType(view: RNAddToWalletButtonView, type: String) {
17
+ view.setButtonType(type)
18
+ }
19
+ }
@@ -0,0 +1,42 @@
1
+ package com.expensify.wallet.components
2
+
3
+ import android.content.Context
4
+ import android.widget.FrameLayout
5
+ import com.expensify.wallet.R
6
+ import android.view.LayoutInflater
7
+ import android.view.View
8
+
9
+ class RNAddToWalletButtonView(context: Context) : FrameLayout(context) {
10
+
11
+ private var buttonView: View? = null
12
+ private var buttonType: String = "basic"
13
+
14
+ init {
15
+ setupButton()
16
+ }
17
+
18
+ fun setButtonType(type: String) {
19
+ if (buttonType != type) {
20
+ buttonType = type
21
+ setupButton()
22
+ }
23
+ }
24
+
25
+ private fun setupButton() {
26
+ removeAllViews()
27
+
28
+ val inflater = LayoutInflater.from(context)
29
+ val layoutId = when (buttonType.lowercase()) {
30
+ "badge" -> R.layout.add_to_googlewallet_badge
31
+ else -> R.layout.add_to_googlewallet_button
32
+ }
33
+ buttonView = inflater.inflate(layoutId, this, false).apply {
34
+ layoutParams = LayoutParams(
35
+ LayoutParams.MATCH_PARENT,
36
+ LayoutParams.MATCH_PARENT
37
+ )
38
+ }
39
+
40
+ addView(buttonView)
41
+ }
42
+ }
@@ -0,0 +1,6 @@
1
+ package com.expensify.wallet.error
2
+
3
+ class InvalidNetworkError : Exception {
4
+ constructor() : super("Unsupported card network, please verify your card details")
5
+ constructor(message: String) : super(message)
6
+ }
@@ -0,0 +1,18 @@
1
+ package com.expensify.wallet.event
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+
6
+
7
+ class OnCardActivatedEvent(private val status: String, private val tokenId: String?) {
8
+ companion object {
9
+ const val NAME = "onCardActivated"
10
+ }
11
+
12
+ fun toMap(): WritableMap? {
13
+ val params = Arguments.createMap()
14
+ params.putString("status", status)
15
+ params.putString("tokenId", tokenId)
16
+ return params
17
+ }
18
+ }
@@ -0,0 +1,12 @@
1
+ package com.expensify.wallet.model
2
+
3
+ import com.google.android.gms.tapandpay.issuer.UserAddress
4
+
5
+ data class CardData(
6
+ val platform: String = "android",
7
+ val network: String,
8
+ val opaquePaymentCard: String,
9
+ val cardHolderName: String,
10
+ val lastDigits: String,
11
+ val userAddress: UserAddress,
12
+ )
@@ -0,0 +1,15 @@
1
+ package com.expensify.wallet.model
2
+
3
+ enum class CardStatus(val code: Int, val message: String) {
4
+ NOT_FOUND_IN_WALLET(-1, "The card can't be found in your active wallet"),
5
+ ACTIVE(0, "The card is ready to use."),
6
+ REQUIRE_AUTHORIZATION(1, "The card requires identity verification."),
7
+ PENDING(2, "The card is pending."),
8
+ SUSPENDED(3, "The card has been suspended."),
9
+ DEACTIVATED(4, "The card is deactivated.");
10
+
11
+
12
+ override fun toString(): String {
13
+ return "$message (Code: $code)"
14
+ }
15
+ }
@@ -0,0 +1,7 @@
1
+ package com.expensify.wallet.model
2
+
3
+ enum class TokenizationStatus(val code: Int) {
4
+ CANCELED(1),
5
+ SUCCESS(0),
6
+ ERROR(-1)
7
+ }
@@ -0,0 +1,7 @@
1
+ package com.expensify.wallet.model
2
+
3
+ data class WalletData(
4
+ val platform: String = "android",
5
+ val deviceID: String,
6
+ val walletAccountID: String,
7
+ )
@@ -0,0 +1,7 @@
1
+ <vector android:width="241dp" android:height="28dp" android:viewportWidth="241" android:viewportHeight="28" xmlns:android="http://schemas.android.com/apk/res/android">
2
+ <path android:pathData="M30 11H0V6c0-2.71429 2.20184-5 4.81651-5H25.1835C27.7982 1 30 3.28571 30 6v5z" android:fillColor="#34a853"/>
3
+ <path android:pathData="M30 15.0537H0v-5c0-2.71427 2.20184-4.99999 4.81651-4.99999H25.1835C27.7982 5.05371 30 7.33943 30 10.0537v5z" android:fillColor="#fbbc04"/>
4
+ <path android:pathData="M30 19.2468H0v-5c0-2.7143 2.20184-5.00003 4.81651-5.00003H25.1835C27.7982 9.24677 30 11.5325 30 14.2468v5z" android:fillColor="#ea4335"/>
5
+ <path android:pathData="M0 12.2752l19.0411 4.4037c2.1918 0.5505 4.6575 0 6.4384-1.3761L30 12v10.3211C30 24.9358 27.8082 27 25.2055 27H4.79452C2.19178 27 0 24.9358 0 22.3211V12.2752z" android:fillColor="#4285f4"/>
6
+ <path android:pathData="M42.3 21l5.4-14.32h2.5L55.62 21H53.2l-1.32-3.68h-5.84L44.72 21H42.3zm6.06-10.1l-1.58 4.38h4.36l-1.58-4.38-0.54-1.64H48.9l-0.54 1.64zm12.8928 10.42c-0.92 0-1.7533-0.2267-2.5-0.68-0.7333-0.4667-1.32-1.1067-1.76-1.92-0.4267-0.8267-0.64-1.7667-0.64-2.82s0.2133-1.9867 0.64-2.8c0.44-0.8133 1.0267-1.4533 1.76-1.92 0.7467-0.4667 1.58-0.7 2.5-0.7 0.7867 0 1.46 0.1733 2.02 0.52 0.5733 0.3467 0.9933 0.74 1.26 1.18h0.12l-0.12-1.42V6.68h2.14V21h-2.02v-1.36h-0.12c-0.2667 0.44-0.6867 0.8333-1.26 1.18-0.56 0.3333-1.2333 0.5-2.02 0.5zm0.32-1.98c0.5333 0 1.0333-0.14 1.5-0.42 0.48-0.28 0.86-0.6733 1.14-1.18 0.2933-0.52 0.44-1.1333 0.44-1.84 0-0.7067-0.1467-1.3133-0.44-1.82-0.28-0.52-0.66-0.92-1.14-1.2-0.4667-0.28-0.9667-0.42-1.5-0.42s-1.0333 0.14-1.5 0.42c-0.4667 0.28-0.8467 0.68-1.14 1.2-0.2933 0.5067-0.44 1.1133-0.44 1.82 0 0.7067 0.1467 1.32 0.44 1.84 0.2933 0.5067 0.6733 0.9 1.14 1.18 0.4667 0.28 0.9667 0.42 1.5 0.42zm11.9066 1.98c-0.92 0-1.7534-0.2267-2.5-0.68-0.7334-0.4667-1.32-1.1067-1.76-1.92-0.4267-0.8267-0.64-1.7667-0.64-2.82s0.2133-1.9867 0.64-2.8c0.44-0.8133 1.0266-1.4533 1.76-1.92 0.7466-0.4667 1.58-0.7 2.5-0.7 0.7866 0 1.46 0.1733 2.02 0.52 0.5733 0.3467 0.9933 0.74 1.26 1.18h0.12l-0.12-1.42V6.68h2.14V21h-2.02v-1.36h-0.12c-0.2667 0.44-0.6867 0.8333-1.26 1.18-0.56 0.3333-1.2334 0.5-2.02 0.5zm0.32-1.98c0.5333 0 1.0333-0.14 1.5-0.42 0.48-0.28 0.86-0.6733 1.14-1.18 0.2933-0.52 0.44-1.1333 0.44-1.84 0-0.7067-0.1467-1.3133-0.44-1.82-0.28-0.52-0.66-0.92-1.14-1.2-0.4667-0.28-0.9667-0.42-1.5-0.42-0.5334 0-1.0334 0.14-1.5 0.42-0.4667 0.28-0.8467 0.68-1.14 1.2-0.2934 0.5067-0.44 1.1133-0.44 1.82 0 0.7067 0.1466 1.32 0.44 1.84 0.2933 0.5067 0.6733 0.9 1.14 1.18 0.4666 0.28 0.9666 0.42 1.5 0.42zm13.3922-1.3v-5.36h-1.78V10.8h1.78V7.92h2.16v2.88h2.5v1.88h-2.5v4.9c0 0.5067 0.1 0.8933 0.3 1.16 0.2133 0.2667 0.5666 0.4 1.06 0.4 0.2533 0 0.4666-0.0333 0.64-0.1 0.1866-0.0667 0.3733-0.16 0.56-0.28v2.1c-0.2267 0.0933-0.4667 0.1667-0.72 0.22-0.2534 0.0533-0.5534 0.08-0.9 0.08-0.9467 0-1.7-0.2733-2.26-0.82-0.56-0.56-0.84-1.3267-0.84-2.3zm11.1418 3.28c-1.0533 0-1.98-0.24-2.78-0.72-0.8-0.48-1.4266-1.1267-1.88-1.94-0.4533-0.8133-0.68-1.7333-0.68-2.76 0-1.0133 0.2267-1.9267 0.68-2.74 0.4534-0.8267 1.08-1.48 1.88-1.96 0.8-0.48 1.7267-0.72 2.78-0.72 1.04 0 1.9596 0.24 2.7596 0.72 0.8 0.48 1.427 1.1333 1.88 1.96 0.454 0.8133 0.68 1.7267 0.68 2.74 0 1.0267-0.226 1.9467-0.68 2.76-0.453 0.8133-1.08 1.46-1.88 1.94-0.8 0.48-1.7196 0.72-2.7596 0.72zm0-1.98c0.56 0 1.08-0.1333 1.56-0.4 0.4796-0.28 0.8666-0.6733 1.1596-1.18 0.307-0.52 0.46-1.14 0.46-1.86 0-0.72-0.153-1.3333-0.46-1.84-0.293-0.52-0.68-0.9133-1.1596-1.18-0.48-0.28-1-0.42-1.56-0.42s-1.0866 0.14-1.58 0.42c-0.48 0.2667-0.8733 0.66-1.18 1.18-0.2933 0.5067-0.44 1.12-0.44 1.84s0.1467 1.34 0.44 1.86c0.3067 0.5067 0.7 0.9 1.18 1.18 0.4934 0.2667 1.02 0.4 1.58 0.4zM118.4 21.32c-1.027 0-1.993-0.1867-2.9-0.56-0.893-0.3733-1.687-0.8933-2.38-1.56-0.693-0.68-1.24-1.4733-1.64-2.38-0.387-0.92-0.58-1.9133-0.58-2.98s0.193-2.0533 0.58-2.96c0.4-0.92 0.94-1.71333 1.62-2.38 0.693-0.68 1.493-1.20667 2.4-1.58 0.907-0.37333 1.873-0.56 2.9-0.56 1.093 0 2.1 0.19333 3.02 0.58 0.933 0.38667 1.713 0.92667 2.34 1.62l-1.52 1.5c-0.467-0.52-1.027-0.92-1.68-1.2-0.64-0.28-1.36-0.42-2.16-0.42-0.947 0-1.82 0.22667-2.62 0.68-0.8 0.44-1.447 1.0667-1.94 1.88-0.48 0.8-0.72 1.7467-0.72 2.84s0.247 2.0467 0.74 2.86c0.493 0.8 1.14 1.4267 1.94 1.88 0.8 0.44 1.673 0.66 2.62 0.66 0.867 0 1.653-0.16 2.36-0.48 0.707-0.3333 1.273-0.8 1.7-1.4 0.44-0.6 0.707-1.32 0.8-2.16h-4.9v-1.94h6.96c0.08 0.36 0.12 0.74 0.12 1.14v0.02c0 1.3867-0.307 2.6-0.92 3.64-0.6 1.0267-1.433 1.8267-2.5 2.4-1.067 0.5733-2.28 0.86-3.64 0.86zm13.5 0c-1.053 0-1.98-0.24-2.78-0.72-0.8-0.48-1.427-1.1267-1.88-1.94-0.453-0.8133-0.68-1.7333-0.68-2.76 0-1.0133 0.227-1.9267 0.68-2.74 0.453-0.8267 1.08-1.48 1.88-1.96 0.8-0.48 1.727-0.72 2.78-0.72 1.04 0 1.96 0.24 2.76 0.72 0.8 0.48 1.427 1.1333 1.88 1.96 0.453 0.8133 0.68 1.7267 0.68 2.74 0 1.0267-0.227 1.9467-0.68 2.76-0.453 0.8133-1.08 1.46-1.88 1.94-0.8 0.48-1.72 0.72-2.76 0.72zm0-1.98c0.56 0 1.08-0.1333 1.56-0.4 0.48-0.28 0.867-0.6733 1.16-1.18 0.307-0.52 0.46-1.14 0.46-1.86 0-0.72-0.153-1.3333-0.46-1.84-0.293-0.52-0.68-0.9133-1.16-1.18-0.48-0.28-1-0.42-1.56-0.42s-1.087 0.14-1.58 0.42c-0.48 0.2667-0.873 0.66-1.18 1.18-0.293 0.5067-0.44 1.12-0.44 1.84s0.147 1.34 0.44 1.86c0.307 0.5067 0.7 0.9 1.18 1.18 0.493 0.2667 1.02 0.4 1.58 0.4zm12.109 1.98c-1.053 0-1.98-0.24-2.78-0.72-0.8-0.48-1.426-1.1267-1.88-1.94-0.453-0.8133-0.68-1.7333-0.68-2.76 0-1.0133 0.227-1.9267 0.68-2.74 0.454-0.8267 1.08-1.48 1.88-1.96 0.8-0.48 1.727-0.72 2.78-0.72 1.04 0 1.96 0.24 2.76 0.72 0.8 0.48 1.427 1.1333 1.88 1.96 0.454 0.8133 0.68 1.7267 0.68 2.74 0 1.0267-0.226 1.9467-0.68 2.76-0.453 0.8133-1.08 1.46-1.88 1.94-0.8 0.48-1.72 0.72-2.76 0.72zm0-1.98c0.56 0 1.08-0.1333 1.56-0.4 0.48-0.28 0.867-0.6733 1.16-1.18 0.307-0.52 0.46-1.14 0.46-1.86 0-0.72-0.153-1.3333-0.46-1.84-0.293-0.52-0.68-0.9133-1.16-1.18-0.48-0.28-1-0.42-1.56-0.42s-1.086 0.14-1.58 0.42c-0.48 0.2667-0.873 0.66-1.18 1.18-0.293 0.5067-0.44 1.12-0.44 1.84s0.147 1.34 0.44 1.86c0.307 0.5067 0.7 0.9 1.18 1.18 0.494 0.2667 1.02 0.4 1.58 0.4zm11.91 6.3c-0.894 0-1.667-0.1467-2.32-0.44-0.64-0.28-1.16-0.6467-1.56-1.1-0.4-0.44-0.687-0.8933-0.86-1.36l2-0.84c0.213 0.5333 0.553 0.9667 1.02 1.3 0.48 0.3467 1.053 0.52 1.72 0.52 0.933 0 1.666-0.28 2.2-0.84 0.546-0.56 0.82-1.3533 0.82-2.38v-0.98h-0.12c-0.32 0.48-0.767 0.8667-1.34 1.16-0.56 0.28-1.2 0.42-1.92 0.42-0.867 0-1.66-0.22-2.38-0.66-0.72-0.44-1.3-1.0533-1.74-1.84-0.44-0.8-0.66-1.7333-0.66-2.8 0-1.08 0.22-2.0133 0.66-2.8 0.44-0.8 1.02-1.42 1.74-1.86 0.72-0.44 1.513-0.66 2.38-0.66 0.72 0 1.36 0.1467 1.92 0.44 0.573 0.2933 1.02 0.68 1.34 1.16h0.12V10.8h2.06v9.66c0 1.1067-0.22 2.0467-0.66 2.82-0.427 0.7733-1.02 1.36-1.78 1.76-0.76 0.4-1.64 0.6-2.64 0.6zm0.02-6.5c0.533 0 1.026-0.1267 1.48-0.38 0.453-0.2667 0.82-0.6467 1.1-1.14 0.28-0.5067 0.42-1.1133 0.42-1.82 0-0.7333-0.14-1.3467-0.42-1.84-0.28-0.5067-0.647-0.8867-1.1-1.14-0.454-0.2533-0.947-0.38-1.48-0.38-0.534 0-1.034 0.1333-1.5 0.4-0.454 0.2533-0.82 0.6267-1.1 1.12-0.28 0.4933-0.42 1.1067-0.42 1.84 0 0.72 0.14 1.3333 0.42 1.84 0.28 0.4933 0.646 0.8667 1.1 1.12 0.466 0.2533 0.966 0.38 1.5 0.38zm7.607 1.86V6.68h2.16V21h-2.16zm9.269 0.32c-1 0-1.894-0.2333-2.68-0.7-0.787-0.4667-1.407-1.1067-1.86-1.92-0.44-0.8133-0.66-1.74-0.66-2.78 0-0.9733 0.213-1.8733 0.64-2.7 0.426-0.8267 1.02-1.4867 1.78-1.98 0.773-0.5067 1.66-0.76 2.66-0.76 1.053 0 1.946 0.2267 2.68 0.68 0.746 0.4533 1.313 1.0733 1.7 1.86 0.386 0.7867 0.58 1.6733 0.58 2.66 0 0.1467-0.007 0.28-0.02 0.4 0 0.12-0.007 0.2133-0.02 0.28h-7.88c0.106 1.0133 0.46 1.7733 1.06 2.28 0.613 0.5067 1.306 0.76 2.08 0.76 0.693 0 1.266-0.1533 1.72-0.46 0.453-0.32 0.813-0.7133 1.08-1.18l1.78 0.86c-0.44 0.8-1.04 1.4533-1.8 1.96-0.76 0.4933-1.707 0.74-2.84 0.74zm-0.1-9c-0.72 0-1.334 0.22-1.84 0.66-0.507 0.44-0.847 1.0267-1.02 1.76h5.66c-0.027-0.3467-0.14-0.7067-0.34-1.08-0.2-0.3733-0.507-0.6867-0.92-0.94-0.4-0.2667-0.914-0.4-1.54-0.4zM186.446 21l-3.84-14.32h2.44l2.28 9.3 0.24 1.24h0.12l0.3-1.24 2.88-9.3h2.2l2.76 9.3 0.3 1.22h0.12l0.24-1.22 2.28-9.3h2.42L197.406 21h-2.32l-2.74-9.5-0.32-1.34h-0.12l-0.34 1.34-2.86 9.5h-2.26zm18.756 0.32c-0.733 0-1.386-0.14-1.96-0.42-0.573-0.2933-1.02-0.7-1.34-1.22-0.32-0.52-0.48-1.1133-0.48-1.78 0-0.72 0.187-1.3333 0.56-1.84 0.387-0.52 0.9-0.9133 1.54-1.18 0.64-0.2667 1.347-0.4 2.12-0.4 0.64 0 1.2 0.06 1.68 0.18 0.494 0.12 0.867 0.2467 1.12 0.38V14.5c0-0.6667-0.24-1.2-0.72-1.6-0.48-0.4-1.1-0.6-1.86-0.6-0.52 0-1.013 0.12-1.48 0.36-0.466 0.2267-0.84 0.54-1.12 0.94l-1.48-1.14c0.44-0.6133 1.02-1.0933 1.74-1.44 0.734-0.36 1.534-0.54 2.4-0.54 1.48 0 2.62 0.3667 3.42 1.1 0.8 0.72 1.2 1.7333 1.2 3.04V21h-2.1v-1.26h-0.12c-0.266 0.4133-0.666 0.78-1.2 1.1-0.533 0.32-1.173 0.48-1.92 0.48zm0.38-1.76c0.56 0 1.054-0.1333 1.48-0.4 0.427-0.2667 0.76-0.6133 1-1.04 0.254-0.44 0.38-0.9133 0.38-1.42-0.306-0.1733-0.666-0.3133-1.08-0.42-0.413-0.12-0.853-0.18-1.32-0.18-0.88 0-1.506 0.18-1.88 0.54-0.373 0.3467-0.56 0.7733-0.56 1.28 0 0.48 0.18 0.8733 0.54 1.18 0.36 0.3067 0.84 0.46 1.44 0.46zM212.94 21V6.68h2.16V21h-2.16zm4.727 0V6.68h2.16V21h-2.16zm9.269 0.32c-1 0-1.894-0.2333-2.68-0.7-0.787-0.4667-1.407-1.1067-1.86-1.92-0.44-0.8133-0.66-1.74-0.66-2.78 0-0.9733 0.213-1.8733 0.64-2.7 0.426-0.8267 1.02-1.4867 1.78-1.98 0.773-0.5067 1.66-0.76 2.66-0.76 1.053 0 1.946 0.2267 2.68 0.68 0.746 0.4533 1.313 1.0733 1.7 1.86 0.386 0.7867 0.58 1.6733 0.58 2.66 0 0.1467-0.007 0.28-0.02 0.4 0 0.12-0.007 0.2133-0.02 0.28h-7.88c0.106 1.0133 0.46 1.7733 1.06 2.28 0.613 0.5067 1.306 0.76 2.08 0.76 0.693 0 1.266-0.1533 1.72-0.46 0.453-0.32 0.813-0.7133 1.08-1.18l1.78 0.86c-0.44 0.8-1.04 1.4533-1.8 1.96-0.76 0.4933-1.707 0.74-2.84 0.74zm-0.1-9c-0.72 0-1.334 0.22-1.84 0.66-0.507 0.44-0.847 1.0267-1.02 1.76h5.66c-0.027-0.3467-0.14-0.7067-0.34-1.08-0.2-0.3733-0.507-0.6867-0.92-0.94-0.4-0.2667-0.914-0.4-1.54-0.4zm7.731 5.72v-5.36h-1.78V10.8h1.78V7.92h2.16v2.88h2.5v1.88h-2.5v4.9c0 0.5067 0.1 0.8933 0.3 1.16 0.213 0.2667 0.566 0.4 1.06 0.4 0.253 0 0.466-0.0333 0.64-0.1 0.186-0.0667 0.373-0.16 0.56-0.28v2.1c-0.227 0.0933-0.467 0.1667-0.72 0.22-0.254 0.0533-0.554 0.08-0.9 0.08-0.947 0-1.7-0.2733-2.26-0.82-0.56-0.56-0.84-1.3267-0.84-2.3z" android:fillColor="#ffffff"/>
7
+ </vector>
@@ -0,0 +1,7 @@
1
+ <vector android:width="159dp" android:height="36dp" android:viewportWidth="159" android:viewportHeight="36" xmlns:android="http://schemas.android.com/apk/res/android">
2
+ <path android:pathData="M36 14.291H0V8.64555c0-3.06469 2.6422-5.64548 5.77982-5.64548H30.2202C33.3578 3.00007 36 5.58086 36 8.64555V14.291z" android:fillColor="#34a853"/>
3
+ <path android:pathData="M36 19.5H0v-6c0-3.2571 2.6422-6 5.77982-6H30.2202C33.3578 7.5 36 10.2429 36 13.5v6z" android:fillColor="#fbbc04"/>
4
+ <path android:pathData="M36 24.5H0v-6c0-3.2571 2.6422-6 5.77982-6H30.2202c3.1376 0 5.7798 2.7429 5.7798 6v6z" android:fillColor="#ea4335"/>
5
+ <path android:pathData="M0 15.7409l22.8493 5.1616c2.6302 0.6452 5.5891 0 7.726-1.613L36 15.4183v12.0974c0 3.0647-2.6301 5.4842-5.7534 5.4842H5.75343C2.63014 32.9999 0 30.5804 0 27.5157V15.7409z" android:fillColor="#4285f4"/>
6
+ <path android:pathData="M48.195 12l3.51-9.308h1.625L56.853 12H55.28l-0.858-2.392h-3.796L49.768 12h-1.573zm3.939-6.565l-1.027 2.847h2.834l-1.027-2.847-0.351-1.066h-0.078l-0.351 1.066zm8.3803 6.773c-0.598 0-1.1396-0.1473-1.625-0.442-0.4766-0.3033-0.858-0.7193-1.144-1.248-0.2773-0.53733-0.416-1.14833-0.416-1.833 0-0.68467 0.1387-1.29133 0.416-1.82 0.286-0.52867 0.6674-0.94467 1.144-1.248 0.4854-0.30333 1.027-0.455 1.625-0.455 0.5114 0 0.949 0.11267 1.313 0.338 0.3727 0.22533 0.6457 0.481 0.819 0.767h0.078l-0.078-0.923V2.692h1.391V12h-1.313v-0.884h-0.078c-0.1733 0.286-0.4463 0.5417-0.819 0.767-0.364 0.2167-0.8016 0.325-1.313 0.325zm0.208-1.287c0.3467 0 0.6717-0.091 0.975-0.273 0.312-0.182 0.559-0.4377 0.741-0.767 0.1907-0.338 0.286-0.73667 0.286-1.196 0-0.45933-0.0953-0.85367-0.286-1.183-0.182-0.338-0.429-0.598-0.741-0.78-0.3033-0.182-0.6283-0.273-0.975-0.273-0.3466 0-0.6716 0.091-0.975 0.273-0.3033 0.182-0.5503 0.442-0.741 0.78-0.1906 0.32933-0.286 0.72367-0.286 1.183s0.0954 0.858 0.286 1.196c0.1907 0.3293 0.4377 0.585 0.741 0.767 0.3034 0.182 0.6284 0.273 0.975 0.273zm7.7393 1.287c-0.598 0-1.1397-0.1473-1.625-0.442-0.4767-0.3033-0.858-0.7193-1.144-1.248-0.2773-0.53733-0.416-1.14833-0.416-1.833 0-0.68467 0.1387-1.29133 0.416-1.82 0.286-0.52867 0.6673-0.94467 1.144-1.248 0.4853-0.30333 1.027-0.455 1.625-0.455 0.5113 0 0.949 0.11267 1.313 0.338 0.3727 0.22533 0.6457 0.481 0.819 0.767h0.078l-0.078-0.923V2.692h1.391V12h-1.313v-0.884h-0.078c-0.1733 0.286-0.4463 0.5417-0.819 0.767-0.364 0.2167-0.8017 0.325-1.313 0.325zm0.208-1.287c0.3467 0 0.6717-0.091 0.975-0.273 0.312-0.182 0.559-0.4377 0.741-0.767 0.1907-0.338 0.286-0.73667 0.286-1.196 0-0.45933-0.0953-0.85367-0.286-1.183-0.182-0.338-0.429-0.598-0.741-0.78-0.3033-0.182-0.6283-0.273-0.975-0.273s-0.6717 0.091-0.975 0.273c-0.3033 0.182-0.5503 0.442-0.741 0.78-0.1907 0.32933-0.286 0.72367-0.286 1.183s0.0953 0.858 0.286 1.196c0.1907 0.3293 0.4377 0.585 0.741 0.767 0.3033 0.182 0.6283 0.273 0.975 0.273zm8.7049-0.845V6.592h-1.157V5.37h1.157V3.498h1.404V5.37h1.625v1.222h-1.625v3.185c0 0.3293 0.065 0.5807 0.195 0.754 0.1387 0.1733 0.3683 0.26 0.689 0.26 0.1647 0 0.3033-0.0217 0.416-0.065 0.1213-0.0433 0.2427-0.104 0.364-0.182v1.365c-0.1473 0.0607-0.3033 0.1083-0.468 0.143-0.1647 0.0347-0.3597 0.052-0.585 0.052-0.6153 0-1.105-0.1777-1.469-0.533-0.364-0.364-0.546-0.8623-0.546-1.495zm7.2422 2.132c-0.6846 0-1.287-0.156-1.807-0.468-0.52-0.312-0.9273-0.7323-1.222-1.261-0.2946-0.52867-0.442-1.12667-0.442-1.794 0-0.65867 0.1474-1.25233 0.442-1.781 0.2947-0.53733 0.702-0.962 1.222-1.274 0.52-0.312 1.1224-0.468 1.807-0.468 0.676 0 1.274 0.156 1.794 0.468 0.52 0.312 0.9274 0.73667 1.222 1.274 0.2947 0.52867 0.442 1.12233 0.442 1.781 0 0.66733-0.1473 1.26533-0.442 1.794-0.2946 0.5287-0.702 0.949-1.222 1.261-0.52 0.312-1.118 0.468-1.794 0.468zm0-1.287c0.364 0 0.702-0.0867 1.014-0.26 0.312-0.182 0.5634-0.4377 0.754-0.767 0.1994-0.338 0.299-0.741 0.299-1.209 0-0.468-0.0996-0.86667-0.299-1.196-0.1906-0.338-0.442-0.59367-0.754-0.767-0.312-0.182-0.65-0.273-1.014-0.273s-0.7063 0.091-1.027 0.273c-0.312 0.17333-0.5676 0.429-0.767 0.767-0.1906 0.32933-0.286 0.728-0.286 1.196 0 0.468 0.0954 0.871 0.286 1.209 0.1994 0.3293 0.455 0.585 0.767 0.767 0.3207 0.1733 0.663 0.26 1.027 0.26zM55.14 32.272c-0.8727 0-1.6943-0.1587-2.465-0.476-0.7593-0.3173-1.4337-0.7593-2.023-1.326-0.5893-0.578-1.054-1.2523-1.394-2.023-0.3287-0.782-0.493-1.6263-0.493-2.533 0-0.9067 0.1643-1.7453 0.493-2.516 0.34-0.782 0.799-1.4563 1.377-2.023 0.5893-0.578 1.2693-1.0257 2.04-1.343 0.7707-0.3173 1.5923-0.476 2.465-0.476 0.9293 0 1.785 0.1643 2.567 0.493 0.7933 0.3287 1.4563 0.7877 1.989 1.377l-1.292 1.275c-0.3967-0.442-0.8727-0.782-1.428-1.02-0.544-0.238-1.156-0.357-1.836-0.357-0.8047 0-1.547 0.1927-2.227 0.578-0.68 0.374-1.2297 0.9067-1.649 1.598-0.408 0.68-0.612 1.4847-0.612 2.414 0 0.9293 0.2097 1.7397 0.629 2.431 0.4193 0.68 0.969 1.2127 1.649 1.598 0.68 0.374 1.4223 0.561 2.227 0.561 0.7367 0 1.4053-0.136 2.006-0.408 0.6007-0.2833 1.0823-0.68 1.445-1.19 0.374-0.51 0.6007-1.122 0.68-1.836h-4.165v-1.649h5.916c0.068 0.306 0.102 0.629 0.102 0.969v0.017c0 1.1787-0.2607 2.21-0.782 3.094-0.51 0.8727-1.2183 1.5527-2.125 2.04-0.9067 0.4873-1.938 0.731-3.094 0.731zm11.4749 0c-0.8954 0-1.683-0.204-2.363-0.612-0.68-0.408-1.2127-0.9577-1.598-1.649-0.3854-0.6913-0.578-1.4733-0.578-2.346 0-0.8613 0.1926-1.6377 0.578-2.329 0.3853-0.7027 0.918-1.258 1.598-1.666 0.68-0.408 1.4676-0.612 2.363-0.612 0.884 0 1.666 0.204 2.346 0.612 0.68 0.408 1.2126 0.9633 1.598 1.666 0.3853 0.6913 0.578 1.4677 0.578 2.329 0 0.8727-0.1927 1.6547-0.578 2.346-0.3854 0.6913-0.918 1.241-1.598 1.649-0.68 0.408-1.462 0.612-2.346 0.612zm0-1.683c0.476 0 0.918-0.1133 1.326-0.34 0.408-0.238 0.7366-0.5723 0.986-1.003 0.2606-0.442 0.391-0.969 0.391-1.581s-0.1304-1.1333-0.391-1.564c-0.2494-0.442-0.578-0.7763-0.986-1.003-0.408-0.238-0.85-0.357-1.326-0.357-0.476 0-0.9237 0.119-1.343 0.357-0.408 0.2267-0.7424 0.561-1.003 1.003-0.2494 0.4307-0.374 0.952-0.374 1.564 0 0.612 0.1246 1.139 0.374 1.581 0.2606 0.4307 0.595 0.765 1.003 1.003 0.4193 0.2267 0.867 0.34 1.343 0.34zm10.2929 1.683c-0.8953 0-1.683-0.204-2.363-0.612-0.68-0.408-1.2126-0.9577-1.598-1.649-0.3853-0.6913-0.578-1.4733-0.578-2.346 0-0.8613 0.1927-1.6377 0.578-2.329 0.3854-0.7027 0.918-1.258 1.598-1.666 0.68-0.408 1.4677-0.612 2.363-0.612 0.884 0 1.666 0.204 2.346 0.612 0.68 0.408 1.2127 0.9633 1.598 1.666 0.3854 0.6913 0.578 1.4677 0.578 2.329 0 0.8727-0.1926 1.6547-0.578 2.346-0.3853 0.6913-0.918 1.241-1.598 1.649-0.68 0.408-1.462 0.612-2.346 0.612zm0-1.683c0.476 0 0.918-0.1133 1.326-0.34 0.408-0.238 0.7367-0.5723 0.986-1.003 0.2607-0.442 0.391-0.969 0.391-1.581s-0.1303-1.1333-0.391-1.564c-0.2493-0.442-0.578-0.7763-0.986-1.003-0.408-0.238-0.85-0.357-1.326-0.357-0.476 0-0.9236 0.119-1.343 0.357-0.408 0.2267-0.7423 0.561-1.003 1.003-0.2493 0.4307-0.374 0.952-0.374 1.564 0 0.612 0.1247 1.139 0.374 1.581 0.2607 0.4307 0.595 0.765 1.003 1.003 0.4194 0.2267 0.867 0.34 1.343 0.34zm10.123 5.355c-0.7593 0-1.4167-0.1247-1.972-0.374-0.544-0.238-0.986-0.5497-1.326-0.935-0.34-0.374-0.5837-0.7593-0.731-1.156l1.7-0.714c0.1813 0.4533 0.4703 0.8217 0.867 1.105 0.408 0.2947 0.8953 0.442 1.462 0.442 0.7933 0 1.4167-0.238 1.87-0.714 0.4647-0.476 0.697-1.1503 0.697-2.023v-0.833h-0.102c-0.272 0.408-0.6517 0.7367-1.139 0.986-0.476 0.238-1.02 0.357-1.632 0.357-0.7367 0-1.411-0.187-2.023-0.561-0.612-0.374-1.105-0.8953-1.479-1.564-0.374-0.68-0.561-1.4733-0.561-2.38 0-0.918 0.187-1.7113 0.561-2.38 0.374-0.68 0.867-1.207 1.479-1.581 0.612-0.374 1.2863-0.561 2.023-0.561 0.612 0 1.156 0.1247 1.632 0.374 0.4873 0.2493 0.867 0.578 1.139 0.986h0.102V23.33h1.751v8.211c0 0.9407-0.187 1.7397-0.561 2.397-0.3627 0.6573-0.867 1.156-1.513 1.496-0.646 0.34-1.394 0.51-2.244 0.51zm0.017-5.525c0.4533 0 0.8727-0.1077 1.258-0.323 0.3853-0.2267 0.697-0.5497 0.935-0.969 0.238-0.4307 0.357-0.9463 0.357-1.547 0-0.6233-0.119-1.1447-0.357-1.564-0.238-0.4307-0.5497-0.7537-0.935-0.969-0.3853-0.2153-0.8047-0.323-1.258-0.323-0.4533 0-0.8783 0.1133-1.275 0.34-0.3853 0.2153-0.697 0.5327-0.935 0.952-0.238 0.4193-0.357 0.9407-0.357 1.564 0 0.612 0.119 1.1333 0.357 1.564 0.238 0.4193 0.5497 0.7367 0.935 0.952 0.3967 0.2153 0.8217 0.323 1.275 0.323zM93.5138 32V19.828h1.836V32h-1.836zm7.8782 0.272c-0.85 0-1.609-0.1983-2.2776-0.595-0.6687-0.3967-1.1957-0.9407-1.581-1.632-0.374-0.6913-0.561-1.479-0.561-2.363 0-0.8273 0.1813-1.5923 0.544-2.295 0.3626-0.7027 0.867-1.2637 1.513-1.683 0.6573-0.4307 1.4106-0.646 2.2606-0.646 0.896 0 1.655 0.1927 2.278 0.578 0.635 0.3853 1.117 0.9123 1.445 1.581 0.329 0.6687 0.493 1.4223 0.493 2.261 0 0.1247-0.005 0.238-0.017 0.34 0 0.102-0.005 0.1813-0.017 0.238h-6.6976c0.0906 0.8613 0.391 1.5073 0.901 1.938 0.5216 0.4307 1.1106 0.646 1.7676 0.646 0.59 0 1.077-0.1303 1.462-0.391 0.386-0.272 0.692-0.6063 0.918-1.003l1.513 0.731c-0.374 0.68-0.884 1.2353-1.53 1.666-0.646 0.4193-1.45 0.629-2.414 0.629zm-0.085-7.65c-0.612 0-1.133 0.187-1.5636 0.561-0.4307 0.374-0.7197 0.8727-0.867 1.496h4.8106c-0.022-0.2947-0.119-0.6007-0.289-0.918-0.17-0.3173-0.43-0.5837-0.782-0.799-0.34-0.2267-0.776-0.34-1.309-0.34zM112.979 32l-3.264-12.172h2.074l1.938 7.905 0.204 1.054h0.102l0.255-1.054 2.448-7.905h1.87l2.346 7.905 0.255 1.037h0.102l0.204-1.037 1.938-7.905h2.057L122.295 32h-1.972l-2.329-8.075-0.272-1.139h-0.102l-0.289 1.139L114.9 32h-1.921zm15.943 0.272c-0.623 0-1.179-0.119-1.666-0.357-0.487-0.2493-0.867-0.595-1.139-1.037-0.272-0.442-0.408-0.9463-0.408-1.513 0-0.612 0.159-1.1333 0.476-1.564 0.329-0.442 0.765-0.7763 1.309-1.003 0.544-0.2267 1.145-0.34 1.802-0.34 0.544 0 1.02 0.051 1.428 0.153 0.419 0.102 0.737 0.2097 0.952 0.323v-0.459c0-0.5667-0.204-1.02-0.612-1.36-0.408-0.34-0.935-0.51-1.581-0.51-0.442 0-0.861 0.102-1.258 0.306-0.397 0.1927-0.714 0.459-0.952 0.799l-1.258-0.969c0.374-0.5213 0.867-0.9293 1.479-1.224 0.623-0.306 1.303-0.459 2.04-0.459 1.258 0 2.227 0.3117 2.907 0.935 0.68 0.612 1.02 1.4733 1.02 2.584V32h-1.785v-1.071h-0.102c-0.227 0.3513-0.567 0.663-1.02 0.935-0.453 0.272-0.997 0.408-1.632 0.408zm0.323-1.496c0.476 0 0.895-0.1133 1.258-0.34s0.646-0.5213 0.85-0.884c0.215-0.374 0.323-0.7763 0.323-1.207-0.261-0.1473-0.567-0.2663-0.918-0.357-0.351-0.102-0.725-0.153-1.122-0.153-0.748 0-1.281 0.153-1.598 0.459-0.317 0.2947-0.476 0.6573-0.476 1.088 0 0.408 0.153 0.7423 0.459 1.003 0.306 0.2607 0.714 0.391 1.224 0.391zM135.499 32V19.828h1.836V32h-1.836zm4.018 0V19.828h1.836V32h-1.836zm7.878 0.272c-0.85 0-1.609-0.1983-2.278-0.595-0.668-0.3967-1.195-0.9407-1.581-1.632-0.374-0.6913-0.561-1.479-0.561-2.363 0-0.8273 0.182-1.5923 0.544-2.295 0.363-0.7027 0.867-1.2637 1.513-1.683 0.658-0.4307 1.411-0.646 2.261-0.646 0.896 0 1.655 0.1927 2.278 0.578 0.635 0.3853 1.117 0.9123 1.445 1.581 0.329 0.6687 0.493 1.4223 0.493 2.261 0 0.1247-0.005 0.238-0.017 0.34 0 0.102-0.005 0.1813-0.017 0.238h-6.698c0.091 0.8613 0.391 1.5073 0.901 1.938 0.522 0.4307 1.111 0.646 1.768 0.646 0.59 0 1.077-0.1303 1.462-0.391 0.386-0.272 0.692-0.6063 0.918-1.003l1.513 0.731c-0.374 0.68-0.884 1.2353-1.53 1.666-0.646 0.4193-1.45 0.629-2.414 0.629zm-0.085-7.65c-0.612 0-1.133 0.187-1.564 0.561-0.43 0.374-0.719 0.8727-0.867 1.496h4.811c-0.022-0.2947-0.119-0.6007-0.289-0.918-0.17-0.3173-0.43-0.5837-0.782-0.799-0.34-0.2267-0.776-0.34-1.309-0.34zm6.572 4.862v-4.556h-1.513V23.33h1.513v-2.448h1.836v2.448h2.125v1.598h-2.125v4.165c0 0.4307 0.085 0.7593 0.255 0.986 0.181 0.2267 0.481 0.34 0.901 0.34 0.215 0 0.396-0.0283 0.544-0.085 0.158-0.0567 0.317-0.136 0.476-0.238v1.785c-0.193 0.0793-0.397 0.1417-0.612 0.187-0.216 0.0453-0.471 0.068-0.765 0.068-0.805 0-1.445-0.2323-1.921-0.697-0.476-0.476-0.714-1.1277-0.714-1.955z" android:fillColor="#ffffff"/>
7
+ </vector>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <selector xmlns:android="http://schemas.android.com/apk/res/android" >
3
+ <item
4
+ android:drawable="@drawable/googlepay_button_background_image" />
5
+ </selector>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <selector xmlns:android="http://schemas.android.com/apk/res/android" >
3
+ <item android:state_enabled="false">
4
+ <shape
5
+ android:shape="rectangle" >
6
+ <corners android:radius="4dp"/>
7
+ <solid android:color="#7FFFFFFF"/>
8
+ </shape>
9
+ </item>
10
+ <item android:drawable="@android:color/transparent" />
11
+ </selector>