55
66package org.microg.gms.pay
77
8+ import android.content.Context
89import android.os.Parcel
10+ import android.util.Base64
11+ import android.util.Log
912import com.google.android.gms.common.Feature
13+ import com.google.android.gms.common.api.ApiMetadata
1014import com.google.android.gms.common.api.CommonStatusCodes
15+ import com.google.android.gms.common.api.Status
1116import com.google.android.gms.common.internal.ConnectionInfo
1217import com.google.android.gms.common.internal.GetServiceRequest
1318import com.google.android.gms.common.internal.IGmsCallbacks
19+ import com.google.android.gms.pay.DataChangeListenerRequest
20+ import com.google.android.gms.pay.GetBulletinsRequest
21+ import com.google.android.gms.pay.GetClosedLoopCardsFromServerRequest
22+ import com.google.android.gms.pay.GetClosedLoopCardsRequest
23+ import com.google.android.gms.pay.GetDigitalCarKeysRequest
24+ import com.google.android.gms.pay.GetOnboardingInfoRequest
25+ import com.google.android.gms.pay.GetPayCapabilitiesRequest
26+ import com.google.android.gms.pay.GetPaymentMethodsRequest
27+ import com.google.android.gms.pay.GetSortOrderRequest
28+ import com.google.android.gms.pay.GetValuablesFromServerRequest
29+ import com.google.android.gms.pay.GetValuablesRequest
1430import com.google.android.gms.pay.internal.IPayService
31+ import com.google.android.gms.pay.internal.IPayServiceCallbacks
1532import org.microg.gms.BaseService
1633import org.microg.gms.common.GmsService
34+ import org.microg.gms.common.GooglePackagePermission
35+ import org.microg.gms.common.PackageUtils
36+ import org.microg.gms.utils.ExtendedPackageInfo
37+ import org.microg.gms.utils.toBase64
1738import org.microg.gms.utils.warnOnTransactionIssues
1839
1940private const val TAG = " PayService"
2041
2142class PayService : BaseService (TAG , GmsService .PAY ) {
2243 override fun handleServiceRequest (callback : IGmsCallbacks , request : GetServiceRequest , service : GmsService ) {
23- callback.onPostInitCompleteWithConnectionInfo(CommonStatusCodes .SUCCESS , PayServiceImpl (), ConnectionInfo ().apply {
44+ val packageName = PackageUtils .getAndCheckCallingPackage(this , request.packageName)
45+ ? : throw IllegalArgumentException (" Missing package name" )
46+ callback.onPostInitCompleteWithConnectionInfo(CommonStatusCodes .SUCCESS , PayServiceImpl (this , packageName), ConnectionInfo ().apply {
2447 features = arrayOf(
2548 Feature (" pay" , 10 ),
2649 Feature (" pay_attestation_signal" , 1 ),
@@ -93,7 +116,112 @@ class PayService : BaseService(TAG, GmsService.PAY) {
93116 }
94117}
95118
96- class PayServiceImpl : IPayService .Stub () {
119+ class PayServiceImpl (private val context : Context , private val packageName : String ) : IPayService.Stub() {
120+
121+ private val isFirstParty
122+ get() = ExtendedPackageInfo (context, packageName).hasGooglePackagePermission(GooglePackagePermission .WALLET )
123+
124+ override fun getValuables (request : GetValuablesRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
125+ if (! isFirstParty) {
126+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
127+ return
128+ }
129+ Log .d(TAG , " Not yet implemented: getValuables($request )" )
130+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
131+ }
132+
133+ override fun getValuablesFromServer (request : GetValuablesFromServerRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
134+ if (! isFirstParty) {
135+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
136+ return
137+ }
138+ Log .d(TAG , " Not yet implemented: getValuablesFromServer($request )" )
139+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
140+ }
141+
142+ override fun getClosedLoopCards (request : GetClosedLoopCardsRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
143+ if (! isFirstParty) {
144+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
145+ return
146+ }
147+ Log .d(TAG , " Not yet implemented: getClosedLoopCards($request )" )
148+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
149+ }
150+
151+ override fun getClosedLoopCardsFromServer (request : GetClosedLoopCardsFromServerRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
152+ if (! isFirstParty) {
153+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
154+ return
155+ }
156+ Log .d(TAG , " Not yet implemented: getClosedLoopCardsFromServer($request )" )
157+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
158+ }
159+
160+ override fun registerDataChangedListener (request : DataChangeListenerRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
161+ if (! isFirstParty) return
162+ Log .d(TAG , " Not yet implemented: registerDataChangedListener($request )" )
163+ }
164+
165+ override fun getSortOrder (request : GetSortOrderRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
166+ if (! isFirstParty) {
167+ callbacks?.onGetSortOrderResponse(Status .INTERNAL_ERROR , null )
168+ return
169+ }
170+ Log .d(TAG , " Not yet implemented: getSortOrder($request )" )
171+ callbacks?.onGetSortOrderResponse(Status .INTERNAL_ERROR , null )
172+ }
173+
174+ override fun getPaymentMethods (request : GetPaymentMethodsRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
175+ if (! isFirstParty) {
176+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
177+ return
178+ }
179+ Log .d(TAG , " Not yet implemented: getPaymentMethods($request )" )
180+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
181+ }
182+
183+ override fun getOnboardingInfo (request : GetOnboardingInfoRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
184+ if (! isFirstParty) {
185+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
186+ return
187+ }
188+ Log .d(TAG , " Not yet implemented: getOnboardingInfo($request )" )
189+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
190+ }
191+
192+ override fun getPayCapabilities (request : GetPayCapabilitiesRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
193+ Log .d(TAG , " Not yet implemented: getPayCapabilities($request )" )
194+ callbacks?.onStatus(Status .INTERNAL_ERROR )
195+ }
196+
197+ override fun getDigitalCarKeys (request : GetDigitalCarKeysRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
198+ if (! isFirstParty) {
199+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
200+ return
201+ }
202+ Log .d(TAG , " Not yet implemented: getDigitalCarKeys($request )" )
203+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
204+ }
205+
206+ override fun getWalletBulletins (request : GetBulletinsRequest ? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
207+ if (! isFirstParty) {
208+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
209+ return
210+ }
211+ Log .d(TAG , " Not yet implemented: getWalletBulletins($request )" )
212+ callbacks?.onProtoSafeParcelable(Status .INTERNAL_ERROR , null )
213+ }
214+
215+ override fun performIdCard (request : ByteArray? , callbacks : IPayServiceCallbacks ? , metadata : ApiMetadata ? ) {
216+ if (! isFirstParty) {
217+ callbacks?.onByteArray(Status .INTERNAL_ERROR , null )
218+ return
219+ }
220+ Log .d(TAG , " Not yet implemented: performIdCard(${request?.toBase64(Base64 .NO_WRAP )} )" )
221+ callbacks?.onByteArray(Status .INTERNAL_ERROR , null )
222+ }
223+
224+
97225 override fun onTransact (code : Int , data : Parcel , reply : Parcel ? , flags : Int ): Boolean =
98226 warnOnTransactionIssues(code, reply, flags, TAG ) { super .onTransact(code, data, reply, flags) }
99227}
0 commit comments