package cgeo.geocaching; import cgeo.geocaching.sensors.Sensors; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.OOMDumpingUncaughtExceptionHandler; import cgeo.geocaching.utils.RxUtils; import org.eclipse.jdt.annotation.NonNull; import android.app.Application; import android.view.ViewConfiguration; import java.lang.reflect.Field; public class CgeoApplication extends Application { private boolean forceRelog = false; // c:geo needs to log into cache providers public boolean showLoginToast = true; //login toast shown just once. private boolean liveMapHintShownInThisSession = false; // livemap hint has been shown private static CgeoApplication instance; private boolean isGooglePlayServicesAvailable = false; public static void dumpOnOutOfMemory(final boolean enable) { if (enable) { if (!OOMDumpingUncaughtExceptionHandler.activateHandler()) { Log.e("OOM dumping handler not activated (either a problem occured or it was already active)"); } } else { if (!OOMDumpingUncaughtExceptionHandler.resetToDefault()) { Log.e("OOM dumping handler not resetted (either a problem occured or it was not active)"); } } } public CgeoApplication() { setInstance(this); } private static void setInstance(@NonNull final CgeoApplication application) { instance = application; } public static CgeoApplication getInstance() { return instance; } @Override public void onCreate() { try { final ViewConfiguration config = ViewConfiguration.get(this); final Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException ignored) { } // Set language to English if the user decided so. Settings.setLanguage(Settings.isUseEnglish()); // ensure initialization of lists DataStore.getLists(); final Sensors sensors = Sensors.getInstance(); sensors.setupGeoDataObservables(Settings.useGooglePlayServices(), Settings.useLowPowerMode()); sensors.setupDirectionObservable(Settings.useLowPowerMode()); // Attempt to acquire an initial location before any real activity happens. sensors.geoDataObservable(true).subscribeOn(RxUtils.looperCallbacksScheduler).first().subscribe(); } @Override public void onLowMemory() { onTrimMemory(TRIM_MEMORY_COMPLETE); } @Override public void onTrimMemory(final int level) { if (level >= TRIM_MEMORY_MODERATE) { Log.i("Cleaning applications cache to trim memory"); DataStore.removeAllFromCache(); } } public boolean isLiveMapHintShownInThisSession() { return liveMapHintShownInThisSession; } public void setLiveMapHintShownInThisSession() { liveMapHintShownInThisSession = true; } /** * Check if cgeo must relog even if already logged in. * * @return true if it is necessary to relog */ public boolean mustRelog() { final boolean mustLogin = forceRelog; forceRelog = false; return mustLogin; } /** * Force cgeo to relog when reaching the main activity. */ public void forceRelog() { forceRelog = true; } public boolean isGooglePlayServicesAvailable() { return isGooglePlayServicesAvailable; } }