package org.sugr.gearshift; import android.app.Application; import android.content.Intent; import com.android.volley.RequestQueue; import com.android.volley.toolbox.JsonArrayRequest; import com.android.volley.toolbox.Volley; import com.github.zafarkhaja.semver.Version; import org.json.JSONObject; public class GearShiftApplication extends Application { private static boolean activityVisible; private static boolean startupInitialized; private static final String UPDATE_URL = "https://api.github.com/repos/urandom/gearshift/releases"; private static GearShiftApplication app; private RequestQueue requestQueue; public interface OnUpdateCheck { public void onNewRelease(String title, String description, String url, String downloadUrl); public void onCurrentRelease(); public void onUpdateCheckError(Exception e); } @Override public void onCreate() { super.onCreate(); requestQueue = Volley.newRequestQueue(this); Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> handleUncaughtException(thread, ex)); app = this; } public static boolean isActivityVisible() { return activityVisible; } public static void setActivityVisible(boolean visible) { activityVisible = visible; } public static boolean isStartupInitialized() { return startupInitialized; } public static void setStartupInitialized(boolean initialized) { startupInitialized = initialized; } public static GearShiftApplication get() { return app; } public RequestQueue getRequestQueue() { return requestQueue; } public void checkForUpdates(final OnUpdateCheck onUpdateCheck) { JsonArrayRequest request = new JsonArrayRequest(UPDATE_URL, response -> { try { String version = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; if (response.length() > 0) { JSONObject latest = response.getJSONObject(0); String url = latest.getString("html_url"); String tag = latest.getString("tag_name"); String name = latest.getString("name"); String description = latest.getString("body"); String downloadUrl = latest.getJSONArray("assets").getJSONObject(0).getString("browser_download_url"); Version current = Version.valueOf(version); Version remote = Version.valueOf(tag); if (remote.greaterThan(current)) { G.logD("New update available at " + url); onUpdateCheck.onNewRelease(name, description, url, downloadUrl); } else { onUpdateCheck.onCurrentRelease(); } } } catch (Exception e) { e.printStackTrace(); onUpdateCheck.onUpdateCheckError(e); return; } }, error -> { G.logD("Error fetching releases feed: " + error.toString()); onUpdateCheck.onUpdateCheckError(error); }); requestQueue.add(request); } private void handleUncaughtException(Thread thread, Throwable e) { e.printStackTrace(); Intent intent = new Intent(); intent.setAction("org.sugr.gearshift.CRASH_REPORT"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); System.exit(1); } }