content: package fuzion24.device.vulnerability.test.job;
  
  import android.app.DownloadManager;
  import android.app.NotificationManager;
  import android.app.PendingIntent;
  import android.content.Context;
  import android.content.Intent;
  import android.net.Uri;
  import android.os.Environment;
  import android.support.annotation.NonNull;
  import android.support.v4.app.NotificationCompat;
  import android.widget.Toast;
  
  import com.afollestad.materialdialogs.DialogAction;
  import com.afollestad.materialdialogs.MaterialDialog;
  import com.evernote.android.job.Job;
  import com.nowsecure.android.vts.BuildConfig;
  import com.nowsecure.android.vts.R;
  
  import fuzion24.device.vulnerability.test.AndroidVTSApplication;
  import fuzion24.device.vulnerability.test.ui.MainActivity;
  import fuzion24.device.vulnerability.update.client.RetrofitClient;
  import fuzion24.device.vulnerability.update.model.GithubRelease;
  import fuzion24.device.vulnerability.update.service.GithubApiService;
  import rx.Subscriber;
  import rx.android.schedulers.AndroidSchedulers;
  import rx.schedulers.Schedulers;
  
  /**
   * Job to run the tests.
   */
  public class CheckForUpdatesJob extends Job {
  
      public static final String TAG = "job_check_for_updates_tag";
  
      @Override
      @NonNull
      protected Result onRunJob(Params params) {
          checkForUpdates(getContext(), null);
  
          return Result.SUCCESS;
      }
  
      public static void checkForUpdates(final Context context, final MaterialDialog progressDialog) {
          GithubApiService service = RetrofitClient.getRetrofitClient().create(GithubApiService.class);
  
          service.getLatestRelease().subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
              .unsubscribeOn(Schedulers.io())
              .subscribe(new Subscriber<GithubRelease>() {
  
                  @Override
                  public void onCompleted() {
                      if (progressDialog == null) {
                          return;
                      }
  
                      progressDialog.dismiss();
                  }
  
                  @Override
                  public void onError(Throwable e) {
                      Toast.makeText(context, R.string.update_error, Toast.LENGTH_LONG).show();
                  }
  
                  @Override
                  public void onNext(final GithubRelease githubRelease) {
                      Double currentVersion = Double.parseDouble(BuildConfig.VERSION_NAME.replace("v.", ""));
                      Double repositoryVersion = Double.parseDouble(githubRelease.getTag_name().replace("v.", ""));
  
                      // Check if a new version is available.
                      if (repositoryVersion > currentVersion) {
                          if (progressDialog == null) {
                              NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.ic_notification).setContentTitle(context.getString(R.string.app_name))
                                  .setStyle(new NotificationCompat.BigTextStyle().bigText(context.getString(R.string.update_available)))
                                  .setAutoCancel(true)
                                  .setContentText(context.getString(R.string.update_available));
                              Intent resultIntent = new Intent(context, MainActivity.class);
                              PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  
                              builder.setContentIntent(resultPendingIntent);
  
                              NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
  
                              notifyMgr.notify(1000, builder.build());
  
                              return;
                          }
  
                          new MaterialDialog.Builder(context)
                              .title(R.string.update_available_title)
                              .content(context.getString(R.string.update_avaiable_description, githubRelease.getTag_name()))
                              .positiveText(R.string.update)
                              .negativeText(R.string.dismiss)
                              .onPositive(new MaterialDialog.SingleButtonCallback() {
                                  @Override
                                  public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
                                      ((AndroidVTSApplication) context.getApplicationContext()).downloadFilename = String.format("AndroidVTS-%s.apk", githubRelease.getTag_name());
                                      ((AndroidVTSApplication) context.getApplicationContext()).downloadManager.enqueue(new DownloadManager.Request(Uri.parse(githubRelease.getAssets().get(0).getBrowser_download_url()))
                                          .setTitle("Android VTS")
                                          .setDescription(context.getString(R.string.downloading_update))
                                          .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, ((AndroidVTSApplication) context.getApplicationContext()).downloadFilename));
                                  }
                              })
                              .show();
  
                          return;
                      }
  
                      // Only show the toast if it was the user who requested the update check.
                      if (progressDialog != null) {
                          Toast.makeText(context, R.string.no_update_available, Toast.LENGTH_LONG).show();
                      }
                  }
  
              });
      }
  }