diff --git a/play-services-api/src/main/aidl/com/google/android/gms/common/data/BitmapTeleporter.aidl b/play-services-api/src/main/aidl/com/google/android/gms/common/data/BitmapTeleporter.aidl new file mode 100644 index 00000000..832f0fd2 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/common/data/BitmapTeleporter.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common.data; + +parcelable BitmapTeleporter; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl new file mode 100644 index 00000000..0b4980d3 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ErrorReport.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable ErrorReport; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl new file mode 100644 index 00000000..d6dd1583 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/FileTeleporter.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable FileTeleporter; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl new file mode 100644 index 00000000..433575b0 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/LogOptions.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable LogOptions; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl new file mode 100644 index 00000000..7b189c99 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/ThemeSettings.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +parcelable ThemeSettings; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl new file mode 100644 index 00000000..eeb50c94 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackCallbacks.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback.internal; + +interface IFeedbackCallbacks { + void onServiceDestroy(); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl new file mode 100644 index 00000000..48401b0d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/feedback/internal/IFeedbackService.aidl @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback.internal; + +import com.google.android.gms.feedback.FeedbackOptions; +import android.os.IBinder; +import android.os.IInterface; +import android.os.Parcel; +import com.google.android.gms.googlehelp.GoogleHelp; +import com.google.android.gms.feedback.ErrorReport; +import android.content.Context; +import android.os.Bundle; +import android.content.Intent; + + +interface IFeedbackService { + + boolean startFeedbackFlow(in ErrorReport errorReport) = 0; + + boolean silentSendFeedback(in ErrorReport errorReport) = 2; + + void saveFeedbackDataAsync(in Bundle bundle, long id) = 3; + + void saveFeedbackDataAsyncWithOption(in FeedbackOptions options, in Bundle bundle, long id) = 4; + + void startFeedbackFlowAsync(in ErrorReport errorReport, long id) = 5; + + boolean isValidConfiguration(in FeedbackOptions options) = 6; + +} \ No newline at end of file diff --git a/play-services-api/src/main/java/com/google/android/gms/common/data/BitmapTeleporter.java b/play-services-api/src/main/java/com/google/android/gms/common/data/BitmapTeleporter.java new file mode 100644 index 00000000..1af37b66 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/common/data/BitmapTeleporter.java @@ -0,0 +1,110 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common.data; + +import android.graphics.Bitmap; +import android.os.Parcel; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.io.Closeable; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; + +@SafeParcelable.Class +public class BitmapTeleporter extends AbstractSafeParcelable { + + @Field(1) + public int versionCode; + @Field(2) + public ParcelFileDescriptor fileDescriptor; + @Field(3) + public int status; + public boolean isParceled; + public Bitmap targetBitmap; + public File targetDirectory; + + public BitmapTeleporter() { + } + + public BitmapTeleporter(int version, ParcelFileDescriptor parcelFileDescriptor, int status) { + this.versionCode = version; + this.fileDescriptor = parcelFileDescriptor; + this.status = status; + this.targetBitmap = null; + this.isParceled = false; + } + + public BitmapTeleporter(Bitmap bitmap) { + this.versionCode = 1; + this.fileDescriptor = null; + this.status = 0; + this.targetBitmap = bitmap; + this.isParceled = true; + } + + public final Bitmap createTargetBitmap() { + if (!this.isParceled) { + ParcelFileDescriptor parcelFileDescriptor = this.fileDescriptor; + if (parcelFileDescriptor == null) { + throw new NullPointerException("null reference"); + } + DataInputStream dataInputStream = new DataInputStream(new ParcelFileDescriptor.AutoCloseInputStream(parcelFileDescriptor)); + try { + try { + byte[] bArr = new byte[dataInputStream.readInt()]; + int readInt = dataInputStream.readInt(); + int readInt2 = dataInputStream.readInt(); + Bitmap.Config valueOf = Bitmap.Config.valueOf(dataInputStream.readUTF()); + dataInputStream.read(bArr); + close(dataInputStream); + ByteBuffer wrap = ByteBuffer.wrap(bArr); + Bitmap createBitmap = Bitmap.createBitmap(readInt, readInt2, valueOf); + createBitmap.copyPixelsFromBuffer(wrap); + this.targetBitmap = createBitmap; + this.isParceled = true; + } catch (IOException e) { + throw new IllegalStateException("Could not read from parcel file descriptor", e); + } + } catch (Throwable th) { + close(dataInputStream); + throw th; + } + } + return this.targetBitmap; + } + + public final void setTargetDirectory(File file) { + if (file == null) { + throw new NullPointerException("Cannot set null temp directory"); + } + this.targetDirectory = file; + } + + private static void close(Closeable closeable) { + try { + closeable.close(); + } catch (IOException e) { + Log.w("BitmapTeleporter", "Could not close stream", e); + } + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(BitmapTeleporter.class); + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java b/play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java new file mode 100644 index 00000000..55d6d359 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/ErrorReport.java @@ -0,0 +1,163 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.app.ApplicationErrorReport; +import android.graphics.Bitmap; +import android.graphics.RectF; +import android.os.Bundle; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.data.BitmapTeleporter; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.util.List; + +@SafeParcelable.Class +public class ErrorReport extends AbstractSafeParcelable { + @Field(2) + public ApplicationErrorReport applicationErrorReport; + @Field(3) + public String feedbackMsg; + @Field(4) + public int versionCode; + @Field(5) + public String versionName; + @Field(6) + public String mobileDevice; + @Field(7) + public String mobileDisplay; + @Field(8) + public String mobileType; + @Field(9) + public String mobileModel; + @Field(10) + public String mobileProduct; + @Field(11) + public String mobileFingerprint; + @Field(12) + public int mobileSdkInt; + @Field(13) + public String mobileRelease; + @Field(14) + public String mobileIncremental; + @Field(15) + public String mobileCodeName; + @Field(16) + public String mobileBoard; + @Field(17) + public String mobileBrand; + @Field(18) + public String[] unknownStringArray18; + @Field(19) + public String[] unknownStringArray19; + @Field(20) + public String[] unknownStringArray20; + @Field(21) + public String unknownString21; + @Field(22) + public String screenshotImgSrc; + @Field(23) + public byte[] screenshotImgData; + @Field(24) + public int screenshotHeight; + @Field(25) + public int screenshotWidth; + @Field(26) + public int phoneType; + @Field(27) + public int networkType; + @Field(28) + public String networkOperatorName; + @Field(29) + public String email; + @Field(30) + public String languageTag; + @Field(31) + public Bundle bundle; + @Field(32) + public boolean isFixedUri; + @Field(33) + public int mobileCountryCode; + @Field(34) + public int mobileNetworkCode; + @Field(35) + public boolean unknownBool35; + @Field(36) + public String exceptionClassName; + @Field(37) + public String throwFileName; + @Field(38) + public int throwLineNumber; + @Field(39) + public String throwClassName; + @Field(40) + public String throwMethodName; + @Field(41) + public String stackTrace; + @Field(42) + public String exceptionMessage; + @Field(43) + public String unknownString43; + @Field(44) + public String unknownString44; + @Field(45) + public String packageName; + @Field(46) + public BitmapTeleporter bitmapTeleporter; + @Field(47) + public String unknownString47; + @Field(48) + public FileTeleporter[] files; + @Field(49) + public String[] unknownByteArray49; + @Field(50) + public boolean unknownBool50; + @Field(51) + public String unknownString51; + @Field(52) + public ThemeSettings themeSettings; + @Field(53) + public LogOptions logOptions; + @Field(54) + public String unknownString54; + @Field(55) + public boolean unknownBool55; + @Field(56) + public Bundle bundleText; + @Field(57) + public List rectFS; + @Field(58) + public boolean unknownBool58; + @Field(59) + public Bitmap bitmap; + @Field(60) + public String unknownString60; + @Field(61) + public List camList; + @Field(62) + public int unknownInt62; + @Field(63) + public int unknownInt63; + @Field(64) + public String[] unknownStringArray64; + @Field(65) + public String[] unknownStringArray65; + @Field(66) + public String[] unknownStringArray66; + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(ErrorReport.class); + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java b/play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java new file mode 100644 index 00000000..679fe0f2 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/FeedbackOptions.java @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.app.ApplicationErrorReport; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.data.BitmapTeleporter; +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +import java.util.List; + +@SafeParcelable.Class +public class FeedbackOptions extends AbstractSafeParcelable { + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FeedbackOptions.class); + + @Field(2) + public String unknownString2; + @Field(3) + public Bundle unknownBundle3; + @Field(5) + public String unknownString3; + @Field(6) + public ApplicationErrorReport applicationErrorReport; + @Field(7) + public String unknownString7; + @Field(8) + public BitmapTeleporter bitmapTeleporter; + @Field(9) + public String packageName; + @Field(10) + public List files; + @Field(11) + public boolean unknownBoolean11; + @Field(12) + public ThemeSettings themeSettings; + @Field(13) + public LogOptions logOptions; + @Field(14) + public boolean unknownBoolean14; + @Field(15) + public Bitmap screenshot; + @Field(16) + public String unknownString16; + @Field(17) + public boolean unknownBoolean17; + @Field(18) + public long unknownLong18; + @Field(19) + public boolean unknownBool19; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java b/play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java new file mode 100644 index 00000000..445200bf --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/FileTeleporter.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class FileTeleporter extends AbstractSafeParcelable { + @Field(3) + public String contentType; + @Field(4) + public String content; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(FileTeleporter.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java b/play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java new file mode 100644 index 00000000..ce1f8201 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/feedback/LogOptions.java @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.feedback; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; +import com.google.android.gms.common.internal.safeparcel.SafeParcelableCreatorAndWriter; + +@SafeParcelable.Class +public class LogOptions extends AbstractSafeParcelable { + + @Field(2) + public String options; + @Field(3) + public boolean unknownBool3; + @Field(4) + public boolean unknownBool4; + @Field(5) + public boolean unknownBool5; + @Field(6) + public boolean unknownBool6; + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + CREATOR.writeToParcel(this, dest, flags); + } + + public static final SafeParcelableCreatorAndWriter CREATOR = findCreator(LogOptions.class); + +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/feedback/FeedbackService.kt b/play-services-core/src/main/kotlin/org/microg/gms/feedback/FeedbackService.kt new file mode 100644 index 00000000..b28127b5 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/feedback/FeedbackService.kt @@ -0,0 +1,86 @@ +/* + * SPDX-FileCopyrightText: 2023 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.feedback + +import android.content.Context +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import androidx.lifecycle.LifecycleCoroutineScope +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.common.Feature +import com.google.android.gms.common.api.CommonStatusCodes +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.feedback.ErrorReport +import com.google.android.gms.feedback.FeedbackOptions +import com.google.android.gms.feedback.internal.IFeedbackService +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.profile.ProfileManager + +private const val TAG = "FeedbackService" + +class FeedbackService : BaseService(TAG, GmsService.FEEDBACK) { + + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + Log.d(TAG, "handleServiceRequest start ") + ProfileManager.ensureInitialized(this) + callback.onPostInitCompleteWithConnectionInfo( + CommonStatusCodes.SUCCESS, + FeedbackServiceImpl(this, lifecycleScope), + ConnectionInfo().apply { + features = arrayOf(Feature("new_send_silent_feedback", 1)) + }) + } + +} + +class FeedbackServiceImpl(private val context: Context, private val lifecycleScope: LifecycleCoroutineScope) : + IFeedbackService.Stub() { + + override fun startFeedbackFlow(errorReport: ErrorReport): Boolean { + Log.d(TAG, "startFeedbackFlow: ") + showFeedbackDisabledToast() + return false + } + + override fun silentSendFeedback(errorReport: ErrorReport): Boolean { + Log.d(TAG, "Not impl silentSendFeedback: ") + return false + } + + override fun saveFeedbackDataAsync(bundle: Bundle, id: Long) { + Log.d(TAG, "Not impl saveFeedbackDataAsync: ") + } + + override fun saveFeedbackDataAsyncWithOption(options: FeedbackOptions, bundle: Bundle, id: Long) { + Log.d(TAG, "Not impl saveFeedbackDataAsyncWithOption: $options") + } + + override fun startFeedbackFlowAsync(errorReport: ErrorReport, id: Long) { + Log.d(TAG, "startFeedbackFlowAsync errorReport:$errorReport") + showFeedbackDisabledToast() + } + + override fun isValidConfiguration(options: FeedbackOptions): Boolean { + Log.d(TAG, "Not impl isValidConfiguration: $options") + return false + } + + private fun showFeedbackDisabledToast() { + lifecycleScope.launchWhenStarted { + withContext(Dispatchers.Main){ + val content = context.resources.getString(com.google.android.gms.R.string.feedback_disabled) + Toast.makeText(context, content, Toast.LENGTH_SHORT).show() + } + } + } + +} diff --git a/play-services-core/src/main/res/values-zh-rCN/strings.xml b/play-services-core/src/main/res/values-zh-rCN/strings.xml index 72062991..beb6f60d 100644 --- a/play-services-core/src/main/res/values-zh-rCN/strings.xml +++ b/play-services-core/src/main/res/values-zh-rCN/strings.xml @@ -111,6 +111,7 @@ 自定义:%s 自动:%s 系统:%s +<<<<<<< HEAD 导入自定义配置 从文件导入设备配置 序列号 @@ -140,3 +141,50 @@ This will open your device settings ! Miscellaneous settings +======= + "测试 SafetyNet 认证" + "Google SafetyNet 是一套设备认证系统,旨在确认设备具有适当安全性,并与 Android CTS 兼容。某些应用会出于安全考虑或是防篡改目的而使用 SafetyNet。 + +microG GmsCore 内置一套自由的 SafetyNet 实现,但是官方服务器要求 SafetyNet 请求使用其专有的 DroidGuard 系统签名。" + Google 服务 + 额外使用 Google 服务 + Google + Wi-Fi + (%1$.7f, %2$.7f) + 预配置 microG 服务 + microG 服务 + 允许 Google 向应用提供验证 + 导入自定义配置信息 + 序列号 + 从文件导入自定义的设备配置信息 + 选择配置信息 + 设备配置信息 + 使用 SafetyNet 的应用 + 清除近期的 SafetyNet 请求 + 最近使用于%1$s + 评估类型 + 响应状态 + 响应数据 + 请求数据 + 十六进制 Nonce + 请求时间 + 请求类型 + 基础数据 + 令牌 + 复制 JSON JWS 数据 + 建议 + 尚未完成 + 无结果 + 无效 JSON + 未通过 CTS 测试 + 进行 reCAPTCHA Enterprise 测试 + 已复制到剪贴板 + 已通过完整性和 CTS 测试 + 未通过完整性测试 + 最近使用 + 选择一个账户 + 添加另一个账户 + + 反馈功能不可用 + +>>>>>>> 64670de2 (Improve dummy for feedback service (#2185)) diff --git a/play-services-core/src/main/res/values/strings.xml b/play-services-core/src/main/res/values/strings.xml index 1c836304..a420ef9c 100755 --- a/play-services-core/src/main/res/values/strings.xml +++ b/play-services-core/src/main/res/values/strings.xml @@ -135,6 +135,7 @@ This can take a couple of minutes." Custom: %s Automatic: %s System: %s +<<<<<<< HEAD Import custom profile Import device profile from file Serial @@ -162,4 +163,48 @@ This can take a couple of minutes." Manage signed in Google accounts This will open your device settings ! Miscellaneous settings +======= + Import custom profile + Serial + Import device profile from file + Select profile + Device profile + + Recent uses + Attestation: %s + ReCaptcha: %s + ReCaptcha Enterprise: %s + Copy JSON JWS data + Advice + Evaluation type + Response status + Response data + Request data + Nonce (Hex) + Time of request + Request type + Basic data + Token + Copied to clipboard! + Integrity and CTS passed + CTS failed + Integrity failed + Not completed yet + No result + Invalid JSON + + OFF + ON / Automatic: %s + ON / Manual: %s + %s seconds + %s minutes + + Licensing off + Licensing on + Answer license verification requests + Some apps require verification that you have purchased them on Google Play. When requested by an app, microG can download a proof of purchase from Google. If disabled, or if no Google account is added, requests for license verification are ignored. + + Feedback currently not possible + +>>>>>>> 64670de2 (Improve dummy for feedback service (#2185))