From fedca835d64fc6c988096a6e97aed5fe6ff2ef13 Mon Sep 17 00:00:00 2001 From: Tad Date: Sat, 30 Dec 2023 14:39:08 -0500 Subject: [PATCH] Crash fixes Also adds an icon Closes https://gitlab.com/divested-mobile/hypatia/-/issues/37 Signed-off-by: Tad --- app/build.gradle | 4 +-- .../spotco/malwarescanner/MainActivity.java | 25 +++++++++++++----- .../java/us/spotco/malwarescanner/Utils.java | 9 ++++--- app/src/main/res/values/strings.xml | 1 + .../metadata/android/en-US/changelogs/306.txt | 1 + .../metadata/android/en-US/images/icon.png | Bin 0 -> 12382 bytes 6 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/306.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png diff --git a/app/build.gradle b/app/build.gradle index 328180a..93b12ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "us.spotco.malwarescanner" minSdkVersion 16 targetSdkVersion 32 - versionCode 305 - versionName "3.05" + versionCode 306 + versionName "3.06" resConfigs 'en', 'af', 'de', 'el', 'es', 'fi', 'fr', 'it', 'pl', 'pt', 'ru', 'tr', 'zh-rCN' } buildTypes { diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java index 19f58af..eaa1ba3 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java +++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java @@ -281,7 +281,7 @@ public class MainActivity extends Activity { item.setChecked(scanExternal); break; case R.id.mnuSelfTestReal: - Utils.writeSelfTestFiles(); + Utils.writeSelfTestFiles(this); break; case R.id.mnuFullCredits: showCredits(); @@ -317,6 +317,7 @@ public class MainActivity extends Activity { filesToScan.add(new File("/data")); filesToScan.add(new File("/data/local/tmp")); filesToScan.add(new File("/firmware")); + filesToScan.add(new File("/oem")); filesToScan.add(new File("/odm")); filesToScan.add(new File("/odm_dlkm")); filesToScan.add(new File("/product")); @@ -327,14 +328,26 @@ public class MainActivity extends Activity { } if (scanApps) { for (ApplicationInfo packageInfo : getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA)) { - filesToScan.add(new File(packageInfo.sourceDir)); - filesToScan.add(new File(packageInfo.dataDir)); - filesToScan.add(new File(packageInfo.nativeLibraryDir)); - filesToScan.add(new File(packageInfo.publicSourceDir)); + if (packageInfo != null) { + if (packageInfo.sourceDir != null) { + filesToScan.add(new File(packageInfo.sourceDir)); + } + if (packageInfo.dataDir != null) { + filesToScan.add(new File(packageInfo.dataDir)); + } + if (packageInfo.nativeLibraryDir != null) { + filesToScan.add(new File(packageInfo.nativeLibraryDir)); + } + if (packageInfo.publicSourceDir != null) { + filesToScan.add(new File(packageInfo.publicSourceDir)); + } + } } } if (scanInternal) { - filesToScan.add(Environment.getExternalStorageDirectory()); + if (Environment.getExternalStorageDirectory() != null) { + filesToScan.add(Environment.getExternalStorageDirectory()); + } } if (scanExternal) { File externalStorage = new File("/storage"); diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java index 4a15dfd..a527cc7 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Utils.java +++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java @@ -26,6 +26,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import android.os.Environment; +import android.widget.Toast; import java.io.File; import java.io.PrintWriter; @@ -166,9 +167,9 @@ class Utils { try (Socket s = new Socket(host, port)) { s.close(); return true; - } catch (Exception e) { - return false; + } catch (Exception ignored) { } + return false; } public static void waitUntilOrbotIsAvailable() { @@ -178,7 +179,6 @@ class Utils { try { Thread.sleep(1000); } catch (Exception ignored) { - } } } @@ -203,11 +203,12 @@ class Utils { Utils.context = context; } - public static void writeSelfTestFiles() { + public static void writeSelfTestFiles(Context context) { int rand = new Random().nextInt(); writeStringToFile(new File(Environment.getExternalStorageDirectory() + "/Hypatia-MD5-Test-" + rand + ".txt"), "HypatiaHypatiaHypatia-MD5"); writeStringToFile(new File(Environment.getExternalStorageDirectory() + "/Hypatia-SHA1-Test-" + rand + ".txt"), "HypatiaHypatiaHypatia-SHA1"); writeStringToFile(new File(Environment.getExternalStorageDirectory() + "/Hypatia-SHA256-Test-" + rand + ".txt"), "HypatiaHypatiaHypatia-SHA256"); + Toast.makeText(context, R.string.lblWroteTestFiles, Toast.LENGTH_SHORT).show(); } public static void writeStringToFile(File fileOut, String s) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a237d63..39fcb79 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,4 +75,5 @@ Confirm download You appear to be on a metered connection. Are you sure you want to update the databases?\nIt may download up to %s megabytes of data. Skipping action, an update is running! + Wrote test files! diff --git a/fastlane/metadata/android/en-US/changelogs/306.txt b/fastlane/metadata/android/en-US/changelogs/306.txt new file mode 100644 index 0000000..632648c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/306.txt @@ -0,0 +1 @@ +* Crash fix when scanning apps in some cases diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..63c5c708ac035e9c42f1d1d22c35e89a153f41ce GIT binary patch literal 12382 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