package net.osmand.core.samples.android.sample1; import android.Manifest; import android.app.Application; import android.content.Context; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import android.os.Environment; import android.os.Handler; import android.support.v4.content.ContextCompat; import android.widget.Toast; import net.osmand.core.android.CoreResourcesFromAndroidAssets; import net.osmand.core.android.NativeCore; import net.osmand.core.jni.LogSeverityLevel; import net.osmand.core.jni.Logger; import net.osmand.core.samples.android.sample1.SampleFormatter.MetricsConstants; import net.osmand.core.samples.android.sample1.SampleFormatter.SpeedConstants; import net.osmand.core.samples.android.sample1.resources.ResourceManager; import net.osmand.core.samples.android.sample1.search.QuickSearchHelper; import net.osmand.map.OsmandRegions; import net.osmand.map.WorldRegion; import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.util.Algorithms; import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Field; import java.util.Locale; import static net.osmand.core.samples.android.sample1.data.PointDescription.FORMAT_DEGREES; public class SampleApplication extends Application { public static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 5 ; public static final int PERMISSION_REQUEST_LOCATION_ON_RESUME = 6 ; public static final int PERMISSION_REQUEST_LOCATION_ON_BUTTON = 7 ; private CoreResourcesFromAndroidAssets assetsCustom; private MapPoiTypes poiTypes; private IconsCache iconsCache; private Handler uiHandler; private long lastTimeInternetConnectionChecked = 0; private boolean internetConnectionAvailable = true; private int coordinatesFormat = FORMAT_DEGREES; private MetricsConstants metricsConstants = MetricsConstants.KILOMETERS_AND_METERS; private SpeedConstants speedConstants = SpeedConstants.KILOMETERS_PER_HOUR; private SampleLocationProvider locationProvider; private QuickSearchHelper searchUICore; private GeocodingLookupService geocodingLookupService; private OsmandRegions regions; private ResourceManager resourceManager; public static String LANGUAGE; public static boolean TRANSLITERATE = false; static { String langCode = Locale.getDefault().getLanguage(); if (langCode.isEmpty()) { langCode = "en"; } LANGUAGE = langCode; } @Override public void onCreate() { super.onCreate(); OsmandResources.init(this); locationProvider = new SampleLocationProvider(this); searchUICore = new QuickSearchHelper(this); geocodingLookupService = new GeocodingLookupService(this); resourceManager = new ResourceManager(this); regions = new OsmandRegions(); updateRegionVars(); indexRegionsBoundaries(); uiHandler = new Handler(); poiTypes = MapPoiTypes.getDefaultNoInit(); if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { initPoiTypes(); } // Initialize native core if (NativeCore.isAvailable() && !NativeCore.isLoaded()) { assetsCustom = CoreResourcesFromAndroidAssets.loadFromCurrentApplication(this); NativeCore.load(assetsCustom); } Logger.get().setSeverityLevelThreshold(LogSeverityLevel.Debug); iconsCache = new IconsCache(assetsCustom, this); } private void updateRegionVars() { regions.setTranslator(new OsmandRegions.RegionTranslation() { @Override public String getTranslation(String id) { if(WorldRegion.AFRICA_REGION_ID.equals(id)){ return getString("index_name_africa"); } else if(WorldRegion.AUSTRALIA_AND_OCEANIA_REGION_ID.equals(id)){ return getString("index_name_oceania"); } else if(WorldRegion.ASIA_REGION_ID.equals(id)){ return getString("index_name_asia"); } else if(WorldRegion.CENTRAL_AMERICA_REGION_ID.equals(id)){ return getString("index_name_central_america"); } else if(WorldRegion.EUROPE_REGION_ID.equals(id)){ return getString("index_name_europe"); } else if(WorldRegion.RUSSIA_REGION_ID.equals(id)){ return getString("index_name_russia"); } else if(WorldRegion.NORTH_AMERICA_REGION_ID.equals(id)){ return getString("index_name_north_america"); } else if(WorldRegion.SOUTH_AMERICA_REGION_ID.equals(id)){ return getString("index_name_south_america"); } return null; } }); regions.setLocale(LANGUAGE); } private void indexRegionsBoundaries() { try { File file = getAppPath("regions.ocbf"); if (file != null) { if (!file.exists()) { file = new File(getInternalAppPath(), "regions.ocbf"); if (!file.exists()) { Algorithms.streamCopy(OsmandRegions.class.getResourceAsStream("regions.ocbf"), new FileOutputStream(file)); } } regions.prepareFile(file.getAbsolutePath()); } } catch (Exception e) { e.printStackTrace(); } } public ResourceManager getResourceManager() { return resourceManager; } public OsmandRegions getRegions() { return regions; } public GeocodingLookupService getGeocodingLookupService() { return geocodingLookupService; } public int getCoordinatesFormat() { return coordinatesFormat; } public MetricsConstants getMetricsConstants() { return metricsConstants; } public SpeedConstants getSpeedConstants() { return speedConstants; } public SampleLocationProvider getLocationProvider() { return locationProvider; } public QuickSearchHelper getSearchUICore() { return searchUICore; } public MapPoiTypes getPoiTypes() { return poiTypes; } public IconsCache getIconsCache() { return iconsCache; } public void initPoiTypes() { File poiTypesFile = new File(Environment.getExternalStorageDirectory() + "/osmand/poi_types.xml"); if (poiTypesFile.exists()) { poiTypes.init(poiTypesFile.getAbsolutePath()); } else { poiTypes.init(); } poiTypes.setPoiTranslator(new MapPoiTypes.PoiTranslator() { @Override public String getTranslation(AbstractPoiType type) { if(type.getBaseLangType() != null) { return getTranslation(type.getBaseLangType()) + " (" + getLangTranslation(type.getLang()).toLowerCase() +")"; } try { Field f = R.string.class.getField("poi_" + type.getIconKeyName()); if (f != null) { Integer in = (Integer) f.get(null); return getString(in); } } catch (Exception e) { System.err.println("No translation for "+ type.getIconKeyName() + " " + e.getMessage()); } return null; } @Override public String getTranslation(String keyName) { return null; } }); searchUICore.initSearchUICore(); } public String getAbsoluteAppPath() { return Environment.getExternalStorageDirectory() + "/osmand"; } public File getAppPath(String path) { if (path == null) { path = ""; } return new File(getAbsoluteAppPath(), path); } public String getLangTranslation(String l) { try { java.lang.reflect.Field f = R.string.class.getField("lang_"+l); if (f != null) { Integer in = (Integer) f.get(null); return getString(in); } } catch (Exception e) { System.err.println(e.getMessage()); } return l; } public void runInUIThread(Runnable run) { uiHandler.post(run); } public void runInUIThread(Runnable run, long delay) { uiHandler.postDelayed(run, delay); } // Check internet connection available every 15 seconds public boolean isInternetConnectionAvailable() { return isInternetConnectionAvailable(false); } public boolean isInternetConnectionAvailable(boolean update) { long delta = System.currentTimeMillis() - lastTimeInternetConnectionChecked; if (delta < 0 || delta > 15000 || update) { internetConnectionAvailable = isInternetConnected(); } return internetConnectionAvailable; } public boolean isWifiConnected() { ConnectivityManager mgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = mgr.getActiveNetworkInfo(); return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI; } private boolean isInternetConnected() { ConnectivityManager mgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo active = mgr.getActiveNetworkInfo(); if (active == null) { return false; } else { NetworkInfo.State state = active.getState(); return state != NetworkInfo.State.DISCONNECTED && state != NetworkInfo.State.DISCONNECTING; } } public static SampleApplication getApp(Context ctx) { return (SampleApplication) ctx.getApplicationContext(); } public String getString(String osmandId) { return OsmandResources.getString(osmandId); } public String getString(String osmandId, Object... formatArgs) { return OsmandResources.getString(osmandId, formatArgs); } public File getInternalAppPath() { if (Build.VERSION.SDK_INT >= 21) { File fl = getNoBackupFilesDir(); if (fl != null) { return fl; } } return getFilesDir(); } public void showShortToastMessage(final int msgId, final Object... args) { uiHandler.post(new Runnable() { @Override public void run() { Toast.makeText(SampleApplication.this, getString(msgId, args), Toast.LENGTH_SHORT).show(); } }); } public void showShortToastMessage(final String msg) { uiHandler.post(new Runnable() { @Override public void run() { Toast.makeText(SampleApplication.this, msg, Toast.LENGTH_SHORT).show(); } }); } public void showToastMessage(final int msgId, final Object... args) { uiHandler.post(new Runnable() { @Override public void run() { Toast.makeText(SampleApplication.this, getString(msgId, args), Toast.LENGTH_LONG).show(); } }); } public void showToastMessage(final String msg) { uiHandler.post(new Runnable() { @Override public void run() { Toast.makeText(SampleApplication.this, msg, Toast.LENGTH_LONG).show(); } }); } }