diff --git a/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java b/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java index 25d08f1f00..7493a9d03d 100644 --- a/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java +++ b/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java @@ -138,7 +138,7 @@ public enum GmsService { AD_CONSENT_LOOKUP(195, "com.google.android.gms.ads.service.CONSENT_LOOKUP"), CREDENTIAL_MANAGER(196, "com.google.android.gms.credential.manager.service.firstparty.START"), PHONE_INTERNAL(197, "com.google.android.gms.auth.api.phone.service.InternalService.START"), - PAY(198, "com.google.android.gms.pay.service.BIND"), + PAY(198, "com.google.android.gms.pay.service.BIND", "com.google.android.gms.pay.service.THIRD_PARTY"), ASTERISM(199, "com.google.android.gms.asterism.service.START"), MODULE_RESTORE(201, "com.google.android.gms.backup.GMS_MODULE_RESTORE"), FACS_CACHE(202, "com.google.android.gms.facs.cache.service.START"), diff --git a/play-services-pay/build.gradle b/play-services-pay/build.gradle index 9316c929e2..9c0a84b156 100644 --- a/play-services-pay/build.gradle +++ b/play-services-pay/build.gradle @@ -35,7 +35,12 @@ android { description = 'microG API for play-services-pay' dependencies { + // Dependencies from play-services-pay:16.5.0 + implementation "androidx.activity:activity:1.2.3" + implementation "androidx.fragment:fragment:1.3.4" api project(':play-services-base') + api project(':play-services-basement') + api project(':play-services-tasks') - implementation "androidx.annotation:annotation:$annotationVersion" + annotationProcessor project(':safe-parcel-processor') } diff --git a/play-services-pay/core/src/main/AndroidManifest.xml b/play-services-pay/core/src/main/AndroidManifest.xml index 54279f4795..1a8f33a67a 100644 --- a/play-services-pay/core/src/main/AndroidManifest.xml +++ b/play-services-pay/core/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - - @@ -7,23 +6,34 @@ + android:name="com.google.android.gms.pay.main.PayActivity" + android:exported="true" + android:process=":ui" + android:targetActivity="org.microg.gms.pay.PayActivity"> - - - + + + + - + + + + + + + + diff --git a/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/PayService.kt b/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/PayService.kt index 69b9003d55..399a03881a 100644 --- a/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/PayService.kt +++ b/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/PayService.kt @@ -16,11 +16,11 @@ import org.microg.gms.BaseService import org.microg.gms.common.GmsService import org.microg.gms.utils.warnOnTransactionIssues -private const val TAG = "GmsPay" +private const val TAG = "PayService" class PayService : BaseService(TAG, GmsService.PAY) { override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { - callback.onPostInitCompleteWithConnectionInfo(CommonStatusCodes.SUCCESS, PayImpl(), ConnectionInfo().apply { + callback.onPostInitCompleteWithConnectionInfo(CommonStatusCodes.SUCCESS, PayServiceImpl(), ConnectionInfo().apply { features = arrayOf( Feature("pay", 10), Feature("pay_attestation_signal", 1), @@ -93,7 +93,7 @@ class PayService : BaseService(TAG, GmsService.PAY) { } } -class PayImpl : IPayService.Stub() { +class PayServiceImpl : IPayService.Stub() { override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } } \ No newline at end of file diff --git a/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/ThirdPartyPayService.kt b/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/ThirdPartyPayService.kt new file mode 100644 index 0000000000..8ad063b390 --- /dev/null +++ b/play-services-pay/core/src/main/kotlin/org/microg/gms/pay/ThirdPartyPayService.kt @@ -0,0 +1,92 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.pay + +import android.util.Log +import com.google.android.gms.common.Feature +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.internal.ConnectionInfo +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import com.google.android.gms.pay.CheckReadinessForEmoneyRequest +import com.google.android.gms.pay.GetMdocCredentialRequest +import com.google.android.gms.pay.GetPayApiAvailabilityStatusRequest +import com.google.android.gms.pay.GetPendingIntentForWalletOnWearRequest +import com.google.android.gms.pay.NotifyCardTapEventRequest +import com.google.android.gms.pay.NotifyEmoneyCardStatusUpdateRequest +import com.google.android.gms.pay.PayApiAvailabilityStatus +import com.google.android.gms.pay.PushEmoneyCardRequest +import com.google.android.gms.pay.SavePassesRequest +import com.google.android.gms.pay.SyncBundleRequest +import com.google.android.gms.pay.internal.IPayServiceCallbacks +import com.google.android.gms.pay.internal.IThirdPartyPayService +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService + + +private const val TAG = "ThirdPartyPayService" + +class ThirdPartyPayService : BaseService(TAG, GmsService.PAY) { + + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + callback.onPostInitCompleteWithConnectionInfo(CommonStatusCodes.SUCCESS, ThirdPartyPayServiceImpl().asBinder(), ConnectionInfo().apply { + features = arrayOf( + Feature("pay_get_pay_api_availability_status", 3), + Feature("pay_save_passes", 5), + Feature("pay_save_passes_jwt", 3), + Feature("pay_sync_bundle", 2), + Feature("pay_get_pending_intent_for_wallet_on_wear", 2), + Feature("pay_get_mdoc_credential_pending_intent", 1), + Feature("pay_notify_card_tap_event", 1), + Feature("pay_check_readiness_for_emoney", 1), + Feature("pay_push_emoney_card", 1), + Feature("pay_notify_emoney_card_status_update", 1) + ) + }) + } +} + +class ThirdPartyPayServiceImpl : IThirdPartyPayService.Stub() { + override fun getPayApiAvailabilityStatus(request: GetPayApiAvailabilityStatusRequest?, callback: IPayServiceCallbacks) { + Log.d(TAG, "onPayApiAvailabilityStatus: Reporting NOT_ELIGIBLE") + callback.onPayApiAvailabilityStatus(Status.SUCCESS, PayApiAvailabilityStatus.NOT_ELIGIBLE) + } + + override fun savePasses(request: SavePassesRequest?, callback: IPayServiceCallbacks) { + Log.d(TAG, "savePasses: return SERVICE_MISSING") + callback.onPendingIntent(Status(CommonStatusCodes.SERVICE_MISSING)) + } + + override fun syncBundle(request: SyncBundleRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "syncBundle Not yet implemented") + } + + override fun getPendingForWalletOnWear(request: GetPendingIntentForWalletOnWearRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "getPendingForWalletOnWear Not yet implemented") + } + + override fun getMdocCredential(request: GetMdocCredentialRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "getMdocCredential Not yet implemented") + } + + override fun notifyCardTapEvent(request: NotifyCardTapEventRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "notifyCardTapEvent Not yet implemented") + } + + override fun checkReadinessForEmoney(request: CheckReadinessForEmoneyRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "checkReadinessForEmoney Not yet implemented") + } + + override fun pushEmoneyCard(request: PushEmoneyCardRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "pushEmoneyCard Not yet implemented") + } + + override fun notifyEmoneyCardStatusUpdate(request: NotifyEmoneyCardStatusUpdateRequest?, callback: IPayServiceCallbacks?) { + Log.d(TAG, "notifyEmoneyCardStatusUpdate Not yet implemented") + } + +} \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.aidl new file mode 100644 index 0000000000..650f6d40c7 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable CheckReadinessForEmoneyRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/EmoneyReadiness.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/EmoneyReadiness.aidl new file mode 100644 index 0000000000..c60f7547c4 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/EmoneyReadiness.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable EmoneyReadiness; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetMdocCredentialRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetMdocCredentialRequest.aidl new file mode 100644 index 0000000000..8c2b01fa74 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetMdocCredentialRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable GetMdocCredentialRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.aidl new file mode 100644 index 0000000000..5d2aa8240f --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable GetPayApiAvailabilityStatusRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.aidl new file mode 100644 index 0000000000..06006c91a7 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable GetPendingIntentForWalletOnWearRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetWalletStatusResponse.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetWalletStatusResponse.aidl new file mode 100644 index 0000000000..789caac8d9 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/GetWalletStatusResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable GetWalletStatusResponse; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyCardTapEventRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyCardTapEventRequest.aidl new file mode 100644 index 0000000000..7d1635c152 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyCardTapEventRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable NotifyCardTapEventRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.aidl new file mode 100644 index 0000000000..54e64ab406 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable NotifyEmoneyCardStatusUpdateRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/PayApiError.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/PayApiError.aidl new file mode 100644 index 0000000000..869f6a965c --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/PayApiError.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable PayApiError; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/PushEmoneyCardRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/PushEmoneyCardRequest.aidl new file mode 100644 index 0000000000..471277aede --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/PushEmoneyCardRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable PushEmoneyCardRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/SavePassesRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/SavePassesRequest.aidl new file mode 100644 index 0000000000..af8c464793 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/SavePassesRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable SavePassesRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/SyncBundleRequest.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/SyncBundleRequest.aidl new file mode 100644 index 0000000000..112095437f --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/SyncBundleRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.pay; + +parcelable SyncBundleRequest; \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IPayServiceCallbacks.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IPayServiceCallbacks.aidl new file mode 100644 index 0000000000..b97add44a9 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IPayServiceCallbacks.aidl @@ -0,0 +1,35 @@ +package com.google.android.gms.pay.internal; + +import android.app.PendingIntent; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.pay.EmoneyReadiness; +import com.google.android.gms.pay.GetWalletStatusResponse; +import com.google.android.gms.pay.PayApiError; + +interface IPayServiceCallbacks { + oneway void onStatus(in Status status) = 1; +// oneway void onGetPayGlobalActionCardsResponse(in Status status, in GetPayGlobalActionCardsResponse response) = 2; + oneway void onPendingIntentForWalletOnWear(in Status status, in PendingIntent pendingIntent) = 3; +// oneway void onProtoSafeParcelable(in Status status, in ProtoSafeParcelable proto) = 4; +// oneway void onDataChangeListenerResponse(in DataChangeListenerResponse response) = 5; +// oneway void onGetSortOrderResponse(in Status status, in GetSortOrderResponse response) = 6; + oneway void onStatusAndBoolean(in Status status, boolean b) = 7; +// oneway void onGetTransactionsResponse(in Status status, in GetTransactionsResponse response) = 8; + oneway void onPayApiError(in PayApiError error) = 9; +// oneway void onGetOutstandingPurchaseOrderIdResponse(in Status status, in GetOutstandingPurchaseOrderIdResponse response) = 10; +// oneway void onGetClosedLoopBundleResponse(in Status status, in GetClosedLoopBundleResponse response) = 11; +// oneway void onGetPayCardArtResponse(in Status status, in GetPayCardArtResponse response) = 12; +// oneway void onSyncTransactionsResponse(in Status status, in SyncTransactionsResponse response) = 13; + oneway void onStatusAndByteArray(in Status status, in byte[] bArr) = 14; +// oneway void onGetPassesResponse(in Status status, in GetPassesResponse response) = 15; + oneway void onStatusAndLong(in Status status, long l) = 16; + oneway void onPendingIntent(in Status status) = 17; +// oneway void onGp3SupportInfo(in Status status, Gp3SupportInfo info) = 18; + oneway void onPayApiAvailabilityStatus(in Status status, int availabilityStatus) = 19; +// oneway void onGetTransitCardsResponse(in Status status, in GetTransitCardsResponse response) = 20; +// oneway void onGetWalletStatus(in Status status, in GetWalletStatusResponse getWalletStatusResponse) = 21; +// oneway void onGetSeFeatureReadinessStatusResponse(in Status status, in GetSeFeatureReadinessStatusResponse response) = 22; +// oneway void onSyncTransactionByIdResponse(in Status status, in SyncTransactionByIdResponse response) = 23; +// oneway void onGetImagesForValuableResponse(in Status status, in GetImagesForValuableResponse response) = 24; + oneway void onEmoneyReadiness(in Status status, in EmoneyReadiness emoneyReadiness) = 25; +} \ No newline at end of file diff --git a/play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IThirdPartyPayService.aidl b/play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IThirdPartyPayService.aidl new file mode 100644 index 0000000000..f70939dd16 --- /dev/null +++ b/play-services-pay/src/main/aidl/com/google/android/gms/pay/internal/IThirdPartyPayService.aidl @@ -0,0 +1,24 @@ +package com.google.android.gms.pay.internal; + +import com.google.android.gms.pay.GetPayApiAvailabilityStatusRequest; +import com.google.android.gms.pay.internal.IPayServiceCallbacks; +import com.google.android.gms.pay.SavePassesRequest; +import com.google.android.gms.pay.SyncBundleRequest; +import com.google.android.gms.pay.CheckReadinessForEmoneyRequest; +import com.google.android.gms.pay.GetMdocCredentialRequest; +import com.google.android.gms.pay.GetPendingIntentForWalletOnWearRequest; +import com.google.android.gms.pay.NotifyCardTapEventRequest; +import com.google.android.gms.pay.PushEmoneyCardRequest; +import com.google.android.gms.pay.NotifyEmoneyCardStatusUpdateRequest; + +interface IThirdPartyPayService { + void getPayApiAvailabilityStatus(in GetPayApiAvailabilityStatusRequest request, in IPayServiceCallbacks callback) = 1; // Reply via onPayApiAvailabilityStatus + void savePasses(in SavePassesRequest request, in IPayServiceCallbacks callback) = 2; // Reply via onPendingIntent + void syncBundle(in SyncBundleRequest request, in IPayServiceCallbacks callback) = 3; + void getPendingForWalletOnWear(in GetPendingIntentForWalletOnWearRequest request, in IPayServiceCallbacks callback) = 4; // Reply via onPendingIntentForWalletOnWear + void getMdocCredential(in GetMdocCredentialRequest request, in IPayServiceCallbacks callback) = 5; + void notifyCardTapEvent(in NotifyCardTapEventRequest request, in IPayServiceCallbacks callback) = 6; // Reply via onStatus or onPayApiError + void checkReadinessForEmoney(in CheckReadinessForEmoneyRequest request, in IPayServiceCallbacks callback) = 7; // Reply via onEmoneyReadiness + void pushEmoneyCard(in PushEmoneyCardRequest request, in IPayServiceCallbacks callback) = 8; // Reply via onPendingIntent + void notifyEmoneyCardStatusUpdate(in NotifyEmoneyCardStatusUpdateRequest request, in IPayServiceCallbacks callback) = 9; // Reply via onStatus +} \ No newline at end of file diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.java new file mode 100644 index 0000000000..976de8413a --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/CheckReadinessForEmoneyRequest.java @@ -0,0 +1,32 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import androidx.annotation.Nullable; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class CheckReadinessForEmoneyRequest extends AbstractSafeParcelable { + @Field(1) + public String serviceProvider; + @Nullable + @Field(2) + public String accountName; + + @Constructor + public CheckReadinessForEmoneyRequest(@Param(1) String serviceProvider, @Nullable @Param(2) String accountName) { + this.serviceProvider = serviceProvider; + this.accountName = accountName; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(CheckReadinessForEmoneyRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadiness.java b/play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadiness.java new file mode 100644 index 0000000000..6e9d87d6cc --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadiness.java @@ -0,0 +1,56 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.pay; + +import android.os.Parcel; +import android.os.Parcelable; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.util.Objects; + +/** + * {@link Parcelable} representing an e-money readiness result. + */ +public class EmoneyReadiness extends AbstractSafeParcelable { + @Field(value = 1, getterName = "getEmoneyReadinessStatus") + private final @EmoneyReadinessStatus int emoneyReadinessStatus; + + public EmoneyReadiness(@Param(1) @EmoneyReadinessStatus int emoneyReadinessStatus) { + this.emoneyReadinessStatus = emoneyReadinessStatus; + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EmoneyReadiness)) return false; + + EmoneyReadiness that = (EmoneyReadiness) o; + return emoneyReadinessStatus == that.emoneyReadinessStatus; + } + + /** + * Gets the int value defined in {@link EmoneyReadinessStatus}. + */ + public @EmoneyReadinessStatus int getEmoneyReadinessStatus() { + return emoneyReadinessStatus; + } + + @Override + public int hashCode() { + return Objects.hashCode(new Object[]{emoneyReadinessStatus}); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(EmoneyReadiness.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadinessStatus.java b/play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadinessStatus.java new file mode 100644 index 0000000000..bd505a8f5d --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/EmoneyReadinessStatus.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + * Notice: Portions of this file are reproduced from work created and shared by Google and used + * according to terms described in the Creative Commons 4.0 Attribution License. + * See https://developers.google.com/readme/policies for details. + */ + +package com.google.android.gms.pay; + +import androidx.annotation.IntDef; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * E-money readiness status based on service provider and account. + */ +@Target({ElementType.TYPE_USE}) +@Retention(RetentionPolicy.SOURCE) +@IntDef({EmoneyReadinessStatus.FEATURE_NOT_SUPPORTED, EmoneyReadinessStatus.READY, EmoneyReadinessStatus.APP_NOT_INSTALLED, EmoneyReadinessStatus.APP_UPGRADE_NEEDED, EmoneyReadinessStatus.NO_ACTIVE_ACCOUNT, EmoneyReadinessStatus.ACCOUNT_MISMATCH}) +public @interface EmoneyReadinessStatus { + /** + * Indicates that the e-money feature is not supported yet or still waiting for launch. + */ + int FEATURE_NOT_SUPPORTED = 0; + /** + * Indicates that the e-money feature is available and ready to be used. + */ + int READY = 1; + /** + * Indicates that the Google Wallet app is not installed. + */ + int APP_NOT_INSTALLED = 2; + /** + * Indicates that the current Google Wallet app version or the Google Play services version needs to be upgraded. + */ + int APP_UPGRADE_NEEDED = 3; + /** + * Indicates that there is no active account currently in Google Wallet. + */ + int NO_ACTIVE_ACCOUNT = 4; + /** + * Indicates that the provided account does not match the active account currently in Google Wallet. + */ + int ACCOUNT_MISMATCH = 5; +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/GetMdocCredentialRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/GetMdocCredentialRequest.java new file mode 100644 index 0000000000..43f5249e67 --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/GetMdocCredentialRequest.java @@ -0,0 +1,33 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class GetMdocCredentialRequest extends AbstractSafeParcelable { + @Field(1) + public String unknownFieldA; + @Field(2) + public byte[] unknownFieldB; + @Field(5) + public byte[] unknownFieldC; + + @Constructor + public GetMdocCredentialRequest(@Param(1) String unknownFieldA, @Param(2) byte[] unknownFieldB, @Param(5) byte[] unknownFieldC) { + this.unknownFieldA = unknownFieldA; + this.unknownFieldB = unknownFieldB; + this.unknownFieldC = unknownFieldC; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetMdocCredentialRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.java new file mode 100644 index 0000000000..9c86c616e1 --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/GetPayApiAvailabilityStatusRequest.java @@ -0,0 +1,35 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; +import org.microg.gms.utils.ToStringHelper; + +@Hide +@SafeParcelable.Class +public class GetPayApiAvailabilityStatusRequest extends AbstractSafeParcelable { + @Field(1) + public int requestType; + + @Constructor + public GetPayApiAvailabilityStatusRequest(@Param(1) @PayClient.RequestType int requestType) { + this.requestType = requestType; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetPayApiAvailabilityStatusRequest.class); + + @Override + public String toString() { + return ToStringHelper.name("GetPayApiAvailabilityStatusRequest") + .field("requestType", requestType) + .end(); + } +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.java new file mode 100644 index 0000000000..ac04b33b1f --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/GetPendingIntentForWalletOnWearRequest.java @@ -0,0 +1,30 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class GetPendingIntentForWalletOnWearRequest extends AbstractSafeParcelable { + @Field(2) + public String wearNodeId; + @Field(3) + public int intentSource; + + @Constructor + public GetPendingIntentForWalletOnWearRequest(@Param(2) String wearNodeId, @Param(3) int intentSource) { + this.wearNodeId = wearNodeId; + this.intentSource = intentSource; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetPendingIntentForWalletOnWearRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/GetWalletStatusResponse.java b/play-services-pay/src/main/java/com/google/android/gms/pay/GetWalletStatusResponse.java new file mode 100644 index 0000000000..62679dd035 --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/GetWalletStatusResponse.java @@ -0,0 +1,30 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class GetWalletStatusResponse extends AbstractSafeParcelable { + @Field(1) + public boolean isWalletUiAvailable; + @Field(2) + public int[] foundIssues; + + @Constructor + public GetWalletStatusResponse(@Param(1) boolean isWalletUiAvailable, @Param(2) int[] foundIssues) { + this.isWalletUiAvailable = isWalletUiAvailable; + this.foundIssues = foundIssues; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(GetWalletStatusResponse.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/NotifyCardTapEventRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/NotifyCardTapEventRequest.java new file mode 100644 index 0000000000..fa2b1726ab --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/NotifyCardTapEventRequest.java @@ -0,0 +1,29 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import androidx.annotation.Nullable; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class NotifyCardTapEventRequest extends AbstractSafeParcelable { + @Nullable + @Field(1) + public String json; + + @Constructor + public NotifyCardTapEventRequest(@Nullable @Param(1) String json) { + this.json = json; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(NotifyCardTapEventRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.java new file mode 100644 index 0000000000..7d26f97c2e --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/NotifyEmoneyCardStatusUpdateRequest.java @@ -0,0 +1,27 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class NotifyEmoneyCardStatusUpdateRequest extends AbstractSafeParcelable { + @Field(1) + public String json; + + @Constructor + public NotifyEmoneyCardStatusUpdateRequest(@Param(1) String json) { + this.json = json; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(NotifyEmoneyCardStatusUpdateRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/PayApiError.java b/play-services-pay/src/main/java/com/google/android/gms/pay/PayApiError.java new file mode 100644 index 0000000000..084b6b435f --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/PayApiError.java @@ -0,0 +1,19 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class PayApiError extends AbstractSafeParcelable { + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PayApiError.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/PayClient.java b/play-services-pay/src/main/java/com/google/android/gms/pay/PayClient.java index 7c5a9d36e2..fdf2624757 100644 --- a/play-services-pay/src/main/java/com/google/android/gms/pay/PayClient.java +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/PayClient.java @@ -10,6 +10,8 @@ import android.app.Activity; import android.app.PendingIntent; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.IntentSenderRequest; import androidx.annotation.IntDef; import com.google.android.gms.common.api.Api; import com.google.android.gms.common.api.HasApiKey; @@ -30,6 +32,17 @@ public interface PayClient extends HasApiKey */ String EXTRA_API_ERROR_MESSAGE = "extra_api_error_message"; + /** + * Checks the e-money readiness for a service provider and account. + *

+ * Important: Only apps on the allowlist for the e-money feature can call this method; otherwise, the result is a failed {@link Task}. + * + * @param serviceProvider The service provider to check readiness. + * @param accountName The email account to check readiness. + * @return One of the possible {@link EmoneyReadinessStatus}. + */ + Task checkReadinessForEmoney(String serviceProvider, String accountName); + /** * Gets the {@link PayApiAvailabilityStatus} of the current user and device. * @@ -51,6 +64,34 @@ public interface PayClient extends HasApiKey */ PayClient.ProductName getProductName(); + /** + * Notifies Google Play services of a card tap event. + *

+ * Only apps on the allowlist can call this method; otherwise, the result is a failed {@link Task}. + * + * @param eventJson The event details in JSON format. + */ + Task notifyCardTapEvent(String eventJson); + + /** + * Notifies Google Play services if an e-money card has been updated. + *

+ * Important: Only apps on the allowlist for the e-money feature can call this method; otherwise, the result is a failed {@link Task}. + * + * @param json The e-money card status update details in JSON format. + */ + Task notifyEmoneyCardStatusUpdate(String json); + + /** + * Saves an e-money card in JSON format. + *

+ * Important: Only apps on the allowlist for the e-money feature can call this method; otherwise, the result is a failed {@link Task}. + * + * @param json The e-money card details in JSON format. + * @param activityResultLauncher an {@link ActivityResultLauncher} registered by caller to handle the activity results. + */ + Task pushEmoneyCard(String json, ActivityResultLauncher activityResultLauncher); + /** * Saves one or multiple passes in a JSON format. *

diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/PushEmoneyCardRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/PushEmoneyCardRequest.java new file mode 100644 index 0000000000..609bc23374 --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/PushEmoneyCardRequest.java @@ -0,0 +1,27 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class PushEmoneyCardRequest extends AbstractSafeParcelable { + @Field(1) + public String json; + + @Constructor + public PushEmoneyCardRequest(@Param(1) String json) { + this.json = json; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(PushEmoneyCardRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/SavePassesRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/SavePassesRequest.java new file mode 100644 index 0000000000..56a83f7329 --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/SavePassesRequest.java @@ -0,0 +1,33 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import androidx.annotation.Nullable; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class SavePassesRequest extends AbstractSafeParcelable { + @Nullable + @Field(1) + public String json; + @Nullable + @Field(2) + public String jwt; + + @Constructor + public SavePassesRequest(@Nullable @Param(1) String json, @Nullable @Param(2) String jwt) { + this.json = json; + this.jwt = jwt; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(SavePassesRequest.class); +} diff --git a/play-services-pay/src/main/java/com/google/android/gms/pay/SyncBundleRequest.java b/play-services-pay/src/main/java/com/google/android/gms/pay/SyncBundleRequest.java new file mode 100644 index 0000000000..0c20031d46 --- /dev/null +++ b/play-services-pay/src/main/java/com/google/android/gms/pay/SyncBundleRequest.java @@ -0,0 +1,27 @@ +package com.google.android.gms.pay; + +import android.os.Parcel; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; +import org.microg.gms.common.Hide; + +@Hide +@SafeParcelable.Class +public class SyncBundleRequest extends AbstractSafeParcelable { + @Field(1) + public String unknownField; + + @Constructor + public SyncBundleRequest(@Param(1) String unknownField) { + this.unknownField = unknownField; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + CREATOR.writeToParcel(this, out, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(SyncBundleRequest.class); +} diff --git a/play-services-pay/src/main/java/org/microg/gms/pay/PayClientImpl.java b/play-services-pay/src/main/java/org/microg/gms/pay/PayClientImpl.java index 8817b2c9fc..0f16c660aa 100644 --- a/play-services-pay/src/main/java/org/microg/gms/pay/PayClientImpl.java +++ b/play-services-pay/src/main/java/org/microg/gms/pay/PayClientImpl.java @@ -8,23 +8,59 @@ import android.app.Activity; import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; +import android.content.IntentSender; +import android.os.RemoteException; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.IntentSenderRequest; import com.google.android.gms.common.api.Api; +import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.GoogleApi; -import com.google.android.gms.pay.PayApiAvailabilityStatus; -import com.google.android.gms.pay.PayClient; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.pay.*; +import com.google.android.gms.pay.internal.IPayServiceCallbacks; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; +import java.lang.ref.WeakReference; + public class PayClientImpl extends GoogleApi implements PayClient { - private static final Api API = new Api<>((options, context, looper, clientSettings, callbacks, connectionFailedListener) -> new PayApiClient(context, callbacks, connectionFailedListener)); + private static final Api API = new Api<>((options, context, looper, clientSettings, callbacks, connectionFailedListener) -> new ThirdPartyPayApiClient(context, callbacks, connectionFailedListener)); public PayClientImpl(Context context) { super(context, API); } + @Override + public Task checkReadinessForEmoney(String serviceProvider, String accountName) { + return null; + } + @Override public Task<@PayApiAvailabilityStatus Integer> getPayApiAvailabilityStatus(@RequestType int requestType) { - return Tasks.forResult(PayApiAvailabilityStatus.NOT_ELIGIBLE); + return this.scheduleTask((client, completionSource) -> { + client.getServiceInterface().getPayApiAvailabilityStatus(new GetPayApiAvailabilityStatusRequest(requestType), new PayServiceCallbacks() { + @Override + public void onPayApiAvailabilityStatus(Status status, int availabilityStatus) { + if (status.isSuccess() && availabilityStatus == 3) { + // Invalid availabilityStatus + completionSource.trySetException(new ApiException(Status.INTERNAL_ERROR)); + } else if (availabilityStatus == 1) { + if (status.isSuccess()) { + completionSource.trySetResult(PayApiAvailabilityStatus.NOT_ELIGIBLE); + } else { + completionSource.trySetException(new ApiException(status)); + } + } else { + if (status.isSuccess()) { + completionSource.trySetResult(availabilityStatus); + } else { + completionSource.trySetException(new ApiException(status)); + } + } + } + }); + }); } @Override @@ -38,12 +74,58 @@ public ProductName getProductName() { } @Override - public void savePasses(String json, Activity activity, int requestCode) { + public Task notifyCardTapEvent(String eventJson) { + return null; + } + @Override + public Task notifyEmoneyCardStatusUpdate(String json) { + return null; + } + + @Override + public Task pushEmoneyCard(String json, ActivityResultLauncher activityResultLauncher) { + return null; + } + + @Override + public void savePasses(String json, Activity activity, int requestCode) { + savePasses(new SavePassesRequest(json, null), activity, requestCode); } @Override public void savePassesJwt(String jwt, Activity activity, int requestCode) { + savePasses(new SavePassesRequest(null, jwt), activity, requestCode); + } + private void savePasses(SavePassesRequest request, Activity activity, int requestCode) { + // We don't want to keep a reference to the activity to not leak it + WeakReference weakActivity = new WeakReference<>(activity); + PayServiceCallbacks callbacks = new PayServiceCallbacks() { + @Override + public void onPendingIntent(Status status) { + Activity activity = weakActivity.get(); + if (activity != null) { + if (status.hasResolution()) { + try { + status.startResolutionForResult(activity, requestCode); + } catch (IntentSender.SendIntentException e) { + // Ignored + } + } else { + PendingIntent resultIntent = activity.createPendingResult(requestCode, new Intent(), PendingIntent.FLAG_ONE_SHOT); + if (resultIntent != null) { + try { + resultIntent.send(status.isSuccess() ? -1 : status.getStatusCode()); + } catch (PendingIntent.CanceledException e) { + // Ignored + } + } + } + } + } + }; + this.scheduleTask((client, completionSource) -> client.getServiceInterface().savePasses(request, callbacks)) + .addOnFailureListener((exception) -> callbacks.onPendingIntent(Status.INTERNAL_ERROR)); } } diff --git a/play-services-pay/src/main/java/org/microg/gms/pay/PayServiceCallbacks.java b/play-services-pay/src/main/java/org/microg/gms/pay/PayServiceCallbacks.java new file mode 100644 index 0000000000..36e0094058 --- /dev/null +++ b/play-services-pay/src/main/java/org/microg/gms/pay/PayServiceCallbacks.java @@ -0,0 +1,59 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.pay; + +import android.app.PendingIntent; +import com.google.android.gms.common.api.Status; +import com.google.android.gms.pay.EmoneyReadiness; +import com.google.android.gms.pay.PayApiError; +import com.google.android.gms.pay.internal.IPayServiceCallbacks; + +public class PayServiceCallbacks extends IPayServiceCallbacks.Stub { + @Override + public void onStatus(Status status) { + throw new UnsupportedOperationException(); + } + + @Override + public void onPendingIntentForWalletOnWear(Status status, PendingIntent pendingIntent) { + throw new UnsupportedOperationException(); + } + + @Override + public void onStatusAndBoolean(Status status, boolean b) { + throw new UnsupportedOperationException(); + } + + @Override + public void onPayApiError(PayApiError error) { + throw new UnsupportedOperationException(); + } + + @Override + public void onStatusAndByteArray(Status status, byte[] bArr) { + throw new UnsupportedOperationException(); + } + + @Override + public void onStatusAndLong(Status status, long l) { + throw new UnsupportedOperationException(); + } + + @Override + public void onPendingIntent(Status status) { + throw new UnsupportedOperationException(); + } + + @Override + public void onPayApiAvailabilityStatus(Status status, int i) { + throw new UnsupportedOperationException(); + } + + @Override + public void onEmoneyReadiness(Status status, EmoneyReadiness emoneyReadiness) { + throw new UnsupportedOperationException(); + } +} diff --git a/play-services-pay/src/main/java/org/microg/gms/pay/ThirdPartyPayApiClient.java b/play-services-pay/src/main/java/org/microg/gms/pay/ThirdPartyPayApiClient.java new file mode 100644 index 0000000000..3e0eb9c239 --- /dev/null +++ b/play-services-pay/src/main/java/org/microg/gms/pay/ThirdPartyPayApiClient.java @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2024 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.pay; + +import android.content.Context; +import android.os.IBinder; +import com.google.android.gms.pay.internal.IPayService; +import com.google.android.gms.pay.internal.IThirdPartyPayService; +import org.microg.gms.common.GmsClient; +import org.microg.gms.common.GmsService; +import org.microg.gms.common.api.ConnectionCallbacks; +import org.microg.gms.common.api.OnConnectionFailedListener; + +public class ThirdPartyPayApiClient extends GmsClient { + public ThirdPartyPayApiClient(Context context, ConnectionCallbacks callbacks, OnConnectionFailedListener connectionFailedListener) { + super(context, callbacks, connectionFailedListener, GmsService.PAY.SECONDARY_ACTIONS[0]); + serviceId = GmsService.PAY.SERVICE_ID; + } + + @Override + protected IThirdPartyPayService interfaceFromBinder(IBinder binder) { + return IThirdPartyPayService.Stub.asInterface(binder); + } +}