package fuzion24.device.vulnerability.broadcastreceiver; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.nowsecure.android.vts.R; import java.util.ArrayList; import java.util.List; import fuzion24.device.vulnerability.test.ui.MainActivity; import fuzion24.device.vulnerability.util.SharedPreferencesUtils; import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityOrganizer; import fuzion24.device.vulnerability.vulnerabilities.VulnerabilityTest; /** * Handles the application update/installation to show a notification to the user if there are * new vulnerabilities scans available. */ public class ApplicationUpdateBroadcastReceiver extends BroadcastReceiver { private static final String TAG = "VULN_TEST_BROAD_UPDATE"; private static final int NOTIFICATION_ID = 1; private static final boolean mTestWasChanged = false; @Override public void onReceive(final Context context, final Intent intent) { List<String> currentTestsAvailable = new ArrayList<>(); for (VulnerabilityTest test : VulnerabilityOrganizer.getTests(context)) { currentTestsAvailable.add(test.getCVEorID()); } List<String> testsAvailableOnPreviousBuild = SharedPreferencesUtils.getTheListOfScansAvailable(context); // First run, save the current list of scans. if (testsAvailableOnPreviousBuild == null) { Log.d(TAG, "This is the first time this detection is running."); SharedPreferencesUtils.setTheListOfScansAvailable(context, currentTestsAvailable); return; } // Update application with the tests available. SharedPreferencesUtils.setTheListOfScansAvailable(context, currentTestsAvailable); if(mTestWasChanged){ buildNotification(context, false); Log.d(TAG, "An existing test was updated"); } for (String testName : currentTestsAvailable) { if (!testsAvailableOnPreviousBuild.contains(testName)) { // This test is new, show a notification to the user. buildNotification(context, true); Log.d(TAG, String.format("New test available:, %s", testName)); return; } } Log.d(TAG, "Without new tests detected."); } private void buildNotification(Context context, boolean forNewTest) { NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.ic_notification) .setAutoCancel(true) .setContentTitle(context.getString(R.string.app_name)) .setContentText(forNewTest ? context.getString(R.string.notification_new_tests) : context.getString(R.string.existing_test_updated)); Intent notificationIntent = new Intent(context, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(contentIntent); // Add the notification. NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(NOTIFICATION_ID, builder.build()); } }