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 @@ diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 036d09b..c9ad5f9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09b..c9ad5f9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file