Improve dummy for feedback service (#2185)

This commit is contained in:
DaVinci9196 2024-02-20 21:59:44 +08:00 • committed by Cuynu
commit 4aef3d6ff6
15 changed files with 668 additions and 0 deletions

View file

@ -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;

View file

@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: 2023 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.feedback;
parcelable ErrorReport;

View file

@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: 2023 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.feedback;
parcelable FileTeleporter;

View file

@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: 2023 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.feedback;
parcelable LogOptions;

View file

@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: 2023 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/
package com.google.android.gms.feedback;
parcelable ThemeSettings;

View file

@ -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();
}

View file

@ -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;
}

View file

@ -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<BitmapTeleporter> CREATOR = findCreator(BitmapTeleporter.class);
}

View file

@ -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<RectF> rectFS;
@Field(58)
public boolean unknownBool58;
@Field(59)
public Bitmap bitmap;
@Field(60)
public String unknownString60;
@Field(61)
public List<String> 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<ErrorReport> CREATOR = findCreator(ErrorReport.class);
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
CREATOR.writeToParcel(this, dest, flags);
}
}

View file

@ -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<FeedbackOptions> 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<FileTeleporter> 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);
}
}

View file

@ -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<FileTeleporter> CREATOR = findCreator(FileTeleporter.class);
}

View file

@ -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<LogOptions> CREATOR = findCreator(LogOptions.class);
}

View file

@ -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()
}
}
}
}

View file

@ -111,6 +111,7 @@
<string name="profile_name_user">自定义:%s</string>
<string name="profile_name_auto">自动:%s</string>
<string name="profile_name_system">系统:%s</string>
<<<<<<< HEAD
<string name="import_profile_name">导入自定义配置</string>
<string name="import_profile_summary">从文件导入设备配置</string>
<string name="serial_name">序列号</string>
@ -140,3 +141,50 @@
<string name="manage_googleaccount_summary">This will open your device settings !</string>
<string name="miscellaneous_settings">Miscellaneous settings</string>
</resources>
=======
<string name="pref_safetynet_test_title">"测试 SafetyNet 认证"</string>
<string name="safetynet_intro">"Google SafetyNet 是一套设备认证系统,旨在确认设备具有适当安全性,并与 Android CTS 兼容。某些应用会出于安全考虑或是防篡改目的而使用 SafetyNet。
microG GmsCore 内置一套自由的 SafetyNet 实现,但是官方服务器要求 SafetyNet 请求使用其专有的 DroidGuard 系统签名。"</string>
<string name="prefcat_google_services">Google 服务</string>
<string name="perm_extended_access_label">额外使用 Google 服务</string>
<string name="google_account_label">Google</string>
<string name="network_type_wifi">Wi-Fi</string>
<string name="place_picker_location_lat_lng">(%1$.7f, %2$.7f)</string>
<string name="perm_provision_label">预配置 microG 服务</string>
<string name="gms_app_name">microG 服务</string>
<string name="pref_auth_trust_google_title">允许 Google 向应用提供验证</string>
<string name="pref_device_registration_import_custom_profile_title">导入自定义配置信息</string>
<string name="pref_device_registration_serial_title">序列号</string>
<string name="pref_device_registration_import_custom_profile_summary">从文件导入自定义的设备配置信息</string>
<string name="pref_device_registration_select_profile_title">选择配置信息</string>
<string name="pref_device_registration_device_profile_category">设备配置信息</string>
<string name="prefcat_safetynet_apps_title">使用 SafetyNet 的应用</string>
<string name="menu_clear_recent_requests">清除近期的 SafetyNet 请求</string>
<string name="safetynet_last_run_at">最近使用于<xliff:g example="昨天 02:20 PM">%1$s</xliff:g></string>
<string name="pref_safetynet_recent_eval_type">评估类型</string>
<string name="pref_safetynet_recent_response_status">响应状态</string>
<string name="pref_safetynet_recent_cat_response">响应数据</string>
<string name="pref_safetynet_recent_cat_request">请求数据</string>
<string name="pref_safetynet_recent_nonce">十六进制 Nonce</string>
<string name="pref_safetynet_recent_request_time">请求时间</string>
<string name="pref_safetynet_recent_request_type">请求类型</string>
<string name="pref_safetynet_recent_cat_basic">基础数据</string>
<string name="pref_safetynet_recent_token">令牌</string>
<string name="pref_safetynet_recent_copy_json">复制 JSON JWS 数据</string>
<string name="pref_safetynet_recent_advice">建议</string>
<string name="pref_safetynet_test_not_completed">尚未完成</string>
<string name="pref_safetynet_test_no_result">无结果</string>
<string name="pref_safetynet_test_invalid_json">无效 JSON</string>
<string name="pref_safetynet_test_cts_failed">未通过 CTS 测试</string>
<string name="pref_recaptcha_enterprise_test_title">进行 reCAPTCHA Enterprise 测试</string>
<string name="pref_safetynet_recent_copied">已复制到剪贴板</string>
<string name="pref_safetynet_test_integrity_cts_passed">已通过完整性和 CTS 测试</string>
<string name="pref_safetynet_test_integrity_failed">未通过完整性测试</string>
<string name="pref_safetynet_recent_uses">最近使用</string>
<string name="signin_picker_title">选择一个账户</string>
<string name="signin_picker_add_account_label">添加另一个账户</string>
<string name="feedback_disabled">反馈功能不可用</string>
</resources>
>>>>>>> 64670de2 (Improve dummy for feedback service (#2185))

View file

@ -135,6 +135,7 @@ This can take a couple of minutes."</string>
<string name="profile_name_user">Custom: %s</string>
<string name="profile_name_auto">Automatic: %s</string>
<string name="profile_name_system">System: %s</string>
<<<<<<< HEAD
<string name="import_profile_name">Import custom profile</string>
<string name="import_profile_summary">Import device profile from file</string>
<string name="serial_name">Serial</string>
@ -162,4 +163,48 @@ This can take a couple of minutes."</string>
<string name="manage_googleaccount_title">Manage signed in Google accounts</string>
<string name="manage_googleaccount_summary">This will open your device settings !</string>
<string name="miscellaneous_settings">Miscellaneous settings</string>
=======
<string name="pref_device_registration_import_custom_profile_title">Import custom profile</string>
<string name="pref_device_registration_serial_title">Serial</string>
<string name="pref_device_registration_import_custom_profile_summary">Import device profile from file</string>
<string name="pref_device_registration_select_profile_title">Select profile</string>
<string name="pref_device_registration_device_profile_category">Device profile</string>
<string name="pref_safetynet_recent_uses">Recent uses</string>
<string name="pref_safetynet_recent_attestation_summary">Attestation: %s</string>
<string name="pref_safetynet_recent_recaptcha_summary">ReCaptcha: %s</string>
<string name="pref_safetynet_recent_recaptcha_enterprise_summary">ReCaptcha Enterprise: %s</string>
<string name="pref_safetynet_recent_copy_json">Copy JSON JWS data</string>
<string name="pref_safetynet_recent_advice">Advice</string>
<string name="pref_safetynet_recent_eval_type">Evaluation type</string>
<string name="pref_safetynet_recent_response_status">Response status</string>
<string name="pref_safetynet_recent_cat_response">Response data</string>
<string name="pref_safetynet_recent_cat_request">Request data</string>
<string name="pref_safetynet_recent_nonce">Nonce (Hex)</string>
<string name="pref_safetynet_recent_request_time">Time of request</string>
<string name="pref_safetynet_recent_request_type">Request type</string>
<string name="pref_safetynet_recent_cat_basic">Basic data</string>
<string name="pref_safetynet_recent_token">Token</string>
<string name="pref_safetynet_recent_copied">Copied to clipboard!</string>
<string name="pref_safetynet_test_integrity_cts_passed">Integrity and CTS passed</string>
<string name="pref_safetynet_test_cts_failed">CTS failed</string>
<string name="pref_safetynet_test_integrity_failed">Integrity failed</string>
<string name="pref_safetynet_test_not_completed">Not completed yet</string>
<string name="pref_safetynet_test_no_result">No result</string>
<string name="pref_safetynet_test_invalid_json">Invalid JSON</string>
<string name="push_notifications_summary_off">OFF</string>
<string name="push_notifications_summary_automatic">ON / Automatic: %s</string>
<string name="push_notifications_summary_manual">ON / Manual: %s</string>
<string name="push_notifications_summary_values_seconds">%s seconds</string>
<string name="push_notifications_summary_values_minutes">%s minutes</string>
<string name="pref_vending_summary_licensing_off">Licensing off</string>
<string name="pref_vending_summary_licensing_on">Licensing on</string>
<string name="pref_vending_licensing_enable_switch">Answer license verification requests</string>
<string name="pref_vending_license_enable_summary">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.</string>
<string name="feedback_disabled">Feedback currently not possible</string>
>>>>>>> 64670de2 (Improve dummy for feedback service (#2185))
</resources>