From af28a78bba03604f4197d4e298f9acf3b63317bb Mon Sep 17 00:00:00 2001 From: Marvin W Date: Mon, 3 Aug 2020 18:05:14 +0200 Subject: [PATCH] Update chimera service provider --- .../org/microg/gms/ChimeraSpoofProvider.java | 67 --------------- .../java/org/microg/gms/common/GmsClient.java | 11 +++ .../gms/common/internal/ConnectionInfo.aidl | 7 ++ .../gms/common/internal/IGmsCallbacks.aidl | 8 ++ .../google/android/gms/common/Feature.java | 36 ++++++++ .../gms/common/internal/ConnectionInfo.java | 23 +++++ .../org/microg/gms/common/GmsService.java | 9 ++ .../src/main/AndroidManifest.xml | 12 +-- .../org/microg/gms/chimera/ServiceProvider.kt | 84 +++++++++++++++++++ 9 files changed, 182 insertions(+), 75 deletions(-) delete mode 100644 play-services-base-core/src/main/java/org/microg/gms/ChimeraSpoofProvider.java create mode 100644 play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ConnectionInfo.aidl create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/Feature.java create mode 100644 play-services-basement/src/main/java/com/google/android/gms/common/internal/ConnectionInfo.java create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt diff --git a/play-services-base-core/src/main/java/org/microg/gms/ChimeraSpoofProvider.java b/play-services-base-core/src/main/java/org/microg/gms/ChimeraSpoofProvider.java deleted file mode 100644 index b0dbea65..00000000 --- a/play-services-base-core/src/main/java/org/microg/gms/ChimeraSpoofProvider.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 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; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.net.Uri; -import android.util.Log; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -public class ChimeraSpoofProvider extends ContentProvider { - private static final String TAG = "GmsChimeraSpoof"; - private static final String[] COLUMNS = new String[]{"version", "apkPath", "loaderPath", "apkDescStr"}; - - @Override - public boolean onCreate() { - return true; - } - - @Nullable - @Override - public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - MatrixCursor cursor = new MatrixCursor(COLUMNS); - Log.d(TAG, "query: " + uri); - return cursor; - } - - @Nullable - @Override - public String getType(@NonNull Uri uri) { - return "vnd.android.cursor.item/com.google.android.gms.chimera"; - } - - @Nullable - @Override - public Uri insert(@NonNull Uri uri, ContentValues values) { - return null; - } - - @Override - public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { - return 0; - } - - @Override - public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) { - return 0; - } -} diff --git a/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java b/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java index 64ac6942..dec9c8ca 100644 --- a/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java +++ b/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java @@ -27,6 +27,7 @@ import android.os.RemoteException; import android.util.Log; import com.google.android.gms.common.ConnectionResult; +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.common.internal.IGmsServiceBroker; @@ -177,6 +178,16 @@ public abstract class GmsClient implements ApiClient { Log.d(TAG, "GmsCallbacks : onPostInitComplete(" + serviceInterface + ")"); callbacks.onConnected(params); } + + @Override + public void onAccountValidationComplete(int statusCode, Bundle params) throws RemoteException { + Log.d(TAG, "GmsCallbacks : onAccountValidationComplete"); + } + + @Override + public void onPostInitCompleteWithConnectionInfo(int statusCode, IBinder binder, ConnectionInfo info) throws RemoteException { + onPostInitComplete(statusCode, binder, info == null ? null : info.params); + } } } diff --git a/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ConnectionInfo.aidl b/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ConnectionInfo.aidl new file mode 100644 index 00000000..b393f11d --- /dev/null +++ b/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/ConnectionInfo.aidl @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common.internal; +parcelable ConnectionInfo; diff --git a/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGmsCallbacks.aidl b/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGmsCallbacks.aidl index b0210281..8fe63347 100644 --- a/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGmsCallbacks.aidl +++ b/play-services-basement/src/main/aidl/com/google/android/gms/common/internal/IGmsCallbacks.aidl @@ -1,7 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + package com.google.android.gms.common.internal; import android.os.Bundle; +import com.google.android.gms.common.internal.ConnectionInfo; interface IGmsCallbacks { void onPostInitComplete(int statusCode, IBinder binder, in Bundle params); + void onAccountValidationComplete(int statusCode, in Bundle params); + void onPostInitCompleteWithConnectionInfo(int statusCode, IBinder binder, in ConnectionInfo info); } diff --git a/play-services-basement/src/main/java/com/google/android/gms/common/Feature.java b/play-services-basement/src/main/java/com/google/android/gms/common/Feature.java new file mode 100644 index 00000000..0a5b0813 --- /dev/null +++ b/play-services-basement/src/main/java/com/google/android/gms/common/Feature.java @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class Feature extends AutoSafeParcelable { + @Field(1) + private String name; + @Field(2) + private int oldVersion; + @Field(3) + private long version = -1; + + private Feature() { + } + + public Feature(String name, long version) { + this.name = name; + this.version = version; + } + + public String getName() { + return name; + } + + public long getVersion() { + if (version == -1) return oldVersion; + return version; + } + + public static final Creator CREATOR = new AutoSafeParcelable.AutoCreator<>(Feature.class); +} diff --git a/play-services-basement/src/main/java/com/google/android/gms/common/internal/ConnectionInfo.java b/play-services-basement/src/main/java/com/google/android/gms/common/internal/ConnectionInfo.java new file mode 100644 index 00000000..5afe6d10 --- /dev/null +++ b/play-services-basement/src/main/java/com/google/android/gms/common/internal/ConnectionInfo.java @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common.internal; + +import android.os.Bundle; + +import com.google.android.gms.common.Feature; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ConnectionInfo extends AutoSafeParcelable { + @Field(1) + public Bundle params; + @Field(2) + public Feature[] features; + @Field(3) + public int unknown3; + + public static final Creator CREATOR = new AutoSafeParcelable.AutoCreator<>(ConnectionInfo.class); +} diff --git a/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java b/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java index fd6141ce..cd6816d4 100644 --- a/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java +++ b/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java @@ -125,6 +125,15 @@ public enum GmsService { return UNKNOWN; } + public static GmsService byAction(String action) { + for (GmsService service : values()) { + for (String serviceAction : service.SECONDARY_ACTIONS) { + if (serviceAction.equals(action)) return service; + } + } + return UNKNOWN; + } + public static String nameFromServiceId(int serviceId) { return byServiceId(serviceId).toString(serviceId); } diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index c575f897..e6353ae6 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -411,9 +411,9 @@ - + @@ -476,10 +476,6 @@ android:name="org.microg.gms.ui.GoogleMoreFragment$AsActivity" android:label="@string/gms_settings_name" /> - - @@ -625,13 +621,13 @@ - + - + diff --git a/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt b/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt new file mode 100644 index 00000000..c4c4248a --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt @@ -0,0 +1,84 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.chimera + +import android.content.ContentProvider +import android.content.ContentValues +import android.content.Context +import android.content.Intent +import android.database.Cursor +import android.database.MatrixCursor +import android.net.Uri +import android.os.Bundle +import android.util.Log +import androidx.core.os.bundleOf +import org.microg.gms.DummyService +import org.microg.gms.common.GmsService +import org.microg.gms.common.RemoteListenerProxy + +class ServiceProvider : ContentProvider() { + + override fun onCreate(): Boolean { + Log.d(TAG, "onCreate") + return true + } + + override fun call(method: String, arg: String?, extras: Bundle?): Bundle? { + when (method) { + "serviceIntentCall" -> { + val serviceAction = extras?.getString("serviceActionBundleKey") ?: return null + val ourServiceAction = GmsService.byAction(serviceAction)?.takeIf { it.SERVICE_ID > 0 }?.ACTION + val context = context!! + val intent = Intent(ourServiceAction).apply { `package` = context.packageName } + val resolveInfo = context.packageManager.resolveService(intent, 0) + if (resolveInfo != null) { + intent.setClassName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name) + } else { + intent.setClass(context, DummyService::class.java) + } + Log.d(TAG, "$method: $serviceAction -> $intent") + return bundleOf( + "serviceResponseIntentKey" to intent + ) + } + else -> { + Log.d(TAG, "$method: $arg, $extras") + return super.call(method, arg, extras) + } + } + } + + override fun query(uri: Uri, projection: Array?, selection: String?, selectionArgs: Array?, sortOrder: String?): Cursor? { + val cursor = MatrixCursor(COLUMNS) + Log.d(TAG, "query: $uri") + return cursor + } + + override fun insert(uri: Uri, values: ContentValues?): Uri? { + Log.d(TAG, "insert: $uri, $values") + return uri + } + + override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int { + Log.d(TAG, "update: $uri, $values, $selection, $selectionArgs") + return 0 + } + + override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int { + Log.d(TAG, "delete: $uri, $selection, $selectionArgs") + return 0 + } + + override fun getType(uri: Uri): String { + Log.d(TAG, "getType: $uri") + return "vnd.android.cursor.item/com.google.android.gms.chimera" + } + + companion object { + private const val TAG = "ChimeraServiceProvider" + private val COLUMNS = arrayOf("version", "apkPath", "loaderPath", "apkDescStr") + } +}