kopia lustrzana https://github.com/ryukoposting/Signal-Android
187 wiersze
8.9 KiB
Java
187 wiersze
8.9 KiB
Java
package org.thoughtcrime.securesms.logsubmit;
|
|
|
|
import android.app.ActivityManager;
|
|
import android.content.Context;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.Build;
|
|
import android.text.TextUtils;
|
|
import android.util.DisplayMetrics;
|
|
import android.view.WindowManager;
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import com.google.android.gms.common.ConnectionResult;
|
|
import com.google.android.gms.common.GoogleApiAvailability;
|
|
|
|
import org.thoughtcrime.securesms.BuildConfig;
|
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
|
import org.thoughtcrime.securesms.emoji.EmojiFiles;
|
|
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
|
import org.thoughtcrime.securesms.net.StandardUserAgentInterceptor;
|
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
|
import org.thoughtcrime.securesms.service.webrtc.AndroidTelecomUtil;
|
|
import org.thoughtcrime.securesms.util.AppSignatureUtil;
|
|
import org.thoughtcrime.securesms.util.ByteUnit;
|
|
import org.thoughtcrime.securesms.util.DeviceProperties;
|
|
import org.thoughtcrime.securesms.util.NetworkUtil;
|
|
import org.thoughtcrime.securesms.util.ScreenDensity;
|
|
import org.thoughtcrime.securesms.util.ServiceUtil;
|
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
|
import org.thoughtcrime.securesms.util.Util;
|
|
import org.thoughtcrime.securesms.util.VersionTracker;
|
|
import org.whispersystems.signalservice.api.push.ACI;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.LinkedList;
|
|
import java.util.Locale;
|
|
|
|
public class LogSectionSystemInfo implements LogSection {
|
|
|
|
@Override
|
|
public @NonNull String getTitle() {
|
|
return "SYSINFO";
|
|
}
|
|
|
|
@Override
|
|
public @NonNull CharSequence getContent(@NonNull Context context) {
|
|
final PackageManager pm = context.getPackageManager();
|
|
final StringBuilder builder = new StringBuilder();
|
|
|
|
builder.append("Time : ").append(System.currentTimeMillis()).append('\n');
|
|
builder.append("Manufacturer : ").append(Build.MANUFACTURER).append("\n");
|
|
builder.append("Model : ").append(Build.MODEL).append("\n");
|
|
builder.append("Product : ").append(Build.PRODUCT).append("\n");
|
|
builder.append("Screen : ").append(getScreenResolution(context)).append(", ")
|
|
.append(ScreenDensity.get(context)).append(", ")
|
|
.append(getScreenRefreshRate(context)).append("\n");
|
|
builder.append("Font Scale : ").append(context.getResources().getConfiguration().fontScale).append("\n");
|
|
builder.append("Android : ").append(Build.VERSION.RELEASE).append(", API ")
|
|
.append(Build.VERSION.SDK_INT).append(" (")
|
|
.append(Build.VERSION.INCREMENTAL).append(", ")
|
|
.append(Build.DISPLAY).append(")\n");
|
|
builder.append("ABIs : ").append(TextUtils.join(", ", getSupportedAbis())).append("\n");
|
|
builder.append("Memory : ").append(getMemoryUsage()).append("\n");
|
|
builder.append("Memclass : ").append(getMemoryClass(context)).append("\n");
|
|
builder.append("MemInfo : ").append(getMemoryInfo(context)).append("\n");
|
|
builder.append("OS Host : ").append(Build.HOST).append("\n");
|
|
builder.append("RecipientId : ").append(SignalStore.registrationValues().isRegistrationComplete() ? Recipient.self().getId() : "N/A").append("\n");
|
|
builder.append("ACI : ").append(getCensoredAci(context)).append("\n");
|
|
builder.append("Device ID : ").append(SignalStore.account().getDeviceId()).append("\n");
|
|
builder.append("Censored : ").append(ApplicationDependencies.getSignalServiceNetworkAccess().isCensored()).append("\n");
|
|
builder.append("Network status: ").append(NetworkUtil.getNetworkStatus(context)).append("\n");
|
|
builder.append("Play Services : ").append(getPlayServicesString(context)).append("\n");
|
|
builder.append("FCM : ").append(SignalStore.account().isFcmEnabled()).append("\n");
|
|
builder.append("BkgRestricted : ").append(Build.VERSION.SDK_INT >= 28 ? DeviceProperties.isBackgroundRestricted(context) : "N/A").append("\n");
|
|
builder.append("Locale : ").append(Locale.getDefault().toString()).append("\n");
|
|
builder.append("Linked Devices: ").append(TextSecurePreferences.isMultiDevice(context)).append("\n");
|
|
builder.append("First Version : ").append(TextSecurePreferences.getFirstInstallVersion(context)).append("\n");
|
|
builder.append("Days Installed: ").append(VersionTracker.getDaysSinceFirstInstalled(context)).append("\n");
|
|
builder.append("Build Variant : ").append(BuildConfig.BUILD_DISTRIBUTION_TYPE).append(BuildConfig.BUILD_ENVIRONMENT_TYPE).append(BuildConfig.BUILD_VARIANT_TYPE).append("\n");
|
|
builder.append("Emoji Version : ").append(getEmojiVersionString(context)).append("\n");
|
|
builder.append("Telecom : ").append(AndroidTelecomUtil.getTelecomSupported()).append("\n");
|
|
builder.append("User-Agent : ").append(StandardUserAgentInterceptor.USER_AGENT).append("\n");
|
|
builder.append("App : ");
|
|
try {
|
|
builder.append(pm.getApplicationLabel(pm.getApplicationInfo(context.getPackageName(), 0)))
|
|
.append(" ")
|
|
.append(pm.getPackageInfo(context.getPackageName(), 0).versionName)
|
|
.append(" (")
|
|
.append(BuildConfig.CANONICAL_VERSION_CODE)
|
|
.append(", ")
|
|
.append(Util.getManifestApkVersion(context))
|
|
.append(") (")
|
|
.append(BuildConfig.GIT_HASH).append(") \n");
|
|
} catch (PackageManager.NameNotFoundException nnfe) {
|
|
builder.append("Unknown\n");
|
|
}
|
|
builder.append("Package : ").append(BuildConfig.APPLICATION_ID).append(" (").append(getSigningString(context)).append(")");
|
|
|
|
return builder;
|
|
}
|
|
|
|
private static @NonNull String getMemoryUsage() {
|
|
Runtime info = Runtime.getRuntime();
|
|
long totalMemory = info.totalMemory();
|
|
|
|
return String.format(Locale.ENGLISH,
|
|
"%dM (%.2f%% free, %dM max)",
|
|
ByteUnit.BYTES.toMegabytes(totalMemory),
|
|
(float) info.freeMemory() / totalMemory * 100f,
|
|
ByteUnit.BYTES.toMegabytes(info.maxMemory()));
|
|
}
|
|
|
|
private static @NonNull String getMemoryClass(Context context) {
|
|
ActivityManager activityManager = ServiceUtil.getActivityManager(context);
|
|
String lowMem = "";
|
|
|
|
if (activityManager.isLowRamDevice()) {
|
|
lowMem = ", low-mem device";
|
|
}
|
|
|
|
return activityManager.getMemoryClass() + lowMem;
|
|
}
|
|
|
|
private static @NonNull String getMemoryInfo(Context context) {
|
|
ActivityManager.MemoryInfo info = DeviceProperties.getMemoryInfo(context);
|
|
return String.format(Locale.US, "availMem: %d mb, totalMem: %d mb, threshold: %d mb, lowMemory: %b",
|
|
ByteUnit.BYTES.toMegabytes(info.availMem), ByteUnit.BYTES.toMegabytes(info.totalMem), ByteUnit.BYTES.toMegabytes(info.threshold), info.lowMemory);
|
|
}
|
|
|
|
private static @NonNull Iterable<String> getSupportedAbis() {
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
return Arrays.asList(Build.SUPPORTED_ABIS);
|
|
} else {
|
|
LinkedList<String> abis = new LinkedList<>();
|
|
abis.add(Build.CPU_ABI);
|
|
if (Build.CPU_ABI2 != null && !"unknown".equals(Build.CPU_ABI2)) {
|
|
abis.add(Build.CPU_ABI2);
|
|
}
|
|
return abis;
|
|
}
|
|
}
|
|
|
|
private static @NonNull String getScreenResolution(@NonNull Context context) {
|
|
DisplayMetrics displayMetrics = new DisplayMetrics();
|
|
WindowManager windowManager = ServiceUtil.getWindowManager(context);
|
|
|
|
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
|
|
return displayMetrics.widthPixels + "x" + displayMetrics.heightPixels;
|
|
}
|
|
|
|
private static @NonNull String getScreenRefreshRate(@NonNull Context context) {
|
|
return String.format(Locale.ENGLISH, "%.2f hz", ServiceUtil.getWindowManager(context).getDefaultDisplay().getRefreshRate());
|
|
}
|
|
|
|
private static String getSigningString(@NonNull Context context) {
|
|
return AppSignatureUtil.getAppSignature(context);
|
|
}
|
|
|
|
private static String getPlayServicesString(@NonNull Context context) {
|
|
int result = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
|
|
return result == ConnectionResult.SUCCESS ? "true" : "false (" + result + ")";
|
|
}
|
|
|
|
private static String getEmojiVersionString(@NonNull Context context) {
|
|
EmojiFiles.Version version = EmojiFiles.Version.readVersion(context);
|
|
|
|
if (version == null) {
|
|
return "None";
|
|
} else {
|
|
return version.getVersion() + " (" + version.getDensity() + ")";
|
|
}
|
|
}
|
|
|
|
private static String getCensoredAci(@NonNull Context context) {
|
|
ACI aci = SignalStore.account().getAci();
|
|
|
|
if (aci != null) {
|
|
String aciString = aci.toString();
|
|
String lastTwo = aciString.substring(aciString.length() - 2);
|
|
|
|
return "********-****-****-****-**********" + lastTwo;
|
|
} else {
|
|
return "N/A";
|
|
}
|
|
}
|
|
}
|