diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl deleted file mode 100644 index 978e72cc15..0000000000 --- a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/DynamicLinkData.aidl +++ /dev/null @@ -1,10 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -parcelable DynamicLinkData; diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl deleted file mode 100644 index d13b9f2812..0000000000 --- a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksCallbacks.aidl +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -import com.google.android.gms.common.api.Status; -import com.google.firebase.dynamiclinks.internal.DynamicLinkData; -import com.google.firebase.dynamiclinks.internal.ShortDynamicLinkImpl; - -interface IDynamicLinksCallbacks { - void onStatusDynamicLinkData(in Status status, in DynamicLinkData dldata) = 0; - void onStatusShortDynamicLink(in Status status, in ShortDynamicLinkImpl sdlink) = 1; -} diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl deleted file mode 100644 index 3afdf705b6..0000000000 --- a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/IDynamicLinksService.aidl +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -import com.google.firebase.dynamiclinks.internal.IDynamicLinksCallbacks; -import android.os.Bundle; - -interface IDynamicLinksService { - void getInitialLink(IDynamicLinksCallbacks callback, String link) = 0; - void createShortDynamicLink(IDynamicLinksCallbacks callback, in Bundle extras) = 1; -} diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl deleted file mode 100644 index cfca953f1d..0000000000 --- a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.aidl +++ /dev/null @@ -1,10 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -parcelable ShortDynamicLinkImpl; diff --git a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl b/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl deleted file mode 100644 index fbdb3f8faf..0000000000 --- a/firebase-dynamic-links/src/main/aidl/com/google/firebase/dynamiclinks/internal/WarningImpl.aidl +++ /dev/null @@ -1,10 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -parcelable WarningImpl; diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java deleted file mode 100644 index f61334735d..0000000000 --- a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/ShortDynamicLink.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021, 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.firebase.dynamiclinks; - -import android.net.Uri; - -import org.microg.gms.common.PublicApi; - -import java.util.List; - -/** - * Response from {@link DynamicLink.Builder#buildShortDynamicLink()} that returns the shortened Dynamic Link, link flow chart, and warnings from the requested Dynamic Link. - */ -@PublicApi -public interface ShortDynamicLink { - /** - * Gets the preview link to show the link flow chart. - */ - Uri getPreviewLink(); - - /** - * Gets the short Dynamic Link value. - */ - Uri getShortLink(); - - /** - * Gets information about potential warnings on link creation. - */ - List getWarnings(); - - /** - * Path generation option for short Dynamic Link length - */ - @interface Suffix { - /** - * Shorten the path to an unguessable string. Such strings are created by base62-encoding randomly generated - * 96-bit numbers, and consist of 17 alphanumeric characters. Use unguessable strings to prevent your Dynamic - * Links from being crawled, which can potentially expose sensitive information. - */ - int UNGUESSABLE = 1; - /** - * Shorten the path to a string that is only as long as needed to be unique, with a minimum length of 4 - * characters. Use this method if sensitive information would not be exposed if a short Dynamic Link URL were - * guessed. - */ - int SHORT = 2; - } - - /** - * Information about potential warnings on short Dynamic Link creation. - */ - interface Warning { - /** - * Gets the warning code. - * - * @deprecated See {@link #getMessage()} for more information on this warning and how to correct it. - */ - @Deprecated - String getCode(); - - /** - * Gets the warning message to help developers improve their requests. - */ - String getMessage(); - } -} diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java deleted file mode 100644 index 6e60b36222..0000000000 --- a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/DynamicLinkData.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; - -import android.os.Bundle; -import android.net.Uri; - -public class DynamicLinkData extends AutoSafeParcelable { - @Field(1) - public final String dynamicLink; - - @Field(2) - public final String deepLink; - - @Field(3) - public final int minVersion; - - @Field(4) - public final long clickTimestamp; - - @Field(5) - public final Bundle extensionBundle; - - @Field(6) - public final Uri redirectUrl; - - public DynamicLinkData() { - dynamicLink = ""; - deepLink = ""; - minVersion = 0; - clickTimestamp = 0; - extensionBundle = new Bundle(); - redirectUrl = Uri.EMPTY; - } - - public static final Creator CREATOR = new AutoCreator(DynamicLinkData.class); -} diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java deleted file mode 100644 index 2c63b26e40..0000000000 --- a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/ShortDynamicLinkImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2019, e Foundation - * SPDX-FileCopyrightText: 2021, Google LLC - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -import android.net.Uri; - -import org.microg.safeparcel.AutoSafeParcelable; - -import java.util.ArrayList; -import java.util.List; - - -public class ShortDynamicLinkImpl extends AutoSafeParcelable { - @Field(1) - public final Uri shortLink; - - @Field(2) - public final Uri previewLink; - - @Field(3) - public final List warnings; - - - public ShortDynamicLinkImpl() { - shortLink = Uri.EMPTY; - previewLink = Uri.EMPTY; - - warnings = new ArrayList<>(); - } - - - public static final Creator CREATOR = new AutoCreator(ShortDynamicLinkImpl.class); -} diff --git a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java b/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java deleted file mode 100644 index ae8e9e1575..0000000000 --- a/firebase-dynamic-links/src/main/java/com/google/firebase/dynamiclinks/internal/WarningImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021, microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.firebase.dynamiclinks.internal; - -import com.google.firebase.dynamiclinks.ShortDynamicLink; - -import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; - -public class WarningImpl extends AutoSafeParcelable implements ShortDynamicLink.Warning { - @Field(1) - @Deprecated - private int code = 1; - - @Field(2) - private final String message; - - private WarningImpl() { - this.message = null; - } - - public WarningImpl(String message) { - this.message = message; - } - - @Override - public String getCode() { - return null; - } - - @Override - public String getMessage() { - return message; - } - - public static final Creator CREATOR = new AutoCreator(WarningImpl.class); -} diff --git a/play-services-core/src/main/java/org/microg/gms/drive/api/DriveApiService.java b/play-services-core/src/main/java/org/microg/gms/drive/api/DriveApiService.java deleted file mode 100644 index 2fc066e158..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/drive/api/DriveApiService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.drive.api; - -import android.os.RemoteException; - -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -public class DriveApiService extends BaseService { - private DriveServiceImpl impl = new DriveServiceImpl(); - - public DriveApiService() { - super("GmsDriveApiSvc", GmsService.DRIVE); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - callback.onPostInitComplete(0, impl.asBinder(), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/drive/api/DriveServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/drive/api/DriveServiceImpl.java deleted file mode 100644 index 4a899fa9fd..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/drive/api/DriveServiceImpl.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.drive.api; - -import android.content.IntentSender; -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.drive.internal.AddEventListenerRequest; -import com.google.android.gms.drive.internal.AddPermissionRequest; -import com.google.android.gms.drive.internal.AuthorizeAccessRequest; -import com.google.android.gms.drive.internal.CancelPendingActionsRequest; -import com.google.android.gms.drive.internal.ChangeResourceParentsRequest; -import com.google.android.gms.drive.internal.CheckResourceIdsExistRequest; -import com.google.android.gms.drive.internal.CloseContentsAndUpdateMetadataRequest; -import com.google.android.gms.drive.internal.CloseContentsRequest; -import com.google.android.gms.drive.internal.ControlProgressRequest; -import com.google.android.gms.drive.internal.CreateContentsRequest; -import com.google.android.gms.drive.internal.CreateFileIntentSenderRequest; -import com.google.android.gms.drive.internal.CreateFileRequest; -import com.google.android.gms.drive.internal.CreateFolderRequest; -import com.google.android.gms.drive.internal.DeleteResourceRequest; -import com.google.android.gms.drive.internal.DisconnectRequest; -import com.google.android.gms.drive.internal.DriveServiceResponse; -import com.google.android.gms.drive.internal.FetchThumbnailRequest; -import com.google.android.gms.drive.internal.GetChangesRequest; -import com.google.android.gms.drive.internal.GetDriveIdFromUniqueIdRequest; -import com.google.android.gms.drive.internal.GetMetadataRequest; -import com.google.android.gms.drive.internal.GetPermissionsRequest; -import com.google.android.gms.drive.internal.IDriveService; -import com.google.android.gms.drive.internal.IDriveServiceCallbacks; -import com.google.android.gms.drive.internal.IEventCallback; -import com.google.android.gms.drive.internal.ListParentsRequest; -import com.google.android.gms.drive.internal.LoadRealtimeRequest; -import com.google.android.gms.drive.internal.OpenContentsRequest; -import com.google.android.gms.drive.internal.OpenFileIntentSenderRequest; -import com.google.android.gms.drive.internal.RealtimeDocumentSyncRequest; -import com.google.android.gms.drive.internal.RemoveEventListenerRequest; -import com.google.android.gms.drive.internal.RemovePermissionRequest; -import com.google.android.gms.drive.internal.SetDrivePreferencesRequest; -import com.google.android.gms.drive.internal.SetFileUploadPreferencesRequest; -import com.google.android.gms.drive.internal.SetResourceParentsRequest; -import com.google.android.gms.drive.internal.StreamContentsRequest; -import com.google.android.gms.drive.internal.TrashResourceRequest; -import com.google.android.gms.drive.internal.UnsubscribeResourceRequest; -import com.google.android.gms.drive.internal.UntrashResourceRequest; -import com.google.android.gms.drive.internal.UpdateMetadataRequest; -import com.google.android.gms.drive.internal.UpdatePermissionRequest; - -public class DriveServiceImpl extends IDriveService.Stub { - private static final String TAG = "GmsDriveSvcImpl"; - - @Override - public void getMetadata(GetMetadataRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: getMetadata"); - - } - - @Override - public void updateMetadata(UpdateMetadataRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: updateMetadata"); - - } - - @Override - public void createContents(CreateContentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: createContents"); - - } - - @Override - public void createFile(CreateFileRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: createFile"); - - } - - @Override - public void createFolder(CreateFolderRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: createFolder"); - - } - - @Override - public DriveServiceResponse openContents(OpenContentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: openContents"); - return null; - } - - @Override - public void closeContents(CloseContentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: closeContents"); - - } - - @Override - public void requestSync(IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: requestSync"); - - } - - @Override - public IntentSender openFileIntentSender(OpenFileIntentSenderRequest request) throws RemoteException { - Log.d(TAG, "unimplemented Method: openFileIntentSender"); - return null; - } - - @Override - public IntentSender createFileIntentSender(CreateFileIntentSenderRequest request) throws RemoteException { - Log.d(TAG, "unimplemented Method: createFileIntentSender"); - return null; - } - - @Override - public void authorizeAccess(AuthorizeAccessRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: authorizeAccess"); - - } - - @Override - public void listParents(ListParentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: listParents"); - - } - - @Override - public void addEventListener(AddEventListenerRequest request, IEventCallback callback, String unused, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: addEventListener"); - - } - - @Override - public void removeEventListener(RemoveEventListenerRequest request, IEventCallback callback, String unused, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: removeEventListener"); - - } - - @Override - public void disconnect(DisconnectRequest request) throws RemoteException { - Log.d(TAG, "unimplemented Method: disconnect"); - - } - - @Override - public void trashResource(TrashResourceRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: trashResource"); - - } - - @Override - public void closeContentsAndUpdateMetadata(CloseContentsAndUpdateMetadataRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: closeContentsAndUpdateMetadata"); - - } - - @Override - public void deleteResource(DeleteResourceRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: deleteResource"); - - } - - @Override - public void loadRealtime(LoadRealtimeRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: loadRealtime"); - - } - - @Override - public void setResourceParents(SetResourceParentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: setResourceParents"); - - } - - @Override - public void getDriveIdFromUniqueId(GetDriveIdFromUniqueIdRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: getDriveIdFromUniqueId"); - - } - - @Override - public void checkResourceIdsExist(CheckResourceIdsExistRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: checkResourceIdsExist"); - - } - - @Override - public void completePendingAction(IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: completePendingAction"); - - } - - @Override - public void getDrivePreferences(IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: getDrivePreferences"); - - } - - @Override - public void setDrivePreferences(SetDrivePreferencesRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: setDrivePreferences"); - - } - - @Override - public void realtimeDocumentSync(RealtimeDocumentSyncRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: realtimeDocumentSync"); - - } - - @Override - public void getDeviceUsagePreferences(IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: getDeviceUsagePreferences"); - - } - - @Override - public void setFileUploadPreferences(SetFileUploadPreferencesRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: setFileUploadPreferences"); - - } - - @Override - public void cancelPendingActions(CancelPendingActionsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: cancelPendingActions"); - - } - - @Override - public void untrashResource(UntrashResourceRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: untrashResource"); - - } - - @Override - public void isAutoBackupEnabled(IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: isAutoBackupEnabled"); - - } - - @Override - public void fetchThumbnail(FetchThumbnailRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: fetchThumbnail"); - - } - - @Override - public void getChanges(GetChangesRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: getChanges"); - - } - - @Override - public void unsubscribeResource(UnsubscribeResourceRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: unsubscribeResource"); - - } - - @Override - public void getPermissions(GetPermissionsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: getPermissions"); - - } - - @Override - public void addPermission(AddPermissionRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: addPermission"); - - } - - @Override - public void updatePermission(UpdatePermissionRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: updatePermission"); - - } - - @Override - public void removePermission(RemovePermissionRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: removePermission"); - - } - - @Override - public void removeQueryResultListener(IEventCallback callback, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: removeQueryResultListener"); - - } - - @Override - public void controlProgress(ControlProgressRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: controlProgress"); - - } - - @Override - public void changeResourceParents(ChangeResourceParentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: changeResourceParents"); - - } - - @Override - public DriveServiceResponse streamContents(StreamContentsRequest request, IDriveServiceCallbacks callbacks) throws RemoteException { - Log.d(TAG, "unimplemented Method: streamContents"); - return null; - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/firebase/dynamiclinks/DynamicLinksService.java b/play-services-core/src/main/java/org/microg/gms/firebase/dynamiclinks/DynamicLinksService.java deleted file mode 100644 index 064d7ead3e..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/firebase/dynamiclinks/DynamicLinksService.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2019 e Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.firebase.dynamiclinks; - -import android.app.Service; -import android.content.Intent; -import android.os.IBinder; -import android.util.Log; -import android.os.RemoteException; - -import com.google.android.gms.common.api.CommonStatusCodes; -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; -import org.microg.gms.common.PackageUtils; - -import org.microg.gms.firebase.dynamiclinks.DynamicLinksServiceImpl; - -public class DynamicLinksService extends BaseService { - private static final String TAG = "GmsDynamicLinksService"; - - public DynamicLinksService() { - super("GmsDynamicLinksSvc", GmsService.DYNAMIC_LINKS); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - PackageUtils.getAndCheckCallingPackage(this, request.packageName); - Log.d(TAG, "callb: " + callback + " ; req: " + request + " ; serv: " + service); - - callback.onPostInitComplete(0, new DynamicLinksServiceImpl(this, request.packageName, request.extras), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/firebase/dynamiclinks/DynamicLinksServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/firebase/dynamiclinks/DynamicLinksServiceImpl.java deleted file mode 100644 index cd8bfed2c4..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/firebase/dynamiclinks/DynamicLinksServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2019 e Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.firebase.dynamiclinks; - -import android.os.Parcel; -import android.os.RemoteException; -import android.os.Bundle; -import android.util.Log; -import android.content.Context; - -import com.google.android.gms.common.api.Status; - -import com.google.firebase.dynamiclinks.internal.IDynamicLinksService; -import com.google.firebase.dynamiclinks.internal.IDynamicLinksCallbacks; -import com.google.firebase.dynamiclinks.internal.DynamicLinkData; -import com.google.firebase.dynamiclinks.internal.ShortDynamicLinkImpl; - - -public class DynamicLinksServiceImpl extends IDynamicLinksService.Stub { - private static final String TAG = "GmsDynamicLinksServImpl"; - - public DynamicLinksServiceImpl(Context context, String packageName, Bundle extras) { - } - - - @Override - public void getInitialLink(IDynamicLinksCallbacks callback, String link) throws RemoteException { - callback.onStatusDynamicLinkData(Status.SUCCESS, null); - } - - - @Override - public void createShortDynamicLink(IDynamicLinksCallbacks callback, Bundle extras) throws RemoteException { - callback.onStatusShortDynamicLink(Status.SUCCESS, new ShortDynamicLinkImpl()); - } - - - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { - if (super.onTransact(code, data, reply, flags)) { - return true; - } - - Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); - return false; - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java b/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java deleted file mode 100644 index 8a88138753..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.games; - -import android.app.PendingIntent; -import android.content.Intent; -import android.os.Bundle; -import android.os.RemoteException; - -import com.google.android.gms.common.api.CommonStatusCodes; -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; -import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; -import static org.microg.gms.games.UpgradeActivity.ACTION_PLAY_GAMES_UPGRADE; -import static org.microg.gms.games.UpgradeActivity.EXTRA_GAME_PACACKE_NAME; - -public class GamesStubService extends BaseService { - - public static final String PARAM_GAME_PACKAGE_NAME = "com.google.android.gms.games.key.gamePackageName"; - - public GamesStubService() { - super("GmsGamesSvc", GmsService.GAMES); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - String packageName = null; - if (request.extras != null) { - packageName = request.extras.getString(PARAM_GAME_PACKAGE_NAME); - } - if (packageName == null) packageName = GMS_PACKAGE_NAME; - Intent intent = new Intent(ACTION_PLAY_GAMES_UPGRADE); - intent.setPackage(GMS_PACKAGE_NAME); - intent.putExtra(EXTRA_GAME_PACACKE_NAME, packageName); - Bundle bundle = new Bundle(); - bundle.putParcelable("pendingIntent", PendingIntent.getActivity(this, packageName.hashCode(), intent, FLAG_UPDATE_CURRENT)); - callback.onPostInitComplete(CommonStatusCodes.RESOLUTION_REQUIRED, null, bundle); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/games/UpgradeActivity.java b/play-services-core/src/main/java/org/microg/gms/games/UpgradeActivity.java deleted file mode 100644 index 7b2709a465..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/games/UpgradeActivity.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.games; - -import android.app.Activity; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.util.Log; -import android.view.View; -import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; - -import com.google.android.gms.R; - -public class UpgradeActivity extends Activity { - public static final String ACTION_PLAY_GAMES_UPGRADE = "com.google.android.gms.games.PLAY_GAMES_UPGRADE"; - public static final String EXTRA_GAME_PACACKE_NAME = "com.google.android.gms.games.GAME_PACKAGE_NAME"; - - private static final String TAG = "GmsUpgActivity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.games_info); - - WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); - lp.copyFrom(getWindow().getAttributes()); - lp.width = WindowManager.LayoutParams.MATCH_PARENT; - lp.height = WindowManager.LayoutParams.WRAP_CONTENT; - getWindow().setAttributes(lp); - - String packageName = getIntent().getStringExtra(EXTRA_GAME_PACACKE_NAME); - - // receive package info - PackageManager packageManager = getPackageManager(); - ApplicationInfo applicationInfo; - try { - applicationInfo = packageManager.getApplicationInfo(packageName, 0); - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, e); - finish(); - return; - } - CharSequence appLabel = packageManager.getApplicationLabel(applicationInfo); - Drawable appIcon = packageManager.getApplicationIcon(applicationInfo); - - ((ImageView) findViewById(R.id.app_icon)).setImageDrawable(appIcon); - ((TextView) findViewById(R.id.title)).setText(getString(R.string.games_info_title, appLabel)); - findViewById(android.R.id.button1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/places/GeoDataService.java b/play-services-core/src/main/java/org/microg/gms/places/GeoDataService.java deleted file mode 100644 index 43a6a84d02..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/places/GeoDataService.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.places; - -import android.os.RemoteException; - -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -public class GeoDataService extends BaseService { - public GeoDataService() { - super("GmsPlcGeoSvc", GmsService.GEODATA); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - callback.onPostInitComplete(0, new PlacesServiceImpl().asBinder(), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionService.java b/play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionService.java deleted file mode 100644 index 761d5a9f40..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionService.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.places; - -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -public class PlaceDetectionService extends BaseService { - public PlaceDetectionService() { - super("GmsPlcDtctSvc", GmsService.PLACE_DETECTION); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - callback.onPostInitComplete(0, new PlaceDetectionServiceImpl().asBinder(), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionServiceImpl.java deleted file mode 100644 index e1c22a270b..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/places/PlaceDetectionServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.places; - -import android.os.Parcel; -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.location.places.internal.IGooglePlaceDetectionService; - -public class PlaceDetectionServiceImpl extends IGooglePlaceDetectionService.Stub{ - private static final String TAG = "GmsPlcDtctSvcImpl"; - - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { - if (super.onTransact(code, data, reply, flags)) return true; - Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); - return false; - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/places/PlacesServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/places/PlacesServiceImpl.java deleted file mode 100644 index c417ac42f3..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/places/PlacesServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.places; - -import android.os.Parcel; -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.location.places.internal.IGooglePlacesService; - -public class PlacesServiceImpl extends IGooglePlacesService.Stub { - private static final String TAG = "GmsPlcSvcImpl"; - - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { - if (super.onTransact(code, data, reply, flags)) return true; - Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); - return false; - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java b/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java deleted file mode 100644 index f86cd109a8..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.playlog; - -import android.os.RemoteException; - -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -@Deprecated -public class PlayLogService extends BaseService { - - private PlayLogServiceImpl playLogService = new PlayLogServiceImpl(); - - public PlayLogService() { - super("GmsPlayLogSvc", GmsService.PLAY_LOG); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - callback.onPostInitComplete(0, playLogService.asBinder(), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java deleted file mode 100644 index 629967283c..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.playlog; - -import android.os.Parcel; -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.playlog.internal.IPlayLogService; -import com.google.android.gms.playlog.internal.LogEvent; -import com.google.android.gms.clearcut.internal.PlayLoggerContext; - -import java.util.List; - -@Deprecated -public class PlayLogServiceImpl extends IPlayLogService.Stub { - private static final String TAG = "GmsPlayLogSvcImpl"; - - @Override - public void onEvent(String packageName, PlayLoggerContext context, LogEvent event) throws RemoteException { - Log.d(TAG, "onEvent: context[packageName]:" + context.packageName + " event[tag]:" + event.tag); - } - - @Override - public void onMultiEvent(String packageName, PlayLoggerContext context, List events) throws RemoteException { - for (LogEvent event : events) { - onEvent(packageName, context, event); - } - } - - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { - if (super.onTransact(code, data, reply, flags)) return true; - Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); - return false; - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java b/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java deleted file mode 100644 index b3da114f1f..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/ui/LocationSettingsActivity.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013-2017 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.ui; - -import android.app.Activity; - -public class LocationSettingsActivity extends Activity { -} diff --git a/play-services-core/src/main/java/org/microg/gms/ui/PlacePickerActivity.java b/play-services-core/src/main/java/org/microg/gms/ui/PlacePickerActivity.java deleted file mode 100644 index 451cd2bc75..0000000000 --- a/play-services-core/src/main/java/org/microg/gms/ui/PlacePickerActivity.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2013-2019 microG Project Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.microg.gms.ui; - -import android.content.Intent; -import android.location.Address; -import android.location.Geocoder; -import android.location.Location; -import android.location.LocationManager; -import android.os.Bundle; -import android.text.Html; -import android.text.TextUtils; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.SearchView; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.core.view.MenuItemCompat; - -import com.google.android.gms.R; -import com.google.android.gms.common.api.CommonStatusCodes; -import com.google.android.gms.common.api.Status; -import com.google.android.gms.common.internal.safeparcel.SafeParcelableSerializer; -import com.google.android.gms.location.places.internal.PlaceImpl; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; - -import org.microg.gms.location.LocationConstants; -//import org.microg.gms.maps.vtm.BackendMapView; -//import org.microg.gms.maps.vtm.GmsMapsTypeHelper; -//import org.oscim.core.MapPosition; -//import org.oscim.event.Event; -//import org.oscim.map.Map; - -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import static android.Manifest.permission.ACCESS_COARSE_LOCATION; -import static android.Manifest.permission.ACCESS_FINE_LOCATION; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.os.Build.VERSION.SDK_INT; -import static org.microg.gms.location.LocationConstants.EXTRA_PRIMARY_COLOR; -import static org.microg.gms.location.LocationConstants.EXTRA_PRIMARY_COLOR_DARK; -//import static org.microg.gms.maps.vtm.GmsMapsTypeHelper.fromLatLngBounds; - -public class - - -PlacePickerActivity extends AppCompatActivity /*implements Map.UpdateListener*/ { - private static final String TAG = "GmsPlacePicker"; - - private PlaceImpl place; -// private BackendMapView mapView; - private Intent resultIntent; - private AtomicBoolean geocoderInProgress = new AtomicBoolean(false); - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - resultIntent = new Intent(); - place = new PlaceImpl(); - - setContentView(R.layout.pick_place); - - Toolbar toolbar = (Toolbar) findViewById(org.microg.tools.ui.R.id.toolbar); - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setDisplayShowHomeEnabled(true); - - if (getIntent().hasExtra(EXTRA_PRIMARY_COLOR)) { - toolbar.setBackgroundColor(getIntent().getIntExtra(EXTRA_PRIMARY_COLOR, 0)); - if (SDK_INT >= 21) - getWindow().setStatusBarColor(getIntent().getIntExtra(EXTRA_PRIMARY_COLOR_DARK, 0)); - ((TextView) findViewById(R.id.place_picker_title)).setTextColor(getIntent().getIntExtra(EXTRA_PRIMARY_COLOR_DARK, 0)); - } - -// mapView = (BackendMapView) findViewById(R.id.map); -// mapView.map().getEventLayer().enableRotation(false); -// mapView.map().getEventLayer().enableTilt(false); -// mapView.map().events.bind(this); - - LatLngBounds latLngBounds = getIntent().getParcelableExtra(LocationConstants.EXTRA_BOUNDS); - if (latLngBounds != null) { - place.viewport = latLngBounds; -// MapPosition mp = new MapPosition(); -// mp.setByBoundingBox(fromLatLngBounds(latLngBounds), mapView.map().getWidth(), mapView.map().getHeight()); -// mapView.map().getMapPosition(mp); - } else { - if (ActivityCompat.checkSelfPermission(PlacePickerActivity.this, ACCESS_FINE_LOCATION) != PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(PlacePickerActivity.this, new String[]{ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}, 0); - } else { - updateMapFromLocationManager(); - } - } - - findViewById(R.id.place_picker_select).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - resultIntent.putExtra(LocationConstants.EXTRA_STATUS, SafeParcelableSerializer.serializeToBytes(new Status(CommonStatusCodes.SUCCESS))); - resultIntent.putExtra(LocationConstants.EXTRA_PLACE, SafeParcelableSerializer.serializeToBytes(place)); - resultIntent.putExtra(LocationConstants.EXTRA_FINAL_BOUNDS, SafeParcelableSerializer.serializeToBytes(place.viewport)); - setResult(RESULT_OK, resultIntent); - finish(); - } - }); - } - - @SuppressWarnings("MissingPermission") - private void updateMapFromLocationManager() { - LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); - Location last = null; - for (String provider : lm.getAllProviders()) { - if (lm.isProviderEnabled(provider)) { - Location t = lm.getLastKnownLocation(provider); - if (t != null && (last == null || t.getTime() > last.getTime())) { - last = t; - } - } - } - Log.d(TAG, "Set location to " + last); - if (last != null) { -// mapView.map().setMapPosition(new MapPosition(last.getLatitude(), last.getLongitude(), 4096)); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == 0) { - for (int grantResult : grantResults) { - if (grantResult != PERMISSION_GRANTED) return; - } - updateMapFromLocationManager(); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.pick_place, menu); - SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_action_search)); - // TODO: search - return true; - } - - @Override - protected void onResume() { - super.onResume(); -// mapView.onResume(); - } - - @Override - protected void onPause() { -// mapView.onPause(); - super.onPause(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - finish(); - return true; - } - return super.onOptionsItemSelected(item); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - } - - /* - @Override - public void onMapEvent(Event event, MapPosition position) { -// place.viewport = GmsMapsTypeHelper.toLatLngBounds(mapView.map().viewport().getBBox(null, 0)); -// resultIntent.putExtra(LocationConstants.EXTRA_FINAL_BOUNDS, place.viewport); -// place.latLng = GmsMapsTypeHelper.toLatLng(position.getGeoPoint()); - place.name = ""; - place.address = ""; - updateInfoText(); - if (geocoderInProgress.compareAndSet(false, true)) { - new Thread(new Runnable() { - @Override - public void run() { - try { - LatLng ll = null; - while (ll != place.latLng) { - ll = place.latLng; - Thread.sleep(1000); - } - Geocoder geocoder = new Geocoder(PlacePickerActivity.this); - List
addresses = geocoder.getFromLocation(place.latLng.latitude, place.latLng.longitude, 1); - if (addresses != null && !addresses.isEmpty() && addresses.get(0).getMaxAddressLineIndex() > 0) { - Address address = addresses.get(0); - StringBuilder sb = new StringBuilder(address.getAddressLine(0)); - for (int i = 1; i < address.getMaxAddressLineIndex(); ++i) { - if (i == 1 && sb.toString().equals(address.getFeatureName())) { - sb = new StringBuilder(address.getAddressLine(i)); - continue; - } - sb.append(", ").append(address.getAddressLine(i)); - } - if (place.latLng == ll) { - place.address = sb.toString(); - place.name = address.getFeatureName(); - runOnUiThread(new Runnable() { - @Override - public void run() { - updateInfoText(); - } - }); - } - } - } catch (Exception ignored) { - Log.w(TAG, ignored); - } finally { - geocoderInProgress.lazySet(false); - } - } - }).start(); - } - }*/ - - private void updateInfoText() { - if (TextUtils.isEmpty(place.address)) { - ((TextView) findViewById(R.id.place_picker_info)).setText(getString(R.string.place_picker_location_lat_lng, place.latLng.latitude, place.latLng.longitude)); - } else if (TextUtils.isEmpty(place.name)) { - ((TextView) findViewById(R.id.place_picker_info)).setText(place.address); - } else { - ((TextView) findViewById(R.id.place_picker_info)).setText(Html.fromHtml("" + place.name + ", " + place.address)); - } - } -} diff --git a/play-services-core/src/main/kotlin/com/google/android/gms/fitness/service/history/FitHistoryBroker.kt b/play-services-core/src/main/kotlin/com/google/android/gms/fitness/service/history/FitHistoryBroker.kt deleted file mode 100644 index 1fefa2c219..0000000000 --- a/play-services-core/src/main/kotlin/com/google/android/gms/fitness/service/history/FitHistoryBroker.kt +++ /dev/null @@ -1,101 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.google.android.gms.fitness.service.history - -import android.os.Bundle -import android.util.Log -import com.google.android.gms.common.api.CommonStatusCodes -import com.google.android.gms.common.internal.GetServiceRequest -import com.google.android.gms.common.internal.IGmsCallbacks -import com.google.android.gms.fitness.internal.IGoogleFitHistoryApi -import com.google.android.gms.fitness.request.DailyTotalRequest -import com.google.android.gms.fitness.request.DataDeleteRequest -import com.google.android.gms.fitness.request.DataInsertRequest -import com.google.android.gms.fitness.request.DataPointChangesRequest -import com.google.android.gms.fitness.request.DataReadRequest -import com.google.android.gms.fitness.request.DataUpdateListenerRegistrationRequest -import com.google.android.gms.fitness.request.DataUpdateListenerUnregistrationRequest -import com.google.android.gms.fitness.request.DataUpdateRequest -import com.google.android.gms.fitness.request.DebugInfoRequest -import com.google.android.gms.fitness.request.GetFileUriRequest -import com.google.android.gms.fitness.request.GetSyncInfoRequest -import com.google.android.gms.fitness.request.ReadRawRequest -import com.google.android.gms.fitness.request.ReadStatsRequest -import com.google.android.gms.fitness.request.SessionChangesRequest -import org.microg.gms.BaseService -import org.microg.gms.common.GmsService - -private const val TAG = "FitHistoryBroker" - -class FitHistoryBroker : BaseService(TAG, GmsService.FITNESS_HISTORY) { - override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { - callback.onPostInitComplete(CommonStatusCodes.SUCCESS, FitHistoryBrokerImpl().asBinder(), Bundle()) - } -} - -class FitHistoryBrokerImpl : IGoogleFitHistoryApi.Stub() { - - override fun readData(request: DataReadRequest?) { - Log.d(TAG, "Not implemented readData: $request") - } - - override fun insertData(request: DataInsertRequest?) { - Log.d(TAG, "Not implemented insertData: $request") - } - - override fun deleteData(request: DataDeleteRequest?) { - Log.d(TAG, "Not implemented deleteData: $request") - } - - override fun getSyncInfo(request: GetSyncInfoRequest) { - Log.d(TAG, "Not implemented getSyncInfo: $request") - } - - override fun readStats(request: ReadStatsRequest?) { - Log.d(TAG, "Not implemented readStats: $request") - } - - override fun readRaw(request: ReadRawRequest?) { - Log.d(TAG, "Not implemented readRaw: $request") - } - - override fun getDailyTotal(request: DailyTotalRequest?) { - Log.d(TAG, "Not implemented getDailyTotal: $request") - } - - override fun insertDataPrivileged(request: DataInsertRequest?) { - Log.d(TAG, "Not implemented insertDataPrivileged: $request") - } - - override fun updateData(request: DataUpdateRequest?) { - Log.d(TAG, "Not implemented updateData: $request") - } - - override fun registerDataUpdateListener(request: DataUpdateListenerRegistrationRequest?) { - Log.d(TAG, "Not implemented registerDataUpdateListener: $request") - } - - override fun unregisterDataUpdateListener(request: DataUpdateListenerUnregistrationRequest?) { - Log.d(TAG, "Not implemented unregisterDataUpdateListener: $request") - } - - override fun getFileUri(request: GetFileUriRequest?) { - Log.d(TAG, "Not implemented getFileUri: $request") - } - - override fun getDebugInfo(request: DebugInfoRequest?) { - Log.d(TAG, "Not implemented getDebugInfo: $request") - } - - override fun getDataPointChanges(request: DataPointChangesRequest?) { - Log.d(TAG, "Not implemented getDataPointChanges: $request") - } - - override fun getSessionChanges(request: SessionChangesRequest?) { - Log.d(TAG, "Not implemented getSessionChanges: $request") - } - -} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt b/play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt deleted file mode 100644 index e149a0263a..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ -package org.microg.gms.clearcut - -import android.os.Parcel -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope -import com.google.android.gms.clearcut.LogEventParcelable -import com.google.android.gms.clearcut.internal.IClearcutLoggerCallbacks -import com.google.android.gms.clearcut.internal.IClearcutLoggerService -import com.google.android.gms.common.api.CommonStatusCodes -import com.google.android.gms.common.api.Status -import com.google.android.gms.common.data.DataHolder -import com.google.android.gms.common.internal.GetServiceRequest -import com.google.android.gms.common.internal.IGmsCallbacks -import org.microg.gms.BaseService -import org.microg.gms.common.GmsService -import org.microg.gms.utils.warnOnTransactionIssues - -private const val TAG = "ClearcutLoggerService" -private const val COLLECT_FOR_DEBUG_DURATION = 24L * 60 * 60 * 1000 - -class ClearcutLoggerService : BaseService(TAG, GmsService.CLEARCUT_LOGGER) { - override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { - callback.onPostInitComplete(0, ClearcutLoggerServiceImpl(lifecycle), null) - } -} - -class ClearcutLoggerServiceImpl(override val lifecycle: Lifecycle) : IClearcutLoggerService.Stub(), LifecycleOwner { - private var collectForDebugExpiryTime: Long = 0 - - override fun log(callbacks: IClearcutLoggerCallbacks, event: LogEventParcelable) { - lifecycleScope.launchWhenStarted { - runCatching { callbacks.onLogResult(Status.SUCCESS) } - } - } - - override fun forceUpload(callbacks: IClearcutLoggerCallbacks) { - lifecycleScope.launchWhenStarted { - runCatching { callbacks.onLogResult(Status.SUCCESS) } - } - } - - override fun startCollectForDebug(callbacks: IClearcutLoggerCallbacks) { - lifecycleScope.launchWhenStarted { - collectForDebugExpiryTime = System.currentTimeMillis() + COLLECT_FOR_DEBUG_DURATION - runCatching { callbacks.onStartCollectForDebugResult(Status.SUCCESS, collectForDebugExpiryTime) } - } - } - - override fun stopCollectForDebug(callbacks: IClearcutLoggerCallbacks) { - lifecycleScope.launchWhenStarted { - runCatching { callbacks.onStopCollectForDebugResult(Status.SUCCESS) } - } - } - - override fun getCollectForDebugExpiryTime(callbacks: IClearcutLoggerCallbacks) { - lifecycleScope.launchWhenStarted { - runCatching { callbacks.onCollectForDebugExpiryTime(Status.SUCCESS, collectForDebugExpiryTime) } - } - } - - override fun getLogEventParcelablesLegacy(callbacks: IClearcutLoggerCallbacks) { - getLogEventParcelables(callbacks) - } - - override fun getLogEventParcelables(callbacks: IClearcutLoggerCallbacks) { - lifecycleScope.launchWhenStarted { - runCatching { callbacks.onLogEventParcelables(DataHolder.empty(CommonStatusCodes.SUCCESS)) } - } - } - - override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) } -} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/games/FirstPartyGamesService.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/FirstPartyGamesService.kt deleted file mode 100644 index 3f111297a0..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/FirstPartyGamesService.kt +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.games - -import android.content.Context -import android.os.Parcel -import android.util.Log -import androidx.lifecycle.Lifecycle -import com.google.android.gms.common.api.CommonStatusCodes -import com.google.android.gms.common.api.Status -import com.google.android.gms.common.data.DataHolder -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.games.client.IPlayGamesCallbacks -import com.google.android.gms.games.client.IPlayGamesService -import com.google.android.gms.games.client.PlayGamesConsistencyTokens -import org.microg.gms.BaseService -import org.microg.gms.common.Constants -import org.microg.gms.common.GmsService -import org.microg.gms.common.GooglePackagePermission -import org.microg.gms.common.PackageUtils -import org.microg.gms.utils.warnOnTransactionIssues - -private const val TAG = "PlayGamesService" -private val FIRST_PARTY_PACKAGES = setOf(Constants.GMS_PACKAGE_NAME, GAMES_PACKAGE_NAME) - -class FirstPartyGamesService : BaseService(TAG, GmsService.GAMES) { - override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { - val packageName = PackageUtils.getAndCheckCallingPackageOrImpersonation(this, request.packageName) - ?: throw IllegalArgumentException("Missing package name") - val callingPackageName = PackageUtils.getCallingPackage(this) ?: packageName - if (!PackageUtils.callerHasGooglePackagePermission(this, GooglePackagePermission.GAMES)) - throw IllegalArgumentException("$callingPackageName does not have google games access") - if (callingPackageName !in FIRST_PARTY_PACKAGES) throw IllegalArgumentException("$callingPackageName is not first-party") - callback.onPostInitCompleteWithConnectionInfo( - CommonStatusCodes.SUCCESS, - PlayGamesServiceImpl(this, lifecycle, packageName), - ConnectionInfo() - ) - } -} - -class PlayGamesServiceImpl(val context: Context, val lifecycle: Lifecycle, val packageName: String) : IPlayGamesService.Stub() { - - override fun getGameCollection(callbacks: IPlayGamesCallbacks?, maxResults: Int, gameCollectionType: Int, z: Boolean, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: getGameCollection($maxResults, $gameCollectionType, $z, $forceReload)") - callbacks?.onData(DataHolder.empty(CommonStatusCodes.SUCCESS)) - } - - override fun loadGames(callbacks: IPlayGamesCallbacks?, playerId: String?, maxResults: Int, z: Boolean, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadGames($playerId, $maxResults, $z, $forceReload)") - callbacks?.onData(DataHolder.empty(CommonStatusCodes.SUCCESS)) - } - - override fun getConsistencyTokens(): PlayGamesConsistencyTokens { - Log.d(TAG, "Not yet implemented: getConsistencyTokens") - return PlayGamesConsistencyTokens(null, null) - } - - override fun updateConsistencyTokens(tokens: PlayGamesConsistencyTokens?) { - Log.d(TAG, "Not yet implemented: updateConsistencyTokens($tokens)") - } - - override fun fun5041(callbacks: IPlayGamesCallbacks?) { - callbacks?.onStatus5028(Status.SUCCESS) - } - - 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-core/src/main/kotlin/org/microg/gms/games/GamesConfigurationService.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/GamesConfigurationService.kt deleted file mode 100644 index 10c0da6556..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesConfigurationService.kt +++ /dev/null @@ -1,233 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.games - -import android.accounts.Account -import android.accounts.AccountManager -import android.app.Service -import android.content.* -import android.os.* -import androidx.core.content.getSystemService -import androidx.core.os.bundleOf -import org.microg.gms.auth.AuthConstants -import org.microg.gms.common.PackageUtils -import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException -import kotlin.coroutines.suspendCoroutine - -private const val PREFERENCES_NAME = "games.config" -private const val PREF_ACCOUNT_GLOBAL = "account_global" -private const val PREF_ACCOUNT_PREFIX = "account_" -private const val PREF_PLAYER_PREFIX = "player_" - -private const val MSG_GET_DEFAULT_ACCOUNT = 1 -private const val MSG_SET_DEFAULT_ACCOUNT = 2 -private const val MSG_GET_PLAYER = 3 -private const val MSG_SET_PLAYER = 4 - -private const val MSG_DATA_PACKAGE_NAME = "package_name" -private const val MSG_DATA_ACCOUNT = "account" -private const val MSG_DATA_PLAYER = "player" - -class GamesConfigurationService : Service() { - private val preferences: SharedPreferences - get() = getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE) - private val accountManager: AccountManager - get() = getSystemService()!! - - override fun onBind(intent: Intent?): IBinder { - return Messenger(object : Handler(Looper.getMainLooper()) { - override fun handleMessage(msg: Message) { - val data = when (msg.what) { - MSG_GET_DEFAULT_ACCOUNT -> { - val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME) - val account = getDefaultAccount(packageName) - bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account - ) - } - - MSG_SET_DEFAULT_ACCOUNT -> { - val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME) - val account = msg.data?.getParcelable(MSG_DATA_ACCOUNT) - setDefaultAccount(packageName, account) - bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account - ) - } - - MSG_GET_PLAYER -> { - val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME) - val account = msg.data?.getParcelable(MSG_DATA_ACCOUNT) - val player = if (packageName != null && account != null) getPlayer(packageName, account) else null - bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account, - MSG_DATA_PLAYER to player - ) - } - - MSG_SET_PLAYER -> { - val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME) - val account = msg.data?.getParcelable(MSG_DATA_ACCOUNT) - val player = msg.data?.getString(MSG_DATA_PLAYER) - if (packageName != null && account != null) setPlayer(packageName, account, player) - bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account, - MSG_DATA_PLAYER to player - ) - } - - else -> Bundle.EMPTY - } - msg.replyTo?.send(Message.obtain().also { - it.what = msg.what - it.data = data - }) - } - }).binder - } - - private fun getPackageNameSuffix(packageName: String): String { - return packageName + ":" + PackageUtils.firstSignatureDigest(this, packageName) - } - - private fun getGlobalDefaultAccount(): Account? { - val name = preferences.getString(PREF_ACCOUNT_GLOBAL, null) - val accounts: Array = accountManager.getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE) - for (account in accounts) { - if (account.name.equals(name)) return account - } - return null - } - - private fun getDefaultAccount(packageName: String?): Account? { - if (packageName == null) return getGlobalDefaultAccount() - val name = preferences.getString(PREF_ACCOUNT_PREFIX + getPackageNameSuffix(packageName), null) - if (name.isNullOrBlank()) return getGlobalDefaultAccount() - val accounts: Array = accountManager.getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE) - for (account in accounts) { - if (account.name.equals(name)) return account - } - return getGlobalDefaultAccount() - } - - private fun setDefaultAccount(packageName: String?, account: Account?) { - if (account?.name == getDefaultAccount(packageName)?.name) return - val key = if (packageName == null) PREF_ACCOUNT_GLOBAL else (PREF_ACCOUNT_PREFIX + getPackageNameSuffix(packageName)) - val editor: SharedPreferences.Editor = preferences.edit() - if (account == null || account.name == AuthConstants.DEFAULT_ACCOUNT) { - editor.remove(key) - } else { - editor.putString(key, account.name) - } - if (packageName != null) { - for (key in preferences.all.keys) { - if (key.startsWith(PREF_PLAYER_PREFIX + getPackageNameSuffix(packageName))) { - editor.remove(key) - } - } - } - editor.apply() - } - - private fun getPackageAndAccountSuffix(packageName: String, account: Account): String { - return getPackageNameSuffix(packageName) + ":" + account.name - } - - private fun getPlayer(packageName: String, account: Account): String? { - val player = preferences.getString(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(packageName, account), null) - if (player.isNullOrBlank()) return null - return player - } - - private fun setPlayer(packageName: String, account: Account, player: String?) { - val editor: SharedPreferences.Editor = preferences.edit() - if (player.isNullOrBlank()) { - editor.remove(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(packageName, account)) - } else { - editor.putString(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(packageName, account), player) - } - editor.apply() - } - - - companion object { - - private suspend fun singleRequest(context: Context, message: Message) = suspendCoroutine { continuation -> - val connection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, service: IBinder?) { - val connection = this - message.replyTo = Messenger(object : Handler(Looper.myLooper() ?: Looper.getMainLooper()) { - override fun handleMessage(msg: Message) { - runCatching { continuation.resume(msg) } - runCatching { context.unbindService(connection) } - } - }) - try { - Messenger(service).send(message) - } catch (e: Exception) { - runCatching { continuation.resumeWithException(e) } - runCatching { context.unbindService(connection) } - } - } - - override fun onServiceDisconnected(name: ComponentName?) { - runCatching { continuation.resumeWithException(RuntimeException("Disconnected")) } - } - } - val connected = context.bindService(Intent(context, GamesConfigurationService::class.java), connection, BIND_AUTO_CREATE or BIND_ABOVE_CLIENT) - if (!connected) { - runCatching { continuation.resumeWithException(RuntimeException("Connection failed")) } - runCatching { context.unbindService(connection) } - } - } - - suspend fun getDefaultAccount(context: Context, packageName: String?): Account? { - return singleRequest(context, Message.obtain().apply { - what = MSG_GET_DEFAULT_ACCOUNT - data = bundleOf( - MSG_DATA_PACKAGE_NAME to packageName - ) - }).data?.getParcelable(MSG_DATA_ACCOUNT) - } - - suspend fun setDefaultAccount(context: Context, packageName: String?, account: Account?) { - singleRequest(context, Message.obtain().apply { - what = MSG_SET_DEFAULT_ACCOUNT - data = bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account - ) - }) - } - - suspend fun getPlayer(context: Context, packageName: String, account: Account): String? { - return singleRequest(context, Message.obtain().apply { - what = MSG_GET_PLAYER - data = bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account - ) - }).data?.getString(MSG_DATA_PLAYER) - } - - suspend fun setPlayer(context: Context, packageName: String, account: Account, player: String?) { - singleRequest(context, Message.obtain().apply { - what = MSG_SET_PLAYER - data = bundleOf( - MSG_DATA_PACKAGE_NAME to packageName, - MSG_DATA_ACCOUNT to account, - MSG_DATA_PLAYER to player - ) - }) - } - - } -} \ No newline at end of file diff --git a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesConnectService.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/GamesConnectService.kt deleted file mode 100644 index 34810ef768..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesConnectService.kt +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.games - -import android.accounts.Account -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.os.Parcel -import android.util.Log -import androidx.core.app.PendingIntentCompat -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope -import com.google.android.gms.common.Scopes -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.games.internal.connect.GamesSignInRequest -import com.google.android.gms.games.internal.connect.GamesSignInResponse -import com.google.android.gms.games.internal.connect.IGamesConnectCallbacks -import com.google.android.gms.games.internal.connect.IGamesConnectService -import org.microg.gms.BaseService -import org.microg.gms.auth.AuthManager -import org.microg.gms.auth.AuthPrefs -import org.microg.gms.common.GmsService -import org.microg.gms.common.PackageUtils -import org.microg.gms.utils.warnOnTransactionIssues -import java.util.UUID - -private const val TAG = "GamesConnectService" - -class GamesConnectService : BaseService(TAG, GmsService.GAMES) { - override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { - val packageName = PackageUtils.getAndCheckCallingPackage(this, request.packageName) - ?: throw IllegalArgumentException("Missing package name") - callback.onPostInitCompleteWithConnectionInfo( - CommonStatusCodes.SUCCESS, - GamesConnectServiceImpl(this, lifecycle, packageName), - ConnectionInfo() - ) - } -} - -class GamesConnectServiceImpl(val context: Context, override val lifecycle: Lifecycle, val packageName: String) : IGamesConnectService.Stub(), LifecycleOwner { - - override fun signIn(callback: IGamesConnectCallbacks?, request: GamesSignInRequest?) { - Log.d(TAG, "signIn($request)") - fun sendSignInRequired() { - val resolution = PendingIntentCompat.getActivity(context, packageName.hashCode(), Intent(context, GamesSignInActivity::class.java).apply { - putExtra(EXTRA_GAME_PACKAGE_NAME, packageName) - putExtra(EXTRA_SCOPES, arrayOf(Scopes.GAMES_LITE)) - }, PendingIntent.FLAG_UPDATE_CURRENT, false) - when (request?.signInType) { - 0 -> { // Manual sign in, provide resolution - callback?.onSignIn(Status(CommonStatusCodes.SIGN_IN_REQUIRED, null, resolution), null) - } - - 1 -> { // Auto sign-in on start, don't provide resolution if not - callback?.onSignIn(Status(CommonStatusCodes.SIGN_IN_REQUIRED), null) - } - - else -> { - callback?.onSignIn(Status(CommonStatusCodes.SIGN_IN_REQUIRED), null) - } - } - } - lifecycleScope.launchWhenStarted { - try { - val account = request?.previousStepResolutionResult?.resultData?.getParcelableExtra(EXTRA_ACCOUNT) - ?: GamesConfigurationService.getDefaultAccount(context, packageName) - ?: return@launchWhenStarted sendSignInRequired() - val authManager = AuthManager(context, account.name, packageName, "oauth2:${Scopes.GAMES_LITE}") - if (!authManager.isPermitted && !AuthPrefs.isTrustGooglePermitted(context)) return@launchWhenStarted sendSignInRequired() - val result = performGamesSignIn(context, packageName, account) - if (result) { - callback?.onSignIn(Status.SUCCESS, GamesSignInResponse().apply { gameRunToken = UUID.randomUUID().toString() }) - } else { - sendSignInRequired() - } - } catch (e: Exception) { - Log.w(TAG, e) - return@launchWhenStarted sendSignInRequired() - } - } - } - - 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-core/src/main/kotlin/org/microg/gms/games/GamesService.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt deleted file mode 100644 index 9fb6e16bd1..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt +++ /dev/null @@ -1,577 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.games - -import android.accounts.Account -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.os.IBinder -import android.os.Parcel -import android.util.Log -import androidx.core.app.PendingIntentCompat -import androidx.core.os.bundleOf -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope -import com.google.android.gms.common.ConnectionResult -import com.google.android.gms.common.Scopes -import com.google.android.gms.common.api.CommonStatusCodes -import com.google.android.gms.common.api.Scope -import com.google.android.gms.common.api.Status -import com.google.android.gms.common.data.DataHolder -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.games.Player -import com.google.android.gms.games.PlayerColumns -import com.google.android.gms.games.PlayerEntity -import com.google.android.gms.games.internal.IGamesCallbacks -import com.google.android.gms.games.internal.IGamesClient -import com.google.android.gms.games.internal.IGamesService -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import org.json.JSONObject -import org.microg.gms.BaseService -import org.microg.gms.auth.AuthConstants -import org.microg.gms.auth.AuthManager -import org.microg.gms.auth.AuthPrefs -import org.microg.gms.common.GmsService -import org.microg.gms.common.PackageUtils -import org.microg.gms.utils.warnOnTransactionIssues - -private const val TAG = "GamesService" - -class GamesService : BaseService(TAG, GmsService.GAMES) { - override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { - val packageName = PackageUtils.getAndCheckCallingPackageOrImpersonation(this, request.packageName) - ?: throw IllegalArgumentException("Missing package name") - - fun sendSignInRequired() { - Log.d(TAG, "Sending SIGN_IN_REQUIRED to $packageName") - callback.onPostInitCompleteWithConnectionInfo(ConnectionResult.SIGN_IN_REQUIRED, null, ConnectionInfo().apply { - params = bundleOf( - "pendingIntent" to PendingIntentCompat.getActivity( - this@GamesService, - packageName.hashCode(), - Intent(this@GamesService, GamesSignInActivity::class.java).apply { - putExtra(EXTRA_GAME_PACKAGE_NAME, request.packageName) - putExtra(EXTRA_ACCOUNT, request.account) - putExtra(EXTRA_SCOPES, request.scopes) - }, - PendingIntent.FLAG_UPDATE_CURRENT, - false - ) - ) - }) - } - - lifecycleScope.launchWhenStarted { - try { - val account = request.account?.takeIf { it.name != AuthConstants.DEFAULT_ACCOUNT } - ?: GamesConfigurationService.getDefaultAccount(this@GamesService, packageName) - ?: return@launchWhenStarted sendSignInRequired() - - val scopes = request.scopes.toList().realScopes - Log.d(TAG, "handleServiceRequest scopes to ${scopes.joinToString(" ")}") - - val authManager = AuthManager(this@GamesService, account.name, packageName, "oauth2:${scopes.joinToString(" ")}") - if (!authManager.isPermitted && !AuthPrefs.isTrustGooglePermitted(this@GamesService)) { - Log.d(TAG, "Not permitted to use $account for ${scopes.toList()}, sign in required") - return@launchWhenStarted sendSignInRequired() - } - - if (!performGamesSignIn(this@GamesService, packageName, account, scopes = scopes)) { - Log.d(TAG, "performGamesSignIn fail, sign in required") - return@launchWhenStarted sendSignInRequired() - } - - val player = JSONObject(GamesConfigurationService.getPlayer(this@GamesService, packageName, account)).toPlayer() - - callback.onPostInitCompleteWithConnectionInfo( - CommonStatusCodes.SUCCESS, - GamesServiceImpl(this@GamesService, lifecycle, packageName, account, player), - ConnectionInfo() - ) - } catch (e: Exception) { - Log.w(TAG, e) - runCatching { callback.onPostInitCompleteWithConnectionInfo(ConnectionResult.INTERNAL_ERROR, null, null) } - } - } - } -} - -class GamesServiceImpl(val context: Context, override val lifecycle: Lifecycle, val packageName: String, val account: Account, val player: Player) : - IGamesService.Stub(), LifecycleOwner { - - override fun clientDisconnecting(clientId: Long) { - Log.d(TAG, "Not yet implemented: clientDisconnecting($clientId)") - } - - override fun signOut(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: signOut") - lifecycleScope.launchWhenStarted { - GamesConfigurationService.setDefaultAccount(context, packageName, null) - callbacks?.onSignOutComplete() - } - } - - override fun getAppId(): String? { - Log.d(TAG, "Not yet implemented: getAppId") - return null - } - - override fun getConnectionHint(): Bundle? { - return null - } - - override fun showWelcomePopup(windowToken: IBinder?, extraArgs: Bundle?) { - runCatching { extraArgs?.keySet() } - Log.d(TAG, "Not yet implemented: showWelcomePopup($windowToken, $extraArgs)") - } - - override fun cancelPopups() { - Log.d(TAG, "Not yet implemented: cancelPopups") - } - - override fun getCurrentAccountName(): String? { - Log.d(TAG, "Not yet implemented: getCurrentAccountName") - return null - } - - override fun loadGameplayAclInternal(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadGameplayAclInternal($gameId)") - } - - override fun updateGameplayAclInternal(callbacks: IGamesCallbacks?, gameId: String?, aclData: String?) { - Log.d(TAG, "Not yet implemented: updateGameplayAclInternal($gameId, $aclData)") - } - - override fun loadFAclInternal(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadFAclInternal($gameId)") - } - - override fun updateFAclInternal(callbacks: IGamesCallbacks?, gameId: String?, allCirclesVisible: Boolean, circleIds: LongArray?) { - Log.d(TAG, "Not yet implemented: updateFAclInternal($gameId, $allCirclesVisible, $circleIds)") - } - - override fun getCurrentPlayerId(): String? { - Log.d(TAG, "Not yet implemented: getCurrentPlayerId") - return null - } - - override fun getCurrentPlayer(): DataHolder? { - return if (player is PlayerEntity) { - DataHolder.builder(PlayerColumns.CURRENT_PLAYER_COLUMNS.toTypedArray()).withRow(player.toContentValues()).build(CommonStatusCodes.SUCCESS) - } else { - DataHolder.builder(PlayerColumns.CURRENT_PLAYER_COLUMNS.toTypedArray()).build(CommonStatusCodes.SIGN_IN_REQUIRED) - } - } - - override fun loadPlayer(callbacks: IGamesCallbacks?, playerId: String?) { - Log.d(TAG, "Not yet implemented: loadPlayer($playerId)") - } - - override fun loadInvitablePlayers(callbacks: IGamesCallbacks?, pageSize: Int, expandCachedData: Boolean, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadInvitablePlayers($pageSize, $expandCachedData, $forceReload)") - } - - override fun submitScore(callbacks: IGamesCallbacks?, leaderboardId: String?, score: Long) { - Log.d(TAG, "Not yet implemented: submitScore($leaderboardId, $score)") - } - - override fun loadLeaderboards(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadLeaderboards") - } - - override fun loadLeaderboard(callbacks: IGamesCallbacks?, leaderboardId: String?) { - Log.d(TAG, "Not yet implemented: loadLeaderboard($leaderboardId)") - } - - override fun loadTopScores( - callbacks: IGamesCallbacks?, - leaderboardId: String?, - span: Int, - leaderboardCollection: Int, - maxResults: Int, - forceReload: Boolean - ) { - Log.d(TAG, "Not yet implemented: loadTopScores($leaderboardId, $span, $leaderboardCollection, $maxResults, $forceReload)") - } - - override fun loadPlayerCenteredScores( - callbacks: IGamesCallbacks?, - leaderboardId: String?, - span: Int, - leaderboardCollection: Int, - maxResults: Int, - forceReload: Boolean - ) { - Log.d(TAG, "Not yet implemented: loadPlayerCenteredScores($leaderboardId, $span, $leaderboardCollection, $maxResults, $forceReload)") - } - - override fun loadMoreScores(callbacks: IGamesCallbacks?, previousheader: Bundle?, maxResults: Int, pageDirection: Int) { - runCatching { previousheader?.keySet() } - Log.d(TAG, "Not yet implemented: loadMoreScores($previousheader, $maxResults, $pageDirection)") - } - - override fun loadAchievements(callbacks: IGamesCallbacks?) { - loadAchievementsV2(callbacks, false) - } - - override fun revealAchievement(callbacks: IGamesCallbacks?, achievementId: String?, windowToken: IBinder?, extraArgs: Bundle?) { - runCatching { extraArgs?.keySet() } - Log.d(TAG, "Not yet implemented: revealAchievement($achievementId, $windowToken, $extraArgs)") - } - - override fun unlockAchievement(callbacks: IGamesCallbacks?, achievementId: String?, windowToken: IBinder?, extraArgs: Bundle?) { - runCatching { extraArgs?.keySet() } - Log.d(TAG, "Not yet implemented: unlockAchievement($achievementId, $windowToken, $extraArgs") - } - - override fun incrementAchievement(callbacks: IGamesCallbacks?, achievementId: String?, numSteps: Int, windowToken: IBinder?, extraArgs: Bundle?) { - runCatching { extraArgs?.keySet() } - Log.d(TAG, "Not yet implemented: incrementAchievement($achievementId, $numSteps, $windowToken, $extraArgs)") - } - - override fun loadGame(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadGame") - } - - override fun loadInvitations(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadInvitations") - } - - override fun declineInvitation(invitationId: String?, invitationType: Int) { - Log.d(TAG, "Not yet implemented: declineInvitation($invitationId, $invitationType)") - } - - override fun dismissInvitation(invitationId: String?, invitationType: Int) { - Log.d(TAG, "Not yet implemented: dismissInvitation($invitationId, $invitationType)") - } - - override fun createRoom( - callbacks: IGamesCallbacks?, - processBinder: IBinder?, - variant: Int, - invitedPlayerIds: Array?, - autoMatchCriteria: Bundle?, - enableSockets: Boolean, - clientId: Long - ) { - Log.d(TAG, "Not yet implemented: createRoom($variant, $invitedPlayerIds, $autoMatchCriteria, $enableSockets, $clientId)") - } - - override fun joinRoom(callbacks: IGamesCallbacks?, processBinder: IBinder?, matchId: String?, enableSockets: Boolean, clientId: Long) { - Log.d(TAG, "Not yet implemented: joinRoom($matchId, $enableSockets, $clientId)") - } - - override fun leaveRoom(callbacks: IGamesCallbacks?, matchId: String?) { - Log.d(TAG, "Not yet implemented: leaveRoom($matchId)") - } - - override fun sendReliableMessage(callbacks: IGamesCallbacks?, messageData: ByteArray?, matchId: String?, recipientParticipantId: String?): Int { - Log.d(TAG, "Not yet implemented: sendReliableMessage($messageData, $matchId, $recipientParticipantId)") - return 0 - } - - override fun sendUnreliableMessage(messageData: ByteArray?, matchId: String?, recipientParticipantIds: Array?): Int { - Log.d(TAG, "Not yet implemented: sendUnreliableMessage($messageData, $matchId, $recipientParticipantIds)") - return 0 - } - - override fun createSocketConnection(participantId: String?): String? { - Log.d(TAG, "Not yet implemented: createSocketConnection($participantId)") - return null - } - - override fun clearNotifications(notificationTypes: Int) { - Log.d(TAG, "Not yet implemented: clearNotifications($notificationTypes)") - } - - override fun loadLeaderboardsFirstParty(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadLeaderboardsFirstParty($gameId)") - } - - override fun loadLeaderboardFirstParty(callbacks: IGamesCallbacks?, gameId: String?, leaderboardId: String?) { - Log.d(TAG, "Not yet implemented: loadLeaderboardFirstParty($gameId, $leaderboardId)") - } - - override fun loadTopScoresFirstParty( - callbacks: IGamesCallbacks?, - gameId: String?, - leaderboardId: String?, - span: Int, - leaderboardCollection: Int, - maxResults: Int, - forceReload: Boolean - ) { - Log.d(TAG, "Not yet implemented: loadTopScoresFirstParty($gameId, $leaderboardId, $span, $leaderboardCollection, $maxResults, $forceReload)") - } - - override fun loadPlayerCenteredScoresFirstParty( - callbacks: IGamesCallbacks?, - gameId: String?, - leaderboardId: String?, - span: Int, - leaderboardCollection: Int, - maxResults: Int, - forceReload: Boolean - ) { - Log.d(TAG, "Not yet implemented: loadPlayerCenteredScoresFirstParty($gameId, $leaderboardId, $span, $leaderboardCollection, $maxResults, $forceReload)") - } - - override fun loadAchievementsFirstParty(callbacks: IGamesCallbacks?, playerId: String?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadAchievementsFirstParty($playerId, $gameId)") - } - - override fun loadGameFirstParty(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadGameFirstParty($gameId)") - } - - override fun loadGameInstancesFirstParty(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadGameInstancesFirstParty($gameId)") - } - - override fun loadGameCollectionFirstParty( - callbacks: IGamesCallbacks?, - pageSize: Int, - collectionType: Int, - expandCachedData: Boolean, - forceReload: Boolean - ) { - Log.d(TAG, "Not yet implemented: loadGameCollectionFirstParty($pageSize, $collectionType, $expandCachedData, $forceReload)") - } - - override fun loadRecentlyPlayedGamesFirstParty( - callbacks: IGamesCallbacks?, - externalPlayerId: String?, - pageSize: Int, - expandCachedData: Boolean, - forceReload: Boolean - ) { - Log.d(TAG, "Not yet implemented: loadRecentlyPlayedGamesFirstParty($externalPlayerId, $pageSize, $expandCachedData, $forceReload)") - } - - override fun loadInvitablePlayersFirstParty(callbacks: IGamesCallbacks?, pageSize: Int, expandCachedData: Boolean, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadInvitablePlayersFirstParty($pageSize, $expandCachedData, $forceReload)") - } - - override fun loadRecentPlayersFirstParty(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadRecentPlayersFirstParty") - } - - override fun loadCircledPlayersFirstParty(callbacks: IGamesCallbacks?, pageSize: Int, expandCachedData: Boolean, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadCircledPlayersFirstParty($pageSize, $expandCachedData, $forceReload)") - } - - override fun loadSuggestedPlayersFirstParty(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadSuggestedPlayersFirstParty") - } - - override fun dismissPlayerSuggestionFirstParty(playerIdToDismiss: String?) { - Log.d(TAG, "Not yet implemented: dismissPlayerSuggestionFirstParty($playerIdToDismiss)") - } - - override fun declineInvitationFirstParty(gameId: String?, invitationId: String?, invitationType: Int) { - Log.d(TAG, "Not yet implemented: declineInvitationFirstParty($gameId, $invitationId, $invitationType)") - } - - override fun loadInvitationsFirstParty(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: loadInvitationsFirstParty($gameId)") - } - - override fun registerWaitingRoomListenerRestricted(callbacks: IGamesCallbacks?, roomId: String?): Int { - Log.d(TAG, "Not yet implemented: registerWaitingRoomListenerRestricted($roomId)") - return 0 - } - - override fun setGameMuteStatusInternal(callbacks: IGamesCallbacks?, gameId: String?, muted: Boolean) { - Log.d(TAG, "Not yet implemented: setGameMuteStatusInternal($gameId, $muted)") - } - - override fun clearNotificationsFirstParty(gameId: String?, notificationTypes: Int) { - Log.d(TAG, "Not yet implemented: clearNotificationsFirstParty($gameId, $notificationTypes)") - } - - override fun loadNotifyAclInternal(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadNotifyAclInternal") - } - - override fun updateNotifyAclInternal(callbacks: IGamesCallbacks?, aclData: String?) { - Log.d(TAG, "Not yet implemented: updateNotifyAclInternal($aclData)") - } - - override fun registerInvitationListener(callbacks: IGamesCallbacks?, clientId: Long) { - Log.d(TAG, "Not yet implemented: registerInvitationListener($clientId)") - } - - override fun unregisterInvitationListener(clientId: Long) { - Log.d(TAG, "Not yet implemented: unregisterInvitationListener($clientId)") - } - - override fun unregisterWaitingRoomListenerRestricted(roomId: String?): Int { - Log.d(TAG, "Not yet implemented: unregisterWaitingRoomListenerRestricted($roomId)") - return 0 - } - - override fun isGameMutedInternal(callbacks: IGamesCallbacks?, gameId: String?) { - Log.d(TAG, "Not yet implemented: isGameMutedInternal($gameId)") - } - - override fun loadContactSettingsInternal(callbacks: IGamesCallbacks?) { - Log.d(TAG, "Not yet implemented: loadContactSettingsInternal") - } - - override fun updateContactSettingsInternal(callbacks: IGamesCallbacks?, enableMobileNotifications: Boolean) { - Log.d(TAG, "Not yet implemented: updateContactSettingsInternal($enableMobileNotifications)") - } - - override fun getSelectedAccountForGameFirstParty(gamePackageName: String?): String? { - Log.d(TAG, "Not yet implemented: getSelectedAccountForGameFirstParty($gamePackageName)") - return null - } - - override fun updateSelectedAccountForGameFirstParty(gamePackageName: String?, accountName: String?) { - Log.d(TAG, "Not yet implemented: updateSelectedAccountForGameFirstParty($gamePackageName, $accountName)") - } - - override fun getGamesContentUriRestricted(gameId: String?): Uri? { - Log.d(TAG, "Not yet implemented: getGamesContentUriRestricted($gameId)") - return null - } - - override fun shouldUseNewPlayerNotificationsFirstParty(): Boolean { - Log.d(TAG, "Not yet implemented: shouldUseNewPlayerNotificationsFirstParty") - return false - } - - override fun setUseNewPlayerNotificationsFirstParty(newPlayerStyle: Boolean) { - Log.d(TAG, "Not yet implemented: setUseNewPlayerNotificationsFirstParty($newPlayerStyle)") - } - - override fun searchForPlayersFirstParty(callbacks: IGamesCallbacks?, query: String?, pageSize: Int, expandCachedData: Boolean, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: searchForPlayersFirstParty($query, $pageSize, $expandCachedData, $forceReload)") - } - - override fun getCurrentGame(): DataHolder? { - Log.d(TAG, "Not yet implemented: getCurrentGame") - return null - } - - override fun loadAchievementsV2(callbacks: IGamesCallbacks?, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadAchievementsV2($forceReload)") - callbacks?.onAchievementsLoaded(DataHolder.empty(CommonStatusCodes.SUCCESS)) - } - - override fun submitLeaderboardScore(callbacks: IGamesCallbacks?, leaderboardId: String?, score: Long, scoreTag: String?) { - Log.d(TAG, "Not yet implemented: submitLeaderboardScore($leaderboardId, $score, $scoreTag)") - } - - override fun setAchievementSteps(callbacks: IGamesCallbacks?, id: String?, numSteps: Int, windowToken: IBinder?, extras: Bundle?) { - runCatching { extras?.keySet() } - Log.d(TAG, "Not yet implemented: setAchievementSteps($id, $numSteps, $windowToken, $extras)") - } - - private fun getGamesIntent(action: String, block: Intent.() -> Unit = {}) = Intent(action).apply { - setPackage(GAMES_PACKAGE_NAME) - putExtra(EXTRA_GAME_PACKAGE_NAME, packageName) - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - block() - } - - override fun getAllLeaderboardsIntent(): Intent = getGamesIntent(ACTION_VIEW_LEADERBOARDS) - - override fun getAchievementsIntent(): Intent = getGamesIntent(ACTION_VIEW_ACHIEVEMENTS) - - override fun getPlayerSearchIntent(): Intent = getGamesIntent(ACTION_PLAYER_SEARCH) - - override fun loadEvents(callbacks: IGamesCallbacks?, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadEvents($forceReload)") - } - - override fun incrementEvent(eventId: String?, incrementAmount: Int) { - Log.d(TAG, "Not yet implemented: incrementEvent($eventId, $incrementAmount)") - } - - override fun loadEventsById(callbacks: IGamesCallbacks?, forceReload: Boolean, eventsIds: Array?) { - Log.d(TAG, "Not yet implemented: loadEventsById($forceReload, $eventsIds)") - } - - override fun getMaxDataSize(): Int { - return 3 * 1024 * 1024 - } - - override fun getMaxCoverImageSize(): Int { - return 800 * 1024 - } - - override fun registerEventClient(callback: IGamesClient?, l: Long) { - Log.d(TAG, "Not yet implemented: registerEventClient($l)") - } - - private fun getCompareProfileIntent(playerId: String, block: Intent.() -> Unit = {}): Intent = getGamesIntent(ACTION_VIEW_PROFILE) { - putExtra(EXTRA_IS_SELF, playerId == currentPlayerId) - putExtra(EXTRA_ACCOUNT, currentAccount) - block() - } - - override fun getCompareProfileIntentForPlayer(player: PlayerEntity): Intent = getCompareProfileIntent(player.playerId) { - putExtra(EXTRA_PLAYER, player) - } - - override fun loadPlayerStats(callbacks: IGamesCallbacks?, forceReload: Boolean) { - Log.d(TAG, "Not yet implemented: loadPlayerStats($forceReload)") - } - - override fun getCurrentAccount(): Account? { - Log.d(TAG, "Not yet implemented: getCurrentAccount") - return account - } - - override fun isTelevision(): Boolean { - Log.d(TAG, "Not yet implemented: isTelevision") - return false - } - - override fun getCompareProfileIntentWithAlternativeNameHints( - otherPlayerId: String, - otherPlayerInGameName: String?, - currentPlayerInGameName: String? - ): Intent = getCompareProfileIntent(otherPlayerId) { - putExtra(EXTRA_PLAYER_ID, otherPlayerId) - putExtra(EXTRA_OTHER_PLAYER_IN_GAME_NAME, otherPlayerInGameName) - putExtra(EXTRA_SELF_IN_GAME_NAME, currentPlayerInGameName) - } - - override fun requestServerSideAccess(callbacks: IGamesCallbacks, serverClientId: String, forceRefreshToken: Boolean) { - lifecycleScope.launchWhenStarted { - try { - val serverAuthTokenResponse = withContext(Dispatchers.IO) { - val serverAuthTokenManager = AuthManager(context, account.name, packageName, "oauth2:server:client_id:${serverClientId}:api_scope:${Scopes.GAMES_LITE}") - serverAuthTokenManager.setOauth2Prompt(if (forceRefreshToken) "consent" else "auto") - serverAuthTokenManager.setItCaveatTypes("2") - serverAuthTokenManager.isPermitted = true - serverAuthTokenManager.invalidateAuthToken() - serverAuthTokenManager.requestAuth(true) - } - if (serverAuthTokenResponse.auth != null) { - callbacks.onServerAuthCode(Status(CommonStatusCodes.SUCCESS), serverAuthTokenResponse.auth) - } else { - callbacks.onServerAuthCode(Status(CommonStatusCodes.SIGN_IN_REQUIRED), null) - } - } catch (e: Exception) { - Log.w(TAG, e) - runCatching { callbacks.onServerAuthCode(Status(CommonStatusCodes.INTERNAL_ERROR), null) } - } - } - } - - 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-core/src/main/kotlin/org/microg/gms/games/GamesSignInActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/GamesSignInActivity.kt deleted file mode 100644 index 27c99cc1f3..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesSignInActivity.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.games - -import android.accounts.Account -import android.content.Intent -import android.os.Bundle -import android.util.Log -import android.view.Gravity -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.lifecycleScope -import com.google.android.gms.auth.api.signin.GoogleSignInAccount -import com.google.android.gms.auth.api.signin.GoogleSignInOptions -import com.google.android.gms.auth.api.signin.internal.SignInConfiguration -import com.google.android.gms.common.api.Status -import org.microg.gms.auth.AuthConstants -import org.microg.gms.auth.signin.AuthSignInActivity -import org.microg.gms.common.Constants - -private const val TAG = "GamesSignIn" - -private const val REQUEST_CODE_GOOGLE_SIGN_IN = 200 - -class GamesSignInActivity : AppCompatActivity() { - val gamePackageName: String? - get() = intent?.getStringExtra(EXTRA_GAME_PACKAGE_NAME) - val account: Account? - get() = intent?.getParcelableExtra(EXTRA_ACCOUNT) - val popupGravity: Int - get() = intent?.getIntExtra(EXTRA_POPUP_GRAVITY, Gravity.TOP or Gravity.CENTER_HORIZONTAL) ?: (Gravity.TOP or Gravity.CENTER_HORIZONTAL) - - private val Int.px: Int get() = (this * resources.displayMetrics.density).toInt() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - if (gamePackageName == null || (gamePackageName != callingActivity?.packageName && callingActivity?.packageName != packageName)) return finish() - - window.setGravity(popupGravity) - startActivityForResult(Intent(this, AuthSignInActivity::class.java).apply { - putExtra("config", SignInConfiguration().apply { - packageName = gamePackageName - options = account?.name?.takeIf { it != AuthConstants.DEFAULT_ACCOUNT }?.let { - GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).setAccountName(it).build() - } ?: GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN - }) - Log.d(TAG, "Redirect to GOOGLE_SIGN_IN using $this") - }, REQUEST_CODE_GOOGLE_SIGN_IN) - } - - private suspend fun signIn(account: Account) { - Log.d(TAG, "Sign in as $account") - if (performGamesSignIn(this, gamePackageName!!, account, permitted = true)) { - GamesConfigurationService.setDefaultAccount(this, gamePackageName, account) - } - setResult(RESULT_OK, Intent().apply { - putExtra(EXTRA_ACCOUNT, account) - }) - finish() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) { - val status = data?.extras?.also { it.classLoader = Status::class.java.classLoader }?.getParcelable("googleSignInStatus") - if (status?.isSuccess == true) { - val account = data.extras?.also { it.classLoader = GoogleSignInAccount::class.java.classLoader } - ?.getParcelable("googleSignInAccount")?.account - if (account != null) { - lifecycleScope.launchWhenStarted { - signIn(account) - } - return - } - } - finish() - } - } -} \ No newline at end of file diff --git a/play-services-core/src/main/kotlin/org/microg/gms/games/extensions.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/extensions.kt deleted file mode 100644 index 956e0600a7..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/extensions.kt +++ /dev/null @@ -1,275 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 microG Project Team - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.games - -import android.accounts.Account -import android.content.ContentValues -import android.content.Context -import android.database.Cursor -import androidx.core.content.contentValuesOf -import androidx.core.net.toUri -import com.android.volley.* -import com.android.volley.Response.success -import com.android.volley.toolbox.JsonObjectRequest -import com.android.volley.toolbox.Volley -import com.google.android.gms.common.Scopes -import com.google.android.gms.common.api.Scope -import com.google.android.gms.games.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import org.json.JSONObject -import org.microg.gms.auth.AuthManager -import org.microg.gms.common.Constants -import org.microg.gms.common.Utils -import org.microg.gms.settings.SettingsContract.CheckIn -import org.microg.gms.settings.SettingsContract.getSettings -import org.microg.gms.utils.singleInstanceOf -import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException -import kotlin.coroutines.suspendCoroutine - - -const val ACTION_START_1P = "com.google.android.play.games.service.START_1P" -const val ACTION_VIEW_LEADERBOARDS = "com.google.android.gms.games.VIEW_LEADERBOARDS" -const val ACTION_VIEW_ACHIEVEMENTS = "com.google.android.gms.games.VIEW_ACHIEVEMENTS" -const val ACTION_PLAYER_SEARCH = "com.google.android.gms.games.PLAYER_SEARCH" -const val ACTION_VIEW_PROFILE = "com.google.android.gms.games.VIEW_PROFILE" -const val ACTION_ADD_FRIEND = "com.google.android.gms.games.ADD_FRIEND" - -const val EXTRA_GAME_PACKAGE_NAME = "com.google.android.gms.games.GAME_PACKAGE_NAME" -const val EXTRA_GAME_ID = "com.google.android.gms.games.GAME_ID" -const val EXTRA_PLAYER = "com.google.android.gms.games.PLAYER" -const val EXTRA_PLAYER_ID = "com.google.android.gms.games.PLAYER_ID" -const val EXTRA_IS_SELF = "com.google.android.gms.games.IS_SELF" -const val EXTRA_ACCOUNT = "com.google.android.gms.games.ACCOUNT" -const val EXTRA_SCOPES = "com.google.android.gms.games.SCOPES" -const val EXTRA_POPUP_GRAVITY = "com.google.android.gms.games.key.connectingPopupGravity" -const val EXTRA_SELF_IN_GAME_NAME = "com.google.android.gms.games.EXTRA_SELF_IN_GAME_NAME" -const val EXTRA_OTHER_PLAYER_IN_GAME_NAME = "com.google.android.gms.games.EXTRA_OTHER_PLAYER_IN_GAME_NAME" - -const val GAMES_PACKAGE_NAME = "com.google.android.play.games" - -val List.realScopes - get() = if (any { it.scopeUri == Scopes.GAMES }) { - this - } else { - this.toSet() + Scope(Scopes.GAMES_LITE) - }.toList().sortedBy { it.scopeUri } - -fun PlayerEntity.toContentValues(): ContentValues = contentValuesOf( - PlayerColumns.externalPlayerId to playerId, - PlayerColumns.profileName to displayName, - PlayerColumns.gamerTag to gamerTag, - PlayerColumns.realName to name, - PlayerColumns.profileIconImageUri to iconImageUri?.toString(), - PlayerColumns.profileIconImageUrl to iconImageUrl, - PlayerColumns.profileHiResImageUri to hiResImageUri?.toString(), - PlayerColumns.profileHiResImageUrl to hiResImageUrl, - PlayerColumns.bannerImageLandscapeUri to bannerImageLandscapeUri?.toString(), - PlayerColumns.bannerImageLandscapeUrl to bannerImageLandscapeUrl, - PlayerColumns.bannerImagePortraitUri to bannerImagePortraitUri?.toString(), - PlayerColumns.bannerImagePortraitUrl to bannerImagePortraitUrl, - PlayerColumns.lastUpdated to retrievedTimestamp, - PlayerColumns.isInCircles to isInCircles, - PlayerColumns.playedWithTimestamp to lastPlayedWithTimestamp, - PlayerColumns.playerTitle to title, - PlayerColumns.isProfileVisible to isProfileVisible, - PlayerColumns.hasDebugAccess to hasDebugAccess, - PlayerColumns.gamerFriendStatus to 0, - PlayerColumns.gamerFriendUpdateTimestamp to 0L, - PlayerColumns.isMuted to false, - PlayerColumns.totalUnlockedAchievements to totalUnlockedAchievement, - PlayerColumns.alwaysAutoSignIn to isAlwaysAutoSignIn, - PlayerColumns.hasAllPublicAcls to isProfileVisible, - - PlayerColumns.currentLevel to levelInfo?.currentLevel?.levelNumber, - PlayerColumns.currentLevelMinXp to levelInfo?.currentLevel?.minXp, - PlayerColumns.currentLevelMaxXp to levelInfo?.currentLevel?.maxXp, - PlayerColumns.nextLevel to levelInfo?.nextLevel?.levelNumber, - PlayerColumns.nextLevelMaxXp to levelInfo?.nextLevel?.maxXp, - PlayerColumns.lastLevelUpTimestamp to (levelInfo?.lastLevelUpTimestamp ?: -1), - PlayerColumns.currentXpTotal to (levelInfo?.currentXpTotal ?: -1L), - - PlayerColumns.mostRecentExternalGameId to mostRecentGameInfo?.gameId, - PlayerColumns.mostRecentGameName to mostRecentGameInfo?.gameName, - PlayerColumns.mostRecentActivityTimestamp to mostRecentGameInfo?.activityTimestampMillis, - PlayerColumns.mostRecentGameIconUri to mostRecentGameInfo?.gameIconImageUri?.toString(), - PlayerColumns.mostRecentGameHiResUri to mostRecentGameInfo?.gameHiResImageUri?.toString(), - PlayerColumns.mostRecentGameFeaturedUri to mostRecentGameInfo?.gameFeaturedImageUri?.toString(), - - PlayerColumns.playTogetherFriendStatus to relationshipInfo?.friendStatus, - PlayerColumns.playTogetherNickname to (relationshipInfo as? PlayerRelationshipInfoEntity)?.nickname, - PlayerColumns.playTogetherInvitationNickname to (relationshipInfo as? PlayerRelationshipInfoEntity)?.invitationNickname, - PlayerColumns.nicknameAbuseReportToken to (relationshipInfo as? PlayerRelationshipInfoEntity)?.nicknameAbuseReportToken, - - PlayerColumns.friendsListVisibility to currentPlayerInfo?.friendsListVisibilityStatus -) - -fun JSONObject.toPlayer() = PlayerEntity( - getString("playerId"), - getString("displayName"), - optString("avatarImageUrl").takeIf { it.isNotBlank() }?.toUri(), - optString("avatarImageUrl").takeIf { it.isNotBlank() }?.toUri(), - System.currentTimeMillis(), - 0, 0, - optString("avatarImageUrl").takeIf { it.isNotBlank() }, - optString("avatarImageUrl").takeIf { it.isNotBlank() }, - getString("title"), - null, - getJSONObject("experienceInfo")?.let { - PlayerLevelInfo( - it.optLong("currentExperiencePoints"), - 0, - it.getJSONObject("currentLevel")?.let { - PlayerLevel(it.getInt("level"), it.optLong("minExperiencePoints"), it.optLong("maxExperiencePoints")) - }, - it.getJSONObject("nextLevel")?.let { - PlayerLevel(it.getInt("level"), it.optLong("minExperiencePoints"), it.optLong("maxExperiencePoints")) - } - ) - }, - optJSONObject("profileSettings")?.optBoolean("profileVisible") ?: false, - false, - null, null, - optString("bannerUrlLandscape").takeIf { it.isNotBlank() }?.toUri(), - optString("bannerUrlLandscape").takeIf { it.isNotBlank() }, - optString("bannerUrlPortrait").takeIf { it.isNotBlank() }?.toUri(), - optString("bannerUrlPortrait").takeIf { it.isNotBlank() }, - 0, null, - optJSONObject("profileSettings")?.optString("friendsListVisibility")?.takeIf { it.isNotBlank() }?.let { - CurrentPlayerInfoEntity( - when (it) { - "VISIBLE" -> Player.FriendsListVisibilityStatus.VISIBLE - "REQUEST_REQUIRED" -> Player.FriendsListVisibilityStatus.REQUEST_REQUIRED - "FEATURE_UNAVAILABLE" -> Player.FriendsListVisibilityStatus.FEATURE_UNAVAILABLE - else -> Player.FriendsListVisibilityStatus.UNKNOWN - } - ) - }, - false, - null -) - -suspend fun registerForGames(context: Context, account: Account, queue: RequestQueue = singleInstanceOf { Volley.newRequestQueue(context.applicationContext) }) { - val authManager = AuthManager(context, account.name, Constants.GOOGLE_SERVICES_PACKAGE_NAME, "oauth2:${Scopes.GAMES_FIRSTPARTY}") - authManager.setOauth2Foreground("1") - val authToken = withContext(Dispatchers.IO) { authManager.requestAuth(false).auth } - val androidId = getSettings(context, CheckIn.getContentUri(context), arrayOf(CheckIn.ANDROID_ID)) { cursor: Cursor -> cursor.getLong(0) } - val result = suspendCoroutine { continuation -> - queue.add( - object : JsonObjectRequest( - "https://www.googleapis.com/games/v1whitelisted/players/me/profilesettings?requestRandomGamerTag=true&language=${Utils.getLocale(context)}", - { continuation.resume(it) }, - { continuation.resumeWithException(RuntimeException(it)) }) { - override fun getHeaders(): MutableMap { - return mutableMapOf( - "Authorization" to "OAuth $authToken", - "X-Device-ID" to androidId.toString(16) - ) - } - } - ) - } - suspendCoroutine { continuation -> - queue.add( - object : JsonObjectRequest( - Method.PUT, - "https://www.googleapis.com/games/v1whitelisted/players/me/profilesettings?language=${Utils.getLocale(context)}", - JSONObject().apply { - put("alwaysAutoSignIn", false) - put("autoSignIn", false) - put("gamerTagIsDefault", true) - put("gamerTagIsExplicitlySet", false) - put("gamesLitePlayerStatsEnabled", false) - put("profileDiscoverableViaGoogleAccount", false) - put("profileVisibilityWasChosenByPlayer", false) - put("profileVisible", false) - put("gamerTag", result.getString("gamerTag")) - if (result.has("stockGamerAvatarUrl")) put("stockGamerAvatarUrl", result.getString("stockGamerAvatarUrl")) - }, - { continuation.resume(it) }, - { continuation.resumeWithException(RuntimeException(it)) }) { - override fun getHeaders(): MutableMap { - return mutableMapOf( - "Content-Type" to "application/json; charset=utf-8", - "Authorization" to "OAuth $authToken", - "X-Device-ID" to androidId.toString(16) - ) - } - } - ) - } -} - -suspend fun performGamesSignIn( - context: Context, - packageName: String, - account: Account, - permitted: Boolean = false, - scopes: List = emptyList(), - queue: RequestQueue = singleInstanceOf { Volley.newRequestQueue(context.applicationContext) } -): Boolean { - val realScopes = scopes.realScopes - val authManager = AuthManager(context, account.name, packageName, "oauth2:${realScopes.joinToString(" ")}") - if (realScopes.size == 1) authManager.setItCaveatTypes("2") - if (permitted) authManager.isPermitted = true - val authResponse = withContext(Dispatchers.IO) { authManager.requestAuth(true) } - if (authResponse.auth == null) return false - if (authResponse.issueAdvice != "stored" || GamesConfigurationService.getPlayer(context, packageName, account) == null) { - suspend fun fetchSelfPlayer() = suspendCoroutine { continuation -> - queue.add( - object : JsonObjectRequest( - "https://www.googleapis.com/games/v1/players/me", - { continuation.resume(it) }, - { continuation.resumeWithException(it) }) { - override fun getHeaders(): MutableMap { - return mutableMapOf( - "Authorization" to "OAuth ${authResponse.auth}" - ) - } - } - ) - } - - val result = try { - fetchSelfPlayer() - } catch (e: Exception) { - if (e is VolleyError && e.networkResponse?.statusCode == 404) { - registerForGames(context, account, queue) - fetchSelfPlayer() - } else { - throw e - } - } - GamesConfigurationService.setPlayer(context, packageName, account, result.toString()) - if (packageName != GAMES_PACKAGE_NAME) { - try { - suspendCoroutine { continuation -> - queue.add(object : Request(Method.POST, "https://www.googleapis.com/games/v1/applications/played", { - continuation.resumeWithException(it) - }) { - override fun parseNetworkResponse(response: NetworkResponse): Response { - if (response.statusCode == 204) return success(Unit, null) - return Response.error(VolleyError(response)) - } - - override fun deliverResponse(response: Unit) { - continuation.resume(response) - } - - override fun getHeaders(): MutableMap { - return mutableMapOf( - "Authorization" to "OAuth ${authResponse.auth}" - ) - } - }) - } - } catch (ignored: Exception) { - } - } - } - return true -} \ No newline at end of file diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/VendingFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/VendingFragment.kt deleted file mode 100644 index 0d0308cd26..0000000000 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/VendingFragment.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023, e Foundation - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.microg.gms.ui - -import android.annotation.SuppressLint -import android.os.Bundle -import androidx.lifecycle.lifecycleScope -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.TwoStatePreference -import com.google.android.gms.R -import org.microg.gms.vending.VendingPreferences - -class VendingFragment : PreferenceFragmentCompat() { - private lateinit var licensingEnabled: TwoStatePreference - private lateinit var iapEnable: TwoStatePreference - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.preferences_vending) - } - - @SuppressLint("RestrictedApi") - override fun onBindPreferences() { - licensingEnabled = preferenceScreen.findPreference(PREF_LICENSING_ENABLED) ?: licensingEnabled - licensingEnabled.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - val appContext = requireContext().applicationContext - lifecycleScope.launchWhenResumed { - if (newValue is Boolean) { - VendingPreferences.setLicensingEnabled(appContext, newValue) - } - updateContent() - } - true - } - - iapEnable = preferenceScreen.findPreference(PREF_IAP_ENABLED) ?: iapEnable - iapEnable.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - val appContext = requireContext().applicationContext - lifecycleScope.launchWhenResumed { - if (newValue is Boolean) { - VendingPreferences.setBillingEnabled(appContext, newValue) - } - updateContent() - } - true - } - } - - override fun onResume() { - super.onResume() - updateContent() - } - - private fun updateContent() { - val appContext = requireContext().applicationContext - lifecycleScope.launchWhenResumed { - licensingEnabled.isChecked = VendingPreferences.isLicensingEnabled(appContext) - iapEnable.isChecked = VendingPreferences.isBillingEnabled(appContext) - } - } - - companion object { - const val PREF_LICENSING_ENABLED = "vending_licensing" - const val PREF_IAP_ENABLED = "vending_iap" - } -} \ No newline at end of file