content: 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());
      }
  
  }
  