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