diff --git a/app/build.gradle b/app/build.gradle
index d3f0f21..d3e0ea2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,8 +6,9 @@ android {
applicationId "us.spotco.malwarescanner"
minSdkVersion 21
targetSdkVersion 26
- versionCode 11
- versionName "1.5" }
+ versionCode 12
+ versionName "1.6"
+ }
buildTypes {
release {
minifyEnabled false
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 417718f..91ddf2c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,8 +30,7 @@
android:name=".MalwareScannerService"
android:label="Theia Realtime Malware Scanner"
android:enabled="true"
- android:exported="false">
-
+ android:exported="false"/>
-
-
-
+
+
diff --git a/app/src/main/java/us/spotco/malwarescanner/BootReceiver.java b/app/src/main/java/us/spotco/malwarescanner/BootReceiver.java
index d3eea5d..c568f21 100644
--- a/app/src/main/java/us/spotco/malwarescanner/BootReceiver.java
+++ b/app/src/main/java/us/spotco/malwarescanner/BootReceiver.java
@@ -8,7 +8,7 @@ import android.content.SharedPreferences;
public class BootReceiver extends BroadcastReceiver {
@Override
- public void onReceive(Context context, Intent intent) {
+ public final void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
boolean autostart = prefs.getBoolean("autostart", false);
diff --git a/app/src/main/java/us/spotco/malwarescanner/Database.java b/app/src/main/java/us/spotco/malwarescanner/Database.java
index 1fd9523..785327b 100644
--- a/app/src/main/java/us/spotco/malwarescanner/Database.java
+++ b/app/src/main/java/us/spotco/malwarescanner/Database.java
@@ -13,16 +13,16 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
-public class Database {
+class Database {
private static TextView log = null;
private static File databasePath = null;
- public static ArrayList signatureDatabases = new ArrayList<>();
+ public final static ArrayList signatureDatabases = new ArrayList<>();
- public static HashMap signaturesMD5 = new HashMap<>();
- public static HashMap signaturesSHA1 = new HashMap<>();
- public static HashMap signaturesSHA256 = new HashMap<>();
+ public final static HashMap signaturesMD5 = new HashMap<>();
+ public final static HashMap signaturesSHA1 = new HashMap<>();
+ public final static HashMap signaturesSHA256 = new HashMap<>();
public Database(Context context, TextView log) {
Database.log = log;
@@ -158,7 +158,7 @@ public class Database {
}
@Override
- protected void onProgressUpdate(String... progress) {
+ protected final void onProgressUpdate(String... progress) {
log.append(progress[0] + "\n");
}
}
diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java
index f58c0ad..f246ed4 100644
--- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java
+++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java
@@ -29,6 +29,8 @@ import java.util.Set;
public class MainActivity extends AppCompatActivity {
private SharedPreferences prefs = null;
+ private MalwareScanner malwareScanner = null;
+
private boolean scanSystem = false;
private boolean scanApps = true;
private boolean scanInternal = true;
@@ -37,7 +39,7 @@ public class MainActivity extends AppCompatActivity {
private static final int REQUEST_PERMISSION_EXTERNAL_STORAGE = 0;
@Override
- protected void onCreate(Bundle savedInstanceState) {
+ protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
@@ -53,7 +55,7 @@ public class MainActivity extends AppCompatActivity {
logView.append("\nDisclaimer: This is an extremely basic signature scanner\n\n");
final Database database = new Database(this, logView);
- final MalwareScanner malwareScanner = new MalwareScanner(this, this, true);
+ malwareScanner = new MalwareScanner(this, this, true);
prefs = getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
@@ -62,22 +64,7 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onClick(View view) {
if (!malwareScanner.getStatus().equals(AsyncTask.Status.RUNNING)) {
- Set filesToScan = new HashSet<>();
- if (scanSystem) {
- filesToScan.addAll(Utils.getFilesRecursive(Environment.getRootDirectory()));
- }
- if (scanApps) {
- for (ApplicationInfo packageInfo : getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA)) {
- filesToScan.add(new File(packageInfo.sourceDir));
- }
- }
- if (scanInternal) {
- filesToScan.addAll(Utils.getFilesRecursive(Environment.getExternalStorageDirectory()));
- }
- if (scanExternal) {
- filesToScan.addAll(Utils.getFilesRecursive(new File("/storage")));
- }
- malwareScanner.execute(filesToScan);
+ startScanner();
} else {
malwareScanner.cancel(true);
}
@@ -87,8 +74,28 @@ public class MainActivity extends AppCompatActivity {
requestPermissions();
}
+ private void startScanner() {
+ malwareScanner = new MalwareScanner(this, this, true);
+ Set filesToScan = new HashSet<>();
+ if (scanSystem) {
+ filesToScan.addAll(Utils.getFilesRecursive(Environment.getRootDirectory()));
+ }
+ if (scanApps) {
+ for (ApplicationInfo packageInfo : getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA)) {
+ filesToScan.add(new File(packageInfo.sourceDir));
+ }
+ }
+ if (scanInternal) {
+ filesToScan.addAll(Utils.getFilesRecursive(Environment.getExternalStorageDirectory()));
+ }
+ if (scanExternal) {
+ filesToScan.addAll(Utils.getFilesRecursive(new File("/storage")));
+ }
+ malwareScanner.execute(filesToScan);
+ }
+
@Override
- public boolean onCreateOptionsMenu(Menu menu) {
+ public final boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.findItem(R.id.toggleRealtime).setChecked(isServiceRunning(MalwareScannerService.class));
return true;
@@ -101,7 +108,7 @@ public class MainActivity extends AppCompatActivity {
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
+ public final boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.mnuUpdateDatabase:
Database.updateDatabase(Database.signatureDatabases);
diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java
index be2fc43..cc1f0c7 100644
--- a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java
+++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java
@@ -8,6 +8,7 @@ import android.os.AsyncTask;
import android.os.Environment;
import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
+import android.util.Log;
import android.widget.TextView;
import java.io.File;
@@ -20,16 +21,16 @@ import java.util.Map;
import java.util.Random;
import java.util.Set;
-public class MalwareScanner extends AsyncTask, Object, String> {
+class MalwareScanner extends AsyncTask, Object, String> {
private Context context = null;
private TextView logOutput = null;
private boolean userFacing = false;
private NotificationManager notificationManager = null;
private long scanTime = 0;
- private HashMap fileHashesMD5 = new HashMap<>();
- private HashMap fileHashesSHA1 = new HashMap<>();
- private HashMap fileHashesSHA256 = new HashMap<>();
+ private final HashMap fileHashesMD5 = new HashMap<>();
+ private final HashMap fileHashesSHA1 = new HashMap<>();
+ private final HashMap fileHashesSHA256 = new HashMap<>();
public MalwareScanner(Activity activity, Context context, boolean userFacing) {
this.context = context;
@@ -58,13 +59,13 @@ public class MalwareScanner extends AsyncTask, Object, String> {
}
@Override
- protected void onPreExecute() {
+ protected final void onPreExecute() {
scanTime = SystemClock.elapsedRealtime();
logResult("Starting scan...", true);
}
@Override
- protected String doInBackground(Set[] filesToScan) {
+ protected final String doInBackground(Set[] filesToScan) {
//Pre
fileHashesMD5.clear();
fileHashesSHA1.clear();
@@ -92,13 +93,13 @@ public class MalwareScanner extends AsyncTask, Object, String> {
fileHashesSHA1.clear();
fileHashesSHA256.clear();
System.gc();
- //Log.d("Thiea", "Scan completed in " + (SystemClock.elapsedRealtime() - scanTime) + " ms!");
+ Log.d("Thiea", "Scan completed in " + (SystemClock.elapsedRealtime() - scanTime) + " ms!");
publishProgress("Scan completed in " + ((SystemClock.elapsedRealtime() - scanTime) / 1000) + " seconds!\n\n\n\n", true);
return null;
}
@Override
- protected void onProgressUpdate(Object... objects) {
+ protected final void onProgressUpdate(Object... objects) {
logResult((String) objects[0], (boolean) objects[1]);
}
diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java
index c9cd379..28d4dd8 100644
--- a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java
+++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java
@@ -20,12 +20,12 @@ public class MalwareScannerService extends Service {
private ArrayList malwareMonitors = null;
@Override
- public IBinder onBind(Intent intent) {
+ public final IBinder onBind(Intent intent) {
return null;
}
@Override
- public int onStartCommand(Intent intent, int flags, int startId) {
+ public final int onStartCommand(Intent intent, int flags, int startId) {
malwareMonitors = new ArrayList<>();
malwareMonitors.add(new MalwareMonitor(Environment.getExternalStorageDirectory().toString()));
malwareMonitors.add(new MalwareMonitor(Environment.getExternalStorageDirectory() + "/Documents"));
@@ -40,7 +40,7 @@ public class MalwareScannerService extends Service {
}
@Override
- public void onDestroy() {
+ public final void onDestroy() {
for (MalwareMonitor malwareMonitor : malwareMonitors) {
malwareMonitor.stopWatching();
}
@@ -48,8 +48,6 @@ public class MalwareScannerService extends Service {
}
private void setForeground() {
- NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
-
Notification notification =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notification)
@@ -62,7 +60,7 @@ public class MalwareScannerService extends Service {
startForeground(-1, notification);
}
- private class MalwareMonitor extends FileObserver {
+ private final class MalwareMonitor extends FileObserver {
private String rootPath = null;
@@ -75,7 +73,7 @@ public class MalwareScannerService extends Service {
}
@Override
- public void onEvent(int eventID, String path) {
+ public final void onEvent(int eventID, String path) {
switch (eventID) {
case FileObserver.MOVED_TO:
case FileObserver.CLOSE_WRITE:
diff --git a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java
index c5637c3..cc44950 100644
--- a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java
+++ b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java
@@ -1,6 +1,6 @@
package us.spotco.malwarescanner;
-public class SignatureDatabase {
+class SignatureDatabase {
private String url = null;
private String name = null;
@@ -10,11 +10,11 @@ public class SignatureDatabase {
this.name = url.replaceAll("https://spotco.us/Theia/", "");
}
- public String getUrl() {
+ public final String getUrl() {
return url;
}
- public String getName() {
+ public final String getName() {
return name;
}
diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java
index cae583d..ffc6a37 100644
--- a/app/src/main/java/us/spotco/malwarescanner/Utils.java
+++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java
@@ -4,9 +4,9 @@ import java.io.File;
import java.util.HashSet;
import java.util.Set;
-public class Utils {
+class Utils {
- private static final int MAX_FILE_SIZE = (1000 * 1000) * 50; //50MB
+ private final static int MAX_FILE_SIZE = (1000 * 1000) * 50; //50MB
public static Set getFilesRecursive(File root) {
Set filesAll = new HashSet<>();
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
index f5bb293..1ccbeee 100644
--- a/app/src/main/res/layout/content_main.xml
+++ b/app/src/main/res/layout/content_main.xml
@@ -1,15 +1,15 @@
-
-
+ android:layout_height="match_parent">
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index e867e0d..3ef3308 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -1,5 +1,4 @@