Detect build type to customize error reporting

The error reporting dialog now shows the build type. The dialog is now
shown only on unsupported builds.

Closes #177
This commit is contained in:
emanuele-f 2022-01-10 23:21:10 +01:00
parent ce3637004e
commit bd2f85f876
3 changed files with 76 additions and 7 deletions

View File

@ -22,6 +22,7 @@ package com.emanuelef.remote_capture;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
@ -45,6 +46,7 @@ import cat.ereza.customactivityoncrash.config.CaocConfig;
* https://stackoverflow.com/questions/56496714/android-webview-causing-runtimeexception-at-webviewdelegate-getpackageid
*/
public class PCAPdroid extends Application {
private static final String TAG = "PCAPdroid";
private MatchList mVisMask;
private MatchList mMalwareWhitelist;
private MatchList mBlocklist;
@ -57,10 +59,18 @@ public class PCAPdroid extends Application {
public void onCreate() {
super.onCreate();
CaocConfig.Builder.create()
.errorDrawable(R.drawable.ic_app_crash)
.errorActivity(ErrorActivity.class)
.apply();
Utils.BuildType buildtp = Utils.getBuildType(this);
Log.d(TAG, "Build type: " + buildtp);
CaocConfig.Builder builder = CaocConfig.Builder.create();
if((buildtp == Utils.BuildType.PLAYSTORE) || (buildtp == Utils.BuildType.UNKNOWN)) {
// Disabled to get reports via the Android system reporting facility
builder.enabled(false);
} else {
builder.errorDrawable(R.drawable.ic_app_crash)
.errorActivity(ErrorActivity.class);
}
builder.apply();
mInstance = new WeakReference<>(this);
mLocalizedContext = createConfigurationContext(Utils.getLocalizedConfig(this));

View File

@ -34,6 +34,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor;
@ -87,6 +88,8 @@ import java.net.URL;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
@ -106,6 +109,15 @@ public class Utils {
private static Boolean rootAvailable = null;
private static Locale primaryLocale = null;
public enum BuildType {
UNKNOWN,
DEBUG,
WORKFLOW, // debug build from the Github workflow
GITHUB, // Github release
FDROID, // F-droid release
PLAYSTORE, // Google play release
}
public static String[] list2array(List<String> l) {
return l.toArray(new String[0]);
}
@ -870,4 +882,46 @@ public class Utils {
else
h.post(r);
}
// Returns true on the playstore branch
public static boolean isPlaystore() {
return false;
}
public static BuildType getBuildType(Context ctx) {
try {
Signature[] signatures;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// NOTE: PCAPdroid does not use multiple signatures
PackageInfo pInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNING_CERTIFICATES);
signatures = pInfo.signingInfo.getSigningCertificateHistory();
} else {
PackageInfo pInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES);
signatures = pInfo.signatures;
}
if(signatures.length < 1)
return BuildType.UNKNOWN;
MessageDigest sha1 = MessageDigest.getInstance("SHA");
sha1.update(signatures[0].toByteArray());
// keytool -printcert -jarfile file.apk
String hex = byteArrayToHex(sha1.digest(), sha1.getDigestLength());
switch(hex) {
case "511140392BFF2CFB4BD825895DD6510CE1807F6D":
return BuildType.DEBUG;
case "EE953D4F988C8AC17575DFFAA1E3BBCE2E29E81D":
return isPlaystore() ? BuildType.PLAYSTORE : BuildType.GITHUB;
case "72777D6939EF150099219BBB68C17220DB28EA8E":
return BuildType.FDROID;
case "9F030FABC158A428CFDB90570A426EA88B39A153":
return BuildType.WORKFLOW;
}
} catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
Log.e("Utils", "Could not retrieve package version");
}
return BuildType.UNKNOWN;
}
}

View File

@ -102,7 +102,7 @@ public final class ErrorActivity extends AppCompatActivity {
AlertDialog dialog = new AlertDialog.Builder(ErrorActivity.this)
.setTitle(R.string.customactivityoncrash_error_activity_error_details_title)
.setMessage(CustomActivityOnCrash.getAllErrorDetailsFromIntent(ErrorActivity.this, getIntent()))
.setMessage(getErrorDetails())
.setPositiveButton(R.string.customactivityoncrash_error_activity_error_details_close, null)
.setNeutralButton(R.string.customactivityoncrash_error_activity_error_details_copy,
new DialogInterface.OnClickListener() {
@ -129,7 +129,7 @@ public final class ErrorActivity extends AppCompatActivity {
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "PCAPdroid crash");
if(emailIntent.resolveActivity(getPackageManager()) != null) {
emailButton.setOnClickListener(v -> {
String errorInformation = CustomActivityOnCrash.getAllErrorDetailsFromIntent(ErrorActivity.this, getIntent());
String errorInformation = getErrorDetails();
emailIntent.putExtra(Intent.EXTRA_TEXT, errorInformation);
Utils.startActivity(this, emailIntent);
});
@ -145,7 +145,7 @@ public final class ErrorActivity extends AppCompatActivity {
}
private void copyErrorToClipboard() {
String errorInformation = CustomActivityOnCrash.getAllErrorDetailsFromIntent(ErrorActivity.this, getIntent());
String errorInformation = getErrorDetails();
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
@ -156,4 +156,9 @@ public final class ErrorActivity extends AppCompatActivity {
Toast.makeText(ErrorActivity.this, R.string.customactivityoncrash_error_activity_error_details_copied, Toast.LENGTH_SHORT).show();
}
}
private String getErrorDetails() {
return "Build type: " + Utils.getBuildType(this).toString().toLowerCase() + "\n" +
CustomActivityOnCrash.getAllErrorDetailsFromIntent(ErrorActivity.this, getIntent());
}
}