diff --git a/app/build.gradle b/app/build.gradle index 2d7b8b3..6adce6b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "us.spotco.malwarescanner" minSdkVersion 16 targetSdkVersion 32 - versionCode 93 - versionName "2.28" + versionCode 94 + versionName "2.29" resConfigs 'en', 'af', 'de', 'es', 'fi', 'fr', 'it', 'pl', 'pt', 'ru' } buildTypes { @@ -29,6 +29,5 @@ android { } dependencies { - implementation 'androidx.appcompat:appcompat:1.6.0' - implementation 'com.google.android.material:material:1.8.0' + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dece813..b7a8c39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,14 +18,13 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme" + android:theme="@android:style/Theme.DeviceDefault" android:largeHeap="true" android:requestLegacyExternalStorage="true"> diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java index 7fb0c9c..a3ad109 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java +++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java @@ -20,6 +20,7 @@ package us.spotco.malwarescanner; import static android.os.Build.VERSION.SDK_INT; import android.Manifest; +import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; @@ -28,7 +29,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.content.res.ColorStateList; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -43,23 +43,16 @@ import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - import java.io.File; import java.util.HashSet; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends Activity { private SharedPreferences prefs = null; private MalwareScanner malwareScanner = null; private TextView logView; + private Menu menu; private static final String buildVersionName = BuildConfig.VERSION_NAME; @@ -72,12 +65,15 @@ public class MainActivity extends AppCompatActivity { @Override protected final void onCreate(Bundle savedInstanceState) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + setTheme(android.R.style.Theme_DeviceDefault_DayNight); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + } super.onCreate(savedInstanceState); Utils.setContext(getApplicationContext()); - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - setContentView(R.layout.activity_main); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + setContentView(R.layout.content_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); @@ -94,17 +90,6 @@ public class MainActivity extends AppCompatActivity { prefs = getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE); - final FloatingActionButton fab = findViewById(R.id.fab); - fab.setOnClickListener(view -> { - if (!malwareScanner.running) { - startScanner(); - } else { - logView.append("\n" + getString(R.string.main_cancelling_scan) + "\n\n"); - malwareScanner.cancel(true); - malwareScanner.running = false; - } - }); - requestPermissions(); Utils.considerStartService(this); @@ -113,23 +98,27 @@ public class MainActivity extends AppCompatActivity { @Override public final boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); + this.menu = menu; menu.findItem(R.id.toggleRealtime).setChecked(Utils.isServiceRunning(MalwareScannerService.class, this)); menu.findItem(R.id.toggleOnionRouting).setChecked(prefs.getBoolean("ONION_ROUTING", false)); + updateScanButton(false); return true; } private void requestPermissions() { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_EXTERNAL_STORAGE); + if (SDK_INT >= Build.VERSION_CODES.M) { + if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_EXTERNAL_STORAGE); + } + } + if (SDK_INT >= Build.VERSION_CODES.R) { + if (!Environment.isExternalStorageManager()) { + Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivity(intent); + } } - if (SDK_INT >= Build.VERSION_CODES.R) { - if (!Environment.isExternalStorageManager()) { - Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); - Uri uri = Uri.fromParts("package", getPackageName(), null); - intent.setData(uri); - startActivity(intent); - } - } } private void showCredits() { @@ -272,6 +261,15 @@ public class MainActivity extends AppCompatActivity { case R.id.mnuFullCredits: showCredits(); break; + case R.id.btnStartScan: + if (!malwareScanner.running) { + updateScanButton(true); + startScanner(); + } else { + logView.append("\n" + getString(R.string.main_cancelling_scan) + "\n\n"); + malwareScanner.cancel(true); + malwareScanner.running = false; + } } return super.onOptionsItemSelected(item); } @@ -294,7 +292,19 @@ public class MainActivity extends AppCompatActivity { if (scanExternal) { filesToScan.add(new File("/storage")); } + + malwareScanner.executeOnExecutor(Utils.getThreadPoolExecutor(), filesToScan); + new Thread(() -> { + try { + while(malwareScanner.running){ + Thread.sleep(500); + } + runOnUiThread(() -> updateScanButton(false)); + } catch (Exception e) { + e.printStackTrace(); + } + }).start(); } private void updateDatabase() { @@ -305,4 +315,26 @@ public class MainActivity extends AppCompatActivity { } } + private void updateScanButton(boolean running) { + if (running) { + if (SDK_INT >= Build.VERSION_CODES.O) { + menu.findItem(R.id.btnStartScan).setIconTintList(getColorStateList(R.color.colorRed)); + } else { + findViewById(R.id.btnStartScan).setBackgroundColor(getResources().getColor(R.color.colorRed)); + } + if (SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + menu.findItem(R.id.btnStartScan).setIcon(getDrawable(android.R.drawable.ic_menu_close_clear_cancel)); + } + } else { + if (SDK_INT >= Build.VERSION_CODES.O) { + menu.findItem(R.id.btnStartScan).setIconTintList(getColorStateList(R.color.colorGreen)); + } else { + findViewById(R.id.btnStartScan).setBackgroundColor(getResources().getColor(R.color.colorGreen)); + } + if (SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + menu.findItem(R.id.btnStartScan).setIcon(getDrawable(android.R.drawable.ic_media_play)); + } + } + } + } diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java index 9830d27..f92016f 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java @@ -28,8 +28,6 @@ import android.os.Environment; import android.os.SystemClock; import android.widget.TextView; -import androidx.core.app.NotificationCompat; - import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -78,15 +76,15 @@ class MalwareScanner extends AsyncTask, Object, String> { } } else if (!userFacingOnly) { String[] malwareDetect = result.split(" in "); - NotificationCompat.Builder mBuilder = - new NotificationCompat.Builder(context) + Notification.Builder mBuilder = + new Notification.Builder(context) .setSmallIcon(R.drawable.ic_notification) .setContentTitle(context.getText(R.string.lblNotificationRealtimeDetection) + " " + malwareDetect[0]) .setContentText(malwareDetect[1]) .setPriority(Notification.PRIORITY_MAX) .setDefaults(Notification.DEFAULT_VIBRATE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mBuilder.setVisibility(NotificationCompat.VISIBILITY_SECRET); + mBuilder.setVisibility(Notification.VISIBILITY_SECRET); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mBuilder.setChannelId("DETECTION"); diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java index 6cdf3a4..fa2b105 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java @@ -29,8 +29,6 @@ import android.os.FileObserver; import android.os.IBinder; import android.widget.Toast; -import androidx.core.app.NotificationCompat; - import java.io.File; import java.text.NumberFormat; import java.util.HashSet; @@ -40,7 +38,7 @@ public class MalwareScannerService extends Service { private final HashSet malwareMonitors = new HashSet<>(); private ThreadPoolExecutor threadPoolExecutor = null; - private NotificationCompat.Builder foregroundNotification = null; + private Notification.Builder foregroundNotification = null; private NotificationManager notificationManager = null; @Override @@ -105,7 +103,7 @@ public class MalwareScannerService extends Service { private void setForeground() { foregroundNotification = - new NotificationCompat.Builder(this) + new Notification.Builder(this) .setSmallIcon(R.drawable.ic_notification) .setContentTitle(getText(R.string.lblNotificationRealtimeTitle)) .setContentText(getText(R.string.lblNotificationRealtimeText)) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 373758a..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 446c0f6..a9e84e3 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -2,6 +2,11 @@ xmlns:tools="http://schemas.android.com/tools" tools:context="us.spotco.malwarescanner.MainActivity"> + - #4CAF50 - #03a9f4 - #f44336 - + #FF0000 + #008000 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83ef26f..29559af 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,4 +59,5 @@ Small Medium Large + Scan Control diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index 3efb15d..0000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - -