package us.spotco.malwarescanner; import android.app.Notification; import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Environment; import android.os.FileObserver; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class MalwareScannerService extends Service { private ArrayList malwareMonitors = null; @Override public IBinder onBind(Intent intent) { return null; } @Override public 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")); malwareMonitors.add(new MalwareMonitor(Environment.getExternalStorageDirectory() + "/Download")); for (MalwareMonitor malwareMonitor : malwareMonitors) { malwareMonitor.startWatching(); } //Toast.makeText(this, "Theia: Realtime Scanning Started", Toast.LENGTH_SHORT).show(); setForeground(); return START_STICKY; } @Override public void onDestroy() { for (MalwareMonitor malwareMonitor : malwareMonitors) { malwareMonitor.stopWatching(); } //Toast.makeText(this, "Theia: Realtime Scanning Stopped", Toast.LENGTH_SHORT).show(); } private void setForeground() { NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_notification) .setContentTitle(getText(R.string.lblNotificationRealtimeTitle)) .setContentText(getText(R.string.lblNotificationRealtimeText)) .setPriority(Notification.PRIORITY_MIN) .setShowWhen(false) .build(); startForeground(-1, notification); } private class MalwareMonitor extends FileObserver { private String rootPath = null; public MalwareMonitor(String path) { super(path); rootPath = path; if (!rootPath.endsWith("/")) { rootPath += "/"; } } @Override public void onEvent(int eventID, String path) { if (eventID == FileObserver.CLOSE_WRITE) { File file = new File(rootPath + path); if (file.exists() && file.length() > 0) { Set filesToScan = new HashSet<>(); filesToScan.add(file); new MalwareScanner(null, getApplicationContext(), false).execute(filesToScan); } } } } }