added appcenter metrics/crash logger

This commit is contained in:
gdlbo
2023-03-15 01:19:25 +03:00
parent 4d7ff28d97
commit a90ae1be64
7 changed files with 106 additions and 0 deletions
@@ -21,6 +21,7 @@ import java.io.StringWriter;
import ru.vtosters.lite.deviceinfo.DeviceInfoCollector;
import ru.vtosters.lite.services.LogWriterService;
import ru.vtosters.lite.utils.AnalyticsHelper;
import ru.vtosters.lite.utils.AndroidUtils;
public class CrashReporter {
@@ -41,6 +42,8 @@ public class CrashReporter {
static void start(Thread.UncaughtExceptionHandler uncaughtExceptionHandler, Thread thread, Throwable th, Activity activity) {
logString = getStackTrace(th) + "\n\n" + new DeviceInfoCollector().collect().toDeviceName();
AnalyticsHelper.trackError(th);
if (Build.VERSION.SDK_INT >= 26) {
var notificationChannel = new NotificationChannel("crashes", AndroidUtils.getString("crash_service_name"), NotificationManager.IMPORTANCE_DEFAULT);
notificationChannel.enableVibration(true);
@@ -206,6 +206,8 @@ public class OtherFragment extends MaterialPreferenceToolbarFragment {
return true;
});
}
findPreference("analyticsDisabled").setVisible(!AndroidUtils.isDebuggable());
}
@SuppressLint({"CommitPrefEdits", "SetTextI18n"})
@@ -47,6 +47,7 @@ public class SystemInfo extends MaterialPreferenceToolbarFragment {
var isValidSignature = Preferences.isValidSignature();
var isTablet = AndroidUtils.isTablet();
var isDebuggable = AndroidUtils.isDebuggable();
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "App information");
@@ -66,6 +67,8 @@ public class SystemInfo extends MaterialPreferenceToolbarFragment {
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isTablet", "Value: " + isTablet, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isDebuggable", "Value: " + isDebuggable, 0, null);
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "System information");
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "SDK Version", sdkVersion, 0, preference -> {
@@ -0,0 +1,87 @@
package ru.vtosters.lite.utils;
import android.app.Application;
import android.os.Handler;
import androidx.annotation.NonNull;
import com.microsoft.appcenter.AppCenter;
import com.microsoft.appcenter.analytics.Analytics;
import com.microsoft.appcenter.channel.AbstractChannelListener;
import com.microsoft.appcenter.channel.Channel;
import com.microsoft.appcenter.crashes.Crashes;
import com.microsoft.appcenter.ingestion.models.Log;
import java.util.HashMap;
public class AnalyticsHelper {
private static final boolean analyticsDisabled = Preferences.getBoolValue("analyticsDisabled", false);;
private static final String key = "5028aa35-9f16-44ed-b306-c4ed471a57eb";
private static final Channel.Listener patchDeviceListener = new AbstractChannelListener() {
@Override
public void onPreparedLog(@NonNull Log log, @NonNull String groupName, int flags) {
var device = log.getDevice();
device.setAppVersion(About.getBuildNumber());
device.setAppBuild(About.getBuildNumber());
}
};
private static void addPatchDeviceListener() {
try {
var channelField = AppCenter.class.getDeclaredField("mChannel");
channelField.setAccessible(true);
var channel = (Channel) channelField.get(AppCenter.getInstance());
assert channel != null;
channel.addListener(patchDeviceListener);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
private static void patchDevice() {
try {
var handlerField = AppCenter.class.getDeclaredField("mHandler");
handlerField.setAccessible(true);
var handler = ((Handler) handlerField.get(AppCenter.getInstance()));
assert handler != null;
handler.post(AnalyticsHelper::addPatchDeviceListener);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public static void start(Application application) {
if (analyticsDisabled) {
setAnalyticsStatus(false);
return;
}
AppCenter.start(application, AnalyticsHelper.key, Analytics.class, Crashes.class);
patchDevice();
setAnalyticsStatus(true);
}
public static void trackEvent(String event) {
if (analyticsDisabled) return;
AnalyticsHelper.trackEvent(event);
}
public static void trackEvent(String event, HashMap<String, String> map) {
if (analyticsDisabled) return;
AnalyticsHelper.trackEvent(event, map);
}
public static void trackError(Throwable th) {
if (analyticsDisabled) return;
Crashes.trackError(th);
}
public static void setAnalyticsStatus(Boolean bool) {
Analytics.setEnabled(bool && Preferences.isValidSignature());
Crashes.setEnabled(bool && !AndroidUtils.isDebuggable() && Preferences.isValidSignature());
Preferences.getPreferences().edit().putBoolean("analyticsDisabled", !bool).apply();
}
}
@@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.verify.domain.DomainVerificationManager;
import android.content.pm.verify.domain.DomainVerificationUserState;
@@ -31,6 +32,9 @@ import java.util.Objects;
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
public class AndroidUtils {
public static boolean isDebuggable() {
return 0 != (AndroidUtils.getGlobalContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE);
}
public static boolean isTablet() {
return Screen.l(getGlobalContext());
@@ -32,6 +32,8 @@ public class Preferences {
setupFilters();
VTVerifications.load(application);
LifecycleUtils.registerActivities(application);
AnalyticsHelper.start(application);
} // VK Init
public static SharedPreferences getPreferences() {
+5
View File
@@ -82,5 +82,10 @@
<Preference
android:key="vk_admin_token"
android:title="@string/vk_admin_token_title"/>
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="false"
android:key="analyticsDisabled"
android:summary="Сбор данных о падениях приложения помогает нам улучшать приложение\n\nОтключение сбора логов падений заставит грустить бедных разработчиков"
android:title="Отключить сбор данных"/>
</PreferenceCategory>
</PreferenceScreen>