diff options
author | jandegr <jandegr@users.noreply.github.com> | 2018-05-14 19:17:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-14 19:17:36 +0200 |
commit | a846962adcf301f1f05f5137ff0b976626ab34c7 (patch) | |
tree | 46b7790df5587c1a4c73251629ce10145cb1d73e /navit/android | |
parent | 55c2c0021c6a385f973c335e4878432237cf8f54 (diff) | |
download | navit-a846962adcf301f1f05f5137ff0b976626ab34c7.tar.gz |
Android translations (#589)
* Add files via upload
store translations in artefacts
* Add files via upload
* Add files via upload
* Add files via upload
* remove the last java files from cmakelists in po
* move all java UI strings into strings.xml
* translate UI strings by their id's
Diffstat (limited to 'navit/android')
11 files changed, 3886 insertions, 3388 deletions
diff --git a/navit/android/res/values/strings-dont-translate.xml b/navit/android/res/values/strings-dont-translate.xml index db794184f..b2a5496bc 100644 --- a/navit/android/res/values/strings-dont-translate.xml +++ b/navit/android/res/values/strings-dont-translate.xml @@ -6,6 +6,7 @@ <string name="map_data_copyright">© OpenStreetMap contributors</string> <string name="url_wiki_android">http://wiki.navit-project.org/index.php/Navit_on_Android</string> <string name="url_wiki_main">http://wiki.navit-project.org</string> + <string name="osm_copyright">Map data © OpenStreetMap contributors, ODBL</string> <!-- NOTIFICATION --> <string name="notification_name">@string/app_name</string> diff --git a/navit/android/res/values/strings.xml b/navit/android/res/values/strings.xml index 7506c21e8..87acfec6b 100644 --- a/navit/android/res/values/strings.xml +++ b/navit/android/res/values/strings.xml @@ -4,6 +4,7 @@ <!-- GENERIC --> <string name="yes">Yes</string> <string name="no">No</string> + <string name="cancel">Cancel</string> <!-- NOTIFICATION --> <string name="notification_ticker">Navit started</string> @@ -38,9 +39,17 @@ <string name="map_download_download_error">Error downloading map.</string> <string name="map_download_download_aborted">Map download aborted</string> <string name="map_download_not_enough_free_space">Not enough free space</string> + <string name="map_download_oversize">Sorry, we currently do not support maps above 3.8G on Android, please select a smaller one.</string> <string name="map_no_fix">No location. Reopen after location fix.</string> <string name="maps_for_current_location">Maps containing current location</string> <string name="maps_installed">Installed maps</string> + <string name="map_downloading">downloading</string> + <string name="map_download_medium_unavailable">Media selected for map storage is not available</string> + <string name="map_download_error_writing_map">Error writing map!</string> + + <!-- STORAGE --> + <string name="map_location_changed">New location set to %s Restart Navit to apply the changes.</string> + <string name="map_location_unavailable">Current map location %s is not available Please restart Navit after you attach an SD card or select a different map location.</string> <!-- ADDRESS SEARCH --> <string name="address_search_title">Address search</string> @@ -81,5 +90,221 @@ <!-- Permissions dialog--> <string name="permissions_not_granted">Navit needs permission to access GPS and read the map.\nIf you change your mind please restart Navit and grant the permissions</string> <string name="permissions_info_box_title">One or more ungranted permissions</string> + + + <!-- countries, continents, regions --> + <string name="whole_planet">Whole Planet</string> + <string name="africa">Africa</string> + <string name="angola">Angola</string> + <string name="burundi">Burundi</string> + <string name="canary_islands">Canary Islands</string> + <string name="congo">Congo, Democratic Republic of the</string> + <string name="ethiopia">Ethiopia</string> + <string name="guinea">Guinea</string> + <string name="cotedivoire">Cote d\'Ivoire</string> + <string name="kenya">Kenya</string> + <string name="lesotho">Lesotho</string> + <string name="liberia">Liberia</string> + <string name="libya">Libya</string> + <string name="madagascar">Madagascar</string> + <string name="namibia">Namibia</string> + <string name="botswana">Botswana</string> + <string name="reunion">Reunion</string> + <string name="rwanda">Rwanda</string> + <string name="south_africa">South Africa</string> + <string name="tanzania">Tanzania, United Republic of</string> + <string name="uganda">Uganda</string> + <string name="asia">Asia</string> + <string name="azerbaijan">Azerbaijan</string> + <string name="china">China</string> + <string name="cyprus">Cyprus</string> + <string name="india">India</string> + <string name="nepal">Nepal</string> + <string name="indonesia">Indonesia</string> + <string name="iran">Iran, Islamic Republic of</string> + <string name="iraq">Iraq</string> + <string name="israel">Israel</string> + <string name="japan">Japan</string> + <string name="kazakhstan">Kazakhstan</string> + <string name="kyrgyzsyan">Kyrgyzstan</string> + <string name="malaysia">Malaysia</string> + <string name="mongolia">Mongolia</string> + <string name="pakistan">Pakistan</string> + <string name="philippines">Philippines</string> + <string name="saudi_arabia">Saudi Arabia</string> + <string name="taiwan">Taiwan</string> + <string name="korea">Korea</string> + <string name="singapore">Singapore</string> + <string name="thailand">Thailand</string> + <string name="turkey">Turkey</string> + <string name="turkmenistan">Turkmenistan</string> + <string name="uae_other">UAE+Other</string> + <string name="australia">Australia</string> + <string name="oceania">Oceania</string> + <string name="tasmania">Tasmania</string> + <string name="victoria">Victoria</string> + <string name="new_south_wales">New South Wales</string> + <string name="new_caledonia">New Caledonia</string> + <string name="newzealand">New Zealand</string> + <string name="europe">Europe</string> + <string name="western_europe">Western Europe</string> + <string name="austria">Austria</string> + <string name="azores">Azores</string> + <string name="belgium">Belgium</string> + <string name="benelux">BeNeLux</string> + <string name="netherlands">Netherlands</string> + <string name="denmark">Denmark</string> + <string name="faroe_islands">Faroe Islands</string> + <string name="france">France</string> + <string name="alsace">Alsace</string> + <string name="aquitaine">Aquitaine</string> + <string name="auvergne">Auvergne</string> + <string name="centre">Centre</string> + <string name="bretagne">Bretagne</string> + <string name="bourgogne">Bourgogne</string> + <string name="basse_normandie">Basse-Normandie</string> + <string name="champagne_ardenne">Champagne-Ardenne</string> + <string name="corse">Corse</string> + <string name="franche_comte">Franche-Comte</string> + <string name="haute_normandie">Haute-Normandie</string> + <string name="ile_de_france">Ile-de-France</string> + <string name="languedoc_roussillon">Languedoc-Roussillon</string> + <string name="limousin">Limousin</string> + <string name="lorraine">Lorraine</string> + <string name="midi_pyrenees">Midi-Pyrenees</string> + <string name="nord_pas_de_calais">Nord-pas-de-Calais</string> + <string name="pays_de_la_loire">Pays-de-la-Loire</string> + <string name="picardie">Picardie</string> + <string name="poitou_charentes">Poitou-Charentes</string> + <string name="provence_alpes_cote_d_azur">Provence-Alpes-Cote-d-Azur</string> + <string name="rhone_alpes">Rhone-Alpes</string> + <string name="luxembourg">Luxembourg</string> + <string name="germany">Germany</string> + <string name="baden_wuerttemberg">Baden-Wuerttemberg</string> + <string name="bayern">Bayern</string> + <string name="mittelfranken">Mittelfranken</string> + <string name="niederbayern">Niederbayern</string> + <string name="oberbayern">Oberbayern</string> + <string name="oberfranken">Oberfranken</string> + <string name="oberpfalz">Oberpfalz</string> + <string name="schwaben">Schwaben</string> + <string name="unterfranken">Unterfranken</string> + <string name="berlin">Berlin</string> + <string name="brandenburg">Brandenburg</string> + <string name="bremen">Bremen</string> + <string name="hamburg">Hamburg</string> + <string name="hessen">Hessen</string> + <string name="mecklenburg_vorpommern">Mecklenburg-Vorpommern</string> + <string name="niedersachsen">Niedersachsen</string> + <string name="nordrhein_westfalen">Nordrhein-westfalen</string> + <string name="rheinland_pfalz">Rheinland-Pfalz</string> + <string name="saarland">Saarland</string> + <string name="sachsen_anhalt">Sachsen-Anhalt</string> + <string name="sachsen">Sachsen</string> + <string name="schleswig_holstein">Schleswig-Holstein</string> + <string name="thueringen">Thueringen</string> + <string name="iceland">Iceland</string> + <string name="ireland">Ireland</string> + <string name="italy">Italy</string> + <string name="portugal">Portugal</string> + <string name="spain">Spain</string> + <string name="mallorca">Mallorca</string> + <string name="galicia">Galicia</string> + <string name="scandinavia">Scandinavia</string> + <string name="finland">Finland</string> + <string name="switzerland">Switzerland</string> + <string name="united_kingdom">United Kingdom</string> + <string name="england">England</string> + <string name="buckinghamshire">Buckinghamshire</string> + <string name="cambridgeshire">Cambridgeshire</string> + <string name="cumbria">Cumbria</string> + <string name="east_yorkshire_with_hull">East yorkshire with hull</string> + <string name="essex">Essex</string> + <string name="herefordshire">Herefordshire</string> + <string name="kent">Kent</string> + <string name="lancashire">Lancashire</string> + <string name="leicestershire">Leicestershire</string> + <string name="norfolk">Norfolk</string> + <string name="nottinghamshire">Nottinghamshire</string> + <string name="oxfordshire">Oxfordshire</string> + <string name="shropshire">Shropshire</string> + <string name="somerset">Somerset</string> + <string name="south_yorkshire">South yorkshire</string> + <string name="suffolk">Suffolk</string> + <string name="surrey">Surrey</string> + <string name="wiltshire">Wiltshire</string> + <string name="scotland">Scotland</string> + <string name="wales">Wales</string> + <string name="albania">Albania</string> + <string name="belarus">Belarus</string> + <string name="russian_federation">Russian Federation</string> + <string name="bulgaria">Bulgaria</string> + <string name="bosnia_and_herzegovina">Bosnia and Herzegovina</string> + <string name="czech_republic">Czech Republic</string> + <string name="croatia">Croatia</string> + <string name="estonia">Estonia</string> + <string name="greece">Greece</string> + <string name="crete">Crete</string> + <string name="hungary">Hungary</string> + <string name="latvia">Latvia</string> + <string name="lithuania">Lithuania</string> + <string name="poland">Poland</string> + <string name="romania">Romania</string> + <string name="slovakia">Slovakia</string> + <string name="ukraine">Ukraine</string> + <string name="north_america">North America</string> + <string name="alaska">Alaska</string> + <string name="canada">Canada</string> + <string name="hawaii">Hawaii</string> + <string name="usa">USA</string> + <string name="except_alaska_and_hawaii">(except Alaska and Hawaii)</string> + <string name="midwest">Midwest</string> + <string name="michigan">Michigan</string> + <string name="ohio">Ohio</string> + <string name="northeast">Northeast</string> + <string name="massachusetts">Massachusetts</string> + <string name="vermont">Vermont</string> + <string name="pacific">Pacific</string> + <string name="south">South</string> + <string name="arkansas">Arkansas</string> + <string name="district_of_columbia">District of Columbia</string> + <string name="florida">Florida</string> + <string name="louisiana">Louisiana</string> + <string name="maryland">Maryland</string> + <string name="mississippi">Mississippi</string> + <string name="oklahoma">Oklahoma</string> + <string name="texas">Texas</string> + <string name="virginia">Virginia</string> + <string name="west_virginia">West Virginia</string> + <string name="west">West</string> + <string name="arizona">Arizona</string> + <string name="california">California</string> + <string name="colorado">Colorado</string> + <string name="idaho">Idaho</string> + <string name="montana">Montana</string> + <string name="new_mexico">New Mexico</string> + <string name="nevada">Nevada</string> + <string name="oregon">Oregon</string> + <string name="utah">Utah</string> + <string name="washington_state">Washington State</string> + <string name="south_middle_america">South+Middle America</string> + <string name="argentina">Argentina</string> + <string name="chile">Chile</string> + <string name="bolivia">Bolivia</string> + <string name="brazil">Brazil</string> + <string name="cuba">Cuba</string> + <string name="colombia">Colombia</string> + <string name="ecuador">Ecuador</string> + <string name="guyana">Guyana</string> + <string name="suriname">Suriname</string> + <string name="guyane_francaise">Guyane Francaise</string> + <string name="haiti">Haiti</string> + <string name="dominican_republic">Dominican Republic</string> + <string name="jamaica">Jamaica</string> + <string name="mexico">Mexico</string> + <string name="paraguay">Paraguay</string> + <string name="peru">Peru</string> + <string name="uruguay">Uruguay</string> + <string name="venezuela">Venezuela</string> </resources> diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java index cf0096453..75a513ef1 100644 --- a/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/android/src/org/navitproject/navit/Navit.java @@ -19,16 +19,7 @@ package org.navitproject.navit; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -45,7 +36,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; -import android.Manifest; import android.media.AudioManager; import android.net.Uri; import android.os.Build; @@ -53,6 +43,9 @@ import android.os.Bundle; import android.os.Environment; import android.os.Message; import android.os.PowerManager; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.NotificationCompat; +import android.support.v4.content.ContextCompat; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; @@ -63,834 +56,842 @@ import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.Toast; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Navit extends Activity { - private NavitDialogs dialogs; - private PowerManager.WakeLock wl; - private NavitActivityResult ActivityResults[]; - public static InputMethodManager mgr = null; - public static DisplayMetrics metrics = null; - public static int status_bar_height = 0; - private static int action_bar_default_height = 0; - public static int navigation_bar_height = 0; - public static int navigation_bar_height_landscape = 0; - public static int navigation_bar_width = 0; - public static Boolean show_soft_keyboard = false; - public static Boolean show_soft_keyboard_now_showing = false; - public static long last_pressed_menu_key = 0L; - public static long time_pressed_menu_key = 0L; - private static Intent startup_intent = null; - private static long startup_intent_timestamp = 0L; - private static String my_display_density = "mdpi"; - private static final int NavitDownloaderSelectMap_id = 967; - private static final int NavitAddressSearch_id = 70; - private static final int NavitSelectStorage_id = 43; - private static String NavitLanguage; - public static Resources NavitResources = null; - private static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit"; - private static final String TAG = "Navit"; - static String map_filename_path = null; - static final String NAVIT_DATA_DIR = "/data/data/" + NAVIT_PACKAGE_NAME; - private static final String NAVIT_DATA_SHARE_DIR = NAVIT_DATA_DIR + "/share"; - public static final String NAVIT_PREFS = "NavitPrefs"; - Boolean isFullscreen = false; - private static final int MY_PERMISSIONS_REQUEST_ALL = 101; - private static NotificationManager nm; - private static Navit navit; - - public static Navit getInstance() { - return navit; - } - - - /** - * @brief A Runnable to restore soft input when the user returns to the activity. - * - * An instance of this class can be passed to the main message queue in the Activity's - * {@code onRestore()} method. - */ - private class SoftInputRestorer implements Runnable { - public void run() { - Navit.this.showNativeKeyboard(); - } - } - - - public void removeFileIfExists(String source) { - File file = new File(source); - - if (!file.exists()) - return; - - file.delete(); - } - - public void copyFileIfExists(String source, String destination) throws IOException { - File file = new File(source); - - if (!file.exists()) - return; - - FileInputStream is = null; - FileOutputStream os = null; - - try { - is = new FileInputStream(source); - os = new FileOutputStream(destination); - - int len; - byte buffer[] = new byte[1024]; - - while ((len = is.read(buffer)) != -1) { - os.write(buffer, 0, len); - } - } finally { - /* Close the FileStreams to prevent Resource leaks */ - if (is != null) - is.close(); - - if (os != null) - os.close(); - } - } - - public String T(String in) - { - return getLocalizedString(in); - } - - private boolean extractRes(String resname, String result) { - boolean needs_update = false; - Log.e(TAG, "Res Name " + resname + ", result " + result); - int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); - Log.e(TAG, "Res ID " + id); - if (id == 0) - return false; - - File resultfile = new File(result); - if (!resultfile.exists()) { - needs_update = true; - File path = resultfile.getParentFile(); - if ( !path.exists() && !resultfile.getParentFile().mkdirs()) - return false; - } else { - PackageManager pm = getPackageManager(); - ApplicationInfo appInfo; - long apkUpdateTime = 0; - try { - appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0); - apkUpdateTime = new File(appInfo.sourceDir).lastModified(); - } catch (NameNotFoundException e) { - Log.e(TAG, "Could not read package infos"); - e.printStackTrace(); - } - if (apkUpdateTime > resultfile.lastModified()) - needs_update = true; - } - - if (needs_update) { - Log.e(TAG, "Extracting resource"); - - try { - InputStream resourcestream = NavitResources.openRawResource(id); - FileOutputStream resultfilestream = new FileOutputStream(resultfile); - byte[] buf = new byte[1024]; - int i = 0; - while ((i = resourcestream.read(buf)) != -1) { - resultfilestream.write(buf, 0, i); - } - resultfilestream.close(); - } catch (Exception e) { - Log.e(TAG, "Exception " + e.getMessage()); - return false; - } - } - return true; - } - - private void showInfos() - { - SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); - boolean firstStart = settings.getBoolean("firstStart", true); - - if (firstStart) - { - AlertDialog.Builder infobox = new AlertDialog.Builder(this); - infobox.setTitle(getString(R.string.initial_info_box_title)); // TRANS - infobox.setCancelable(false); - - infobox.setMessage(R.string.initial_info_box_message); - - // TRANS - infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface arg0, int arg1) { - Log.d(TAG, "Ok, user saw the infobox"); - } - }); - - // TRANS - infobox.setNeutralButton(getString(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface arg0, int arg1) { - Log.d(TAG, "user wants more info, show the website"); - String url = "http://wiki.navit-project.org/index.php/Navit_on_Android"; - Intent i = new Intent(Intent.ACTION_VIEW); - i.setData(Uri.parse(url)); - startActivity(i); - } - }); - infobox.show(); - SharedPreferences.Editor edit_settings = settings.edit(); - edit_settings.putBoolean("firstStart", false); - edit_settings.apply(); - } - } - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) - this.requestWindowFeature(Window.FEATURE_NO_TITLE); - else - this.getActionBar().hide(); - - navit = this; - dialogs = new NavitDialogs(this); - - NavitResources = getResources(); - - // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.) - Navit.startup_intent = this.getIntent(); - // hack! Remember time stamps, and only allow 4 secs. later in onResume to set target! - Navit.startup_intent_timestamp = System.currentTimeMillis(); - Log.d(TAG, "**1**A " + startup_intent.getAction()); - Log.d(TAG, "**1**D " + startup_intent.getDataString()); - - // NOTIFICATION - // Setup the status bar notification - // This notification is removed in the exit() function - nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager - PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(this); - builder.setContentIntent(appIntent); - builder.setAutoCancel(false).setOngoing(true); - builder.setContentTitle(getString(R.string.app_name)); - builder.setContentText(getString(R.string.notification_event_default)); - builder.setSmallIcon(R.drawable.ic_notify); - Notification NavitNotification = builder.build(); - nm.notify(R.string.app_name, NavitNotification);// Show the notification - - // Status and navigation bar sizes - // These are platform defaults and do not change with rotation, but we have to figure out which ones apply - // (is the navigation bar visible? on the side or at the bottom?) - Resources resources = getResources(); - int shid = resources.getIdentifier("status_bar_height", "dimen", "android"); - int adhid = resources.getIdentifier("action_bar_default_height", "dimen", "android"); - int nhid = resources.getIdentifier("navigation_bar_height", "dimen", "android"); - int nhlid = resources.getIdentifier("navigation_bar_height_landscape", "dimen", "android"); - int nwid = resources.getIdentifier("navigation_bar_width", "dimen", "android"); - status_bar_height = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0; - action_bar_default_height = (adhid > 0) ? resources.getDimensionPixelSize(adhid) : 0; - navigation_bar_height = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0; - navigation_bar_height_landscape = (nhlid > 0) ? resources.getDimensionPixelSize(nhlid) : 0; - navigation_bar_width = (nwid > 0) ? resources.getDimensionPixelSize(nwid) : 0; - Log.d(TAG, String.format("status_bar_height=%d, action_bar_default_height=%d, navigation_bar_height=%d, navigation_bar_height_landscape=%d, navigation_bar_width=%d", - status_bar_height, action_bar_default_height, navigation_bar_height, navigation_bar_height_landscape, navigation_bar_width)); - if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)|| - (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { - Log.d (TAG,"ask for permission(s)"); - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_ALL); - } - // get the local language ------------- - Locale locale = java.util.Locale.getDefault(); - String lang = locale.getLanguage(); - String langc = lang; - Log.d(TAG, "lang=" + lang); - int pos = lang.indexOf('_'); - if (pos != -1) - { - langc = lang.substring(0, pos); - NavitLanguage = langc + lang.substring(pos).toUpperCase(locale); - Log.d(TAG, "substring lang " + NavitLanguage.substring(pos).toUpperCase(locale)); - } - else - { - String country = locale.getCountry(); - Log.d(TAG, "Country1 " + country); - Log.d(TAG, "Country2 " + country.toUpperCase(locale)); - NavitLanguage = langc + "_" + country.toUpperCase(locale); - } - Log.d(TAG, "Language " + lang); - - SharedPreferences prefs = getSharedPreferences(NAVIT_PREFS,MODE_PRIVATE); - map_filename_path = prefs.getString("filenamePath", Environment.getExternalStorageDirectory().getPath() + "/navit/"); - - // make sure the new path for the navitmap.bin file(s) exist!! - File navit_maps_dir = new File(map_filename_path); - navit_maps_dir.mkdirs(); - - // make sure the share dir exists - File navit_data_share_dir = new File(NAVIT_DATA_SHARE_DIR); - navit_data_share_dir.mkdirs(); - - Display display_ = getWindowManager().getDefaultDisplay(); - int width_ = display_.getWidth(); - int height_ = display_.getHeight(); - metrics = new DisplayMetrics(); - display_.getMetrics(Navit.metrics); - int densityDpi = (int)(( Navit.metrics.density*160)-.5f); - Log.d(TAG, "Navit -> pixels x=" + width_ + " pixels y=" + height_); - Log.d(TAG, "Navit -> dpi=" + densityDpi); - Log.d(TAG, "Navit -> density=" + Navit.metrics.density); - Log.d(TAG, "Navit -> scaledDensity=" + Navit.metrics.scaledDensity); - - ActivityResults = new NavitActivityResult[16]; - setVolumeControlStream(AudioManager.STREAM_MUSIC); - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen"); - - if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) - { - Log.e(TAG, "Failed to extract language resource " + langc); - } - - if (densityDpi <= 120) - { - my_display_density = "ldpi"; - } - else if (densityDpi <= 160) - { - my_display_density = "mdpi"; - } - else if (densityDpi < 240) - { - my_display_density = "hdpi"; - } - else if (densityDpi < 320) - { - my_display_density = "xhdpi"; - } - else if (densityDpi < 480) - { - my_display_density = "xxhdpi"; - } - else if (densityDpi < 640) - { - my_display_density = "xxxhdpi"; - } - else - { - Log.e(TAG, "found device of very high density ("+densityDpi+")"); - Log.e(TAG, "using xxxhdpi values"); - my_display_density = "xxxhdpi"; - } - - if (!extractRes("navit" + my_display_density, NAVIT_DATA_DIR + "/share/navit.xml")) - { - Log.e(TAG, "Failed to extract navit.xml for " + my_display_density); - } - - Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); - NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, NAVIT_DATA_DIR+"/bin/navit",map_filename_path); - - showInfos(); - - Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - } - - @Override - public void onResume() - { - super.onResume(); - Log.d(TAG, "OnResume"); - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { - /* Required to make system bars fully transparent */ - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + private NavitDialogs dialogs; + private PowerManager.WakeLock wl; + private NavitActivityResult ActivityResults[]; + public static InputMethodManager mgr = null; + public static DisplayMetrics metrics = null; + public static int status_bar_height = 0; + private static int action_bar_default_height = 0; + public static int navigation_bar_height = 0; + public static int navigation_bar_height_landscape = 0; + public static int navigation_bar_width = 0; + public static Boolean show_soft_keyboard = false; + public static Boolean show_soft_keyboard_now_showing = false; + public static long last_pressed_menu_key = 0L; + public static long time_pressed_menu_key = 0L; + private static Intent startup_intent = null; + private static long startup_intent_timestamp = 0L; + private static String my_display_density = "mdpi"; + private static final int NavitDownloaderSelectMap_id = 967; + private static final int NavitAddressSearch_id = 70; + private static final int NavitSelectStorage_id = 43; + private static String NavitLanguage; + private static Resources NavitResources = null; + private static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit"; + private static final String TAG = "Navit"; + static String map_filename_path = null; + static final String NAVIT_DATA_DIR = "/data/data/" + NAVIT_PACKAGE_NAME; + private static final String NAVIT_DATA_SHARE_DIR = NAVIT_DATA_DIR + "/share"; + public static final String NAVIT_PREFS = "NavitPrefs"; + Boolean isFullscreen = false; + private static final int MY_PERMISSIONS_REQUEST_ALL = 101; + private static NotificationManager nm; + private static Navit navit; + + public static Navit getInstance() { + return navit; + } + + + /** + * @brief A Runnable to restore soft input when the user returns to the activity. + * + * An instance of this class can be passed to the main message queue in the Activity's + * {@code onRestore()} method. + */ + private class SoftInputRestorer implements Runnable { + public void run() { + Navit.this.showNativeKeyboard(); + } + } + + + public void removeFileIfExists(String source) { + File file = new File(source); + + if (!file.exists()) + return; + + file.delete(); + } + + public void copyFileIfExists(String source, String destination) throws IOException { + File file = new File(source); + + if (!file.exists()) + return; + + FileInputStream is = null; + FileOutputStream os = null; + + try { + is = new FileInputStream(source); + os = new FileOutputStream(destination); + + int len; + byte buffer[] = new byte[1024]; + + while ((len = is.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + } finally { + /* Close the FileStreams to prevent Resource leaks */ + if (is != null) + is.close(); + + if (os != null) + os.close(); + } + } + + /* Translates a string from its id + * in R.strings + * + * @param Rid resource identifier + * @retrun translated string + */ + String getTstring(int Rid){ + return getLocalizedString(getString(Rid)); + } + + private boolean extractRes(String resname, String result) { + boolean needs_update = false; + Log.e(TAG, "Res Name " + resname + ", result " + result); + int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); + Log.e(TAG, "Res ID " + id); + if (id == 0) + return false; + + File resultfile = new File(result); + if (!resultfile.exists()) { + needs_update = true; + File path = resultfile.getParentFile(); + if ( !path.exists() && !resultfile.getParentFile().mkdirs()) + return false; + } else { + PackageManager pm = getPackageManager(); + ApplicationInfo appInfo; + long apkUpdateTime = 0; + try { + appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0); + apkUpdateTime = new File(appInfo.sourceDir).lastModified(); + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not read package infos"); + e.printStackTrace(); + } + if (apkUpdateTime > resultfile.lastModified()) + needs_update = true; + } + + if (needs_update) { + Log.e(TAG, "Extracting resource"); + + try { + InputStream resourcestream = NavitResources.openRawResource(id); + FileOutputStream resultfilestream = new FileOutputStream(resultfile); + byte[] buf = new byte[1024]; + int i; + while ((i = resourcestream.read(buf)) != -1) { + resultfilestream.write(buf, 0, i); + } + resultfilestream.close(); + } catch (Exception e) { + Log.e(TAG, "Exception " + e.getMessage()); + return false; + } + } + return true; + } + + private void showInfos() + { + SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); + boolean firstStart = settings.getBoolean("firstStart", true); + + if (firstStart) + { + AlertDialog.Builder infobox = new AlertDialog.Builder(this); + infobox.setTitle(getTstring(R.string.initial_info_box_title)); // TRANS + infobox.setCancelable(false); + + infobox.setMessage(getTstring(R.string.initial_info_box_message)); + + infobox.setPositiveButton(getTstring(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.d(TAG, "Ok, user saw the infobox"); + } + }); + + infobox.setNeutralButton(getTstring(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.d(TAG, "user wants more info, show the website"); + String url = "http://wiki.navit-project.org/index.php/Navit_on_Android"; + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + startActivity(i); + } + }); + infobox.show(); + SharedPreferences.Editor edit_settings = settings.edit(); + edit_settings.putBoolean("firstStart", false); + edit_settings.apply(); + } + } + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) + this.requestWindowFeature(Window.FEATURE_NO_TITLE); + else + this.getActionBar().hide(); + + navit = this; + dialogs = new NavitDialogs(this); + + NavitResources = getResources(); + + // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.) + Navit.startup_intent = this.getIntent(); + // hack! Remember time stamps, and only allow 4 secs. later in onResume to set target! + Navit.startup_intent_timestamp = System.currentTimeMillis(); + Log.d(TAG, "**1**A " + startup_intent.getAction()); + Log.d(TAG, "**1**D " + startup_intent.getDataString()); + + // NOTIFICATION + // Setup the status bar notification + // This notification is removed in the exit() function + nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager + PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this); + builder.setContentIntent(appIntent); + builder.setAutoCancel(false).setOngoing(true); + builder.setContentTitle(getTstring(R.string.app_name)); + builder.setContentText(getTstring(R.string.notification_event_default)); + builder.setSmallIcon(R.drawable.ic_notify); + Notification NavitNotification = builder.build(); + nm.notify(R.string.app_name, NavitNotification);// Show the notification + + // Status and navigation bar sizes + // These are platform defaults and do not change with rotation, but we have to figure out which ones apply + // (is the navigation bar visible? on the side or at the bottom?) + Resources resources = getResources(); + int shid = resources.getIdentifier("status_bar_height", "dimen", "android"); + int adhid = resources.getIdentifier("action_bar_default_height", "dimen", "android"); + int nhid = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + int nhlid = resources.getIdentifier("navigation_bar_height_landscape", "dimen", "android"); + int nwid = resources.getIdentifier("navigation_bar_width", "dimen", "android"); + status_bar_height = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0; + action_bar_default_height = (adhid > 0) ? resources.getDimensionPixelSize(adhid) : 0; + navigation_bar_height = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0; + navigation_bar_height_landscape = (nhlid > 0) ? resources.getDimensionPixelSize(nhlid) : 0; + navigation_bar_width = (nwid > 0) ? resources.getDimensionPixelSize(nwid) : 0; + Log.d(TAG, String.format("status_bar_height=%d, action_bar_default_height=%d, navigation_bar_height=%d, navigation_bar_height_landscape=%d, navigation_bar_width=%d", + status_bar_height, action_bar_default_height, navigation_bar_height, navigation_bar_height_landscape, navigation_bar_width)); + if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)|| + (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + Log.d (TAG,"ask for permission(s)"); + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_ALL); + } + // get the local language ------------- + Locale locale = java.util.Locale.getDefault(); + String lang = locale.getLanguage(); + String langc = lang; + Log.d(TAG, "lang=" + lang); + int pos = lang.indexOf('_'); + if (pos != -1) + { + langc = lang.substring(0, pos); + NavitLanguage = langc + lang.substring(pos).toUpperCase(locale); + Log.d(TAG, "substring lang " + NavitLanguage.substring(pos).toUpperCase(locale)); + } + else + { + String country = locale.getCountry(); + Log.d(TAG, "Country1 " + country); + Log.d(TAG, "Country2 " + country.toUpperCase(locale)); + NavitLanguage = langc + "_" + country.toUpperCase(locale); + } + Log.d(TAG, "Language " + lang); + + SharedPreferences prefs = getSharedPreferences(NAVIT_PREFS,MODE_PRIVATE); + map_filename_path = prefs.getString("filenamePath", Environment.getExternalStorageDirectory().getPath() + "/navit/"); + + // make sure the new path for the navitmap.bin file(s) exist!! + File navit_maps_dir = new File(map_filename_path); + navit_maps_dir.mkdirs(); + + // make sure the share dir exists + File navit_data_share_dir = new File(NAVIT_DATA_SHARE_DIR); + navit_data_share_dir.mkdirs(); + + Display display_ = getWindowManager().getDefaultDisplay(); + int width_ = display_.getWidth(); + int height_ = display_.getHeight(); + metrics = new DisplayMetrics(); + display_.getMetrics(Navit.metrics); + int densityDpi = (int)(( Navit.metrics.density*160)-.5f); + Log.d(TAG, "Navit -> pixels x=" + width_ + " pixels y=" + height_); + Log.d(TAG, "Navit -> dpi=" + densityDpi); + Log.d(TAG, "Navit -> density=" + Navit.metrics.density); + Log.d(TAG, "Navit -> scaledDensity=" + Navit.metrics.scaledDensity); + + ActivityResults = new NavitActivityResult[16]; + setVolumeControlStream(AudioManager.STREAM_MUSIC); + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen"); + + if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) + { + Log.e(TAG, "Failed to extract language resource " + langc); + } + + if (densityDpi <= 120) + { + my_display_density = "ldpi"; + } + else if (densityDpi <= 160) + { + my_display_density = "mdpi"; + } + else if (densityDpi < 240) + { + my_display_density = "hdpi"; + } + else if (densityDpi < 320) + { + my_display_density = "xhdpi"; + } + else if (densityDpi < 480) + { + my_display_density = "xxhdpi"; + } + else if (densityDpi < 640) + { + my_display_density = "xxxhdpi"; + } + else + { + Log.e(TAG, "found device of very high density ("+densityDpi+")"); + Log.e(TAG, "using xxxhdpi values"); + my_display_density = "xxxhdpi"; + } + + if (!extractRes("navit" + my_display_density, NAVIT_DATA_DIR + "/share/navit.xml")) + { + Log.e(TAG, "Failed to extract navit.xml for " + my_display_density); + } + + Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); + NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, NAVIT_DATA_DIR+"/bin/navit",map_filename_path); + + showInfos(); + + Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + } + + @Override + public void onResume() + { + super.onResume(); + Log.d(TAG, "OnResume"); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + /* Required to make system bars fully transparent */ + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); - } - //InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - // DEBUG - // intent_data = "google.navigation:q=Wien Burggasse 27"; - // intent_data = "google.navigation:q=48.25676,16.643"; - // intent_data = "google.navigation:ll=48.25676,16.643&q=blabla-strasse"; - // intent_data = "google.navigation:ll=48.25676,16.643"; - if (startup_intent != null) - { - if (System.currentTimeMillis() <= Navit.startup_intent_timestamp + 4000L) - { - Log.d(TAG, "**2**A " + startup_intent.getAction()); - Log.d(TAG, "**2**D " + startup_intent.getDataString()); - String navi_scheme = startup_intent.getScheme(); - if ( navi_scheme != null && navi_scheme.equals("google.navigation")) { - parseNavigationURI(startup_intent.getData().getSchemeSpecificPart()); - } - } - else { - Log.e(TAG, "timestamp for navigate_to expired! not using data"); - } - } - Log.d(TAG, "onResume"); - if (show_soft_keyboard_now_showing) { - /* Calling showNativeKeyboard() directly won't work here, we need to use the message queue */ - View cf = getCurrentFocus(); - if (cf == null) - Log.e(TAG, "no view in focus, can't get a handler"); - else - cf.getHandler().post(new SoftInputRestorer()); - } - } - - @Override - public void onPause() { - super.onPause(); - Log.d(TAG, "onPause"); - if (show_soft_keyboard_now_showing) { - Log.d(TAG, "onPause:hiding soft input"); - this.hideNativeKeyboard(); - show_soft_keyboard_now_showing = true; - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { - switch (requestCode) { - case MY_PERMISSIONS_REQUEST_ALL: { - if (grantResults.length > 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED + } + //InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + // DEBUG + // intent_data = "google.navigation:q=Wien Burggasse 27"; + // intent_data = "google.navigation:q=48.25676,16.643"; + // intent_data = "google.navigation:ll=48.25676,16.643&q=blabla-strasse"; + // intent_data = "google.navigation:ll=48.25676,16.643"; + if (startup_intent != null) + { + if (System.currentTimeMillis() <= Navit.startup_intent_timestamp + 4000L) + { + Log.d(TAG, "**2**A " + startup_intent.getAction()); + Log.d(TAG, "**2**D " + startup_intent.getDataString()); + String navi_scheme = startup_intent.getScheme(); + if ( navi_scheme != null && navi_scheme.equals("google.navigation")) { + parseNavigationURI(startup_intent.getData().getSchemeSpecificPart()); + } + } + else { + Log.e(TAG, "timestamp for navigate_to expired! not using data"); + } + } + Log.d(TAG, "onResume"); + if (show_soft_keyboard_now_showing) { + /* Calling showNativeKeyboard() directly won't work here, we need to use the message queue */ + View cf = getCurrentFocus(); + if (cf == null) + Log.e(TAG, "no view in focus, can't get a handler"); + else + cf.getHandler().post(new SoftInputRestorer()); + } + } + + @Override + public void onPause() { + super.onPause(); + Log.d(TAG, "onPause"); + if (show_soft_keyboard_now_showing) { + Log.d(TAG, "onPause:hiding soft input"); + this.hideNativeKeyboard(); + show_soft_keyboard_now_showing = true; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + switch (requestCode) { + case MY_PERMISSIONS_REQUEST_ALL: { + if (grantResults.length > 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { - return; - } - AlertDialog.Builder infobox = new AlertDialog.Builder(this); - infobox.setTitle(getString(R.string.permissions_info_box_title)); // TRANS - infobox.setCancelable(false); - infobox.setMessage(getString(R.string.permissions_not_granted)); - // TRANS - infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { + return; + } + AlertDialog.Builder infobox = new AlertDialog.Builder(this); + infobox.setTitle(getTstring(R.string.permissions_info_box_title)); // TRANS + infobox.setCancelable(false); + infobox.setMessage(getTstring(R.string.permissions_not_granted)); + // TRANS + infobox.setPositiveButton(getTstring(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { exit(); } }); - infobox.show(); - } - } - } - - private void parseNavigationURI(String schemeSpecificPart) { - String naviData[]= schemeSpecificPart.split("&"); - Pattern p = Pattern.compile("(.*)=(.*)"); - Map<String,String> params = new HashMap<String,String>(); - for (int count=0; count < naviData.length; count++) { - Matcher m = p.matcher(naviData[count]); - - if (m.matches()) { - params.put(m.group(1), m.group(2)); - } - } - - // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts) - // a: google.navigation:ll=48.25676,16.643&q=blabla-strasse - // c: google.navigation:ll=48.25676,16.643 - // b: google.navigation:q=48.25676,16.643 - - Float lat; - Float lon; - Bundle b = new Bundle(); - - String geoString = params.get("ll"); - if (geoString != null) { - String address = params.get("q"); - if (address != null) b.putString("q", address); - } - else { - geoString = params.get("q"); - } - - if ( geoString != null) { - if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) { - String geo[] = geoString.split(","); - if (geo.length == 2) { - try { - lat = Float.valueOf(geo[0]); - lon = Float.valueOf(geo[1]); - b.putFloat("lat", lat); - b.putFloat("lon", lon); - Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); - - msg.setData(b); - msg.sendToTarget(); - Log.e(TAG, "target found (b): " + geoString); - } catch (NumberFormatException e) { - e.printStackTrace(); - } - } - } - else { - start_targetsearch_from_intent(geoString); - } - } - } - - public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) - { - ActivityResults[requestCode] = ActivityResult; - } - - /* - * This is unused since we dont have the dropdown - * TODO: recheck if this is right and remove this! - */ - @Override - public boolean onPrepareOptionsMenu(Menu menu) - { - super.onPrepareOptionsMenu(menu); - //Log.e("Navit","onPrepareOptionsMenu"); - // this gets called every time the menu is opened!! - // change menu items here! - menu.clear(); - - // group-id,item-id,sort order number - //menu.add(1, 1, 100, getString(R.string.optionsmenu_zoom_in)); //TRANS - //menu.add(1, 2, 200, getString(R.string.optionsmenu_zoom_out)); //TRANS - - menu.add(1, 3, 300, getString(R.string.optionsmenu_download_maps)); //TRANS - menu.add(1, 5, 400, getString(R.string.optionsmenu_toggle_poi)); //TRANS - - menu.add(1, 6, 500, getString(R.string.optionsmenu_address_search)); //TRANS - menu.add(1, 10, 600, getString(R.string.optionsmenu_set_map_location)); - - menu.add(1, 99, 900, getString(R.string.optionsmenu_exit_navit)); //TRANS - - /* Only show the Backup to SD-Card Option if we really have one */ - if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) - menu.add(1, 7, 700, getString(R.string.optionsmenu_backup_restore)); //TRANS - - return true; - } - - // define callback id here - private NavitGraphics N_NavitGraphics = null; - - // callback id gets set here when called from NavitGraphics - public void setKeypressCallback(int kp_cb_id, NavitGraphics ng) - { - N_NavitGraphics = ng; - } - - public void setMotionCallback(int mo_cb_id, NavitGraphics ng) - { - N_NavitGraphics = ng; - } - - public NavitGraphics getNavitGraphics() { - return N_NavitGraphics; - } - - - public void start_targetsearch_from_intent(String target_address) - { - if (target_address == null || target_address.equals("")) - { - // empty search string entered - Toast.makeText(getApplicationContext(), getString(R.string.address_search_not_found), Toast.LENGTH_LONG).show(); //TRANS - } - else - { - Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); - search_intent.putExtra("search_string", target_address); - this.startActivityForResult(search_intent, NavitAddressSearch_id); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) - { - runOptionsItem(item.getItemId()); - return true; - } - - public void runOptionsItem(int id) - { - switch (id) - { - case 1 : - // zoom in - Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_IN.ordinal()).sendToTarget(); - // if we zoom, hide the bubble - Log.d(TAG, "onOptionsItemSelected -> zoom in"); - break; - case 2 : - // zoom out - Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_OUT.ordinal()).sendToTarget(); - // if we zoom, hide the bubble - Log.d(TAG, "onOptionsItemSelected -> zoom out"); - break; - case 3 : - // map download menu - Intent map_download_list_activity = new Intent(this, NavitDownloadSelectMapActivity.class); - startActivityForResult(map_download_list_activity, Navit.NavitDownloaderSelectMap_id); - break; - case 5 : - // toggle the normal POI layers and labels (to avoid double POIs) - Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); - Bundle b = new Bundle(); - b.putString("cmd", "toggle_layer(\"POI Symbols\");"); - msg.setData(b); - msg.sendToTarget(); - - msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); - b = new Bundle(); - b.putString("cmd", "toggle_layer(\"POI Labels\");"); - msg.setData(b); - msg.sendToTarget(); - - // toggle full POI icons on/off - msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); - b = new Bundle(); - b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");"); - msg.setData(b); - msg.sendToTarget(); - - break; - case 6 : - // ok startup address search activity - Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); - this.startActivityForResult(search_intent, NavitAddressSearch_id); - break; - case 7 : - /* Backup / Restore */ - showDialog(NavitDialogs.DIALOG_BACKUP_RESTORE); - break; - case 10: - setMapLocation(); - break; - case 99 : - // exit - this.onStop(); - this.exit(); - break; - } - } - - - /** - * @brief Shows the Options menu. - * - * Calling this method has the same effect as pressing the hardware Menu button, where present, or touching - * the overflow button in the Action bar. - */ - public void showMenu() { - openOptionsMenu(); - } - - - /** - * @brief Shows the native keyboard or other input method. - */ - public int showNativeKeyboard() { - /* - * Apologies for the huge mess that this function is, but Android's soft input API is a big - * nightmare. Its devs have mercifully given us an option to show or hide the keyboard, but - * there is no reliable way to figure out if it is actually showing, let alone how much of the - * screen it occupies, so our best bet is guesswork. - */ - Configuration config = getResources().getConfiguration(); - if ((config.keyboard == Configuration.KEYBOARD_QWERTY) && (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)) - /* physical keyboard present, exit */ - return 0; - - /* Use SHOW_FORCED here, else keyboard won't show in landscape mode */ - mgr.showSoftInput(getCurrentFocus(), InputMethodManager.SHOW_FORCED); - show_soft_keyboard_now_showing = true; - - /* - * Crude way to estimate the height occupied by the keyboard: for AOSP on KitKat and Lollipop it - * is about 62-63% of available screen width (in portrait mode) but no more than slightly above - * 46% of height (in landscape mode). - */ - Display display_ = getWindowManager().getDefaultDisplay(); - int width_ = display_.getWidth(); - int height_ = display_.getHeight(); - int maxHeight = height_ * 47 / 100; - int inputHeight = width_ * 63 / 100; - if (inputHeight > (maxHeight)) - inputHeight = maxHeight; - - /* the receiver isn't going to fire before the UI thread becomes idle, well after this method returns */ - Log.d(TAG, "showNativeKeyboard:return (assuming true)"); - return inputHeight; - } - - - /** - * @brief Hides the native keyboard or other input method. - */ - public void hideNativeKeyboard() { - mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); - show_soft_keyboard_now_showing = false; - } - - - void setDestination(float latitude, float longitude, String address) { - Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + address, Toast.LENGTH_LONG).show(); //TRANS - - Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); - Bundle b = new Bundle(); - b.putFloat("lat", latitude); - b.putFloat("lon", longitude); - b.putString("q", address); - msg.setData(b); - msg.sendToTarget(); - } - - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - switch (requestCode) - { - case Navit.NavitDownloaderSelectMap_id : - if (resultCode == Activity.RESULT_OK) - { - Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD - , data.getIntExtra("map_index", -1), 0); - msg.sendToTarget(); - } - break; - case NavitAddressSearch_id : - if (resultCode == Activity.RESULT_OK) { - Bundle destination = data.getExtras(); - Toast.makeText( getApplicationContext(),getString(R.string.address_search_set_destination) + "\n" + destination.getString(("q")), Toast.LENGTH_LONG).show(); //TRANS - - Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); - msg.setData(destination); - msg.sendToTarget(); - } - break; - case NavitSelectStorage_id : - if(resultCode == RESULT_OK) { - String newDir = data.getStringExtra(FileBrowserActivity.returnDirectoryParameter); - Log.d(TAG, "selected path= "+newDir); - if(!newDir.contains("/navit")) - newDir = newDir+"/navit/"; - else - newDir = newDir+"/"; - SharedPreferences prefs = this.getSharedPreferences(NAVIT_PREFS,MODE_PRIVATE); - SharedPreferences.Editor prefs_editor = prefs.edit(); - prefs_editor.putString("filenamePath", newDir); - prefs_editor.apply(); - Toast.makeText(this, String.format(T("New location set to %s\nRestart Navit to apply the changes."),newDir),Toast.LENGTH_LONG).show(); - } - else Log.w(TAG, "select path failed"); - break; - default : - ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); - break; - } - } - - @Override + infobox.show(); + } + } + } + + private void parseNavigationURI(String schemeSpecificPart) { + String naviData[]= schemeSpecificPart.split("&"); + Pattern p = Pattern.compile("(.*)=(.*)"); + Map<String,String> params = new HashMap<String,String>(); + for (int count=0; count < naviData.length; count++) { + Matcher m = p.matcher(naviData[count]); + + if (m.matches()) { + params.put(m.group(1), m.group(2)); + } + } + + // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts) + // a: google.navigation:ll=48.25676,16.643&q=blabla-strasse + // c: google.navigation:ll=48.25676,16.643 + // b: google.navigation:q=48.25676,16.643 + + Float lat; + Float lon; + Bundle b = new Bundle(); + + String geoString = params.get("ll"); + if (geoString != null) { + String address = params.get("q"); + if (address != null) b.putString("q", address); + } + else { + geoString = params.get("q"); + } + + if ( geoString != null) { + if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) { + String geo[] = geoString.split(","); + if (geo.length == 2) { + try { + lat = Float.valueOf(geo[0]); + lon = Float.valueOf(geo[1]); + b.putFloat("lat", lat); + b.putFloat("lon", lon); + Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); + + msg.setData(b); + msg.sendToTarget(); + Log.e(TAG, "target found (b): " + geoString); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + } + else { + start_targetsearch_from_intent(geoString); + } + } + } + + public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) + { + ActivityResults[requestCode] = ActivityResult; + } + + + @Override + public boolean onPrepareOptionsMenu(Menu menu) + { + super.onPrepareOptionsMenu(menu); + //Log.e("Navit","onPrepareOptionsMenu"); + // this gets called every time the menu is opened!! + // change menu items here! + menu.clear(); + + // group-id,item-id,sort order number + //menu.add(1, 1, 100, getString(R.string.optionsmenu_zoom_in)); //TRANS + //menu.add(1, 2, 200, getString(R.string.optionsmenu_zoom_out)); //TRANS + + menu.add(1, 3, 300, getTstring(R.string.optionsmenu_download_maps)); //TRANS + menu.add(1, 5, 400, getTstring(R.string.optionsmenu_toggle_poi)); //TRANS + + menu.add(1, 6, 500, getTstring(R.string.optionsmenu_address_search)); //TRANS + menu.add(1, 10, 600, getTstring(R.string.optionsmenu_set_map_location)); + + menu.add(1, 99, 900, getTstring(R.string.optionsmenu_exit_navit)); //TRANS + + /* Only show the Backup to SD-Card Option if we really have one */ + if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) + menu.add(1, 7, 700, getTstring(R.string.optionsmenu_backup_restore)); //TRANS + + return true; + } + + // define callback id here + private NavitGraphics N_NavitGraphics = null; + + // callback id gets set here when called from NavitGraphics + public void setKeypressCallback(int kp_cb_id, NavitGraphics ng) + { + N_NavitGraphics = ng; + } + + public void setMotionCallback(int mo_cb_id, NavitGraphics ng) + { + N_NavitGraphics = ng; + } + + public NavitGraphics getNavitGraphics() { + return N_NavitGraphics; + } + + + public void start_targetsearch_from_intent(String target_address) + { + if (target_address == null || target_address.equals("")) + { + // empty search string entered + Toast.makeText(getApplicationContext(), getTstring(R.string.address_search_not_found), Toast.LENGTH_LONG).show(); //TRANS + } + else + { + Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); + search_intent.putExtra("search_string", target_address); + this.startActivityForResult(search_intent, NavitAddressSearch_id); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + runOptionsItem(item.getItemId()); + return true; + } + + public void runOptionsItem(int id) + { + switch (id) + { + case 1 : + // zoom in + Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_IN.ordinal()).sendToTarget(); + // if we zoom, hide the bubble + Log.d(TAG, "onOptionsItemSelected -> zoom in"); + break; + case 2 : + // zoom out + Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_ZOOM_OUT.ordinal()).sendToTarget(); + // if we zoom, hide the bubble + Log.d(TAG, "onOptionsItemSelected -> zoom out"); + break; + case 3 : + // map download menu + Intent map_download_list_activity = new Intent(this, NavitDownloadSelectMapActivity.class); + startActivityForResult(map_download_list_activity, Navit.NavitDownloaderSelectMap_id); + break; + case 5 : + // toggle the normal POI layers and labels (to avoid double POIs) + Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); + Bundle b = new Bundle(); + b.putString("cmd", "toggle_layer(\"POI Symbols\");"); + msg.setData(b); + msg.sendToTarget(); + + msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); + b = new Bundle(); + b.putString("cmd", "toggle_layer(\"POI Labels\");"); + msg.setData(b); + msg.sendToTarget(); + + // toggle full POI icons on/off + msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); + b = new Bundle(); + b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");"); + msg.setData(b); + msg.sendToTarget(); + + break; + case 6 : + // ok startup address search activity + Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); + this.startActivityForResult(search_intent, NavitAddressSearch_id); + break; + case 7 : + /* Backup / Restore */ + showDialog(NavitDialogs.DIALOG_BACKUP_RESTORE); + break; + case 10: + setMapLocation(); + break; + case 99 : + // exit + this.onStop(); + this.exit(); + break; + } + } + + + /** + * @brief Shows the Options menu. + * + * Calling this method has the same effect as pressing the hardware Menu button, where present, or touching + * the overflow button in the Action bar. + */ + public void showMenu() { + openOptionsMenu(); + } + + + /** + * @brief Shows the native keyboard or other input method. + */ + public int showNativeKeyboard() { + /* + * Apologies for the huge mess that this function is, but Android's soft input API is a big + * nightmare. Its devs have mercifully given us an option to show or hide the keyboard, but + * there is no reliable way to figure out if it is actually showing, let alone how much of the + * screen it occupies, so our best bet is guesswork. + */ + Configuration config = getResources().getConfiguration(); + if ((config.keyboard == Configuration.KEYBOARD_QWERTY) && (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)) + /* physical keyboard present, exit */ + return 0; + + /* Use SHOW_FORCED here, else keyboard won't show in landscape mode */ + mgr.showSoftInput(getCurrentFocus(), InputMethodManager.SHOW_FORCED); + show_soft_keyboard_now_showing = true; + + /* + * Crude way to estimate the height occupied by the keyboard: for AOSP on KitKat and Lollipop it + * is about 62-63% of available screen width (in portrait mode) but no more than slightly above + * 46% of height (in landscape mode). + */ + Display display_ = getWindowManager().getDefaultDisplay(); + int width_ = display_.getWidth(); + int height_ = display_.getHeight(); + int maxHeight = height_ * 47 / 100; + int inputHeight = width_ * 63 / 100; + if (inputHeight > (maxHeight)) + inputHeight = maxHeight; + + /* the receiver isn't going to fire before the UI thread becomes idle, well after this method returns */ + Log.d(TAG, "showNativeKeyboard:return (assuming true)"); + return inputHeight; + } + + + /** + * @brief Hides the native keyboard or other input method. + */ + public void hideNativeKeyboard() { + mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + show_soft_keyboard_now_showing = false; + } + + + void setDestination(float latitude, float longitude, String address) { + Toast.makeText( getApplicationContext(),getTstring(R.string.address_search_set_destination) + "\n" + address, Toast.LENGTH_LONG).show(); //TRANS + + Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); + Bundle b = new Bundle(); + b.putFloat("lat", latitude); + b.putFloat("lon", longitude); + b.putString("q", address); + msg.setData(b); + msg.sendToTarget(); + } + + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) + { + case Navit.NavitDownloaderSelectMap_id : + if (resultCode == Activity.RESULT_OK) + { + Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD + , data.getIntExtra("map_index", -1), 0); + msg.sendToTarget(); + } + break; + case NavitAddressSearch_id : + if (resultCode == Activity.RESULT_OK) { + Bundle destination = data.getExtras(); + Toast.makeText( getApplicationContext(),getTstring(R.string.address_search_set_destination) + "\n" + destination.getString(("q")), Toast.LENGTH_LONG).show(); //TRANS + + Message msg = Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.CLB_SET_DESTINATION.ordinal()); + msg.setData(destination); + msg.sendToTarget(); + } + break; + case NavitSelectStorage_id : + if(resultCode == RESULT_OK) { + String newDir = data.getStringExtra(FileBrowserActivity.returnDirectoryParameter); + Log.d(TAG, "selected path= "+newDir); + if(!newDir.contains("/navit")) + newDir = newDir+"/navit/"; + else + newDir = newDir+"/"; + SharedPreferences prefs = this.getSharedPreferences(NAVIT_PREFS,MODE_PRIVATE); + SharedPreferences.Editor prefs_editor = prefs.edit(); + prefs_editor.putString("filenamePath", newDir); + prefs_editor.apply(); + + Toast.makeText(this, String.format(getTstring(R.string.map_location_changed),newDir),Toast.LENGTH_LONG).show(); + } + else Log.w(TAG, "select path failed"); + break; + default : + ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); + break; + } + } + + @Override protected void onPrepareDialog(int id, Dialog dialog) { - dialogs.prepareDialog(id); + dialogs.prepareDialog(id); super.onPrepareDialog(id, dialog); } protected Dialog onCreateDialog(int id) - { - return dialogs.createDialog(id); - } - - @Override - public boolean onSearchRequested() { - /* Launch the internal Search Activity */ + { + return dialogs.createDialog(id); + } + + @Override + public boolean onSearchRequested() { + /* Launch the internal Search Activity */ Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); this.startActivityForResult(search_intent, NavitAddressSearch_id); - return true; - } - - private void setMapLocation() - { - Intent fileExploreIntent = new Intent(this,FileBrowserActivity.class); - fileExploreIntent - .putExtra(FileBrowserActivity.startDirectoryParameter, "/mnt") - .setAction(FileBrowserActivity.INTENT_ACTION_SELECT_DIR); - startActivityForResult(fileExploreIntent,NavitSelectStorage_id); - } - - @Override - public void onDestroy() - { - super.onDestroy(); - Log.d(TAG, "OnDestroy"); - // next call will kill our app the hard way. This should not be necessary, but ensures navit is - // properly restarted and no resources are wasted with navit in background. Remove this call after - // code review - NavitDestroy(); - } - - public void fullscreen(int fullscreen) { - int w, h; - - isFullscreen = (fullscreen != 0); - if (isFullscreen) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); - } - else { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } - - Display display_ = getWindowManager().getDefaultDisplay(); - if (Build.VERSION.SDK_INT < 17) { - w = display_.getWidth(); - h = display_.getHeight(); - } else { - Point size = new Point(); - display_.getRealSize(size); - w = size.x; - h = size.y; - } - Log.d(TAG, String.format("Toggle fullscreen, w=%d, h=%d", w, h)); - N_NavitGraphics.handleResize(w, h); - } - - public void disableSuspend() - { - wl.acquire(); - wl.release(); - } - - private void exit() - { - nm.cancelAll(); - NavitVehicle.removeListener(); - NavitDestroy(); - } - - public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path, String path2); - public native void NavitDestroy(); - - - protected String getLocalizedString(String text) - { - return NavitGraphics.CallbackLocalizedString(text); - } - - - /* - * this is used to load the 'navit' native library on - * application startup. The library has already been unpacked at - * installation time by the package manager. - */ - static - { - System.loadLibrary("navit"); - } + return true; + } + + private void setMapLocation() + { + Intent fileExploreIntent = new Intent(this,FileBrowserActivity.class); + fileExploreIntent + .putExtra(FileBrowserActivity.startDirectoryParameter, "/mnt") + .setAction(FileBrowserActivity.INTENT_ACTION_SELECT_DIR); + startActivityForResult(fileExploreIntent,NavitSelectStorage_id); + } + + @Override + public void onDestroy() + { + super.onDestroy(); + Log.d(TAG, "OnDestroy"); + // next call will kill our app the hard way. This should not be necessary, but ensures navit is + // properly restarted and no resources are wasted with navit in background. Remove this call after + // code review + NavitDestroy(); + } + + public void fullscreen(int fullscreen) { + int w, h; + + isFullscreen = (fullscreen != 0); + if (isFullscreen) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + } + else { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + Display display_ = getWindowManager().getDefaultDisplay(); + if (Build.VERSION.SDK_INT < 17) { + w = display_.getWidth(); + h = display_.getHeight(); + } else { + Point size = new Point(); + display_.getRealSize(size); + w = size.x; + h = size.y; + } + Log.d(TAG, String.format("Toggle fullscreen, w=%d, h=%d", w, h)); + N_NavitGraphics.handleResize(w, h); + } + + public void disableSuspend() + { + wl.acquire(); + wl.release(); + } + + private void exit() + { + nm.cancelAll(); + NavitVehicle.removeListener(); + NavitDestroy(); + } + + public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path, String path2); + public native void NavitDestroy(); + + + private String getLocalizedString(String text) + { + return NavitGraphics.CallbackLocalizedString(text); + } + + + /* + * this is used to load the 'navit' native library on + * application startup. The library has already been unpacked at + * installation time by the package manager. + */ + static + { + System.loadLibrary("navit"); + } } diff --git a/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java b/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java index 1fbe65a86..c174e3eba 100644 --- a/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java @@ -19,13 +19,6 @@ package org.navitproject.navit; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.Locale; - import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -50,334 +43,340 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; -import android.widget.Toast; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; +import android.widget.Toast; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; public class NavitAddressSearchActivity extends Activity { - public static final class NavitAddress { - public NavitAddress(int type, float latitude, float longitude, String address) { - result_type = type; - lat = latitude; - lon = longitude; - addr = address; - } - - final int result_type; - final float lat; - final float lon; - final String addr; - } - - private static final String TAG = "NavitAddress"; - private static final int ADDRESS_RESULT_PROGRESS_MAX = 10; - - private List<NavitAddress> Addresses_found = null; - private List<NavitAddress> addresses_shown = null; - private String mAddressString = ""; - private boolean mPartialSearch = false; - private String mCountry; - private ImageButton mCountryButton; - private ProgressDialog search_results_wait = null; - public RelativeLayout NavitAddressSearchActivity_layout; - private int search_results_towns = 0; - private int search_results_streets = 0; - private int search_results_streets_hn = 0; - private long search_handle = 0; - - // TODO remember settings - private static String last_address_search_string = ""; - private static Boolean last_address_partial_match = false; - private static String last_country = ""; - - private int getDrawableID(String resourceName) { - int drawableId = 0; - try { - Class<?> res = R.drawable.class; - Field field = res.getField(resourceName); - drawableId = field.getInt(null); - } catch (Exception e) { - Log.e(TAG, "Failure to get drawable id.", e); - } - return drawableId; - } - - private void setCountryButtonImage() { - // We have all images stored as drawable_nodpi resources which allows native code to manipulate them - // without interference with android builtin choosing and scaling system. But that makes us to - // reinvent the wheel here to show an image in android native interface. - int flag_icon_sizes[]={24,32,48,64,96}; - int exact_size, nearest_size; - exact_size=(int)(Navit.metrics.density*24.0 -.5); - nearest_size=flag_icon_sizes[0]; - for(int size: flag_icon_sizes) { - nearest_size=size; - if(exact_size<=size) - break; - } - mCountryButton.setImageResource(getDrawableID("country_" + mCountry+"_"+nearest_size+"_"+nearest_size)); - } - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Bundle extras = getIntent().getExtras(); - if ( extras != null ) - { - String search_string = extras.getString(("search_string")); - if (search_string != null) { - mPartialSearch = true; - mAddressString = search_string; - executeSearch(); - return; - } - } - - mPartialSearch = last_address_partial_match; - mAddressString = last_address_search_string; - - getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); - LinearLayout panel = new LinearLayout(this); - panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); - panel.setOrientation(LinearLayout.VERTICAL); - - // address: label and text field - SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); - mCountry = settings.getString(("DefaultCountry") , null); - - if (mCountry == null) { - Locale defaultLocale = Locale.getDefault(); - mCountry = defaultLocale.getCountry().toLowerCase(defaultLocale); - SharedPreferences.Editor edit_settings = settings.edit(); - edit_settings.putString("DefaultCountry", mCountry); - edit_settings.apply(); - } - - mCountryButton = new ImageButton(this); - - setCountryButtonImage(); - - mCountryButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - requestCountryDialog(); - } - }); - - // address: label and text field - TextView addr_view = new TextView(this); - addr_view.setText(Navit.getInstance().T("Enter Destination")); // TRANS - addr_view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); - addr_view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); - addr_view.setPadding(4, 4, 4, 4); - - // partial match checkbox - final CheckBox checkboxPartialMatch = new CheckBox(this); - checkboxPartialMatch.setText(Navit.getInstance().T("partial match")); // TRANS - checkboxPartialMatch.setChecked(last_address_partial_match); - checkboxPartialMatch.setGravity(Gravity.CENTER); - - final EditText address_string = new EditText(this); - address_string.setText(last_address_search_string); - address_string.setSelectAllOnFocus(true); - - // search button - final Button btnSearch = new Button(this); - btnSearch.setText(Navit.getInstance().T("Search")); // TRANS - btnSearch.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); - btnSearch.setGravity(Gravity.CENTER); - btnSearch.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - mPartialSearch = checkboxPartialMatch.isChecked(); - mAddressString = address_string.getText().toString(); - last_address_partial_match = mPartialSearch; - last_address_search_string = mAddressString; - executeSearch(); - } - }); - - ListView lastAddresses = new ListView(this); - NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext(); - - final List<NavitAddress> addresses = navitConfig.getLastAddresses(); - int addressCount = addresses.size(); - if (addressCount > 0) { - String[] strAddresses = new String[addressCount]; - for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { - strAddresses[addrIndex] = addresses.get(addrIndex).addr; - } - ArrayAdapter<String> addressList = - new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strAddresses); - lastAddresses.setAdapter(addressList); - lastAddresses.setOnItemClickListener(new OnItemClickListener() { - public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { - NavitAddress addressSelected = addresses.get(arg2); - Intent resultIntent = new Intent(); - - resultIntent.putExtra("lat", addressSelected.lat); - resultIntent.putExtra("lon", addressSelected.lon); - resultIntent.putExtra("q", addressSelected.addr); - - setResult(Activity.RESULT_OK, resultIntent); - finish(); - } - }); - } - - String title = getString(R.string.address_search_title); - this.setTitle(title); - - LinearLayout searchSettingsLayout = new LinearLayout(this); - searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL); - - searchSettingsLayout.addView(mCountryButton); - searchSettingsLayout.addView(checkboxPartialMatch); - panel.addView(addr_view); - panel.addView(address_string); - panel.addView(searchSettingsLayout); - panel.addView(btnSearch); - panel.addView(lastAddresses); - - setContentView(panel); - } - - private void requestCountryDialog() { - final String[][] all_countries = NavitGraphics.GetAllCountries(); - - Comparator<String[]> country_comperator = new Comparator<String[]>() { - public int compare(String[] object1, String[] object2) { - return object1[1].compareTo(object2[1]); - } - }; - - Arrays.sort(all_countries, country_comperator); - - AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this); - // ToDo also show icons and country code - String[] country_name = new String[all_countries.length]; - - for (int country_index = 0; country_index < all_countries.length; country_index++) { - country_name[country_index] = all_countries[country_index][1]; - } - - mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); - mCountry = all_countries[item][0]; - SharedPreferences.Editor edit_settings = settings.edit(); - edit_settings.putString("DefaultCountry", mCountry); - edit_settings.apply(); - - setCountryButtonImage(); - } - }); - - AlertDialog d=mapModeChooser.create(); - d.getListView().setFastScrollEnabled(true); - d.show(); - } - - /** - * start a search on the map - */ - public void receiveAddress(int type, float latitude, float longitude, String address) { - Log.e(TAG, "(" + String.valueOf(latitude) + ", " + String.valueOf(longitude) + ") " + address); - - switch (type) { - case 0: - search_results_towns++; - break; - case 1: - search_results_streets++; - break; - case 2: - search_results_streets_hn++; - break; - - } - search_results_wait.setMessage(Navit.getInstance().T("Towns") + ":" + search_results_towns + " " - + Navit.getInstance().T("Streets") + ":" + search_results_streets + "/" - + search_results_streets_hn); - - search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); - - Addresses_found.add(new NavitAddress(type, latitude, longitude, address)); - } - - public void finishAddressSearch() { - if (Addresses_found.isEmpty()) { - Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); //TRANS - setResult(Activity.RESULT_CANCELED); - finish(); - } - ListView addressesFound = new ListView(this); - addressesFound.setFastScrollEnabled(true); - ArrayAdapter<String> addressList = - new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); - - addresses_shown = new ArrayList<NavitAddress>(); - - for (NavitAddress currentAddress : Addresses_found) { - if (currentAddress.result_type != 0 || search_results_streets == 0) { - addressList.add(currentAddress.addr); - addresses_shown.add(currentAddress); - } - } - - addressesFound.setAdapter(addressList); - - addressesFound.setOnItemClickListener(new OnItemClickListener() { - public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { - NavitAddress addressSelected = addresses_shown.get(arg2); - Intent resultIntent = new Intent(); - - resultIntent.putExtra("lat", addressSelected.lat); - resultIntent.putExtra("lon", addressSelected.lon); - resultIntent.putExtra("q", addressSelected.addr); - - setResult(Activity.RESULT_OK, resultIntent); - finish(); - } - }); - - setContentView(addressesFound); - search_results_wait.dismiss(); - } - - public native long CallbackStartAddressSearch(int partial_match, String country, String s); - public native void CallbackCancelAddressSearch(long handle); - - @Override - protected Dialog onCreateDialog(int id) { - search_results_wait = new ProgressDialog(this); - search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - search_results_wait.setTitle("Loading search results"); - search_results_wait.setMessage("--"); - search_results_wait.setCancelable(true); - search_results_wait.setProgress(0); - search_results_wait.setMax(10); - - Addresses_found = new ArrayList<NavitAddress>(); - search_results_towns = 0; - search_results_streets = 0; - search_results_streets_hn = 0; - - search_handle = CallbackStartAddressSearch(mPartialSearch ? 1 : 0, mCountry, mAddressString); - - search_results_wait.setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - CallbackCancelAddressSearch(search_handle); - search_handle = 0; - search_results_wait.dismiss(); - } - }); - return search_results_wait; - } - - private void executeSearch() { - showDialog(0); - } + public static final class NavitAddress { + public NavitAddress(int type, float latitude, float longitude, String address) { + result_type = type; + lat = latitude; + lon = longitude; + addr = address; + } + + final int result_type; + final float lat; + final float lon; + final String addr; + } + + private static final String TAG = "NavitAddress"; + private static final int ADDRESS_RESULT_PROGRESS_MAX = 10; + + private List<NavitAddress> Addresses_found = null; + private List<NavitAddress> addresses_shown = null; + private String mAddressString = ""; + private boolean mPartialSearch = false; + private String mCountry; + private ImageButton mCountryButton; + private ProgressDialog search_results_wait = null; + public RelativeLayout NavitAddressSearchActivity_layout; + private int search_results_towns = 0; + private int search_results_streets = 0; + private int search_results_streets_hn = 0; + private long search_handle = 0; + + // TODO remember settings + private static String last_address_search_string = ""; + private static Boolean last_address_partial_match = false; + private static String last_country = ""; + + private int getDrawableID(String resourceName) { + int drawableId = 0; + try { + Class<?> res = R.drawable.class; + Field field = res.getField(resourceName); + drawableId = field.getInt(null); + } catch (Exception e) { + Log.e(TAG, "Failure to get drawable id.", e); + } + return drawableId; + } + + private void setCountryButtonImage() { + // We have all images stored as drawable_nodpi resources which allows native code to manipulate them + // without interference with android builtin choosing and scaling system. But that makes us to + // reinvent the wheel here to show an image in android native interface. + int flag_icon_sizes[]={24,32,48,64,96}; + int exact_size, nearest_size; + exact_size=(int)(Navit.metrics.density*24.0 -.5); + nearest_size=flag_icon_sizes[0]; + for(int size: flag_icon_sizes) { + nearest_size=size; + if(exact_size<=size) + break; + } + mCountryButton.setImageResource(getDrawableID("country_" + mCountry+"_"+nearest_size+"_"+nearest_size)); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle extras = getIntent().getExtras(); + if ( extras != null ) + { + String search_string = extras.getString(("search_string")); + if (search_string != null) { + mPartialSearch = true; + mAddressString = search_string; + executeSearch(); + return; + } + } + + mPartialSearch = last_address_partial_match; + mAddressString = last_address_search_string; + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); + LinearLayout panel = new LinearLayout(this); + panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + panel.setOrientation(LinearLayout.VERTICAL); + + // address: label and text field + SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + mCountry = settings.getString(("DefaultCountry") , null); + + if (mCountry == null) { + Locale defaultLocale = Locale.getDefault(); + mCountry = defaultLocale.getCountry().toLowerCase(defaultLocale); + SharedPreferences.Editor edit_settings = settings.edit(); + edit_settings.putString("DefaultCountry", mCountry); + edit_settings.apply(); + } + + mCountryButton = new ImageButton(this); + + setCountryButtonImage(); + + mCountryButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + requestCountryDialog(); + } + }); + + // address: label and text field + TextView addr_view = new TextView(this); + addr_view.setText(Navit.getInstance().getTstring(R.string.address_enter_destination)); // TRANS + addr_view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); + addr_view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + addr_view.setPadding(4, 4, 4, 4); + + // partial match checkbox + final CheckBox checkboxPartialMatch = new CheckBox(this); + checkboxPartialMatch.setText(Navit.getInstance().getTstring(R.string.address_partial_match)); // TRANS + checkboxPartialMatch.setChecked(last_address_partial_match); + checkboxPartialMatch.setGravity(Gravity.CENTER); + + final EditText address_string = new EditText(this); + address_string.setText(last_address_search_string); + address_string.setSelectAllOnFocus(true); + + // search button + final Button btnSearch = new Button(this); + btnSearch.setText(Navit.getInstance().getTstring(R.string.address_search_button)); // TRANS + btnSearch.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); + btnSearch.setGravity(Gravity.CENTER); + btnSearch.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + mPartialSearch = checkboxPartialMatch.isChecked(); + mAddressString = address_string.getText().toString(); + last_address_partial_match = mPartialSearch; + last_address_search_string = mAddressString; + executeSearch(); + } + }); + + ListView lastAddresses = new ListView(this); + NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext(); + + final List<NavitAddress> addresses = navitConfig.getLastAddresses(); + int addressCount = addresses.size(); + if (addressCount > 0) { + String[] strAddresses = new String[addressCount]; + for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { + strAddresses[addrIndex] = addresses.get(addrIndex).addr; + } + ArrayAdapter<String> addressList = + new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strAddresses); + lastAddresses.setAdapter(addressList); + lastAddresses.setOnItemClickListener(new OnItemClickListener() { + public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { + NavitAddress addressSelected = addresses.get(arg2); + Intent resultIntent = new Intent(); + + resultIntent.putExtra("lat", addressSelected.lat); + resultIntent.putExtra("lon", addressSelected.lon); + resultIntent.putExtra("q", addressSelected.addr); + + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } + }); + } + + String title = getString(R.string.address_search_title); + this.setTitle(title); + + LinearLayout searchSettingsLayout = new LinearLayout(this); + searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL); + + searchSettingsLayout.addView(mCountryButton); + searchSettingsLayout.addView(checkboxPartialMatch); + panel.addView(addr_view); + panel.addView(address_string); + panel.addView(searchSettingsLayout); + panel.addView(btnSearch); + panel.addView(lastAddresses); + + setContentView(panel); + } + + private void requestCountryDialog() { + final String[][] all_countries = NavitGraphics.GetAllCountries(); + + Comparator<String[]> country_comperator = new Comparator<String[]>() { + public int compare(String[] object1, String[] object2) { + return object1[1].compareTo(object2[1]); + } + }; + + Arrays.sort(all_countries, country_comperator); + + AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this); + // ToDo also show icons and country code + String[] country_name = new String[all_countries.length]; + + for (int country_index = 0; country_index < all_countries.length; country_index++) { + country_name[country_index] = all_countries[country_index][1]; + } + + mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + mCountry = all_countries[item][0]; + SharedPreferences.Editor edit_settings = settings.edit(); + edit_settings.putString("DefaultCountry", mCountry); + edit_settings.apply(); + + setCountryButtonImage(); + } + }); + + AlertDialog d=mapModeChooser.create(); + d.getListView().setFastScrollEnabled(true); + d.show(); + } + + /** + * start a search on the map + */ + public void receiveAddress(int type, float latitude, float longitude, String address) { + Log.e(TAG, "(" + String.valueOf(latitude) + ", " + String.valueOf(longitude) + ") " + address); + + switch (type) { + case 0: + search_results_towns++; + break; + case 1: + search_results_streets++; + break; + case 2: + search_results_streets_hn++; + break; + + } + search_results_wait.setMessage(Navit.getInstance().getTstring(R.string.address_search_towns) + ":" + search_results_towns + " " + + Navit.getInstance().getTstring(R.string.address_search_streets) + ":" + search_results_streets + "/" + + search_results_streets_hn); + + search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); + + Addresses_found.add(new NavitAddress(type, latitude, longitude, address)); + } + + public void finishAddressSearch() { + if (Addresses_found.isEmpty()) { + Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); //TRANS + setResult(Activity.RESULT_CANCELED); + finish(); + } + ListView addressesFound = new ListView(this); + addressesFound.setFastScrollEnabled(true); + ArrayAdapter<String> addressList = + new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); + + addresses_shown = new ArrayList<NavitAddress>(); + + for (NavitAddress currentAddress : Addresses_found) { + if (currentAddress.result_type != 0 || search_results_streets == 0) { + addressList.add(currentAddress.addr); + addresses_shown.add(currentAddress); + } + } + + addressesFound.setAdapter(addressList); + + addressesFound.setOnItemClickListener(new OnItemClickListener() { + public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { + NavitAddress addressSelected = addresses_shown.get(arg2); + Intent resultIntent = new Intent(); + + resultIntent.putExtra("lat", addressSelected.lat); + resultIntent.putExtra("lon", addressSelected.lon); + resultIntent.putExtra("q", addressSelected.addr); + + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } + }); + + setContentView(addressesFound); + search_results_wait.dismiss(); + } + + public native long CallbackStartAddressSearch(int partial_match, String country, String s); + public native void CallbackCancelAddressSearch(long handle); + + @Override + protected Dialog onCreateDialog(int id) { + search_results_wait = new ProgressDialog(this); + search_results_wait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + search_results_wait.setTitle("Loading search results"); + search_results_wait.setMessage("--"); + search_results_wait.setCancelable(true); + search_results_wait.setProgress(0); + search_results_wait.setMax(10); + + Addresses_found = new ArrayList<NavitAddress>(); + search_results_towns = 0; + search_results_streets = 0; + search_results_streets_hn = 0; + + search_handle = CallbackStartAddressSearch(mPartialSearch ? 1 : 0, mCountry, mAddressString); + + search_results_wait.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + CallbackCancelAddressSearch(search_handle); + search_handle = 0; + search_results_wait.dismiss(); + } + }); + return search_results_wait; + } + + private void executeSearch() { + showDialog(0); + } } diff --git a/navit/android/src/org/navitproject/navit/NavitBackupTask.java b/navit/android/src/org/navitproject/navit/NavitBackupTask.java index ca52ee46e..d7b41cee3 100644 --- a/navit/android/src/org/navitproject/navit/NavitBackupTask.java +++ b/navit/android/src/org/navitproject/navit/NavitBackupTask.java @@ -1,7 +1,5 @@ - package org.navitproject.navit; -import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; @@ -9,7 +7,6 @@ import android.os.Environment; import android.text.format.Time; import android.widget.Toast; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; @@ -31,7 +28,7 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { /* Create a Wait Progress Dialog to inform the User that we are working */ mDialog = new ProgressDialog(mActivity); mDialog.setIndeterminate(true); - mDialog.setMessage(mActivity.getString(R.string.backing_up)); + mDialog.setMessage(mActivity.getTstring(R.string.backing_up)); mDialog.show(); } @@ -41,60 +38,70 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { now.setToNow(); /* This is the Directory where all Subdirectories are stored by date */ - File mainBackupDir = new File(Environment.getExternalStorageDirectory().getPath() + "/navit/backup/"); + File mainBackupDir = new File( + Environment.getExternalStorageDirectory().getPath() + "/navit/backup/"); /* Create the Main Backup Directory if it doesn't exist */ if (!mainBackupDir.isDirectory()) { - if (!mainBackupDir.mkdirs()) - return mActivity.getString(R.string.failed_to_create_backup_directory); + if (!mainBackupDir.mkdirs()) { + return mActivity.getTstring(R.string.failed_to_create_backup_directory); + } } /* Create a Timestamp in the format YYYY-MM-DD-Index */ - String timestamp = now.year + "-" + String.format("%02d", now.month+1) + "-" + String.format("%02d", now.monthDay); + String timestamp = now.year + "-" + String.format("%02d", now.month + 1) + "-" + String + .format("%02d", now.monthDay); /* Get the next free index */ int index = 1; for (String s : mainBackupDir.list()) { if (s.contains(timestamp)) { int newIndex = Integer.parseInt(s.substring(11)); - if (newIndex >= index) + if (newIndex >= index) { index = newIndex + 1; + } } } timestamp += "-" + index; /* This is the Directory in which the Files are copied into */ - File backupDir = new File(Environment.getExternalStorageDirectory().getPath() + "/navit/backup/" + timestamp); + File backupDir = new File( + Environment.getExternalStorageDirectory().getPath() + "/navit/backup/" + timestamp); /* Create the Backup Directory if it doesn't exist */ if (!backupDir.isDirectory()) { - if (!backupDir.mkdirs()) - return mActivity.getString(R.string.failed_to_create_backup_directory); + if (!backupDir.mkdirs()) { + return mActivity.getTstring(R.string.failed_to_create_backup_directory); + } } ObjectOutputStream preferencesOOs = null; try { /* Backup Files in home */ - mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/bookmark.txt", backupDir.getPath() + "/bookmark.txt"); - mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/destination.txt", backupDir.getPath() + "/destination.txt"); - mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt", backupDir.getPath() + "/gui_internal.txt"); + mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/bookmark.txt", + backupDir.getPath() + "/bookmark.txt"); + mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/destination.txt", + backupDir.getPath() + "/destination.txt"); + mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt", + backupDir.getPath() + "/gui_internal.txt"); /* Backup Shared Preferences */ - preferencesOOs = new ObjectOutputStream(new FileOutputStream(backupDir.getPath() + "/preferences.bak")); - preferencesOOs.writeObject(mActivity.getSharedPreferences(Navit.NAVIT_PREFS, Context.MODE_PRIVATE).getAll()); - } - catch (IOException e) { + preferencesOOs = new ObjectOutputStream( + new FileOutputStream(backupDir.getPath() + "/preferences.bak")); + preferencesOOs.writeObject( + mActivity.getSharedPreferences(Navit.NAVIT_PREFS, Context.MODE_PRIVATE) + .getAll()); + } catch (IOException e) { e.printStackTrace(); - return mActivity.getString(R.string.backup_failed); - } - finally { + return mActivity.getTstring(R.string.backup_failed); + } finally { /* Close Stream to prevent Resource Leaks */ try { - if (preferencesOOs != null) + if (preferencesOOs != null) { preferencesOOs.close(); - } - catch (IOException e) { + } + } catch (IOException e) { e.printStackTrace(); - return mActivity.getString(R.string.backup_failed); + return mActivity.getTstring(R.string.backup_failed); } } @@ -114,13 +121,15 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { return; } - Toast.makeText(mActivity, mActivity.getString(R.string.backup_successful), Toast.LENGTH_LONG).show(); + Toast.makeText(mActivity, mActivity.getTstring(R.string.backup_successful), + Toast.LENGTH_LONG).show(); } @Override protected void onCancelled() { super.onCancelled(); - Toast.makeText(mActivity, mActivity.getString(R.string.backup_failed), Toast.LENGTH_LONG).show(); + Toast.makeText(mActivity, mActivity.getTstring(R.string.backup_failed), Toast.LENGTH_LONG) + .show(); mDialog.dismiss(); } } diff --git a/navit/android/src/org/navitproject/navit/NavitDialogs.java b/navit/android/src/org/navitproject/navit/NavitDialogs.java index 3d39227c4..426acb76f 100644 --- a/navit/android/src/org/navitproject/navit/NavitDialogs.java +++ b/navit/android/src/org/navitproject/navit/NavitDialogs.java @@ -1,216 +1,223 @@ package org.navitproject.navit; -import java.io.File; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; +import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.Toast; -import android.os.Environment; +import java.io.File; + +public class NavitDialogs extends Handler { + + // Dialogs + public static final int DIALOG_MAPDOWNLOAD = 1; + public static final int DIALOG_BACKUP_RESTORE = 2; + // dialog messages + static final int MSG_MAP_DOWNLOAD_FINISHED = 0; + static final int MSG_PROGRESS_BAR = 1; + static final int MSG_TOAST = 2; + static final int MSG_TOAST_LONG = 3; + static final int MSG_START_MAP_DOWNLOAD = 7; + private static final int DIALOG_SELECT_BACKUP = 3; + private static final int MSG_REMOVE_DIALOG_GENERIC = 99; + private static Handler mHandler; + private final String TAG = this.getClass().getName(); + private ProgressDialog mapdownloader_dialog = null; + private NavitMapDownloader mapdownloader = null; + private Navit mActivity; + + NavitDialogs(Navit activity) { + super(); + mActivity = activity; + mHandler = this; + } + + static public void sendDialogMessage(int what, String title, String text, int dialog_num, + int value1, int value2) { + Message msg = mHandler.obtainMessage(what); + Bundle data = new Bundle(); -public class NavitDialogs extends Handler{ - // Dialogs - public static final int DIALOG_MAPDOWNLOAD = 1; - public static final int DIALOG_BACKUP_RESTORE = 2; - private static final int DIALOG_SELECT_BACKUP = 3; - - // dialog messages - static final int MSG_MAP_DOWNLOAD_FINISHED = 0; - static final int MSG_PROGRESS_BAR = 1; - static final int MSG_TOAST = 2; - static final int MSG_TOAST_LONG = 3; - static final int MSG_START_MAP_DOWNLOAD = 7; - private static final int MSG_REMOVE_DIALOG_GENERIC = 99; - private static Handler mHandler; - private final String TAG = "NavitDialogs"; - private ProgressDialog mapdownloader_dialog = null; - private NavitMapDownloader mapdownloader = null; - private Navit mActivity; - - NavitDialogs(Navit activity) { - super(); - mActivity = activity; - mHandler = this; - } - - static public void sendDialogMessage(int what, String title, String text, int dialog_num, int value1, int value2) - { - Message msg = mHandler.obtainMessage(what); - Bundle data = new Bundle(); - - data.putString("title", title); - data.putString("text", text); - data.putInt("value1", value1); - data.putInt("value2", value2); - data.putInt("dialog_num", dialog_num); - msg.setData(data); - - mHandler.sendMessage(msg); - } - - @Override - public void handleMessage(Message msg) - { - switch (msg.what) - { - case MSG_MAP_DOWNLOAD_FINISHED : - { - // dismiss dialog, remove dialog - mActivity.dismissDialog(DIALOG_MAPDOWNLOAD); - mActivity.removeDialog(DIALOG_MAPDOWNLOAD); - if (msg.getData().getInt("value1") == 1) { - Message msg_out = - Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, - NavitGraphics.msg_type.CLB_LOAD_MAP.ordinal()); - msg_out.setData(msg.getData()); - msg_out.sendToTarget(); - - msg_out = Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, - NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); - Bundle b = new Bundle(); - int mi=msg.getData().getInt("value2"); - double lon=(Double.parseDouble(NavitMapDownloader.osm_maps[mi].lon1)+Double.parseDouble(NavitMapDownloader.osm_maps[mi].lon2))/2.0; - double lat=(Double.parseDouble(NavitMapDownloader.osm_maps[mi].lat1)+Double.parseDouble(NavitMapDownloader.osm_maps[mi].lat2))/2.0; - b.putString("cmd", "set_center(\""+ lon +" "+ lat + "\",1); zoom=256"); - msg_out.setData(b); - msg_out.sendToTarget(); - } - break; - } - case MSG_PROGRESS_BAR : - // change progressbar values - mapdownloader_dialog.setMax(msg.getData().getInt("value1")); - mapdownloader_dialog.setProgress(msg.getData().getInt("value2")); - mapdownloader_dialog.setTitle(msg.getData().getString(("title"))); - mapdownloader_dialog.setMessage(msg.getData().getString(("text"))); - break; - case MSG_TOAST : - Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_SHORT).show(); - break; - case MSG_TOAST_LONG : - Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_LONG).show(); - break; - case MSG_START_MAP_DOWNLOAD: - { - int download_map_id = msg.arg1; - Log.d(TAG, "PRI id=" + download_map_id); - // set map id to download - - // show the map download progressbar, and download the map - if (download_map_id > -1) - { - mapdownloader = new NavitMapDownloader(download_map_id); - mActivity.showDialog(NavitDialogs.DIALOG_MAPDOWNLOAD); - mapdownloader.start(); - } - } - break; - case MSG_REMOVE_DIALOG_GENERIC : - // dismiss dialog, remove dialog - generic - mActivity.dismissDialog(msg.getData().getInt("dialog_num")); - mActivity.removeDialog(msg.getData().getInt("dialog_num")); - break; - } - } - - Dialog createDialog(int id) - { - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); - - switch (id) - { - case DIALOG_MAPDOWNLOAD : - mapdownloader_dialog = new ProgressDialog(mActivity); - mapdownloader_dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - mapdownloader_dialog.setTitle("--"); - mapdownloader_dialog.setMessage("--"); - mapdownloader_dialog.setCancelable(true); - mapdownloader_dialog.setProgress(0); - mapdownloader_dialog.setMax(200); - DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() - { - public void onDismiss(DialogInterface dialog) - { - Log.e(TAG, "onDismiss: mapdownloader_dialog"); - if(mapdownloader!=null) - mapdownloader.stop_thread(); - } - }; - mapdownloader_dialog.setOnDismissListener(onDismissListener); - // show license for OSM maps - Toast.makeText(mActivity.getApplicationContext(), - Navit.getInstance().T("Map data (c) OpenStreetMap contributors, ODBL"), - Toast.LENGTH_LONG).show(); //TRANS - return mapdownloader_dialog; - - case DIALOG_BACKUP_RESTORE : - /* Create a Dialog that Displays Options wether to Backup or Restore */ - builder.setTitle(mActivity.getString(R.string.choose_an_action)). - setCancelable(true). - setItems(R.array.dialog_backup_restore_items, - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - /* Notify User if no SD Card present */ - if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) - Toast.makeText(mActivity,mActivity.getString(R.string.please_insert_an_sd_card), Toast.LENGTH_LONG).show(); - - switch (which) { - case 0: - /* Backup */ - new NavitBackupTask(mActivity).execute(); - break; - case 1: - /* Restore */ - mActivity.showDialog(DIALOG_SELECT_BACKUP); - break; - } - }}); - return builder.create(); - - case DIALOG_SELECT_BACKUP : - /* Create a Dialog with a list from which the user selects the Backup to be restored */ - File mainBackupDir = new File(Environment.getExternalStorageDirectory().getPath() + "/navit/backup/"); - - String[] backups = null; - if(mainBackupDir.isDirectory()) - backups = mainBackupDir.list(); - - if(backups == null || backups.length == 0) { - /* No Backups were found */ - builder.setTitle(mActivity.getText(R.string.no_backup_found)); - builder.setNegativeButton(mActivity.getText(android.R.string.cancel), null); - return builder.create(); - } - - builder.setTitle(mActivity.getString(R.string.select_backup)); - final ArrayAdapter<String> adapter = new ArrayAdapter<String>(mActivity, android.R.layout.simple_spinner_item, backups); - builder.setAdapter(adapter, new OnClickListener(){ + data.putString("title", title); + data.putString("text", text); + data.putInt("value1", value1); + data.putInt("value2", value2); + data.putInt("dialog_num", dialog_num); + msg.setData(data); + + mHandler.sendMessage(msg); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_MAP_DOWNLOAD_FINISHED: { + // dismiss dialog, remove dialog + mActivity.dismissDialog(DIALOG_MAPDOWNLOAD); + mActivity.removeDialog(DIALOG_MAPDOWNLOAD); + if (msg.getData().getInt("value1") == 1) { + Message msg_out = + Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, + NavitGraphics.msg_type.CLB_LOAD_MAP.ordinal()); + msg_out.setData(msg.getData()); + msg_out.sendToTarget(); + + msg_out = Message + .obtain(Navit.getInstance().getNavitGraphics().callback_handler, + NavitGraphics.msg_type.CLB_CALL_CMD.ordinal()); + Bundle b = new Bundle(); + int mi = msg.getData().getInt("value2"); + double lon = (Double.parseDouble(NavitMapDownloader.osm_maps[mi].lon1) + Double + .parseDouble(NavitMapDownloader.osm_maps[mi].lon2)) / 2.0; + double lat = (Double.parseDouble(NavitMapDownloader.osm_maps[mi].lat1) + Double + .parseDouble(NavitMapDownloader.osm_maps[mi].lat2)) / 2.0; + b.putString("cmd", "set_center(\"" + lon + " " + lat + "\",1); zoom=256"); + msg_out.setData(b); + msg_out.sendToTarget(); + } + break; + } + case MSG_PROGRESS_BAR: + // change progressbar values + mapdownloader_dialog.setMax(msg.getData().getInt("value1")); + mapdownloader_dialog.setProgress(msg.getData().getInt("value2")); + mapdownloader_dialog.setTitle(msg.getData().getString(("title"))); + mapdownloader_dialog.setMessage(msg.getData().getString(("text"))); + break; + case MSG_TOAST: + Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_SHORT) + .show(); + break; + case MSG_TOAST_LONG: + Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_LONG) + .show(); + break; + case MSG_START_MAP_DOWNLOAD: { + int download_map_id = msg.arg1; + Log.d(TAG, "PRI id=" + download_map_id); + // set map id to download + + // show the map download progressbar, and download the map + if (download_map_id > -1) { + mapdownloader = new NavitMapDownloader(download_map_id); + mActivity.showDialog(NavitDialogs.DIALOG_MAPDOWNLOAD); + mapdownloader.start(); + } + } + break; + case MSG_REMOVE_DIALOG_GENERIC: + // dismiss dialog, remove dialog - generic + mActivity.dismissDialog(msg.getData().getInt("dialog_num")); + mActivity.removeDialog(msg.getData().getInt("dialog_num")); + break; + } + } + + Dialog createDialog(int id) { + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + + switch (id) { + case DIALOG_MAPDOWNLOAD: + mapdownloader_dialog = new ProgressDialog(mActivity); + mapdownloader_dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + mapdownloader_dialog.setTitle("--"); + mapdownloader_dialog.setMessage("--"); + mapdownloader_dialog.setCancelable(true); + mapdownloader_dialog.setProgress(0); + mapdownloader_dialog.setMax(200); + DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() { + public void onDismiss(DialogInterface dialog) { + Log.e(TAG, "onDismiss: mapdownloader_dialog"); + if (mapdownloader != null) { + mapdownloader.stop_thread(); + } + } + }; + mapdownloader_dialog.setOnDismissListener(onDismissListener); + // show license for OSM maps + Toast.makeText(mActivity.getApplicationContext(), + Navit.getInstance().getString(R.string.osm_copyright), + Toast.LENGTH_LONG).show(); + return mapdownloader_dialog; + + case DIALOG_BACKUP_RESTORE: + /* Create a Dialog that Displays Options wether to Backup or Restore */ + builder.setTitle(mActivity.getTstring(R.string.choose_an_action)). + setCancelable(true). + setItems(R.array.dialog_backup_restore_items, + new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + /* Notify User if no SD Card present */ + if (!Environment.getExternalStorageState() + .equals(Environment.MEDIA_MOUNTED)) { + Toast.makeText(mActivity, mActivity + .getTstring(R.string.please_insert_an_sd_card), + Toast.LENGTH_LONG).show(); + } + + switch (which) { + case 0: + /* Backup */ + new NavitBackupTask(mActivity).execute(); + break; + case 1: + /* Restore */ + mActivity.showDialog(DIALOG_SELECT_BACKUP); + break; + } + } + }); + return builder.create(); + + case DIALOG_SELECT_BACKUP: + /* Create a Dialog with a list from which the user selects the Backup to be restored */ + File mainBackupDir = new File( + Environment.getExternalStorageDirectory().getPath() + "/navit/backup/"); + + String[] backups = null; + if (mainBackupDir.isDirectory()) { + backups = mainBackupDir.list(); + } + + if (backups == null || backups.length == 0) { + /* No Backups were found */ + builder.setTitle(mActivity.getTstring(R.string.no_backup_found)); + builder.setNegativeButton(mActivity.getTstring(android.R.string.cancel), null); + return builder.create(); + } + + builder.setTitle(mActivity.getTstring(R.string.select_backup)); + final ArrayAdapter<String> adapter = new ArrayAdapter<String>(mActivity, + android.R.layout.simple_spinner_item, backups); + builder.setAdapter(adapter, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new NavitRestoreTask(mActivity, adapter.getItem(which)).execute(); - }}); - builder.setNegativeButton(mActivity.getString(android.R.string.cancel), null); + } + }); + builder.setNegativeButton(mActivity.getTstring(android.R.string.cancel), null); return builder.create(); - } - // should never get here!! - return null; - } + } + // should never get here!! + return null; + } public void prepareDialog(int id) { - + /* Remove the Dialog to force Android to rerun onCreateDialog */ - if(id == DIALOG_SELECT_BACKUP) + if (id == DIALOG_SELECT_BACKUP) { mActivity.removeDialog(id); + } } } diff --git a/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java b/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java index 3c47cef1a..e32b48ace 100644 --- a/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java @@ -1,28 +1,20 @@ /** - * Navit, a modular navigation system. - * Copyright (C) 2005-2008 Navit Team + * Navit, a modular navigation system. Copyright (C) 2005-2008 Navit Team * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License version 2 as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. + * You should have received a copy of the GNU General Public License along with this program; if + * not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. */ package org.navitproject.navit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import android.Manifest; import android.app.Activity; import android.app.AlertDialog; @@ -41,201 +33,228 @@ import android.util.Log; import android.view.View; import android.widget.ExpandableListView; import android.widget.SimpleExpandableListAdapter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; public class NavitDownloadSelectMapActivity extends ExpandableListActivity { - private static final String TAG = "DownloadSelectMap"; - private static SimpleExpandableListAdapter adapter = null; - private static final String MAP_BULLETPOINT = " * "; - private static ArrayList<HashMap<String, String>> downloaded_maps_childs = null; - private static ArrayList<HashMap<String, String>> maps_current_position_childs = null; - private static boolean currentLocationKnown = false; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (adapter == null) { - adapter = createAdapter(); - } - updateDownloadedMaps(); - updateMapsForLocation(NavitMapDownloader.osm_maps); - setListAdapter(adapter); - try { - setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available"); - } catch (Exception e) { - Log.e(TAG, "Exception " + e.getClass().getName() + " during getFreeSpace, reporting 'no sdcard present'"); - NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, - String.format(Navit.getInstance().T("Current map location %s is not available\nPlease restart Navit after you attach an SD card or select a different map location."), Navit.map_filename_path), - -1, 0, 0); - finish(); - } - } - - private long getFreeSpace() { - StatFs fsInfo = new StatFs(Navit.map_filename_path); - return (long) fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); - } - - private void updateDownloadedMaps() { - downloaded_maps_childs.clear(); - for (NavitMap map : NavitMapDownloader.getAvailableMaps()) { - HashMap<String, String> child = new HashMap<String, String>(); - child.put("map_name", map.mapName + " " + (map.size() / 1024 / 1024) + "MB"); - child.put("map_location", map.getLocation()); - downloaded_maps_childs.add(child); - } - } - - private void updateMapsForLocation(NavitMapDownloader.osm_map_values osm_maps[]) { - Location currentLocation = NavitVehicle.lastLocation; - if (maps_current_position_childs.size() == 0 || (currentLocation != null && !currentLocationKnown)) { - if (currentLocation == null) { - LocationManager mapLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); - List<String> providers = mapLocationManager.getProviders(true); - long lastUpdate; - long bestUpdateTime = -1; - for (String provider : providers) { - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED - && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - return; - } - Location lastKnownLocation = mapLocationManager.getLastKnownLocation(provider); - if (lastKnownLocation != null) { - lastUpdate = lastKnownLocation.getTime(); - if (lastUpdate > bestUpdateTime) { - currentLocation = lastKnownLocation; - bestUpdateTime = lastUpdate; - } - } - } - } else currentLocationKnown = true; - - if (currentLocation != null) { - // if this map contains data to our current position, add it to - // the MapsOfCurrentLocation-list - for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { - if (osm_maps[currentMapIndex].isInMap(currentLocation)) { - HashMap<String, String> currentPositionMapChild = new HashMap<String, String>(); - currentPositionMapChild.put("map_name", osm_maps[currentMapIndex].map_name + " " - + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); - currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex)); - - maps_current_position_childs.add(currentPositionMapChild); - } - } - } - } - } - - private SimpleExpandableListAdapter createAdapter() { - - NavitMapDownloader.osm_map_values osm_maps[] = NavitMapDownloader.osm_maps; - - ArrayList<HashMap<String, String>> resultGroups = new ArrayList<HashMap<String, String>>(); - ArrayList<ArrayList<HashMap<String, String>>> resultChilds = - new ArrayList<ArrayList<HashMap<String, String>>>(); - - // add already downloaded maps (group and empty child list - HashMap<String, String> downloaded_maps_hash = new HashMap<String, String>(); - downloaded_maps_hash.put("category_name", Navit.getInstance().T(getString(R.string.maps_installed))); - resultGroups.add(downloaded_maps_hash); - downloaded_maps_childs = new ArrayList<HashMap<String, String>>(); - resultChilds.add(downloaded_maps_childs); - - ArrayList<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>(); - maps_current_position_childs = new ArrayList<HashMap<String, String>>(); - // maps containing the current location - HashMap<String, String> matching_maps = new HashMap<String, String>(); - matching_maps.put("category_name", Navit.getInstance().T(getString(R.string.maps_for_current_location))); - resultGroups.add(matching_maps); - resultChilds.add(maps_current_position_childs); - - // add all maps - for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { - if (osm_maps[currentMapIndex].level == 0) { - if (secList.size() > 0) { - resultChilds.add(secList); - } - secList = new ArrayList<HashMap<String, String>>(); - HashMap<String, String> map_info_hash = new HashMap<String, String>(); - map_info_hash.put("category_name", osm_maps[currentMapIndex].map_name); - resultGroups.add(map_info_hash); - } - - HashMap<String, String> child = new HashMap<String, String>(); - child.put("map_name", (osm_maps[currentMapIndex].level > 1 ? MAP_BULLETPOINT : "") - + osm_maps[currentMapIndex].map_name + " " - + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); - child.put("map_index", String.valueOf(currentMapIndex)); - - secList.add(child); - } - resultChilds.add(secList); - - return new SimpleExpandableListAdapter(this, resultGroups, android.R.layout.simple_expandable_list_item_1, - new String[] { "category_name" }, new int[] { android.R.id.text1 }, resultChilds, - android.R.layout.simple_expandable_list_item_1, new String[] { "map_name" }, - new int[] { android.R.id.text1 }); - } - - @Override - public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { - super.onChildClick(parent, v, groupPosition, childPosition, id); - Log.d(TAG, "p:" + groupPosition + ", child_pos:" + childPosition); - - @SuppressWarnings("unchecked") - HashMap<String, String> child = (HashMap<String, String>) adapter.getChild(groupPosition, childPosition); - - String map_index = child.get("map_index"); - if (map_index != null) { - int mi=Integer.parseInt(map_index); - if(NavitMapDownloader.osm_maps[mi].est_size_bytes/1024/1024/950>=4) { - NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, - Navit.getInstance().T("Sorry, we currently do not support maps above 3.8G on Android, please select a smaller one."), - -1, 0, 0); - return true; - } - Intent resultIntent = new Intent(); - resultIntent.putExtra("map_index", mi); - setResult(Activity.RESULT_OK, resultIntent); - finish(); - } else { - // ask user if to delete this map - askForMapDeletion(child.get("map_location")); - } - return true; - } - - private void askForMapDeletion(final String map_location) { - AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this); - deleteMapBox.setTitle(R.string.map_delete); // Android also takes recource id - deleteMapBox.setCancelable(true); - - NavitMap maptoDelete = new NavitMap(map_location); - deleteMapBox.setMessage(maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + "MB"); - - // TRANS - deleteMapBox.setPositiveButton(Navit.getInstance().T(getString(R.string.yes)), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface arg0, int arg1) { - Log.d(TAG, "Delete Map"); - Message msg = - Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, - NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); - Bundle b = new Bundle(); - b.putString("title", map_location); - msg.setData(b); - msg.sendToTarget(); - finish(); - } - }); - - // TRANS - deleteMapBox.setNegativeButton(Navit.getInstance().T(getString(R.string.no)), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface arg0, int arg1) { - Log.d(TAG, "don't delete map"); - } - }); - deleteMapBox.show(); - } + private static final String MAP_BULLETPOINT = " * "; + private static SimpleExpandableListAdapter adapter = null; + private static ArrayList<HashMap<String, String>> downloaded_maps_childs = null; + private static ArrayList<HashMap<String, String>> maps_current_position_childs = null; + private static boolean currentLocationKnown = false; + private final String TAG = this.getClass().getName(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (adapter == null) { + adapter = createAdapter(); + } + updateDownloadedMaps(); + updateMapsForLocation(NavitMapDownloader.osm_maps); + setListAdapter(adapter); + try { + setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available"); + } catch (Exception e) { + Log.e(TAG, "Exception " + e.getClass().getName() + + " during getFreeSpace, reporting 'no sdcard present'"); + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, + String.format( + (Navit.getInstance().getTstring(R.string.map_location_unavailable)), + Navit.map_filename_path), + -1, 0, 0); + finish(); + } + } + + private long getFreeSpace() { + StatFs fsInfo = new StatFs(Navit.map_filename_path); + return (long) fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); + } + + private void updateDownloadedMaps() { + downloaded_maps_childs.clear(); + for (NavitMap map : NavitMapDownloader.getAvailableMaps()) { + HashMap<String, String> child = new HashMap<String, String>(); + child.put("map_name", map.mapName + " " + (map.size() / 1024 / 1024) + "MB"); + child.put("map_location", map.getLocation()); + downloaded_maps_childs.add(child); + } + } + + private void updateMapsForLocation(NavitMapDownloader.osm_map_values osm_maps[]) { + Location currentLocation = NavitVehicle.lastLocation; + if (maps_current_position_childs.size() == 0 || (currentLocation != null + && !currentLocationKnown)) { + if (currentLocation == null) { + LocationManager mapLocationManager = (LocationManager) getSystemService( + Context.LOCATION_SERVICE); + List<String> providers = mapLocationManager.getProviders(true); + long lastUpdate; + long bestUpdateTime = -1; + for (String provider : providers) { + if (ActivityCompat + .checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && ActivityCompat + .checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + return; + } + Location lastKnownLocation = mapLocationManager.getLastKnownLocation(provider); + if (lastKnownLocation != null) { + lastUpdate = lastKnownLocation.getTime(); + if (lastUpdate > bestUpdateTime) { + currentLocation = lastKnownLocation; + bestUpdateTime = lastUpdate; + } + } + } + } else { + currentLocationKnown = true; + } + + if (currentLocation != null) { + // if this map contains data to our current position, add it to + // the MapsOfCurrentLocation-list + for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; + currentMapIndex++) { + if (osm_maps[currentMapIndex].isInMap(currentLocation)) { + HashMap<String, String> currentPositionMapChild = new HashMap<String, String>(); + currentPositionMapChild + .put("map_name", osm_maps[currentMapIndex].map_name + " " + + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + + "MB"); + currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex)); + + maps_current_position_childs.add(currentPositionMapChild); + } + } + } + } + } + + private SimpleExpandableListAdapter createAdapter() { + + NavitMapDownloader.osm_map_values osm_maps[] = NavitMapDownloader.osm_maps; + + ArrayList<HashMap<String, String>> resultGroups = new ArrayList<HashMap<String, String>>(); + ArrayList<ArrayList<HashMap<String, String>>> resultChilds = + new ArrayList<ArrayList<HashMap<String, String>>>(); + + // add already downloaded maps (group and empty child list + HashMap<String, String> downloaded_maps_hash = new HashMap<String, String>(); + downloaded_maps_hash + .put("category_name", Navit.getInstance().getTstring(R.string.maps_installed)); + resultGroups.add(downloaded_maps_hash); + downloaded_maps_childs = new ArrayList<HashMap<String, String>>(); + resultChilds.add(downloaded_maps_childs); + + ArrayList<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>(); + maps_current_position_childs = new ArrayList<HashMap<String, String>>(); + // maps containing the current location + HashMap<String, String> matching_maps = new HashMap<String, String>(); + matching_maps.put("category_name", + Navit.getInstance().getTstring(R.string.maps_for_current_location)); + resultGroups.add(matching_maps); + resultChilds.add(maps_current_position_childs); + + // add all maps + for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { + if (osm_maps[currentMapIndex].level == 0) { + if (secList.size() > 0) { + resultChilds.add(secList); + } + secList = new ArrayList<HashMap<String, String>>(); + HashMap<String, String> map_info_hash = new HashMap<String, String>(); + map_info_hash.put("category_name", osm_maps[currentMapIndex].map_name); + resultGroups.add(map_info_hash); + } + + HashMap<String, String> child = new HashMap<String, String>(); + child.put("map_name", (osm_maps[currentMapIndex].level > 1 ? MAP_BULLETPOINT : "") + + osm_maps[currentMapIndex].map_name + " " + + (osm_maps[currentMapIndex].est_size_bytes / 1024 / 1024) + "MB"); + child.put("map_index", String.valueOf(currentMapIndex)); + + secList.add(child); + } + resultChilds.add(secList); + + return new SimpleExpandableListAdapter(this, resultGroups, + android.R.layout.simple_expandable_list_item_1, + new String[]{"category_name"}, new int[]{android.R.id.text1}, resultChilds, + android.R.layout.simple_expandable_list_item_1, new String[]{"map_name"}, + new int[]{android.R.id.text1}); + } + + @Override + public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, + int childPosition, long id) { + super.onChildClick(parent, v, groupPosition, childPosition, id); + Log.d(TAG, "p:" + groupPosition + ", child_pos:" + childPosition); + + @SuppressWarnings("unchecked") + HashMap<String, String> child = (HashMap<String, String>) adapter + .getChild(groupPosition, childPosition); + + String map_index = child.get("map_index"); + if (map_index != null) { + int mi = Integer.parseInt(map_index); + if (NavitMapDownloader.osm_maps[mi].est_size_bytes / 1024 / 1024 / 950 >= 4) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, + Navit.getInstance().getTstring(R.string.map_download_oversize), + -1, 0, 0); + return true; + } + Intent resultIntent = new Intent(); + resultIntent.putExtra("map_index", mi); + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } else { + // ask user if to delete this map + askForMapDeletion(child.get("map_location")); + } + return true; + } + + private void askForMapDeletion(final String map_location) { + AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this); + deleteMapBox.setTitle(Navit.getInstance().getTstring(R.string.map_delete)); + deleteMapBox.setCancelable(true); + + NavitMap maptoDelete = new NavitMap(map_location); + deleteMapBox.setMessage( + maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + + "MB"); + + // TRANS + deleteMapBox.setPositiveButton(Navit.getInstance().getTstring(R.string.yes), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.d(TAG, "Delete Map"); + Message msg = + Message.obtain( + Navit.getInstance().getNavitGraphics().callback_handler, + NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); + Bundle b = new Bundle(); + b.putString("title", map_location); + msg.setData(b); + msg.sendToTarget(); + finish(); + } + }); + + // TRANS + deleteMapBox.setNegativeButton((Navit.getInstance().getTstring(R.string.no)), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.d(TAG, "don't delete map"); + } + }); + deleteMapBox.show(); + } } diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/android/src/org/navitproject/navit/NavitGraphics.java index 35b44cf0f..e8394dfb8 100644 --- a/navit/android/src/org/navitproject/navit/NavitGraphics.java +++ b/navit/android/src/org/navitproject/navit/NavitGraphics.java @@ -19,10 +19,6 @@ package org.navitproject.navit; -import java.io.File; -import java.lang.reflect.Method; -import java.util.ArrayList; - import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; @@ -50,1029 +46,1034 @@ import android.view.ViewGroup.LayoutParams; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; import android.widget.RelativeLayout; +import java.io.File; +import java.lang.reflect.Method; +import java.util.ArrayList; public class NavitGraphics { - private static final String TAG = "NavitGraphics"; - private final NavitGraphics parent_graphics; - private final ArrayList<NavitGraphics> overlays = new ArrayList<NavitGraphics>(); - private int bitmap_w; - private int bitmap_h; - private int pos_x; - private int pos_y; - private int pos_wraparound; - private int overlay_disabled; - private int bgcolor; - private float trackball_x, trackball_y; - private View view; - private SystemBarTintView navigationTintView; - private SystemBarTintView statusTintView; - private FrameLayout frameLayout; - private RelativeLayout relativelayout; - private NavitCamera camera; - private Navit activity; - private static Boolean in_map = false; - // for menu key - private static final long time_for_long_press = 300L; - - - private Handler timer_handler = new Handler(); - - public void setBackgroundColor(int bgcolor) { - this.bgcolor = bgcolor; - if (navigationTintView != null) - navigationTintView.setBackgroundColor(bgcolor); - if (statusTintView != null) - statusTintView.setBackgroundColor(bgcolor); - } - - private void SetCamera(int use_camera) - { - if (use_camera != 0 && camera == null) - { - // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); - camera = new NavitCamera(activity); - relativelayout.addView(camera); - relativelayout.bringChildToFront(view); - } - } - - private Rect get_rect() - { - Rect ret=new Rect(); - ret.left=pos_x; - ret.top=pos_y; - if (pos_wraparound != 0) { - if (ret.left < 0) { - ret.left+=parent_graphics.bitmap_w; - } - if (ret.top < 0) { - ret.top+=parent_graphics.bitmap_h; - } - } - ret.right=ret.left+bitmap_w; - ret.bottom=ret.top+bitmap_h; - if (pos_wraparound != 0) { - if (bitmap_w < 0) { - ret.right=ret.left+bitmap_w+parent_graphics.bitmap_w; - } - if (bitmap_h < 0) { - ret.bottom=ret.top+bitmap_h+parent_graphics.bitmap_h; - } - } - return ret; - } - - private class NavitView extends View implements Runnable, MenuItem.OnMenuItemClickListener{ - int touch_mode = NONE; - float oldDist = 0; - static final int NONE = 0; - static final int DRAG = 1; - static final int ZOOM = 2; - static final int PRESSED = 3; - - Method eventGetX = null; - Method eventGetY = null; - - PointF mPressedPosition = null; - - public NavitView(Context context) { - super(context); - try - { - eventGetX = android.view.MotionEvent.class.getMethod("getX", int.class); - eventGetY = android.view.MotionEvent.class.getMethod("getY", int.class); - } - catch (Exception e) - { - Log.e(TAG, "Multitouch zoom not supported"); - } - } - - @Override - protected void onCreateContextMenu(ContextMenu menu) { - super.onCreateContextMenu(menu); - - menu.setHeaderTitle(activity.T("Position")+".."); - menu.add(1, 1, NONE, activity.T("Route to here")).setOnMenuItemClickListener(this); - menu.add(1, 2, NONE, activity.T("Cancel")).setOnMenuItemClickListener(this); - } - - @Override - public boolean onMenuItemClick(MenuItem item) { - switch(item.getItemId()) { - case 1: - Message msg = Message.obtain(callback_handler, msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal() - , (int)mPressedPosition.x, (int)mPressedPosition.y); - msg.sendToTarget(); - break; - } - return false; - } - - - @Override - protected void onDraw(Canvas canvas) - { - super.onDraw(canvas); - canvas.drawBitmap(draw_bitmap, pos_x, pos_y, null); - if (overlay_disabled == 0) - { - // assume we ARE in map view mode! - in_map = true; - for (NavitGraphics overlay : overlays) - { - if (overlay.overlay_disabled == 0) - { - Rect r=overlay.get_rect(); - canvas.drawBitmap(overlay.draw_bitmap, r.left, r.top, null); - } - } - } - else - { - if (Navit.show_soft_keyboard) - { - if (Navit.mgr != null) - { - Navit.mgr.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); - Navit.show_soft_keyboard_now_showing = true; - // clear the variable now, keyboard will stay on screen until backbutton pressed - Navit.show_soft_keyboard = false; - } - } - } - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) - { - Log.d(TAG, "onSizeChanged pixels x=" + w + " pixels y=" + h); - Log.d(TAG, "onSizeChanged density=" + Navit.metrics.density); - Log.d(TAG, "onSizeChanged scaledDensity=" - + Navit.metrics.scaledDensity); - super.onSizeChanged(w, h, oldw, oldh); - - handleResize(w, h); - } - - void do_longpress_action() - { - Log.d(TAG, "do_longpress_action enter"); - - activity.openContextMenu(this); - } - - private int getActionField(String fieldname, Object obj) - { - int ret_value = -999; - try - { - java.lang.reflect.Field field = android.view.MotionEvent.class.getField(fieldname); - try - { - ret_value = field.getInt(obj); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - catch (NoSuchFieldException ex) { - ex.printStackTrace(); - } - return ret_value; - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouchEvent(MotionEvent event) - { - super.onTouchEvent(event); - int x = (int) event.getX(); - int y = (int) event.getY(); - - int _ACTION_POINTER_UP_ = getActionField("ACTION_POINTER_UP", event); - int _ACTION_POINTER_DOWN_ = getActionField("ACTION_POINTER_DOWN", event); - int _ACTION_MASK_ = getActionField("ACTION_MASK", event); - - int switch_value = event.getAction(); - if (_ACTION_MASK_ != -999) - { - switch_value = (event.getAction() & _ACTION_MASK_); - } - - if (switch_value == MotionEvent.ACTION_DOWN) - { - touch_mode = PRESSED; - if (!in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down - mPressedPosition = new PointF(x, y); - postDelayed(this, time_for_long_press); - } - else if ((switch_value == MotionEvent.ACTION_UP) || (switch_value == _ACTION_POINTER_UP_)) - { - Log.d(TAG, "ACTION_UP"); - - switch (touch_mode) { - case DRAG: - Log.d(TAG, "onTouch move"); - - MotionCallback(MotionCallbackID, x, y); - ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up - - break; - case ZOOM: - float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); - float scale = 0; - if (newDist > 10f) { - scale = newDist / oldDist; - } - - if (scale > 1.3) { - // zoom in - CallbackMessageChannel(1, null); - } else if (scale < 0.8) { - // zoom out - CallbackMessageChannel(2, null); - } - break; - case PRESSED: - if (in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down - ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up - - break; - } - touch_mode = NONE; - } - else if (switch_value == MotionEvent.ACTION_MOVE) - { - switch (touch_mode) { - case DRAG: - MotionCallback(MotionCallbackID, x, y); - break; - case ZOOM: - float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); - float scale = newDist / oldDist; - Log.d(TAG, "New scale = " + scale); - if (scale > 1.2) { - // zoom in - CallbackMessageChannel(1, ""); - oldDist = newDist; - } else if (scale < 0.8) { - oldDist = newDist; - // zoom out - CallbackMessageChannel(2, ""); - } - break; - case PRESSED: - Log.d(TAG, "Start drag mode"); - if (spacing(mPressedPosition, new PointF(event.getX(), event.getY())) > 20f) { - ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down - touch_mode = DRAG; - } - break; - } - } - else if (switch_value == _ACTION_POINTER_DOWN_) - { - oldDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); - if (oldDist > 2f) - { - touch_mode = ZOOM; - } - } - return true; - } - - private float spacing(PointF a, PointF b) - { - float x = a.x - b.x; - float y = a.y - b.y; - return (float)Math.sqrt(x * x + y * y); - } - - private PointF getFloatValue(Object instance, Object argument) - { - PointF pos = new PointF(0,0); - - if (eventGetX != null && eventGetY != null) - { - try - { - Float x = (java.lang.Float) eventGetX.invoke(instance, argument); - Float y = (java.lang.Float) eventGetY.invoke(instance, argument); - pos.set(x, y); - - } - catch (Exception e){ - e.printStackTrace(); - } - } - return pos; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) - { - int i; - String s = null; - long interval_for_long_press = 200L; - i = event.getUnicodeChar(); - if (i == 0) - { - switch (keyCode) { - case KeyEvent.KEYCODE_DEL: - s = String.valueOf((char) 8); - break; - case KeyEvent.KEYCODE_MENU: - if (!in_map) { - // if last menukeypress is less than 0.2 seconds away then count longpress - if ((System.currentTimeMillis() - Navit.last_pressed_menu_key) < interval_for_long_press) { - Navit.time_pressed_menu_key = Navit.time_pressed_menu_key - + (System.currentTimeMillis() - Navit.last_pressed_menu_key); - // on long press let softkeyboard popup - if (Navit.time_pressed_menu_key > time_for_long_press) { - Navit.show_soft_keyboard = true; - Navit.time_pressed_menu_key = 0L; - // need to draw to get the keyboard showing - this.postInvalidate(); - } - } else { - Navit.time_pressed_menu_key = 0L; - } - Navit.last_pressed_menu_key = System.currentTimeMillis(); - // if in menu view: - // use as OK (Enter) key - // dont use menu key here (use it in onKeyUp) - return true; - } else { - // if on map view: - // volume UP - //s = java.lang.String.valueOf((char) 1); - return true; - } - case KeyEvent.KEYCODE_SEARCH: - /* Handle event in Main Activity if map is shown */ - if (in_map) - return false; - - s = String.valueOf((char) 19); - break; - case KeyEvent.KEYCODE_BACK: - s = String.valueOf((char) 27); - break; - case KeyEvent.KEYCODE_CALL: - s = String.valueOf((char) 3); - break; - case KeyEvent.KEYCODE_VOLUME_UP: - if (!in_map) { - // if in menu view: - // use as UP key - s = String.valueOf((char) 16); - } else { - // if on map view: - // volume UP - //s = java.lang.String.valueOf((char) 21); - return false; - } - break; - case KeyEvent.KEYCODE_VOLUME_DOWN: - if (!in_map) { - // if in menu view: - // use as DOWN key - s = String.valueOf((char) 14); - } else { - // if on map view: - // volume DOWN - //s = java.lang.String.valueOf((char) 4); - return false; - } - break; - case KeyEvent.KEYCODE_DPAD_CENTER: - s = String.valueOf((char) 13); - break; - case KeyEvent.KEYCODE_DPAD_DOWN: - s = String.valueOf((char) 14); - break; - case KeyEvent.KEYCODE_DPAD_LEFT: - s = String.valueOf((char) 2); - break; - case KeyEvent.KEYCODE_DPAD_RIGHT: - s = String.valueOf((char) 6); - break; - case KeyEvent.KEYCODE_DPAD_UP: - s = String.valueOf((char) 16); - break; - } - } - else if (i == 10) - { - s = java.lang.String.valueOf((char) 13); - } - - if (s != null) - { - KeypressCallback(KeypressCallbackID, s); - } - return true; - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) - { - int i; - String s = null; - i = event.getUnicodeChar(); - - if (i == 0) - { - switch (keyCode) { - case KeyEvent.KEYCODE_VOLUME_UP: - return (!in_map); - case KeyEvent.KEYCODE_VOLUME_DOWN: - return (!in_map); - case KeyEvent.KEYCODE_SEARCH: - /* Handle event in Main Activity if map is shown */ - if (in_map) - return false; - break; - case KeyEvent.KEYCODE_BACK: - if (Navit.show_soft_keyboard_now_showing) { - Navit.show_soft_keyboard_now_showing = false; - } - //s = java.lang.String.valueOf((char) 27); - return true; - case KeyEvent.KEYCODE_MENU: - if (!in_map) { - if (Navit.show_soft_keyboard_now_showing) { - // if soft keyboard showing on screen, dont use menu button as select key - } else { - // if in menu view: - // use as OK (Enter) key - s = String.valueOf((char) 13); - } - } else { - // if on map view: - // volume UP - //s = java.lang.String.valueOf((char) 1); - return false; - } - break; - } - } - else if(i!=10) - { - s = java.lang.String.valueOf((char) i); - } - - if (s != null) - { - KeypressCallback(KeypressCallbackID, s); - } - return true; - - } - - @Override - public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) - { - String s; - if(keyCode == KeyEvent.KEYCODE_UNKNOWN) { - s=event.getCharacters(); - KeypressCallback(KeypressCallbackID, s); - return true; - } - return super.onKeyMultiple(keyCode, count, event); - } - - @Override - public boolean onTrackballEvent(MotionEvent event) - { - String s = null; - if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) - { - s = java.lang.String.valueOf((char) 13); - } - if (event.getAction() == android.view.MotionEvent.ACTION_MOVE) - { - trackball_x += event.getX(); - trackball_y += event.getY(); - if (trackball_x <= -1) - { - s = java.lang.String.valueOf((char) 2); - trackball_x += 1; - } - if (trackball_x >= 1) - { - s = java.lang.String.valueOf((char) 6); - trackball_x -= 1; - } - if (trackball_y <= -1) - { - s = java.lang.String.valueOf((char) 16); - trackball_y += 1; - } - if (trackball_y >= 1) - { - s = java.lang.String.valueOf((char) 14); - trackball_y -= 1; - } - } - if (s != null) - { - KeypressCallback(KeypressCallbackID, s); - } - return true; - } - - public void run() { - if (in_map && touch_mode == PRESSED) - { - do_longpress_action(); - touch_mode = NONE; - } - } - - } - - private class SystemBarTintView extends View { - - public SystemBarTintView(Context context) { - super(context); - this.setBackgroundColor(bgcolor); - } - - } - - public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, - int wraparound, int use_camera) - { - if (parent == null) - { - this.activity = (Navit) activity; - view = new NavitView(activity); - //activity.registerForContextMenu(view); - view.setClickable(false); - view.setFocusable(true); - view.setFocusableInTouchMode(true); - view.setKeepScreenOn(true); - relativelayout = new RelativeLayout(activity); - if (use_camera != 0) - { - SetCamera(use_camera); - } - relativelayout.addView(view); - - /* The navigational and status bar tinting code is meaningful only on API19+ */ - if(Build.VERSION.SDK_INT >= 19) - { - frameLayout = new FrameLayout(activity); - frameLayout.addView(relativelayout); - navigationTintView = new SystemBarTintView(activity); - statusTintView = new SystemBarTintView(activity); - frameLayout.addView(navigationTintView); - frameLayout.addView(statusTintView); - activity.setContentView(frameLayout); - } - else - { - activity.setContentView(relativelayout); - } - - view.requestFocus(); - } - else - { - draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - bitmap_w = w; - bitmap_h = h; - pos_x = x; - pos_y = y; - pos_wraparound = wraparound; - draw_canvas = new Canvas(draw_bitmap); - parent.overlays.add(this); - } - parent_graphics = parent; - } - - public enum msg_type { - CLB_ZOOM_IN, CLB_ZOOM_OUT, CLB_REDRAW, CLB_MOVE, CLB_BUTTON_UP, CLB_BUTTON_DOWN, CLB_SET_DESTINATION - , CLB_SET_DISPLAY_DESTINATION, CLB_CALL_CMD, CLB_COUNTRY_CHOOSER, CLB_LOAD_MAP, CLB_UNLOAD_MAP, CLB_DELETE_MAP - } - - static private final msg_type[] msg_values = msg_type.values(); - - public final Handler callback_handler = new Handler() - { - public void handleMessage(Message msg) - { - switch (msg_values[msg.what]) - { - case CLB_ZOOM_IN: - CallbackMessageChannel(1, ""); - break; - case CLB_ZOOM_OUT: - CallbackMessageChannel(2, ""); - break; - case CLB_MOVE: - MotionCallback(MotionCallbackID, msg.getData().getInt("x"), msg.getData().getInt("y")); - break; - case CLB_SET_DESTINATION: - String lat = Float.toString(msg.getData().getFloat("lat")); - String lon = Float.toString(msg.getData().getFloat("lon")); - String q = msg.getData().getString(("q")); - CallbackMessageChannel(3, lat + "#" + lon + "#" + q); - break; - case CLB_SET_DISPLAY_DESTINATION: - int x = msg.arg1; - int y = msg.arg2; - CallbackMessageChannel(4, "" + x + "#" + y); - break; - case CLB_CALL_CMD: - String cmd = msg.getData().getString(("cmd")); - CallbackMessageChannel(5, cmd); - break; - case CLB_BUTTON_UP: - ButtonCallback(ButtonCallbackID, 0, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // up - break; - case CLB_BUTTON_DOWN: - ButtonCallback(ButtonCallbackID, 1, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // down - break; - case CLB_COUNTRY_CHOOSER: - break; - case CLB_LOAD_MAP: - CallbackMessageChannel(6, msg.getData().getString(("title"))); - break; - case CLB_DELETE_MAP: - File toDelete = new File( msg.getData().getString(("title"))); - toDelete.delete(); - //fallthrough - case CLB_UNLOAD_MAP: - CallbackMessageChannel(7, msg.getData().getString(("title"))); - break; - } - } - }; - - public native void SizeChangedCallback(int id, int x, int y); - public native void PaddingChangedCallback(int id, int left, int right, int top, int bottom); - public native void KeypressCallback(int id, String s); - public native int CallbackMessageChannel(int i, String s); - public native void ButtonCallback(int id, int pressed, int button, int x, int y); - public native void MotionCallback(int id, int x, int y); - public native String GetDefaultCountry(int id, String s); - public static native String[][] GetAllCountries(); - private Canvas draw_canvas; - private Bitmap draw_bitmap; - private int SizeChangedCallbackID, PaddingChangedCallbackID, ButtonCallbackID, MotionCallbackID, KeypressCallbackID; - - /** - * @brief Adjust views used to tint navigation and status bars. - * - * This method is called from handleResize. - * - * It (re-)evaluates if and where the navigation bar is going to be shown, and calculates the - * padding for objects which should not be obstructed. - * - */ - private void adjustSystemBarsTintingViews() { - - /* frameLayout is only created on platforms supporting navigation and status bar tinting */ - if (frameLayout == null) - return; - - if (activity == null) { - Log.w(TAG, "Main Activity is not a Navit instance, cannot update padding"); - return; - } - - Navit navit = activity; - - /* - * Determine visibility of status bar. - * The status bar is always visible unless we are in fullscreen mode. - */ - final Boolean isStatusShowing = !navit.isFullscreen; - - /* - * Determine visibility of navigation bar. - * This logic is based on the presence of a hardware menu button and is known to work on - * devices which allow switching between hw and sw buttons (OnePlus One running CyanogenMod). - */ - final Boolean isNavShowing = !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(navit)); - Log.d(TAG, String.format("isStatusShowing=%b isNavShowing=%b", isStatusShowing, isNavShowing)); - - /* - * Determine where the navigation bar would be displayed. - * Logic is taken from AOSP RenderSessionImpl.findNavigationBar() - * (platform/frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java) - */ - final Boolean isLandscape = (navit.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); - final Boolean isNavAtBottom = (!isLandscape) || (navit.getResources().getConfiguration().smallestScreenWidthDp >= 600); - Log.d(TAG, String.format("isNavAtBottom=%b (Configuration.smallestScreenWidthDp=%d, isLandscape=%b)", - isNavAtBottom, navit.getResources().getConfiguration().smallestScreenWidthDp, isLandscape)); - - int left = 0; - int top = isStatusShowing ? Navit.status_bar_height : 0; - int right = (isNavShowing && !isNavAtBottom) ? Navit.navigation_bar_width : 0; - final int bottom = (!(isNavShowing && isNavAtBottom)) ? 0 : isLandscape ? Navit.navigation_bar_height_landscape : Navit.navigation_bar_height; - - /* hide tint bars during update to prevent ugly effects */ - statusTintView.setVisibility(View.GONE); - navigationTintView.setVisibility(View.GONE); - - frameLayout.post(new Runnable() { - @Override - public void run() { - statusTintView.setVisibility(isStatusShowing ? View.VISIBLE : View.GONE); - FrameLayout.LayoutParams statusLayoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, Navit.status_bar_height, Gravity.TOP); - - /* Prevent tint views from overlapping when navigation is on the right */ - statusLayoutParams.setMargins(0, 0, (isNavShowing && !isNavAtBottom) ? Navit.navigation_bar_width : 0, 0); - statusTintView.setLayoutParams(statusLayoutParams); - Log.d(TAG, String.format("statusTintView: width=%d height=%d", - statusTintView.getWidth(), statusTintView.getHeight())); - navigationTintView.setVisibility(isNavShowing ? View.VISIBLE : View.GONE); - LayoutParams navigationLayoutParams = new FrameLayout.LayoutParams( - isNavAtBottom ? LayoutParams.MATCH_PARENT : Navit.navigation_bar_width, // X - isNavAtBottom ? bottom : LayoutParams.MATCH_PARENT, // Y - Gravity.BOTTOM | Gravity.RIGHT); - navigationTintView.setLayoutParams(navigationLayoutParams); - Log.d(TAG, String.format("navigationTintView: width=%d height=%d", - navigationTintView.getWidth(), navigationTintView.getHeight())); - } - }); - - Log.d(TAG, String.format("Padding left=%d top=%d right=%d bottom=%d", left, top, right, bottom)); - - PaddingChangedCallback(PaddingChangedCallbackID, left, top, right, bottom); - } - - /** - * @brief Handles resize events. - * - * This method is called whenever the main View is resized in any way. This is the case when its - * {@code onSizeChanged()} event handler fires or when toggling Fullscreen mode. - * - */ - public void handleResize(int w, int h) { - if (this.parent_graphics != null) - this.parent_graphics.handleResize(w, h); - else { - Log.d(TAG, String.format("handleResize w=%d h=%d", w, h)); - - adjustSystemBarsTintingViews(); - - draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - draw_canvas = new Canvas(draw_bitmap); - bitmap_w = w; - bitmap_h = h; - SizeChangedCallback(SizeChangedCallbackID, w, h); - } - } - - /** - * @brief Returns whether the device has a hardware menu button. - * - * Only Android versions starting with ICS (API version 14) support the API call to detect the presence of a - * Menu button. On earlier Android versions, the following assumptions will be made: On API levels up to 10, - * this method will always return {@code true}, as these Android versions relied on devices having a physical - * Menu button. On API levels 11 through 13 (Honeycomb releases), this method will always return - * {@code false}, as Honeycomb was a tablet-only release and did not require devices to have a Menu button. - * - * Note that this method is not aware of non-standard mechanisms on some customized builds of Android. For - * example, CyanogenMod has an option to add a menu button to the navigation bar. Even with that option, - * this method will still return `false`. - */ - public boolean hasMenuButton() { - if (Build.VERSION.SDK_INT <= 10) - return true; - else if (Build.VERSION.SDK_INT <= 13) - return false; - else - return ViewConfiguration.get(activity.getApplication()).hasPermanentMenuKey(); - } - - public void setSizeChangedCallback(int id) - { - SizeChangedCallbackID = id; - } - public void setPaddingChangedCallback(int id) - { - PaddingChangedCallbackID = id; - } - public void setButtonCallback(int id) - { - ButtonCallbackID = id; - } - public void setMotionCallback(int id) - { - MotionCallbackID = id; - if(activity != null){ - activity.setMotionCallback(id, this); - } - } - - public void setKeypressCallback(int id) - { - KeypressCallbackID = id; - // set callback id also in main intent (for menus) - if(activity != null) { - activity.setKeypressCallback(id, this); - } - } - - - protected void draw_polyline(Paint paint, int c[]) - { - int i, ndashes; - float [] intervals; - paint.setStrokeWidth(c[0]); - paint.setARGB(c[1],c[2],c[3],c[4]); - paint.setStyle(Paint.Style.STROKE); - //paint.setAntiAlias(true); - //paint.setStrokeWidth(0); - ndashes=c[5]; - intervals=new float[ndashes+(ndashes%2)]; - for (i = 0; i < ndashes; i++) - intervals[i]=c[6+i]; - - if((ndashes%2)==1) - intervals[ndashes]=intervals[ndashes-1]; - - if(ndashes>0) - paint.setPathEffect(new android.graphics.DashPathEffect(intervals,0.0f)); - - Path path = new Path(); - path.moveTo(c[6+ndashes], c[7+ndashes]); - for (i = 8+ndashes; i < c.length; i += 2) - { - path.lineTo(c[i], c[i + 1]); - } - //global_path.close(); - draw_canvas.drawPath(path, paint); - paint.setPathEffect(null); - } - - protected void draw_polygon(Paint paint, int c[]) - { - paint.setStrokeWidth(c[0]); - paint.setARGB(c[1],c[2],c[3],c[4]); - paint.setStyle(Paint.Style.FILL); - //paint.setAntiAlias(true); - //paint.setStrokeWidth(0); - Path path = new Path(); - path.moveTo(c[5], c[6]); - for (int i = 7; i < c.length; i += 2) - { - path.lineTo(c[i], c[i + 1]); - } - //global_path.close(); - draw_canvas.drawPath(path, paint); - } - protected void draw_rectangle(Paint paint, int x, int y, int w, int h) - { - Rect r = new Rect(x, y, x + w, y + h); - paint.setStyle(Paint.Style.FILL); - paint.setAntiAlias(true); - //paint.setStrokeWidth(0); - draw_canvas.drawRect(r, paint); - } - protected void draw_circle(Paint paint, int x, int y, int r) - { - paint.setStyle(Paint.Style.STROKE); - draw_canvas.drawCircle(x, y, r / 2, paint); - } - protected void draw_text(Paint paint, int x, int y, String text, int size, int dx, int dy, int bgcolor) - { - int oldcolor=paint.getColor(); - Path path=null; - - paint.setTextSize(size / 15); - paint.setStyle(Paint.Style.FILL); - - if (dx != 0x10000 || dy != 0) { - path = new Path(); - path.moveTo(x, y); - path.rLineTo(dx, dy); - paint.setTextAlign(android.graphics.Paint.Align.LEFT); - } - - if(bgcolor!=0) { - paint.setStrokeWidth(3); - paint.setColor(bgcolor); - paint.setStyle(Paint.Style.STROKE); - if(path==null) { - draw_canvas.drawText(text, x, y, paint); - } else { - draw_canvas.drawTextOnPath(text, path, 0, 0, paint); - } - paint.setStyle(Paint.Style.FILL); - paint.setColor(oldcolor); - } - - if(path==null) { - draw_canvas.drawText(text, x, y, paint); - } else { - draw_canvas.drawTextOnPath(text, path, 0, 0, paint); - } - paint.clearShadowLayer(); - } - protected void draw_image(Paint paint, int x, int y, Bitmap bitmap) - { - draw_canvas.drawBitmap(bitmap, x, y, null); - } - - /* takes an image and draws it on the screen as a prerendered maptile - * - * - * - * @param paint Paint object used to draw the image - * @param count the number of points specified - * @param p0x and p0y specifying the top left point - * @param p1x and p1y specifying the top right point - * @param p2x and p2y specifying the bottom left point, not yet used but kept - * for compatibility with the linux port - * @param bitmap Bitmap object holding the image to draw - * - * TODO make it work with 4 points specified to make it work for 3D mapview, so it can be used - * for small but very detailed maps as well as for large maps with very little detail but large - * coverage. - * TODO make it work with rectangular tiles as well ? - */ - protected void draw_image_warp(Paint paint, int count, int p0x, int p0y, int p1x, int p1y, int p2x, int p2y, Bitmap bitmap) - { - - float width; - float scale; - float deltaY; - float deltaX; - float angle; - Matrix matrix; - - if (count == 3) - { - matrix = new Matrix(); - deltaX = p1x - p0x; - deltaY = p1y - p0y; - width = (float) (Math.sqrt((deltaX * deltaX) + (deltaY * deltaY))); - angle = (float) (Math.atan2(deltaY, deltaX) * 180d / Math.PI); - scale = width / bitmap.getWidth(); - matrix.preScale(scale, scale); - matrix.postTranslate(p0x, p0y); - matrix.postRotate(angle, p0x, p0y); - draw_canvas.drawBitmap(bitmap, matrix, paint); - } - } - - /* These constants must be synchronized with enum draw_mode_num in graphics.h. */ - private static final int draw_mode_begin = 0; - private static final int draw_mode_end = 1; - - protected void draw_mode(int mode) - { - if (mode == draw_mode_end) { - if (parent_graphics == null) { - view.invalidate(); - } else { - parent_graphics.view.invalidate(get_rect()); - } - } - if (mode == draw_mode_begin && parent_graphics != null) { - draw_bitmap.eraseColor(0); - } - - } - protected void draw_drag(int x, int y) - { - pos_x = x; - pos_y = y; - } - protected void overlay_disable(int disable) - { - Log.d(TAG,"overlay_disable: " + disable + "Parent: " + (parent_graphics != null)); - // assume we are NOT in map view mode! - if (parent_graphics == null) - in_map = (disable==0); - if (overlay_disabled != disable) { - overlay_disabled = disable; - if (parent_graphics != null) { - parent_graphics.view.invalidate(get_rect()); - } - } - } - - protected void overlay_resize(int x, int y, int w, int h, int wraparound) - { - draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - bitmap_w = w; - bitmap_h = h; - pos_x = x; - pos_y = y; - pos_wraparound = wraparound; - draw_canvas.setBitmap(draw_bitmap); - } + private static final String TAG = "NavitGraphics"; + private final NavitGraphics parent_graphics; + private final ArrayList<NavitGraphics> overlays = new ArrayList<NavitGraphics>(); + private int bitmap_w; + private int bitmap_h; + private int pos_x; + private int pos_y; + private int pos_wraparound; + private int overlay_disabled; + private int bgcolor; + private float trackball_x, trackball_y; + private View view; + private SystemBarTintView navigationTintView; + private SystemBarTintView statusTintView; + private FrameLayout frameLayout; + private RelativeLayout relativelayout; + private NavitCamera camera; + private Navit activity; + private static Boolean in_map = false; + // for menu key + private static final long time_for_long_press = 300L; + + + private Handler timer_handler = new Handler(); + + public void setBackgroundColor(int bgcolor) { + this.bgcolor = bgcolor; + if (navigationTintView != null) + navigationTintView.setBackgroundColor(bgcolor); + if (statusTintView != null) + statusTintView.setBackgroundColor(bgcolor); + } + + private void SetCamera(int use_camera) + { + if (use_camera != 0 && camera == null) + { + // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); + camera = new NavitCamera(activity); + relativelayout.addView(camera); + relativelayout.bringChildToFront(view); + } + } + + private Rect get_rect() + { + Rect ret=new Rect(); + ret.left=pos_x; + ret.top=pos_y; + if (pos_wraparound != 0) { + if (ret.left < 0) { + ret.left+=parent_graphics.bitmap_w; + } + if (ret.top < 0) { + ret.top+=parent_graphics.bitmap_h; + } + } + ret.right=ret.left+bitmap_w; + ret.bottom=ret.top+bitmap_h; + if (pos_wraparound != 0) { + if (bitmap_w < 0) { + ret.right=ret.left+bitmap_w+parent_graphics.bitmap_w; + } + if (bitmap_h < 0) { + ret.bottom=ret.top+bitmap_h+parent_graphics.bitmap_h; + } + } + return ret; + } + + private class NavitView extends View implements Runnable, MenuItem.OnMenuItemClickListener{ + int touch_mode = NONE; + float oldDist = 0; + static final int NONE = 0; + static final int DRAG = 1; + static final int ZOOM = 2; + static final int PRESSED = 3; + + Method eventGetX = null; + Method eventGetY = null; + + PointF mPressedPosition = null; + + public NavitView(Context context) { + super(context); + try + { + eventGetX = android.view.MotionEvent.class.getMethod("getX", int.class); + eventGetY = android.view.MotionEvent.class.getMethod("getY", int.class); + } + catch (Exception e) + { + Log.e(TAG, "Multitouch zoom not supported"); + } + } + + @Override + protected void onCreateContextMenu(ContextMenu menu) { + super.onCreateContextMenu(menu); + + menu.setHeaderTitle(activity.getTstring(R.string.position_popup_title)+".."); + menu.add(1, 1, NONE, activity.getTstring(R.string.position_popup_drive_here)).setOnMenuItemClickListener(this); + menu.add(1, 2, NONE, activity.getTstring(R.string.cancel)).setOnMenuItemClickListener(this); + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + switch(item.getItemId()) { + case 1: + Message msg = Message.obtain(callback_handler, msg_type.CLB_SET_DISPLAY_DESTINATION.ordinal() + , (int)mPressedPosition.x, (int)mPressedPosition.y); + msg.sendToTarget(); + break; + } + return false; + } + + + @Override + protected void onDraw(Canvas canvas) + { + super.onDraw(canvas); + canvas.drawBitmap(draw_bitmap, pos_x, pos_y, null); + if (overlay_disabled == 0) + { + // assume we ARE in map view mode! + in_map = true; + for (NavitGraphics overlay : overlays) + { + if (overlay.overlay_disabled == 0) + { + Rect r=overlay.get_rect(); + canvas.drawBitmap(overlay.draw_bitmap, r.left, r.top, null); + } + } + } + else + { + if (Navit.show_soft_keyboard) + { + if (Navit.mgr != null) + { + Navit.mgr.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT); + Navit.show_soft_keyboard_now_showing = true; + // clear the variable now, keyboard will stay on screen until backbutton pressed + Navit.show_soft_keyboard = false; + } + } + } + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) + { + Log.d(TAG, "onSizeChanged pixels x=" + w + " pixels y=" + h); + Log.d(TAG, "onSizeChanged density=" + Navit.metrics.density); + Log.d(TAG, "onSizeChanged scaledDensity=" + + Navit.metrics.scaledDensity); + super.onSizeChanged(w, h, oldw, oldh); + + handleResize(w, h); + } + + void do_longpress_action() + { + Log.d(TAG, "do_longpress_action enter"); + + activity.openContextMenu(this); + } + + private int getActionField(String fieldname, Object obj) + { + int ret_value = -999; + try + { + java.lang.reflect.Field field = android.view.MotionEvent.class.getField(fieldname); + try + { + ret_value = field.getInt(obj); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + catch (NoSuchFieldException ex) { + ex.printStackTrace(); + } + return ret_value; + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) + { + super.onTouchEvent(event); + int x = (int) event.getX(); + int y = (int) event.getY(); + + int _ACTION_POINTER_UP_ = getActionField("ACTION_POINTER_UP", event); + int _ACTION_POINTER_DOWN_ = getActionField("ACTION_POINTER_DOWN", event); + int _ACTION_MASK_ = getActionField("ACTION_MASK", event); + + int switch_value = event.getAction(); + if (_ACTION_MASK_ != -999) + { + switch_value = (event.getAction() & _ACTION_MASK_); + } + + if (switch_value == MotionEvent.ACTION_DOWN) + { + touch_mode = PRESSED; + if (!in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down + mPressedPosition = new PointF(x, y); + postDelayed(this, time_for_long_press); + } + else if ((switch_value == MotionEvent.ACTION_UP) || (switch_value == _ACTION_POINTER_UP_)) + { + Log.d(TAG, "ACTION_UP"); + + switch (touch_mode) { + case DRAG: + Log.d(TAG, "onTouch move"); + + MotionCallback(MotionCallbackID, x, y); + ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up + + break; + case ZOOM: + float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); + float scale = 0; + if (newDist > 10f) { + scale = newDist / oldDist; + } + + if (scale > 1.3) { + // zoom in + CallbackMessageChannel(1, null); + } else if (scale < 0.8) { + // zoom out + CallbackMessageChannel(2, null); + } + break; + case PRESSED: + if (in_map) ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down + ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up + + break; + } + touch_mode = NONE; + } + else if (switch_value == MotionEvent.ACTION_MOVE) + { + switch (touch_mode) { + case DRAG: + MotionCallback(MotionCallbackID, x, y); + break; + case ZOOM: + float newDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); + float scale = newDist / oldDist; + Log.d(TAG, "New scale = " + scale); + if (scale > 1.2) { + // zoom in + CallbackMessageChannel(1, ""); + oldDist = newDist; + } else if (scale < 0.8) { + oldDist = newDist; + // zoom out + CallbackMessageChannel(2, ""); + } + break; + case PRESSED: + Log.d(TAG, "Start drag mode"); + if (spacing(mPressedPosition, new PointF(event.getX(), event.getY())) > 20f) { + ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down + touch_mode = DRAG; + } + break; + } + } + else if (switch_value == _ACTION_POINTER_DOWN_) + { + oldDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); + if (oldDist > 2f) + { + touch_mode = ZOOM; + } + } + return true; + } + + private float spacing(PointF a, PointF b) + { + float x = a.x - b.x; + float y = a.y - b.y; + return (float)Math.sqrt(x * x + y * y); + } + + private PointF getFloatValue(Object instance, Object argument) + { + PointF pos = new PointF(0,0); + + if (eventGetX != null && eventGetY != null) + { + try + { + Float x = (java.lang.Float) eventGetX.invoke(instance, argument); + Float y = (java.lang.Float) eventGetY.invoke(instance, argument); + pos.set(x, y); + + } + catch (Exception e){ + e.printStackTrace(); + } + } + return pos; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) + { + int i; + String s = null; + long interval_for_long_press = 200L; + i = event.getUnicodeChar(); + if (i == 0) + { + switch (keyCode) { + case KeyEvent.KEYCODE_DEL: + s = String.valueOf((char) 8); + break; + case KeyEvent.KEYCODE_MENU: + if (!in_map) { + // if last menukeypress is less than 0.2 seconds away then count longpress + if ((System.currentTimeMillis() - Navit.last_pressed_menu_key) < interval_for_long_press) { + Navit.time_pressed_menu_key = Navit.time_pressed_menu_key + + (System.currentTimeMillis() - Navit.last_pressed_menu_key); + // on long press let softkeyboard popup + if (Navit.time_pressed_menu_key > time_for_long_press) { + Navit.show_soft_keyboard = true; + Navit.time_pressed_menu_key = 0L; + // need to draw to get the keyboard showing + this.postInvalidate(); + } + } else { + Navit.time_pressed_menu_key = 0L; + } + Navit.last_pressed_menu_key = System.currentTimeMillis(); + // if in menu view: + // use as OK (Enter) key + // dont use menu key here (use it in onKeyUp) + return true; + } else { + // if on map view: + // volume UP + //s = java.lang.String.valueOf((char) 1); + return true; + } + case KeyEvent.KEYCODE_SEARCH: + /* Handle event in Main Activity if map is shown */ + if (in_map) + return false; + + s = String.valueOf((char) 19); + break; + case KeyEvent.KEYCODE_BACK: + s = String.valueOf((char) 27); + break; + case KeyEvent.KEYCODE_CALL: + s = String.valueOf((char) 3); + break; + case KeyEvent.KEYCODE_VOLUME_UP: + if (!in_map) { + // if in menu view: + // use as UP key + s = String.valueOf((char) 16); + } else { + // if on map view: + // volume UP + //s = java.lang.String.valueOf((char) 21); + return false; + } + break; + case KeyEvent.KEYCODE_VOLUME_DOWN: + if (!in_map) { + // if in menu view: + // use as DOWN key + s = String.valueOf((char) 14); + } else { + // if on map view: + // volume DOWN + //s = java.lang.String.valueOf((char) 4); + return false; + } + break; + case KeyEvent.KEYCODE_DPAD_CENTER: + s = String.valueOf((char) 13); + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + s = String.valueOf((char) 14); + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + s = String.valueOf((char) 2); + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + s = String.valueOf((char) 6); + break; + case KeyEvent.KEYCODE_DPAD_UP: + s = String.valueOf((char) 16); + break; + } + } + else if (i == 10) + { + s = java.lang.String.valueOf((char) 13); + } + + if (s != null) + { + KeypressCallback(KeypressCallbackID, s); + } + return true; + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) + { + int i; + String s = null; + i = event.getUnicodeChar(); + + if (i == 0) + { + switch (keyCode) { + case KeyEvent.KEYCODE_VOLUME_UP: + return (!in_map); + case KeyEvent.KEYCODE_VOLUME_DOWN: + return (!in_map); + case KeyEvent.KEYCODE_SEARCH: + /* Handle event in Main Activity if map is shown */ + if (in_map) + return false; + break; + case KeyEvent.KEYCODE_BACK: + if (Navit.show_soft_keyboard_now_showing) { + Navit.show_soft_keyboard_now_showing = false; + } + //s = java.lang.String.valueOf((char) 27); + return true; + case KeyEvent.KEYCODE_MENU: + if (!in_map) { + if (Navit.show_soft_keyboard_now_showing) { + // if soft keyboard showing on screen, dont use menu button as select key + } else { + // if in menu view: + // use as OK (Enter) key + s = String.valueOf((char) 13); + } + } else { + // if on map view: + // volume UP + //s = java.lang.String.valueOf((char) 1); + return false; + } + break; + } + } + else if(i!=10) + { + s = java.lang.String.valueOf((char) i); + } + + if (s != null) + { + KeypressCallback(KeypressCallbackID, s); + } + return true; + } + + @Override + public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) + { + String s; + if(keyCode == KeyEvent.KEYCODE_UNKNOWN) { + s=event.getCharacters(); + KeypressCallback(KeypressCallbackID, s); + return true; + } + return super.onKeyMultiple(keyCode, count, event); + } + + @Override + public boolean onTrackballEvent(MotionEvent event) + { + String s = null; + if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) + { + s = java.lang.String.valueOf((char) 13); + } + if (event.getAction() == android.view.MotionEvent.ACTION_MOVE) + { + trackball_x += event.getX(); + trackball_y += event.getY(); + if (trackball_x <= -1) + { + s = java.lang.String.valueOf((char) 2); + trackball_x += 1; + } + if (trackball_x >= 1) + { + s = java.lang.String.valueOf((char) 6); + trackball_x -= 1; + } + if (trackball_y <= -1) + { + s = java.lang.String.valueOf((char) 16); + trackball_y += 1; + } + if (trackball_y >= 1) + { + s = java.lang.String.valueOf((char) 14); + trackball_y -= 1; + } + } + if (s != null) + { + KeypressCallback(KeypressCallbackID, s); + } + return true; + } + + public void run() { + if (in_map && touch_mode == PRESSED) + { + do_longpress_action(); + touch_mode = NONE; + } + } + + } + + private class SystemBarTintView extends View { + + public SystemBarTintView(Context context) { + super(context); + this.setBackgroundColor(bgcolor); + } + + } + + public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, + int wraparound, int use_camera) + { + if (parent == null) + { + this.activity = (Navit) activity; + view = new NavitView(activity); + //activity.registerForContextMenu(view); + view.setClickable(false); + view.setFocusable(true); + view.setFocusableInTouchMode(true); + view.setKeepScreenOn(true); + relativelayout = new RelativeLayout(activity); + if (use_camera != 0) + { + SetCamera(use_camera); + } + relativelayout.addView(view); + + /* The navigational and status bar tinting code is meaningful only on API19+ */ + if(Build.VERSION.SDK_INT >= 19) + { + frameLayout = new FrameLayout(activity); + frameLayout.addView(relativelayout); + navigationTintView = new SystemBarTintView(activity); + statusTintView = new SystemBarTintView(activity); + frameLayout.addView(navigationTintView); + frameLayout.addView(statusTintView); + activity.setContentView(frameLayout); + } + else + { + activity.setContentView(relativelayout); + } + + view.requestFocus(); + } + else + { + draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + bitmap_w = w; + bitmap_h = h; + pos_x = x; + pos_y = y; + pos_wraparound = wraparound; + draw_canvas = new Canvas(draw_bitmap); + parent.overlays.add(this); + } + parent_graphics = parent; + } + + public enum msg_type { + CLB_ZOOM_IN, CLB_ZOOM_OUT, CLB_REDRAW, CLB_MOVE, CLB_BUTTON_UP, CLB_BUTTON_DOWN, CLB_SET_DESTINATION + , CLB_SET_DISPLAY_DESTINATION, CLB_CALL_CMD, CLB_COUNTRY_CHOOSER, CLB_LOAD_MAP, CLB_UNLOAD_MAP, CLB_DELETE_MAP + } + + static private final msg_type[] msg_values = msg_type.values(); + + public final Handler callback_handler = new Handler() + { + public void handleMessage(Message msg) + { + switch (msg_values[msg.what]) + { + case CLB_ZOOM_IN: + CallbackMessageChannel(1, ""); + break; + case CLB_ZOOM_OUT: + CallbackMessageChannel(2, ""); + break; + case CLB_MOVE: + MotionCallback(MotionCallbackID, msg.getData().getInt("x"), msg.getData().getInt("y")); + break; + case CLB_SET_DESTINATION: + String lat = Float.toString(msg.getData().getFloat("lat")); + String lon = Float.toString(msg.getData().getFloat("lon")); + String q = msg.getData().getString(("q")); + CallbackMessageChannel(3, lat + "#" + lon + "#" + q); + break; + case CLB_SET_DISPLAY_DESTINATION: + int x = msg.arg1; + int y = msg.arg2; + CallbackMessageChannel(4, "" + x + "#" + y); + break; + case CLB_CALL_CMD: + String cmd = msg.getData().getString(("cmd")); + CallbackMessageChannel(5, cmd); + break; + case CLB_BUTTON_UP: + ButtonCallback(ButtonCallbackID, 0, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // up + break; + case CLB_BUTTON_DOWN: + ButtonCallback(ButtonCallbackID, 1, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // down + break; + case CLB_COUNTRY_CHOOSER: + break; + case CLB_LOAD_MAP: + CallbackMessageChannel(6, msg.getData().getString(("title"))); + break; + case CLB_DELETE_MAP: + File toDelete = new File( msg.getData().getString(("title"))); + toDelete.delete(); + //fallthrough + case CLB_UNLOAD_MAP: + CallbackMessageChannel(7, msg.getData().getString(("title"))); + break; + } + } + }; + + public native void SizeChangedCallback(int id, int x, int y); + public native void PaddingChangedCallback(int id, int left, int right, int top, int bottom); + public native void KeypressCallback(int id, String s); + public native int CallbackMessageChannel(int i, String s); + public native void ButtonCallback(int id, int pressed, int button, int x, int y); + public native void MotionCallback(int id, int x, int y); + public native String GetDefaultCountry(int id, String s); + public static native String[][] GetAllCountries(); + private Canvas draw_canvas; + private Bitmap draw_bitmap; + private int SizeChangedCallbackID, PaddingChangedCallbackID, ButtonCallbackID, MotionCallbackID, KeypressCallbackID; + + /** + * @brief Adjust views used to tint navigation and status bars. + * + * This method is called from handleResize. + * + * It (re-)evaluates if and where the navigation bar is going to be shown, and calculates the + * padding for objects which should not be obstructed. + * + */ + private void adjustSystemBarsTintingViews() { + + /* frameLayout is only created on platforms supporting navigation and status bar tinting */ + if (frameLayout == null) + return; + + if (activity == null) { + Log.w(TAG, "Main Activity is not a Navit instance, cannot update padding"); + return; + } + + Navit navit = activity; + + /* + * Determine visibility of status bar. + * The status bar is always visible unless we are in fullscreen mode. + */ + final Boolean isStatusShowing = !navit.isFullscreen; + + /* + * Determine visibility of navigation bar. + * This logic is based on the presence of a hardware menu button and is known to work on + * devices which allow switching between hw and sw buttons (OnePlus One running CyanogenMod). + */ + final Boolean isNavShowing = !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(navit)); + Log.d(TAG, String.format("isStatusShowing=%b isNavShowing=%b", isStatusShowing, isNavShowing)); + + /* + * Determine where the navigation bar would be displayed. + * Logic is taken from AOSP RenderSessionImpl.findNavigationBar() + * (platform/frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java) + */ + final Boolean isLandscape = (navit.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); + final Boolean isNavAtBottom = (!isLandscape) || (navit.getResources().getConfiguration().smallestScreenWidthDp >= 600); + Log.d(TAG, String.format("isNavAtBottom=%b (Configuration.smallestScreenWidthDp=%d, isLandscape=%b)", + isNavAtBottom, navit.getResources().getConfiguration().smallestScreenWidthDp, isLandscape)); + + int left = 0; + int top = isStatusShowing ? Navit.status_bar_height : 0; + int right = (isNavShowing && !isNavAtBottom) ? Navit.navigation_bar_width : 0; + final int bottom = (!(isNavShowing && isNavAtBottom)) ? 0 : isLandscape ? Navit.navigation_bar_height_landscape : Navit.navigation_bar_height; + + /* hide tint bars during update to prevent ugly effects */ + statusTintView.setVisibility(View.GONE); + navigationTintView.setVisibility(View.GONE); + + frameLayout.post(new Runnable() { + @Override + public void run() { + statusTintView.setVisibility(isStatusShowing ? View.VISIBLE : View.GONE); + FrameLayout.LayoutParams statusLayoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, Navit.status_bar_height, Gravity.TOP); + + /* Prevent tint views from overlapping when navigation is on the right */ + statusLayoutParams.setMargins(0, 0, (isNavShowing && !isNavAtBottom) ? Navit.navigation_bar_width : 0, 0); + statusTintView.setLayoutParams(statusLayoutParams); + Log.d(TAG, String.format("statusTintView: width=%d height=%d", + statusTintView.getWidth(), statusTintView.getHeight())); + navigationTintView.setVisibility(isNavShowing ? View.VISIBLE : View.GONE); + LayoutParams navigationLayoutParams = new FrameLayout.LayoutParams( + isNavAtBottom ? LayoutParams.MATCH_PARENT : Navit.navigation_bar_width, // X + isNavAtBottom ? bottom : LayoutParams.MATCH_PARENT, // Y + Gravity.BOTTOM | Gravity.RIGHT); + navigationTintView.setLayoutParams(navigationLayoutParams); + Log.d(TAG, String.format("navigationTintView: width=%d height=%d", + navigationTintView.getWidth(), navigationTintView.getHeight())); + } + }); + + Log.d(TAG, String.format("Padding left=%d top=%d right=%d bottom=%d", left, top, right, bottom)); + + PaddingChangedCallback(PaddingChangedCallbackID, left, top, right, bottom); + } + + /** + * @brief Handles resize events. + * + * This method is called whenever the main View is resized in any way. This is the case when its + * {@code onSizeChanged()} event handler fires or when toggling Fullscreen mode. + * + */ + public void handleResize(int w, int h) { + if (this.parent_graphics != null) + this.parent_graphics.handleResize(w, h); + else { + Log.d(TAG, String.format("handleResize w=%d h=%d", w, h)); + + adjustSystemBarsTintingViews(); + + draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + draw_canvas = new Canvas(draw_bitmap); + bitmap_w = w; + bitmap_h = h; + SizeChangedCallback(SizeChangedCallbackID, w, h); + } + } + + /** + * @brief Returns whether the device has a hardware menu button. + * + * Only Android versions starting with ICS (API version 14) support the API call to detect the presence of a + * Menu button. On earlier Android versions, the following assumptions will be made: On API levels up to 10, + * this method will always return {@code true}, as these Android versions relied on devices having a physical + * Menu button. On API levels 11 through 13 (Honeycomb releases), this method will always return + * {@code false}, as Honeycomb was a tablet-only release and did not require devices to have a Menu button. + * + * Note that this method is not aware of non-standard mechanisms on some customized builds of Android. For + * example, CyanogenMod has an option to add a menu button to the navigation bar. Even with that option, + * this method will still return `false`. + */ + public boolean hasMenuButton() { + if (Build.VERSION.SDK_INT <= 10) + return true; + else if (Build.VERSION.SDK_INT <= 13) + return false; + else + return ViewConfiguration.get(activity.getApplication()).hasPermanentMenuKey(); + } + + public void setSizeChangedCallback(int id) + { + SizeChangedCallbackID = id; + } + public void setPaddingChangedCallback(int id) + { + PaddingChangedCallbackID = id; + } + public void setButtonCallback(int id) + { + ButtonCallbackID = id; + } + public void setMotionCallback(int id) + { + MotionCallbackID = id; + if(activity != null){ + activity.setMotionCallback(id, this); + } + } + + public void setKeypressCallback(int id) + { + KeypressCallbackID = id; + // set callback id also in main intent (for menus) + if(activity != null) { + activity.setKeypressCallback(id, this); + } + } + + + protected void draw_polyline(Paint paint, int c[]) + { + int i, ndashes; + float [] intervals; + paint.setStrokeWidth(c[0]); + paint.setARGB(c[1],c[2],c[3],c[4]); + paint.setStyle(Paint.Style.STROKE); + //paint.setAntiAlias(true); + //paint.setStrokeWidth(0); + ndashes=c[5]; + intervals=new float[ndashes+(ndashes%2)]; + for (i = 0; i < ndashes; i++) + intervals[i]=c[6+i]; + + if((ndashes%2)==1) + intervals[ndashes]=intervals[ndashes-1]; + + if(ndashes>0) + paint.setPathEffect(new android.graphics.DashPathEffect(intervals,0.0f)); + + Path path = new Path(); + path.moveTo(c[6+ndashes], c[7+ndashes]); + for (i = 8+ndashes; i < c.length; i += 2) + { + path.lineTo(c[i], c[i + 1]); + } + //global_path.close(); + draw_canvas.drawPath(path, paint); + paint.setPathEffect(null); + } + + protected void draw_polygon(Paint paint, int c[]) + { + paint.setStrokeWidth(c[0]); + paint.setARGB(c[1],c[2],c[3],c[4]); + paint.setStyle(Paint.Style.FILL); + //paint.setAntiAlias(true); + //paint.setStrokeWidth(0); + Path path = new Path(); + path.moveTo(c[5], c[6]); + for (int i = 7; i < c.length; i += 2) + { + path.lineTo(c[i], c[i + 1]); + } + //global_path.close(); + draw_canvas.drawPath(path, paint); + } + + protected void draw_rectangle(Paint paint, int x, int y, int w, int h) + { + Rect r = new Rect(x, y, x + w, y + h); + paint.setStyle(Paint.Style.FILL); + paint.setAntiAlias(true); + //paint.setStrokeWidth(0); + draw_canvas.drawRect(r, paint); + } + + protected void draw_circle(Paint paint, int x, int y, int r) + { + paint.setStyle(Paint.Style.STROKE); + draw_canvas.drawCircle(x, y, r / 2, paint); + } + + protected void draw_text(Paint paint, int x, int y, String text, int size, int dx, int dy, int bgcolor) + { + int oldcolor=paint.getColor(); + Path path=null; + + paint.setTextSize(size / 15); + paint.setStyle(Paint.Style.FILL); + + if (dx != 0x10000 || dy != 0) { + path = new Path(); + path.moveTo(x, y); + path.rLineTo(dx, dy); + paint.setTextAlign(android.graphics.Paint.Align.LEFT); + } + + if(bgcolor!=0) { + paint.setStrokeWidth(3); + paint.setColor(bgcolor); + paint.setStyle(Paint.Style.STROKE); + if(path==null) { + draw_canvas.drawText(text, x, y, paint); + } else { + draw_canvas.drawTextOnPath(text, path, 0, 0, paint); + } + paint.setStyle(Paint.Style.FILL); + paint.setColor(oldcolor); + } + + if(path==null) { + draw_canvas.drawText(text, x, y, paint); + } else { + draw_canvas.drawTextOnPath(text, path, 0, 0, paint); + } + paint.clearShadowLayer(); + } + protected void draw_image(Paint paint, int x, int y, Bitmap bitmap) + { + draw_canvas.drawBitmap(bitmap, x, y, null); + } + + /* takes an image and draws it on the screen as a prerendered maptile + * + * + * + * @param paint Paint object used to draw the image + * @param count the number of points specified + * @param p0x and p0y specifying the top left point + * @param p1x and p1y specifying the top right point + * @param p2x and p2y specifying the bottom left point, not yet used but kept + * for compatibility with the linux port + * @param bitmap Bitmap object holding the image to draw + * + * TODO make it work with 4 points specified to make it work for 3D mapview, so it can be used + * for small but very detailed maps as well as for large maps with very little detail but large + * coverage. + * TODO make it work with rectangular tiles as well ? + */ + protected void draw_image_warp(Paint paint, int count, int p0x, int p0y, int p1x, int p1y, int p2x, int p2y, Bitmap bitmap) + { + + float width; + float scale; + float deltaY; + float deltaX; + float angle; + Matrix matrix; + + if (count == 3) + { + matrix = new Matrix(); + deltaX = p1x - p0x; + deltaY = p1y - p0y; + width = (float) (Math.sqrt((deltaX * deltaX) + (deltaY * deltaY))); + angle = (float) (Math.atan2(deltaY, deltaX) * 180d / Math.PI); + scale = width / bitmap.getWidth(); + matrix.preScale(scale, scale); + matrix.postTranslate(p0x, p0y); + matrix.postRotate(angle, p0x, p0y); + draw_canvas.drawBitmap(bitmap, matrix, paint); + } + } + + /* These constants must be synchronized with enum draw_mode_num in graphics.h. */ + private static final int draw_mode_begin = 0; + private static final int draw_mode_end = 1; + + protected void draw_mode(int mode) + { + if (mode == draw_mode_end) { + if (parent_graphics == null) { + view.invalidate(); + } else { + parent_graphics.view.invalidate(get_rect()); + } + } + if (mode == draw_mode_begin && parent_graphics != null) { + draw_bitmap.eraseColor(0); + } + + } + protected void draw_drag(int x, int y) + { + pos_x = x; + pos_y = y; + } + protected void overlay_disable(int disable) + { + Log.d(TAG,"overlay_disable: " + disable + "Parent: " + (parent_graphics != null)); + // assume we are NOT in map view mode! + if (parent_graphics == null) + in_map = (disable==0); + if (overlay_disabled != disable) { + overlay_disabled = disable; + if (parent_graphics != null) { + parent_graphics.view.invalidate(get_rect()); + } + } + } + + protected void overlay_resize(int x, int y, int w, int h, int wraparound) + { + draw_bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + bitmap_w = w; + bitmap_h = h; + pos_x = x; + pos_y = y; + pos_wraparound = wraparound; + draw_canvas.setBitmap(draw_bitmap); + } public static native String CallbackLocalizedString(String s); } diff --git a/navit/android/src/org/navitproject/navit/NavitMapDownloader.java b/navit/android/src/org/navitproject/navit/NavitMapDownloader.java index 3a7c59e03..0c7d19ca8 100644 --- a/navit/android/src/org/navitproject/navit/NavitMapDownloader.java +++ b/navit/android/src/org/navitproject/navit/NavitMapDownloader.java @@ -1,24 +1,25 @@ /** - * Navit, a modular navigation system. - * Copyright (C) 2005-2008 Navit Team + * Navit, a modular navigation system. Copyright (C) 2005-2008 Navit Team * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License version 2 as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. + * You should have received a copy of the GNU General Public License along with this program; if + * not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. */ package org.navitproject.navit; +import android.location.Location; +import android.os.Bundle; +import android.os.Message; +import android.os.StatFs; +import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -36,676 +37,905 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; -import android.location.Location; -import android.os.Bundle; -import android.os.Message; -import android.os.StatFs; -import android.util.Log; - /** * @author rikky * */ -public class NavitMapDownloader extends Thread -{ - public static class osm_map_values - { - final String lon1; - final String lat1; - final String lon2; - final String lat2; - final String map_name; - final long est_size_bytes; - final int level; - - - private osm_map_values(String mapname, String lon_1, String lat_1, String lon_2, String lat_2, - long bytes_est, int level) - { - this.map_name = mapname; - this.lon1 = lon_1; - this.lat1 = lat_1; - this.lon2 = lon_2; - this.lat2 = lat_2; - this.est_size_bytes = bytes_est; - this.level = level; - } - - public boolean isInMap(Location location) { - double longitude_1 = Double.valueOf(this.lon1); - double latitude_1 = Double.valueOf(this.lat1); - double longitude_2 = Double.valueOf(this.lon2); - double latitude_2 = Double.valueOf(this.lat2); - - if (location.getLongitude() < longitude_1) - return false; - if (location.getLongitude() > longitude_2) - return false; - if (location.getLatitude() < latitude_1) - return false; - if (location.getLatitude() > latitude_2) - return false; - - return true; - } - } - - // - // define the maps here - // size estimations updated 2017-06-22 - // - public static final osm_map_values[] osm_maps = { - new osm_map_values(Navit.getInstance().T("Whole Planet"), "-180", "-90", "180", "90", 23992258630L, 0), - new osm_map_values(Navit.getInstance().T("Africa"), "-30.89", "-36.17", "61.68", "38.40", 2070076339L, 0), - new osm_map_values(Navit.getInstance().T("Angola"), "11.4", "-18.1", "24.2", "-5.3", 127557789L, 1), - new osm_map_values(Navit.getInstance().T("Burundi"), "28.9", "-4.5", "30.9", "-2.2", 124049667L, 1), - new osm_map_values(Navit.getInstance().T("Canary Islands"), "-18.69", "26.52", "-12.79", "29.99", 133565815L, 1), - new osm_map_values(Navit.getInstance().T("Congo, Democratic Republic of the"), "11.7", "-13.6", "31.5", "5.7", 244228485L, 1), - new osm_map_values(Navit.getInstance().T("Ethiopia"), "32.89", "3.33", "48.07", "14.97", 153067406L, 1), - new osm_map_values(Navit.getInstance().T("Guinea"), "-15.47", "7.12", "-7.58", "12.74", 188047126L, 1), - new osm_map_values(Navit.getInstance().T("Cote d'Ivoire"), "-8.72", "4.09", "-2.43", "10.80", 132187496L, 1), - new osm_map_values(Navit.getInstance().T("Kenya"), "33.8", "-5.2", "42.4", "4.9", 190073089L, 1), - new osm_map_values(Navit.getInstance().T("Lesotho"), "26.9", "-30.7", "29.6", "-28.4", 196189429L, 1), - new osm_map_values(Navit.getInstance().T("Liberia"), "-15.00", "-0.73", "-7.20", "8.65", 156257253L, 1), - new osm_map_values(Navit.getInstance().T("Libya"), "9.32", "19.40", "25.54", "33.63", 126046917L, 1), - new osm_map_values(Navit.getInstance().T("Madagascar"), "42.25", "-26.63", "51.20", "-11.31", 145210721L, 1), - new osm_map_values(Navit.getInstance().T("Namibia")+"+"+Navit.getInstance().T("Botswana"), "11.4", "-29.1", "29.5", "-16.9", 248970987L, 1), - new osm_map_values(Navit.getInstance().T("Reunion"), "55.2", "-21.4", "55.9", "-20.9", 126008774L, 1), - new osm_map_values(Navit.getInstance().T("Rwanda"), "28.8", "-2.9", "30.9", "-1.0", 128267595L, 1), - new osm_map_values(Navit.getInstance().T("South Africa")+"+"+Navit.getInstance().T("Lesotho"), "15.93", "-36.36", "33.65", "-22.08", 307280006L, 1), - new osm_map_values(Navit.getInstance().T("Tanzania, United Republic of"), "29.19", "-11.87", "40.74", "-0.88", 253621029L, 1), - new osm_map_values(Navit.getInstance().T("Uganda"), "29.3", "-1.6", "35.1", "4.3", 179134521L, 1), - new osm_map_values(Navit.getInstance().T("Asia"), "23.8", "0.1", "195.0", "82.4", 5113673780L, 0), - new osm_map_values(Navit.getInstance().T("Azerbaijan"), "44.74", "38.34", "51.69", "42.37", 138346406L, 1), - new osm_map_values(Navit.getInstance().T("China"), "67.3", "5.3", "135.0", "54.5", 1718108758L, 1), - new osm_map_values(Navit.getInstance().T("Cyprus"), "32.0", "34.5", "34.9", "35.8", 118472448L, 1), - new osm_map_values(Navit.getInstance().T("India")+"+"+Navit.getInstance().T("Nepal"), "67.9", "5.5", "89.6", "36.0", 601877877L, 1), - new osm_map_values(Navit.getInstance().T("Indonesia"), "93.7", "-17.3", "155.5", "7.6", 420741405L, 1), - new osm_map_values(Navit.getInstance().T("Iran, Islamic Republic of"), "43.5", "24.4", "63.6", "40.4", 242016066L, 1), - new osm_map_values(Navit.getInstance().T("Iraq"), "38.7", "28.5", "49.2", "37.4", 160751805L, 1), - new osm_map_values(Navit.getInstance().T("Israel"), "33.99", "29.8", "35.95", "33.4", 155685778L, 1), - new osm_map_values(Navit.getInstance().T("Japan")+"+"+Navit.getInstance().T("Korea"), "123.6", "25.2", "151.3", "47.1", 1029080156L, 1), - new osm_map_values(Navit.getInstance().T("Kazakhstan"), "46.44", "40.89", "87.36", "55.45", 407633007L, 1), - new osm_map_values(Navit.getInstance().T("Kyrgyzstan"), "69.23", "39.13", "80.33", "43.29", 147997835L, 1), - new osm_map_values(Navit.getInstance().T("Malaysia")+"+"+Navit.getInstance().T("Singapore"), "94.3", "-5.9", "108.6", "6.8", 168816435L, 1), - new osm_map_values(Navit.getInstance().T("Mongolia"), "87.5", "41.4", "120.3", "52.7", 153534851L, 1), - new osm_map_values(Navit.getInstance().T("Pakistan"), "60.83", "23.28", "77.89", "37.15", 217644321L, 1), - new osm_map_values(Navit.getInstance().T("Philippines"), "115.58", "4.47", "127.85", "21.60", 281428307L, 1), - new osm_map_values(Navit.getInstance().T("Saudi Arabia"), "33.2", "16.1", "55.9", "33.5", 242648303L, 1), - new osm_map_values(Navit.getInstance().T("Taiwan"), "119.1", "21.5", "122.5", "25.2", 1029080156L, 1), - new osm_map_values(Navit.getInstance().T("Thailand"), "97.5", "5.7", "105.2", "19.7", 185135492L, 1), - new osm_map_values(Navit.getInstance().T("Turkey"), "25.1", "35.8", "46.4", "42.8", 331087441L, 1), - new osm_map_values(Navit.getInstance().T("Turkmenistan"), "51.78", "35.07", "66.76", "42.91", 131045087L, 1), - new osm_map_values(Navit.getInstance().T("UAE+Other"), "51.5", "22.6", "56.7", "26.5", 128934674L, 1), - new osm_map_values(Navit.getInstance().T("Australia")+"+"+Navit.getInstance().T("Oceania"), "89.84", "-57.39", "179.79", "7.26", 782722650L, 0), - new osm_map_values(Navit.getInstance().T("Australia"), "110.5", "-44.2", "154.9", "-9.2", 348652900L, 0), - new osm_map_values(Navit.getInstance().T("Tasmania"), "144.0", "-45.1", "155.3", "-24.8", 253231890L, 1), - new osm_map_values(Navit.getInstance().T("Victoria")+"+"+Navit.getInstance().T("New South Wales"), "140.7", "-39.4", "153.7", "-26.9", 241500829L, 1), - new osm_map_values(Navit.getInstance().T("New Caledonia"), "157.85", "-25.05", "174.15", "-16.85", 115512336L, 1), - new osm_map_values(Navit.getInstance().T("New Zealand"), "165.2", "-47.6", "179.1", "-33.7", 239264192L, 1), - new osm_map_values(Navit.getInstance().T("Europe"), "-12.97", "33.59", "34.15", "72.10", 11984126789L, 0), - new osm_map_values(Navit.getInstance().T("Western Europe"), "-17.6", "34.5", "42.9", "70.9", 12648810717L, 1), - new osm_map_values(Navit.getInstance().T("Austria"), "9.4", "46.32", "17.21", "49.1", 898273634L, 1), - new osm_map_values(Navit.getInstance().T("Azores"), "-31.62", "36.63", "-24.67", "40.13", 112687225L, 1), - new osm_map_values(Navit.getInstance().T("Belgium"), "2.3", "49.5", "6.5", "51.6", 733035524L, 1), - new osm_map_values(Navit.getInstance().T("BeNeLux"), "2.08", "48.87", "7.78", "54.52", 1771971595L, 1), - new osm_map_values(Navit.getInstance().T("Netherlands"), "3.07", "50.75", "7.23", "53.73", 1191828033L, 1), - new osm_map_values(Navit.getInstance().T("Denmark"), "7.65", "54.32", "15.58", "58.07", 365606979L, 1), - new osm_map_values(Navit.getInstance().T("Faroe Islands"), "-7.8", "61.3", "-6.1", "62.5", 109377568L, 1), - new osm_map_values(Navit.getInstance().T("France"), "-5.45", "42.00", "8.44", "51.68", 3907969744L, 1), - new osm_map_values(Navit.getInstance().T("Alsace"), "6.79", "47.27", "8.48", "49.17", 354249349L, 2), - new osm_map_values(Navit.getInstance().T("Aquitaine"), "-2.27", "42.44", "1.50", "45.76", 443715019L, 2), - new osm_map_values(Navit.getInstance().T("Auvergne"), "2.01", "44.57", "4.54", "46.85", 287663213L, 2), - new osm_map_values(Navit.getInstance().T("Basse-Normandie"), "-2.09", "48.13", "1.03", "49.98", 262352354L, 2), - new osm_map_values(Navit.getInstance().T("Bourgogne"), "2.80", "46.11", "5.58", "48.45", 298868796L, 2), - new osm_map_values(Navit.getInstance().T("Bretagne"), "-5.58", "46.95", "-0.96", "48.99", 382770794L, 2), - new osm_map_values(Navit.getInstance().T("Centre"), "0.01", "46.29", "3.18", "48.99", 474224721L, 2), - new osm_map_values(Navit.getInstance().T("Champagne-Ardenne"), "3.34", "47.53", "5.94", "50.28", 269947824L, 2), - new osm_map_values(Navit.getInstance().T("Corse"), "8.12", "41.32", "9.95", "43.28", 129902146L, 2), - new osm_map_values(Navit.getInstance().T("Franche-Comte"), "5.20", "46.21", "7.83", "48.07", 324476070L, 2), - new osm_map_values(Navit.getInstance().T("Haute-Normandie"), "-0.15", "48.62", "1.85", "50.18", 202782876L, 2), - new osm_map_values(Navit.getInstance().T("Ile-de-France"), "1.40", "48.07", "3.61", "49.29", 311052699L, 2), - new osm_map_values(Navit.getInstance().T("Languedoc-Roussillon"), "1.53", "42.25", "4.89", "45.02", 380145667L, 2), - new osm_map_values(Navit.getInstance().T("Limousin"), "0.58", "44.87", "2.66", "46.50", 206696539L, 2), - new osm_map_values(Navit.getInstance().T("Lorraine"), "4.84", "47.77", "7.72", "49.73", 330777318L, 2), - new osm_map_values(Navit.getInstance().T("Midi-Pyrenees"), "-0.37", "42.18", "3.50", "45.10", 462618363L, 2), - new osm_map_values(Navit.getInstance().T("Nord-pas-de-Calais"), "1.42", "49.92", "4.49", "51.31", 368467511L, 2), - new osm_map_values(Navit.getInstance().T("Pays-de-la-Loire"), "-2.88", "46.20", "0.97", "48.62", 499471143L, 2), - new osm_map_values(Navit.getInstance().T("Picardie"), "1.25", "48.79", "4.31", "50.43", 374308041L, 2), - new osm_map_values(Navit.getInstance().T("Poitou-Charentes"), "-1.69", "45.04", "1.26", "47.23", 342125526L, 2), - new osm_map_values(Navit.getInstance().T("Provence-Alpes-Cote-d-Azur"), "4.21", "42.91", "7.99", "45.18", 390306134L, 2), - new osm_map_values(Navit.getInstance().T("Rhone-Alpes"), "3.65", "44.07", "7.88", "46.64", 510797942L, 2), - new osm_map_values(Navit.getInstance().T("Germany"), "5.18", "46.84", "15.47", "55.64", 3521359466L, 1), - new osm_map_values(Navit.getInstance().T("Baden-Wuerttemberg"), "7.32", "47.14", "10.57", "49.85", 674361124L, 2), - new osm_map_values(Navit.getInstance().T("Bayern"), "8.92", "47.22", "13.90", "50.62", 860161150L, 2), - new osm_map_values(Navit.getInstance().T("Mittelfranken"), "9.86", "48.78", "11.65", "49.84", 203055195L, 2), - new osm_map_values(Navit.getInstance().T("Niederbayern"), "11.55", "47.75", "14.12", "49.42", 312924770L, 2), - new osm_map_values(Navit.getInstance().T("Oberbayern"), "10.67", "47.05", "13.57", "49.14", 382734883L, 2), - new osm_map_values(Navit.getInstance().T("Oberfranken"), "10.31", "49.54", "12.49", "50.95", 235258691L, 2), - new osm_map_values(Navit.getInstance().T("Oberpfalz"), "11.14", "48.71", "13.47", "50.43", 264536012L, 2), - new osm_map_values(Navit.getInstance().T("Schwaben"), "9.27", "47.10", "11.36", "49.09", 321141607L, 2), - new osm_map_values(Navit.getInstance().T("Unterfranken"), "8.59", "49.16", "10.93", "50.67", 303720890L, 2), - new osm_map_values(Navit.getInstance().T("Berlin"), "13.03", "52.28", "13.81", "52.73", 169019946L, 2), - new osm_map_values(Navit.getInstance().T("Brandenburg"), "11.17", "51.30", "14.83", "53.63", 323497599L, 2), - new osm_map_values(Navit.getInstance().T("Bremen"), "8.43", "52.96", "9.04", "53.66", 150963608L, 2), - new osm_map_values(Navit.getInstance().T("Hamburg"), "9.56", "53.34", "10.39", "53.80", 156284421L, 2), - new osm_map_values(Navit.getInstance().T("Hessen"), "7.72", "49.34", "10.29", "51.71", 432279328L, 2), - new osm_map_values(Navit.getInstance().T("Mecklenburg-Vorpommern"), "10.54", "53.05", "14.48", "55.05", 213183908L, 2), - new osm_map_values(Navit.getInstance().T("Niedersachsen"), "6.40", "51.24", "11.69", "54.22", 819766939L, 2), - new osm_map_values(Navit.getInstance().T("Nordrhein-westfalen"), "5.46", "50.26", "9.52", "52.59", 967053517L, 2), - new osm_map_values(Navit.getInstance().T("Rheinland-Pfalz"), "6.06", "48.91", "8.56", "51.00", 442868899L, 2), - new osm_map_values(Navit.getInstance().T("Saarland"), "6.30", "49.06", "7.46", "49.69", 157721162L, 2), - new osm_map_values(Navit.getInstance().T("Sachsen-Anhalt"), "10.50", "50.88", "13.26", "53.11", 287785088L, 2), - new osm_map_values(Navit.getInstance().T("Sachsen"), "11.82", "50.11", "15.10", "51.73", 342620834L, 2), - new osm_map_values(Navit.getInstance().T("Schleswig-Holstein"), "7.41", "53.30", "11.98", "55.20", 280293910L, 2), - new osm_map_values(Navit.getInstance().T("Thueringen"), "9.81", "50.15", "12.72", "51.70", 269428239L, 2), - new osm_map_values(Navit.getInstance().T("Germany")+"+"+Navit.getInstance().T("Austria")+"+"+Navit.getInstance().T("Switzerland"), "3.4", "44.5", "18.6", "55.1", 5746126429L, 1), - new osm_map_values(Navit.getInstance().T("Iceland"), "-25.3", "62.8", "-11.4", "67.5", 124837162L, 1), - new osm_map_values(Navit.getInstance().T("Ireland"), "-11.17", "51.25", "-5.23", "55.9", 234750271L, 1), - new osm_map_values(Navit.getInstance().T("Italy"), "6.52", "36.38", "18.96", "47.19", 1610171395L, 1), - new osm_map_values(Navit.getInstance().T("Spain")+"+"+Navit.getInstance().T("Portugal"), "-11.04", "34.87", "4.62", "44.41", 1039624918L, 1), - new osm_map_values(Navit.getInstance().T("Mallorca"), "2.2", "38.8", "4.7", "40.2", 137200636L, 2), - new osm_map_values(Navit.getInstance().T("Galicia"), "-10.0", "41.7", "-6.3", "44.1", 174549553L, 2), - new osm_map_values(Navit.getInstance().T("Scandinavia"), "4.0", "54.4", "32.1", "71.5", 1398661090L, 1), - new osm_map_values(Navit.getInstance().T("Finland"), "18.6", "59.2", "32.3", "70.3", 460997178L, 1), - new osm_map_values(Navit.getInstance().T("Denmark"), "7.49", "54.33", "13.05", "57.88", 321870414L, 1), - new osm_map_values(Navit.getInstance().T("Switzerland"), "5.79", "45.74", "10.59", "47.84", 552565332L, 1), - new osm_map_values(Navit.getInstance().T("United Kingdom"), "-9.7", "49.6", "2.2", "61.2", 901724648L, 1), - new osm_map_values(Navit.getInstance().T("England"), "-7.80", "48.93", "2.41", "56.14", 937728414L, 1), - new osm_map_values(Navit.getInstance().T("Buckinghamshire"), "-1.19", "51.44", "-0.43", "52.25", 142256978L, 2), - new osm_map_values(Navit.getInstance().T("Cambridgeshire"), "-0.55", "51.96", "0.56", "52.79", 142334001L, 2), - new osm_map_values(Navit.getInstance().T("Cumbria"), "-3.96", "53.85", "-2.11", "55.24", 144422460L, 2), - new osm_map_values(Navit.getInstance().T("East yorkshire with hull"), "-1.16", "53.50", "0.54", "54.26", 141518744L, 2), - new osm_map_values(Navit.getInstance().T("Essex"), "-0.07", "51.40", "1.36", "52.14", 162542730L, 2), - new osm_map_values(Navit.getInstance().T("Herefordshire"), "-3.19", "51.78", "-2.29", "52.45", 129368660L, 2), - new osm_map_values(Navit.getInstance().T("Kent"), "-0.02", "50.81", "1.65", "51.53", 145482562L, 2), - new osm_map_values(Navit.getInstance().T("Lancashire"), "-3.20", "53.43", "-2.00", "54.29", 148964975L, 2), - new osm_map_values(Navit.getInstance().T("Leicestershire"), "-1.65", "52.34", "-0.61", "53.03", 154199956L, 2), - new osm_map_values(Navit.getInstance().T("Norfolk"), "0.10", "52.30", "2.04", "53.41", 146017009L, 2), - new osm_map_values(Navit.getInstance().T("Nottinghamshire"), "-1.39", "52.73", "-0.62", "53.55", 147986548L, 2), - new osm_map_values(Navit.getInstance().T("Oxfordshire"), "-1.77", "51.41", "-0.82", "52.22", 142240992L, 2), - new osm_map_values(Navit.getInstance().T("Shropshire"), "-3.29", "52.26", "-2.18", "53.05", 136909363L, 2), - new osm_map_values(Navit.getInstance().T("Somerset"), "-3.89", "50.77", "-2.20", "51.40", 145186096L, 2), - new osm_map_values(Navit.getInstance().T("South yorkshire"), "-1.88", "53.25", "-0.80", "53.71", 145902650L, 2), - new osm_map_values(Navit.getInstance().T("Suffolk"), "0.29", "51.88", "1.81", "52.60", 143799697L, 2), - new osm_map_values(Navit.getInstance().T("Surrey"), "-0.90", "51.02", "0.10", "51.52", 157987139L, 2), - new osm_map_values(Navit.getInstance().T("Wiltshire"), "-2.41", "50.90", "-1.44", "51.76", 138652346L, 2), - new osm_map_values(Navit.getInstance().T("Scotland"), "-8.13", "54.49", "-0.15", "61.40", 258853845L, 2), - new osm_map_values(Navit.getInstance().T("Wales"), "-5.56", "51.28", "-2.60", "53.60", 193593409L, 2), - new osm_map_values(Navit.getInstance().T("Albania"), "19.09", "39.55", "21.12", "42.72", 146199817L, 1), - new osm_map_values(Navit.getInstance().T("Belarus"), "23.12", "51.21", "32.87", "56.23", 324470696L, 1), - new osm_map_values(Navit.getInstance().T("Russian Federation"), "27.9", "41.5", "190.4", "77.6", 2148314279L, 1), - new osm_map_values(Navit.getInstance().T("Bulgaria"), "24.7", "42.1", "24.8", "42.1", 109869373L, 1), - new osm_map_values(Navit.getInstance().T("Bosnia and Herzegovina"), "15.69", "42.52", "19.67", "45.32", 187122485L, 1), - new osm_map_values(Navit.getInstance().T("Czech Republic"), "11.91", "48.48", "19.02", "51.17", 904838442L, 1), - new osm_map_values(Navit.getInstance().T("Croatia"), "13.4", "42.1", "19.4", "46.9", 460854751L, 1), - new osm_map_values(Navit.getInstance().T("Estonia"), "21.5", "57.5", "28.2", "59.6", 173378927L, 1), - new osm_map_values(Navit.getInstance().T("Greece"), "28.9", "37.8", "29.0", "37.8", 109435051L, 1), - new osm_map_values(Navit.getInstance().T("Crete"), "23.3", "34.5", "26.8", "36.0", 115985063L, 1), - new osm_map_values(Navit.getInstance().T("Hungary"), "16.08", "45.57", "23.03", "48.39", 350318541L, 1), - new osm_map_values(Navit.getInstance().T("Latvia"), "20.7", "55.6", "28.3", "58.1", 188188140L, 1), - new osm_map_values(Navit.getInstance().T("Lithuania"), "20.9", "53.8", "26.9", "56.5", 217852597L, 1), - new osm_map_values(Navit.getInstance().T("Poland"), "13.6", "48.8", "24.5", "55.0", 1464968657L, 1), - new osm_map_values(Navit.getInstance().T("Romania"), "20.3", "43.5", "29.9", "48.4", 347931565L, 1), - new osm_map_values(Navit.getInstance().T("Slovakia"), "16,8", "47,7", "22,6", "49,7", 420533039L, 1), - new osm_map_values(Navit.getInstance().T("Ukraine"), "22.0", "44.3", "40.4", "52.4", 793611912L, 1), - new osm_map_values(Navit.getInstance().T("North America"), "-178.1", "6.5", "-10.4", "84.0", 5601866516L, 0), - new osm_map_values(Navit.getInstance().T("Alaska"), "-179.5", "49.5", "-129", "71.6", 207746039L, 1), - new osm_map_values(Navit.getInstance().T("Canada"), "-141.3", "41.5", "-52.2", "70.2", 2635719651L, 1), - new osm_map_values(Navit.getInstance().T("Hawaii"), "-161.07", "18.49", "-154.45", "22.85", 115016656L, 1), - new osm_map_values(Navit.getInstance().T("USA")+Navit.getInstance().T(" (except Alaska and Hawaii)"), "-125.4", "24.3", "-66.5", "49.3", 4060487198L, 1), - new osm_map_values(Navit.getInstance().T("Midwest"), "-104.11", "35.92", "-80.46", "49.46", 1145596450L, 2), - new osm_map_values(Navit.getInstance().T("Michigan"), "-90.47", "41.64", "-79.00", "49.37", 538247019L, 2), - new osm_map_values(Navit.getInstance().T("Ohio"), "-84.87", "38.05", "-79.85", "43.53", 277022336L, 2), - new osm_map_values(Navit.getInstance().T("Northeast"), "-80.58", "38.72", "-66.83", "47.53", 1017160709L, 2), - new osm_map_values(Navit.getInstance().T("Massachusetts"), "-73.56", "40.78", "-68.67", "42.94", 340055487L, 2), - new osm_map_values(Navit.getInstance().T("Vermont"), "-73.49", "42.68", "-71.41", "45.07", 139626067L, 2), - new osm_map_values(Navit.getInstance().T("Pacific"), "-180.05", "15.87", "-129.75", "73.04", 207090640L, 2), - new osm_map_values(Navit.getInstance().T("South"), "-106.70", "23.98", "-71.46", "40.70", 1747935356L, 2), - new osm_map_values(Navit.getInstance().T("Arkansas"), "-94.67", "32.95", "-89.59", "36.60", 155658661L, 2), - new osm_map_values(Navit.getInstance().T("District of Columbia"), "-77.17", "38.74", "-76.86", "39.05", 129235755L, 2), - new osm_map_values(Navit.getInstance().T("Florida"), "-88.75", "23.63", "-77.67", "31.05", 224022108L, 2), - new osm_map_values(Navit.getInstance().T("Louisiana"), "-94.09", "28.09", "-88.62", "33.07", 210120605L, 2), - new osm_map_values(Navit.getInstance().T("Maryland"), "-79.54", "37.83", "-74.99", "40.22", 276462622L, 2), - new osm_map_values(Navit.getInstance().T("Mississippi"), "-91.71", "29.99", "-88.04", "35.05", 177858031L, 2), - new osm_map_values(Navit.getInstance().T("Oklahoma"), "-103.41", "33.56", "-94.38", "37.38", 200061473L, 2), - new osm_map_values(Navit.getInstance().T("Texas"), "-106.96", "25.62", "-92.97", "36.58", 430089141L, 2), - new osm_map_values(Navit.getInstance().T("Virginia"), "-83.73", "36.49", "-74.25", "39.52", 384187569L, 2), - new osm_map_values(Navit.getInstance().T("West Virginia"), "-82.70", "37.15", "-77.66", "40.97", 220552071L, 2), - new osm_map_values(Navit.getInstance().T("West"), "-133.11", "31.28", "-101.99", "49.51", 1152909162L, 2), - new osm_map_values(Navit.getInstance().T("Arizona"), "-114.88", "30.01", "-108.99", "37.06", 182826833L, 2), - new osm_map_values(Navit.getInstance().T("California"), "-125.94", "32.43", "-114.08", "42.07", 586923326L, 2), - new osm_map_values(Navit.getInstance().T("Colorado"), "-109.11", "36.52", "-100.41", "41.05", 228623724L, 2), - new osm_map_values(Navit.getInstance().T("Idaho"), "-117.30", "41.93", "-110.99", "49.18", 170684507L, 2), - new osm_map_values(Navit.getInstance().T("Montana"), "-116.10", "44.31", "-102.64", "49.74", 176229800L, 2), - new osm_map_values(Navit.getInstance().T("New Mexico"), "-109.10", "26.98", "-96.07", "37.05", 361793070L, 2), - new osm_map_values(Navit.getInstance().T("Nevada"), "-120.2", "35.0", "-113.8", "42.1", 200614482L, 2), - new osm_map_values(Navit.getInstance().T("Oregon"), "-124.8", "41.8", "-116.3", "46.3", 211462685L, 2), - new osm_map_values(Navit.getInstance().T("Utah"), "-114.11", "36.95", "-108.99", "42.05", 151590197L, 2), - new osm_map_values(Navit.getInstance().T("Washington State"), "-125.0", "45.5", "-116.9", "49.0", 222553768L, 2), - new osm_map_values(Navit.getInstance().T("South+Middle America"), "-83.5", "-56.3", "-30.8", "13.7", 958895383L, 0), - new osm_map_values(Navit.getInstance().T("Argentina"), "-73.9", "-57.3", "-51.6", "-21.0", 376857648L, 1), - new osm_map_values(Navit.getInstance().T("Argentina")+"+"+Navit.getInstance().T("Chile"), "-77.2", "-56.3", "-52.7", "-16.1", 420275812L, 1), - new osm_map_values(Navit.getInstance().T("Bolivia"), "-70.5", "-23.1", "-57.3", "-9.3", 175937824L, 1), - new osm_map_values(Navit.getInstance().T("Brazil"), "-71.4", "-34.7", "-32.8", "5.4", 664872975L, 1), - new osm_map_values(Navit.getInstance().T("Chile"), "-81.77", "-58.50", "-65.46", "-17.41", 241657330L, 1), - new osm_map_values(Navit.getInstance().T("Cuba"), "-85.3", "19.6", "-74.0", "23.6", 129043575L, 1), - new osm_map_values(Navit.getInstance().T("Colombia"), "-79.1", "-4.0", "-66.7", "12.6", 212016580L, 1), - new osm_map_values(Navit.getInstance().T("Ecuador"), "-82.6", "-5.4", "-74.4", "2.3", 158857591L, 1), - new osm_map_values(Navit.getInstance().T("Guyana")+"+"+Navit.getInstance().T("Suriname")+"+"+Navit.getInstance().T("Guyane Francaise"), "-62.0", "1.0", "-51.2", "8.9", 123000072L, 1), - new osm_map_values(Navit.getInstance().T("Haiti")+"+"+Navit.getInstance().T("Dominican Republic"), "-74.8", "17.3", "-68.2", "20.1", 149925689L, 1), - new osm_map_values(Navit.getInstance().T("Jamaica"), "-78.6", "17.4", "-75.9", "18.9", 113961998L, 1), - new osm_map_values(Navit.getInstance().T("Mexico"), "-117.6", "14.1", "-86.4", "32.8", 551307973L, 1), - new osm_map_values(Navit.getInstance().T("Paraguay"), "-63.8", "-28.1", "-53.6", "-18.8", 159498397L, 1), - new osm_map_values(Navit.getInstance().T("Peru"), "-82.4", "-18.1", "-67.5", "0.4", 212490557L, 1), - new osm_map_values(Navit.getInstance().T("Uruguay"), "-59.2", "-36.5", "-51.7", "-29.7", 157482719L, 1), - new osm_map_values(Navit.getInstance().T("Venezuela"), "-73.6", "0.4", "-59.7", "12.8", 167295729L, 1) - }; - - private final String map_filename_path; - - public static NavitMap[] getAvailableMaps() { - class filterMaps implements FilenameFilter { - public boolean accept(File dir, String filename) { - return (filename.endsWith(".bin")); - } - } - NavitMap maps[] = new NavitMap[0]; - File map_dir = new File(Navit.map_filename_path); - String map_file_names[] = map_dir.list(new filterMaps()); - if (map_file_names != null) { - maps = new NavitMap[map_file_names.length]; - for (int map_file_index = 0; map_file_index < map_file_names.length; map_file_index++) { - maps[map_file_index] = new NavitMap(Navit.map_filename_path, map_file_names[map_file_index]); - } - } - return maps; - } - private Boolean stop_me = false; - private final osm_map_values map_values; - private final int map_id; - private long uiLastUpdated = -1; - - private Boolean retryDownload = false; //Download failed, but - //we should try to resume - private static final int SOCKET_CONNECT_TIMEOUT = 60000; // 60 secs. - private static final int SOCKET_READ_TIMEOUT = 120000; // 120 secs. - private static final int MAP_WRITE_FILE_BUFFER = 1024 * 64; - private static final int MAP_WRITE_MEM_BUFFER = 1024 * 64; - private static final int MAP_READ_FILE_BUFFER = 1024 * 64; - private static final int UPDATE_PROGRESS_TIME_NS = 1000 * 1000000; // 1ns=1E-9s - private static final int MAX_RETRIES = 5; - private static final String TAG = "NavitMapDownloader"; - private int retry_counter = 0; - - NavitMapDownloader(int map_id) { - this.map_values = osm_maps[map_id]; - this.map_id=map_id; - this.map_filename_path=Navit.map_filename_path; - } - - public void run() { - stop_me = false; - retry_counter = 0; - - Log.v(TAG, "start download " + map_values.map_name); - updateProgress(0, map_values.est_size_bytes, Navit.getInstance().T("downloading") + ": " + map_values.map_name); - - boolean success; - do { - try { - Thread.sleep(10 + retry_counter * 1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - retryDownload = false; - success = download_osm_map(); - } while ( !success - && retryDownload - && retry_counter < MAX_RETRIES - && !stop_me); - - if (success) { - toast(map_values.map_name + " " + Navit.getInstance().T("ready")); - getMapInfoFile().delete(); - Log.d(TAG, "success"); - } - - if (success || stop_me ) { - NavitDialogs.sendDialogMessage( NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED - , map_filename_path + map_values.map_name + ".bin", null, -1, success ? 1 : 0 , map_id ); - } - } - - public void stop_thread() { - stop_me = true; - Log.d(TAG, "stop_me -> true"); - } - - private boolean checkFreeSpace(long needed_bytes) { - long free_space = getFreeSpace(); - - if ( needed_bytes <= 0 ) - needed_bytes = MAP_WRITE_FILE_BUFFER; - - if (free_space < needed_bytes ) { - String msg; - Log.e(TAG, "Not enough free space or media not available. Please free at least " + needed_bytes / 1024 /1024 + "Mb."); - if(free_space<0) - msg=Navit.getInstance().T("Media selected for map storage is not available"); - else - msg=Navit.getInstance().T("Not enough free space"); - updateProgress(free_space, needed_bytes, Navit.getInstance().T("Error downloading map!") + "\n" + msg); - return false; - } - return true; - } - - private boolean deleteMap() { - File finalOutputFile = getMapFile(); - - if (finalOutputFile.exists()) { - Message msg = - Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, - NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); - Bundle b = new Bundle(); - b.putString("title", finalOutputFile.getAbsolutePath()); - msg.setData(b); - msg.sendToTarget(); - return true; - } - return false; - } - - /** - * @return - */ - private boolean download_osm_map() { - long already_read = 0; - long real_size_bytes; - boolean resume = true; - - File outputFile = getDestinationFile(); - long old_download_size = outputFile.length(); - - URL url = null; - if (old_download_size > 0) { - url = readFileInfo(); - } - - if (url == null) { - resume = false; - url = getDownloadURL(); - } - - // URL url = new URL("http://192.168.2.101:8080/zweibruecken.bin"); - URLConnection c = initConnection(url); - if (c != null) { - - if (resume) { - c.setRequestProperty("Range", "bytes=" + old_download_size + "-"); - already_read = old_download_size; - } - try { - real_size_bytes=Long.parseLong(c.getHeaderField("Content-Length")) + already_read; - } catch(Exception e) { - real_size_bytes=-1; - } - - long fileTime = c.getLastModified(); - - if (!resume) { - outputFile.delete(); - writeFileInfo(c, real_size_bytes); - } - - if (real_size_bytes <= 0) - real_size_bytes = map_values.est_size_bytes; - - Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + fileTime - + ", Connection ref: " + c.getURL()); - - if (checkFreeSpace(real_size_bytes - already_read) - && downloadData(c, already_read, real_size_bytes, resume, outputFile)) { - - File finalOutputFile = getMapFile(); - // delete an already existing file first - finalOutputFile.delete(); - // rename file to its final name - outputFile.renameTo(finalOutputFile); - return true; - } - } - return false; - } - - private File getDestinationFile() { - File outputFile = new File(map_filename_path, map_values.map_name + ".tmp"); - outputFile.getParentFile().mkdir(); - return outputFile; - } - - private boolean downloadData(URLConnection c, long already_read, long real_size_bytes - , boolean resume,File outputFile) { - boolean success = false; - BufferedOutputStream buf = getOutputStream(outputFile, resume); - BufferedInputStream bif = getInputStream(c); - - if (buf != null && bif != null) { - success = readData(buf, bif, already_read, real_size_bytes); - // always cleanup, as we might get errors when trying to resume - try { - buf.flush(); - buf.close(); - - bif.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return success; - } - - private URL getDownloadURL() { - URL url; - try { - url = - new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," + map_values.lat1 - + "," + map_values.lon2 + "," + map_values.lat2); - } catch (MalformedURLException e) { - Log.e(TAG, "We failed to create a URL to " + map_values.map_name); - e.printStackTrace(); - return null; - } - Log.v(TAG, "connect to " + url.toString()); - return url; - } - - private long getFreeSpace() { - try { - StatFs fsInfo = new StatFs(map_filename_path); - return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); - } catch(Exception e) { - return -1; - } - } - - private BufferedInputStream getInputStream(URLConnection c) { - BufferedInputStream bif; - try { - bif = new BufferedInputStream(c.getInputStream(), MAP_READ_FILE_BUFFER); - } catch (FileNotFoundException e) { - Log.e(TAG, "File not found on server: " + e); - if (retry_counter > 0) { - getMapInfoFile().delete(); - } - enableRetry(); - bif = null; - } catch (IOException e) { - Log.e(TAG, "Error reading from server: " + e); - enableRetry(); - bif = null; - } - return bif; - } - - private File getMapFile() { - return new File(map_filename_path, map_values.map_name + ".bin"); - } - - private File getMapInfoFile() { - return new File(map_filename_path, map_values.map_name + ".tmp.info"); - } - - private BufferedOutputStream getOutputStream(File outputFile, boolean resume) { - BufferedOutputStream buf; - try { - buf = new BufferedOutputStream(new FileOutputStream(outputFile, resume), MAP_WRITE_FILE_BUFFER); - } catch (FileNotFoundException e) { - Log.e(TAG, "Could not open output file for writing: " + e); - buf = null; - } - return buf; - } - - private URLConnection initConnection(URL url) { - HttpURLConnection c; - try { - c = (HttpURLConnection) url.openConnection(); - c.setRequestMethod("GET"); - } catch (Exception e) { - Log.e(TAG, "Failed connecting server: " + e); - enableRetry(); - return null; - } - - c.setReadTimeout(SOCKET_READ_TIMEOUT); - c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT); - return c; - } - - private boolean readData(OutputStream buf, InputStream bif, long already_read, long real_size_bytes) { - long start_timestamp = System.nanoTime(); - byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; - int len1; - long startOffset = already_read; - boolean success = false; - - try { - while (!stop_me && (len1 = bif.read(buffer)) != -1) { - already_read += len1; - updateProgress(start_timestamp, startOffset, already_read, real_size_bytes); - - try { - buf.write(buffer, 0, len1); - } catch (IOException e) { - Log.d(TAG, "Error: " + e); - if ( !checkFreeSpace(real_size_bytes - already_read + MAP_WRITE_FILE_BUFFER)) { - if (deleteMap()) { - enableRetry(); - } else { - updateProgress(already_read, real_size_bytes, Navit.getInstance().T("Error downloading map!") + "\n" - + Navit.getInstance().T("Not enough free space")); - } - } else { - updateProgress(already_read, real_size_bytes, Navit.getInstance().T("Error writing map!")); - } - - return false; - } - } - - if (stop_me) { - toast(Navit.getInstance().T("Map download aborted!")); - } else if ( already_read < real_size_bytes ) { - Log.d(TAG, "Server send only " + already_read + " bytes of " + real_size_bytes); - enableRetry(); - } else { - success = true; - } - } catch (IOException e) { - Log.d(TAG, "Error: " + e); - - enableRetry(); - updateProgress(already_read, real_size_bytes, Navit.getInstance().T("Error downloading map!")); - } - - return success; - } - - private URL readFileInfo() { - URL url = null; - try { - ObjectInputStream infoStream = new ObjectInputStream(new FileInputStream(getMapInfoFile())); - String resume_proto = infoStream.readUTF(); - infoStream.readUTF(); // read the host name (unused for now) - String resume_file = infoStream.readUTF(); - infoStream.close(); - // looks like the same file, try to resume - Log.v(TAG, "Try to resume download"); - url = new URL(resume_proto + "://" + "maps.navit-project.org" + resume_file); - } catch (Exception e) { - getMapInfoFile().delete(); - } - return url; - } - - private void toast(String message) { - NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST, null, message, -1, 0, 0); - } - - private void updateProgress(long startTime, long offsetBytes, long readBytes, long maxBytes) { - long currentTime = System.nanoTime(); - - if ((currentTime > uiLastUpdated + UPDATE_PROGRESS_TIME_NS) && startTime!=currentTime) { - float per_second_overall = (readBytes - offsetBytes) / ((currentTime - startTime) / 1000000000f); - long bytes_remaining = maxBytes - readBytes; - int eta_seconds = (int) (bytes_remaining / per_second_overall); - - String eta_string; - if (eta_seconds > 60) { - eta_string = (int) (eta_seconds / 60f) + " m"; - } else { - eta_string = eta_seconds + " s"; - } - String info = - String.format("%s: %s\n %dMb / %dMb\n %.1f kb/s %s: %s", Navit.getInstance().T("downloading") - , map_values.map_name, readBytes / 1024 / 1024, maxBytes / 1024 / 1024, - per_second_overall / 1024f, Navit.getInstance().T("ETA"), eta_string); - - if (retry_counter > 0) { - info += "\n Retry " + retry_counter + "/" + MAX_RETRIES; - } - Log.d(TAG, "info: " + info); - - updateProgress(readBytes, maxBytes, info); - uiLastUpdated = currentTime; - } - } - - private void updateProgress(long positionBytes, long maximumBytes, String infoText) { - NavitDialogs.sendDialogMessage(NavitDialogs.MSG_PROGRESS_BAR, Navit.getInstance().T("Map download"), infoText - , NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024), - (int) (positionBytes / 1024)); - } - - private void writeFileInfo(URLConnection c, long sizeInBytes) { - ObjectOutputStream infoStream; - try { - infoStream = new ObjectOutputStream(new FileOutputStream(getMapInfoFile())); - infoStream.writeUTF(c.getURL().getProtocol()); - infoStream.writeUTF(c.getURL().getHost()); - infoStream.writeUTF(c.getURL().getFile()); - infoStream.writeLong(sizeInBytes); - infoStream.close(); - } catch (Exception e) { - Log.e(TAG, "Could not write info file for map download. Resuming will not be possible. (" + e.getMessage() + ")"); - } - } - - private void enableRetry() { - retryDownload = true; - retry_counter++; - } - // dialog send helper methods +public class NavitMapDownloader extends Thread { + + // + // define the maps here + // size estimations updated 2017-06-22 + // + public static final osm_map_values[] osm_maps = { + new osm_map_values(Navit.getInstance().getTstring(R.string.whole_planet), "-180", "-90", "180", "90", + 23992258630L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.africa), "-30.89", "-36.17", "61.68", + "38.40", 2070076339L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.angola), "11.4", "-18.1", "24.2", "-5.3", + 127557789L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.burundi), "28.9", "-4.5", "30.9", "-2.2", + 124049667L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.canary_islands), "-18.69", "26.52", "-12.79", + "29.99", 133565815L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.congo), "11.7", + "-13.6", "31.5", "5.7", 244228485L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.ethiopia), "32.89", "3.33", "48.07", "14.97", + 153067406L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.guinea), "-15.47", "7.12", "-7.58", "12.74", + 188047126L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.cotedivoire), "-8.72", "4.09", "-2.43", + "10.80", 132187496L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.kenya), "33.8", "-5.2", "42.4", "4.9", + 190073089L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.lesotho), "26.9", "-30.7", "29.6", "-28.4", + 196189429L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.liberia), "-15.00", "-0.73", "-7.20", "8.65", + 156257253L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.libya), "9.32", "19.40", "25.54", "33.63", + 126046917L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.madagascar), "42.25", "-26.63", "51.20", + "-11.31", 145210721L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.namibia) + "+" + Navit.getInstance().getTstring(R.string.botswana), + "11.4", "-29.1", "29.5", "-16.9", 248970987L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.reunion), "55.2", "-21.4", "55.9", "-20.9", + 126008774L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.rwanda), "28.8", "-2.9", "30.9", "-1.0", + 128267595L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.south_africa) + "+" + Navit.getInstance().getTstring(R.string.lesotho), + "15.93", "-36.36", "33.65", "-22.08", 307280006L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.tanzania), "29.19", + "-11.87", "40.74", "-0.88", 253621029L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.uganda), "29.3", "-1.6", "35.1", "4.3", + 179134521L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.asia), "23.8", "0.1", "195.0", "82.4", + 5113673780L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.azerbaijan), "44.74", "38.34", "51.69", + "42.37", 138346406L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.china), "67.3", "5.3", "135.0", "54.5", + 1718108758L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.cyprus), "32.0", "34.5", "34.9", "35.8", + 118472448L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.india) + "+" + Navit.getInstance().getTstring(R.string.nepal), "67.9", + "5.5", "89.6", "36.0", 601877877L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.indonesia), "93.7", "-17.3", "155.5", "7.6", + 420741405L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.iran), "43.5", "24.4", + "63.6", "40.4", 242016066L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.iraq), "38.7", "28.5", "49.2", "37.4", + 160751805L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.israel), "33.99", "29.8", "35.95", "33.4", + 155685778L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.japan) + "+" + Navit.getInstance().getTstring(R.string.korea), "123.6", + "25.2", "151.3", "47.1", 1029080156L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.kazakhstan), "46.44", "40.89", "87.36", + "55.45", 407633007L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.kyrgyzsyan), "69.23", "39.13", "80.33", + "43.29", 147997835L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.malaysia) + "+" + Navit.getInstance().getTstring(R.string.singapore), + "94.3", "-5.9", "108.6", "6.8", 168816435L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.mongolia), "87.5", "41.4", "120.3", "52.7", + 153534851L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.pakistan), "60.83", "23.28", "77.89", + "37.15", 217644321L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.philippines), "115.58", "4.47", "127.85", + "21.60", 281428307L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.saudi_arabia), "33.2", "16.1", "55.9", + "33.5", 242648303L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.taiwan), "119.1", "21.5", "122.5", "25.2", + 1029080156L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.thailand), "97.5", "5.7", "105.2", "19.7", + 185135492L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.turkey), "25.1", "35.8", "46.4", "42.8", + 331087441L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.turkmenistan), "51.78", "35.07", "66.76", + "42.91", 131045087L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.uae_other), "51.5", "22.6", "56.7", "26.5", + 128934674L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.australia) + "+" + Navit.getInstance().getTstring(R.string.oceania), + "89.84", "-57.39", "179.79", "7.26", 782722650L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.australia), "110.5", "-44.2", "154.9", + "-9.2", 348652900L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.tasmania), "144.0", "-45.1", "155.3", + "-24.8", 253231890L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.victoria) + " + " + Navit.getInstance() + .getTstring(R.string.new_south_wales), "140.7", "-39.4", "153.7", "-26.9", 241500829L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.new_caledonia), "157.85", "-25.05", "174.15", + "-16.85", 115512336L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.newzealand), "165.2", "-47.6", "179.1", + "-33.7", 239264192L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.europe), "-12.97", "33.59", "34.15", "72.10", + 11984126789L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.western_europe), "-17.6", "34.5", "42.9", + "70.9", 12648810717L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.austria), "9.4", "46.32", "17.21", "49.1", + 898273634L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.azores), "-31.62", "36.63", "-24.67", + "40.13", 112687225L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.belgium), "2.3", "49.5", "6.5", "51.6", + 733035524L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.benelux), "2.08", "48.87", "7.78", "54.52", + 1771971595L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.netherlands), "3.07", "50.75", "7.23", + "53.73", 1191828033L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.denmark), "7.65", "54.32", "15.58", "58.07", + 365606979L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.faroe_islands), "-7.8", "61.3", "-6.1", + "62.5", 109377568L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.france), "-5.45", "42.00", "8.44", "51.68", + 3907969744L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.alsace), "6.79", "47.27", "8.48", "49.17", + 354249349L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.aquitaine), "-2.27", "42.44", "1.50", + "45.76", 443715019L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.auvergne), "2.01", "44.57", "4.54", "46.85", + 287663213L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.basse_normandie), "-2.09", "48.13", "1.03", + "49.98", 262352354L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.bourgogne), "2.80", "46.11", "5.58", "48.45", + 298868796L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.bretagne), "-5.58", "46.95", "-0.96", + "48.99", 382770794L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.centre), "0.01", "46.29", "3.18", "48.99", + 474224721L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.champagne_ardenne), "3.34", "47.53", "5.94", + "50.28", 269947824L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.corse), "8.12", "41.32", "9.95", "43.28", + 129902146L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.franche_comte), "5.20", "46.21", "7.83", + "48.07", 324476070L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.haute_normandie), "-0.15", "48.62", "1.85", + "50.18", 202782876L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.ile_de_france), "1.40", "48.07", "3.61", + "49.29", 311052699L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.languedoc_roussillon), "1.53", "42.25", + "4.89", "45.02", 380145667L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.limousin), "0.58", "44.87", "2.66", "46.50", + 206696539L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.lorraine), "4.84", "47.77", "7.72", "49.73", + 330777318L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.midi_pyrenees), "-0.37", "42.18", "3.50", + "45.10", 462618363L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.nord_pas_de_calais), "1.42", "49.92", "4.49", + "51.31", 368467511L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.pays_de_la_loire), "-2.88", "46.20", "0.97", + "48.62", 499471143L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.picardie), "1.25", "48.79", "4.31", "50.43", + 374308041L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.poitou_charentes), "-1.69", "45.04", "1.26", + "47.23", 342125526L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.provence_alpes_cote_d_azur), "4.21", "42.91", + "7.99", "45.18", 390306134L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.rhone_alpes), "3.65", "44.07", "7.88", + "46.64", 510797942L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.luxembourg), "5.7", "49.4", "6.5", "50.2", + 1771971595L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.germany), "5.18", "46.84", "15.47", "55.64", + 3521359466L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.baden_wuerttemberg), "7.32", "47.14", + "10.57", "49.85", 674361124L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.bayern), "8.92", "47.22", "13.90", "50.62", + 860161150L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.mittelfranken), "9.86", "48.78", "11.65", + "49.84", 203055195L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.niederbayern), "11.55", "47.75", "14.12", + "49.42", 312924770L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.oberbayern), "10.67", "47.05", "13.57", + "49.14", 382734883L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.oberfranken), "10.31", "49.54", "12.49", + "50.95", 235258691L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.oberpfalz), "11.14", "48.71", "13.47", + "50.43", 264536012L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.schwaben), "9.27", "47.10", "11.36", "49.09", + 321141607L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.unterfranken), "8.59", "49.16", "10.93", + "50.67", 303720890L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.berlin), "13.03", "52.28", "13.81", "52.73", + 169019946L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.brandenburg), "11.17", "51.30", "14.83", + "53.63", 323497599L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.bremen), "8.43", "52.96", "9.04", "53.66", + 150963608L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.hamburg), "9.56", "53.34", "10.39", "53.80", + 156284421L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.hessen), "7.72", "49.34", "10.29", "51.71", + 432279328L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.mecklenburg_vorpommern), "10.54", "53.05", + "14.48", "55.05", 213183908L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.niedersachsen), "6.40", "51.24", "11.69", + "54.22", 819766939L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.nordrhein_westfalen), "5.46", "50.26", + "9.52", "52.59", 967053517L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.rheinland_pfalz), "6.06", "48.91", "8.56", + "51.00", 442868899L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.saarland), "6.30", "49.06", "7.46", "49.69", + 157721162L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.sachsen_anhalt), "10.50", "50.88", "13.26", + "53.11", 287785088L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.sachsen), "11.82", "50.11", "15.10", "51.73", + 342620834L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.schleswig_holstein), "7.41", "53.30", + "11.98", "55.20", 280293910L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.thueringen), "9.81", "50.15", "12.72", + "51.70", 269428239L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.iceland), "-25.3", "62.8", "-11.4", "67.5", + 124837162L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.ireland), "-11.17", "51.25", "-5.23", "55.9", + 234750271L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.italy), "6.52", "36.38", "18.96", "47.19", + 1610171395L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.spain) + "+" + Navit.getInstance().getTstring(R.string.portugal), + "-11.04", "34.87", "4.62", "44.41", 1039624918L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.mallorca), "2.2", "38.8", "4.7", "40.2", + 137200636L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.galicia), "-10.0", "41.7", "-6.3", "44.1", + 174549553L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.scandinavia), "4.0", "54.4", "32.1", "71.5", + 1398661090L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.finland), "18.6", "59.2", "32.3", "70.3", + 460997178L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.denmark), "7.49", "54.33", "13.05", "57.88", + 321870414L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.switzerland), "5.79", "45.74", "10.59", + "47.84", 552565332L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.united_kingdom), "-9.7", "49.6", "2.2", + "61.2", 901724648L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.england), "-7.80", "48.93", "2.41", "56.14", + 937728414L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.buckinghamshire), "-1.19", "51.44", "-0.43", + "52.25", 142256978L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.cambridgeshire), "-0.55", "51.96", "0.56", + "52.79", 142334001L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.cumbria), "-3.96", "53.85", "-2.11", "55.24", + 144422460L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.east_yorkshire_with_hull), "-1.16", "53.50", + "0.54", "54.26", 141518744L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.essex), "-0.07", "51.40", "1.36", "52.14", + 162542730L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.herefordshire), "-3.19", "51.78", "-2.29", + "52.45", 129368660L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.kent), "-0.02", "50.81", "1.65", "51.53", + 145482562L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.lancashire), "-3.20", "53.43", "-2.00", + "54.29", 148964975L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.leicestershire), "-1.65", "52.34", "-0.61", + "53.03", 154199956L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.norfolk), "0.10", "52.30", "2.04", "53.41", + 146017009L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.nottinghamshire), "-1.39", "52.73", "-0.62", + "53.55", 147986548L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.oxfordshire), "-1.77", "51.41", "-0.82", + "52.22", 142240992L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.shropshire), "-3.29", "52.26", "-2.18", + "53.05", 136909363L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.somerset), "-3.89", "50.77", "-2.20", + "51.40", 145186096L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.south_yorkshire), "-1.88", "53.25", "-0.80", + "53.71", 145902650L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.suffolk), "0.29", "51.88", "1.81", "52.60", + 143799697L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.surrey), "-0.90", "51.02", "0.10", "51.52", + 157987139L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.wiltshire), "-2.41", "50.90", "-1.44", + "51.76", 138652346L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.scotland), "-8.13", "54.49", "-0.15", + "61.40", 258853845L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.wales), "-5.56", "51.28", "-2.60", "53.60", + 193593409L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.albania), "19.09", "39.55", "21.12", "42.72", + 146199817L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.belarus), "23.12", "51.21", "32.87", "56.23", + 324470696L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.russian_federation), "27.9", "41.5", "190.4", + "77.6", 2148314279L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.bulgaria), "24.7", "42.1", "24.8", "42.1", + 109869373L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.bosnia_and_herzegovina), "15.69", "42.52", + "19.67", "45.32", 187122485L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.czech_republic), "11.91", "48.48", "19.02", + "51.17", 904838442L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.croatia), "13.4", "42.1", "19.4", "46.9", + 460854751L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.estonia), "21.5", "57.5", "28.2", "59.6", + 173378927L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.greece), "28.9", "37.8", "29.0", "37.8", + 109435051L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.crete), "23.3", "34.5", "26.8", "36.0", + 115985063L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.hungary), "16.08", "45.57", "23.03", "48.39", + 350318541L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.latvia), "20.7", "55.6", "28.3", "58.1", + 188188140L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.lithuania), "20.9", "53.8", "26.9", "56.5", + 217852597L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.poland), "13.6", "48.8", "24.5", "55.0", + 1464968657L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.romania), "20.3", "43.5", "29.9", "48.4", + 347931565L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.slovakia), "16.8", "47.7", "22.6", "49.7", + 420533039L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.ukraine), "22.0", "44.3", "40.4", "52.4", + 793611912L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.north_america), "-178.1", "6.5", "-10.4", + "84.0", 5601866516L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.alaska), "-179.5", "49.5", "-129", "71.6", + 207746039L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.canada), "-141.3", "41.5", "-52.2", "70.2", + 2635719651L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.hawaii), "-161.07", "18.49", "-154.45", + "22.85", 115016656L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.usa) + Navit.getInstance() + .getTstring(R.string.except_alaska_and_hawaii), "-125.4", "24.3", "-66.5", "49.3", + 4060487198L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.midwest), "-104.11", "35.92", "-80.46", + "49.46", 1145596450L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.michigan), "-90.47", "41.64", "-79.00", + "49.37", 538247019L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.ohio), "-84.87", "38.05", "-79.85", "43.53", + 277022336L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.northeast), "-80.58", "38.72", "-66.83", + "47.53", 1017160709L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.massachusetts), "-73.56", "40.78", "-68.67", + "42.94", 340055487L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.vermont), "-73.49", "42.68", "-71.41", + "45.07", 139626067L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.pacific), "-180.05", "15.87", "-129.75", + "73.04", 207090640L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.south), "-106.70", "23.98", "-71.46", + "40.70", 1747935356L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.arkansas), "-94.67", "32.95", "-89.59", + "36.60", 155658661L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.district_of_columbia), "-77.17", "38.74", + "-76.86", "39.05", 129235755L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.florida), "-88.75", "23.63", "-77.67", + "31.05", 224022108L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.louisiana), "-94.09", "28.09", "-88.62", + "33.07", 210120605L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.maryland), "-79.54", "37.83", "-74.99", + "40.22", 276462622L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.mississippi), "-91.71", "29.99", "-88.04", + "35.05", 177858031L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.oklahoma), "-103.41", "33.56", "-94.38", + "37.38", 200061473L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.texas), "-106.96", "25.62", "-92.97", + "36.58", 430089141L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.virginia), "-83.73", "36.49", "-74.25", + "39.52", 384187569L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.west_virginia), "-82.70", "37.15", "-77.66", + "40.97", 220552071L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.west), "-133.11", "31.28", "-101.99", + "49.51", 1152909162L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.arizona), "-114.88", "30.01", "-108.99", + "37.06", 182826833L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.california), "-125.94", "32.43", "-114.08", + "42.07", 586923326L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.colorado), "-109.11", "36.52", "-100.41", + "41.05", 228623724L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.idaho), "-117.30", "41.93", "-110.99", + "49.18", 170684507L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.montana), "-116.10", "44.31", "-102.64", + "49.74", 176229800L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.new_mexico), "-109.10", "26.98", "-96.07", + "37.05", 361793070L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.nevada), "-120.2", "35.0", "-113.8", "42.1", + 200614482L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.oregon), "-124.8", "41.8", "-116.3", "46.3", + 211462685L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.utah), "-114.11", "36.95", "-108.99", + "42.05", 151590197L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.washington_state), "-125.0", "45.5", + "-116.9", "49.0", 222553768L, 2), + new osm_map_values(Navit.getInstance().getTstring(R.string.south_middle_america), "-83.5", "-56.3", + "-30.8", "13.7", 958895383L, 0), + new osm_map_values(Navit.getInstance().getTstring(R.string.argentina), "-73.9", "-57.3", "-51.6", + "-21.0", 376857648L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.argentina) + "+" + Navit.getInstance().getTstring(R.string.chile), + "-77.2", "-56.3", "-52.7", "-16.1", 420275812L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.bolivia), "-70.5", "-23.1", "-57.3", "-9.3", + 175937824L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.brazil), "-71.4", "-34.7", "-32.8", "5.4", + 664872975L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.chile), "-81.77", "-58.50", "-65.46", + "-17.41", 241657330L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.cuba), "-85.3", "19.6", "-74.0", "23.6", + 129043575L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.colombia), "-79.1", "-4.0", "-66.7", "12.6", + 212016580L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.ecuador), "-82.6", "-5.4", "-74.4", "2.3", + 158857591L, 1), + new osm_map_values( + Navit.getInstance().getTstring(R.string.guyana) + "+" + Navit.getInstance().getTstring(R.string.suriname) + "+" + + Navit.getInstance().getTstring(R.string.guyane_francaise), "-62.0", "1.0", "-51.2", + "8.9", 123000072L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.haiti) + "+" + Navit.getInstance().getTstring(R.string.dominican_republic), "-74.8", "17.3", "-68.2", "20.1", 149925689L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.jamaica), "-78.6", "17.4", "-75.9", "18.9", + 113961998L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.mexico), "-117.6", "14.1", "-86.4", "32.8", + 551307973L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.paraguay), "-63.8", "-28.1", "-53.6", + "-18.8", 159498397L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.peru), "-82.4", "-18.1", "-67.5", "0.4", + 212490557L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.uruguay), "-59.2", "-36.5", "-51.7", "-29.7", + 157482719L, 1), + new osm_map_values(Navit.getInstance().getTstring(R.string.venezuela), "-73.6", "0.4", "-59.7", "12.8", + 167295729L, 1) + }; + //we should try to resume + private static final int SOCKET_CONNECT_TIMEOUT = 60000; // 60 secs. + private static final int SOCKET_READ_TIMEOUT = 120000; // 120 secs. + private static final int MAP_WRITE_FILE_BUFFER = 1024 * 64; + private static final int MAP_WRITE_MEM_BUFFER = 1024 * 64; + private static final int MAP_READ_FILE_BUFFER = 1024 * 64; + private static final int UPDATE_PROGRESS_TIME_NS = 1000 * 1000000; // 1ns=1E-9s + private static final int MAX_RETRIES = 5; + private final String TAG = this.getClass().getName(); + private final String map_filename_path; + private final osm_map_values map_values; + private final int map_id; + private Boolean stop_me = false; + private long uiLastUpdated = -1; + private Boolean retryDownload = false; //Download failed, but + private int retry_counter = 0; + NavitMapDownloader(int map_id) { + this.map_values = osm_maps[map_id]; + this.map_id = map_id; + this.map_filename_path = Navit.map_filename_path; + } + + public static NavitMap[] getAvailableMaps() { + class filterMaps implements FilenameFilter { + + public boolean accept(File dir, String filename) { + return (filename.endsWith(".bin")); + } + } + NavitMap maps[] = new NavitMap[0]; + File map_dir = new File(Navit.map_filename_path); + String map_file_names[] = map_dir.list(new filterMaps()); + if (map_file_names != null) { + maps = new NavitMap[map_file_names.length]; + for (int map_file_index = 0; map_file_index < map_file_names.length; map_file_index++) { + maps[map_file_index] = new NavitMap(Navit.map_filename_path, + map_file_names[map_file_index]); + } + } + return maps; + } + + public void run() { + stop_me = false; + retry_counter = 0; + + Log.v(TAG, "start download " + map_values.map_name); + updateProgress(0, map_values.est_size_bytes, + Navit.getInstance().getTstring(R.string.map_downloading) + ": " + map_values.map_name); + + boolean success; + do { + try { + Thread.sleep(10 + retry_counter * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + retryDownload = false; + success = download_osm_map(); + } while (!success + && retryDownload + && retry_counter < MAX_RETRIES + && !stop_me); + + if (success) { + toast(map_values.map_name + " " + Navit.getInstance().getTstring(R.string.map_download_ready)); + getMapInfoFile().delete(); + Log.d(TAG, "success"); + } + + if (success || stop_me) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED + , map_filename_path + map_values.map_name + ".bin", null, -1, success ? 1 : 0, + map_id); + } + } + + public void stop_thread() { + stop_me = true; + Log.d(TAG, "stop_me -> true"); + } + + private boolean checkFreeSpace(long needed_bytes) { + long free_space = getFreeSpace(); + + if (needed_bytes <= 0) { + needed_bytes = MAP_WRITE_FILE_BUFFER; + } + + if (free_space < needed_bytes) { + String msg; + Log.e(TAG, "Not enough free space or media not available. Please free at least " + + needed_bytes / 1024 / 1024 + "Mb."); + if (free_space < 0) { + msg = Navit.getInstance().getTstring(R.string.map_download_medium_unavailable); + } else { + msg = Navit.getInstance().getTstring(R.string.map_download_not_enough_free_space); + } + updateProgress(free_space, needed_bytes, + Navit.getInstance().getTstring(R.string.map_download_download_error) + "\n" + msg); + return false; + } + return true; + } + + private boolean deleteMap() { + File finalOutputFile = getMapFile(); + + if (finalOutputFile.exists()) { + Message msg = + Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, + NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); + Bundle b = new Bundle(); + b.putString("title", finalOutputFile.getAbsolutePath()); + msg.setData(b); + msg.sendToTarget(); + return true; + } + return false; + } + + + private boolean download_osm_map() { + long already_read = 0; + long real_size_bytes; + boolean resume = true; + + File outputFile = getDestinationFile(); + long old_download_size = outputFile.length(); + + URL url = null; + if (old_download_size > 0) { + url = readFileInfo(); + } + + if (url == null) { + resume = false; + url = getDownloadURL(); + } + + // URL url = new URL("http://192.168.2.101:8080/zweibruecken.bin"); + URLConnection c = initConnection(url); + if (c != null) { + + if (resume) { + c.setRequestProperty("Range", "bytes=" + old_download_size + "-"); + already_read = old_download_size; + } + try { + real_size_bytes = Long.parseLong(c.getHeaderField("Content-Length")) + already_read; + } catch (Exception e) { + real_size_bytes = -1; + } + + long fileTime = c.getLastModified(); + + if (!resume) { + outputFile.delete(); + writeFileInfo(c, real_size_bytes); + } + + if (real_size_bytes <= 0) { + real_size_bytes = map_values.est_size_bytes; + } + + Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + + fileTime + + ", Connection ref: " + c.getURL()); + + if (checkFreeSpace(real_size_bytes - already_read) + && downloadData(c, already_read, real_size_bytes, resume, outputFile)) { + + File finalOutputFile = getMapFile(); + // delete an already existing file first + finalOutputFile.delete(); + // rename file to its final name + outputFile.renameTo(finalOutputFile); + return true; + } + } + return false; + } + + private File getDestinationFile() { + File outputFile = new File(map_filename_path, map_values.map_name + ".tmp"); + outputFile.getParentFile().mkdir(); + return outputFile; + } + + private boolean downloadData(URLConnection c, long already_read, long real_size_bytes + , boolean resume, File outputFile) { + boolean success = false; + BufferedOutputStream buf = getOutputStream(outputFile, resume); + BufferedInputStream bif = getInputStream(c); + + if (buf != null && bif != null) { + success = readData(buf, bif, already_read, real_size_bytes); + // always cleanup, as we might get errors when trying to resume + try { + buf.flush(); + buf.close(); + + bif.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return success; + } + + private URL getDownloadURL() { + URL url; + try { + url = + new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," + + map_values.lat1 + + "," + map_values.lon2 + "," + map_values.lat2); + } catch (MalformedURLException e) { + Log.e(TAG, "We failed to create a URL to " + map_values.map_name); + e.printStackTrace(); + return null; + } + Log.v(TAG, "connect to " + url.toString()); + return url; + } + + private long getFreeSpace() { + try { + StatFs fsInfo = new StatFs(map_filename_path); + return (long) fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); + } catch (Exception e) { + return -1; + } + } + + private BufferedInputStream getInputStream(URLConnection c) { + BufferedInputStream bif; + try { + bif = new BufferedInputStream(c.getInputStream(), MAP_READ_FILE_BUFFER); + } catch (FileNotFoundException e) { + Log.e(TAG, "File not found on server: " + e); + if (retry_counter > 0) { + getMapInfoFile().delete(); + } + enableRetry(); + bif = null; + } catch (IOException e) { + Log.e(TAG, "Error reading from server: " + e); + enableRetry(); + bif = null; + } + return bif; + } + + private File getMapFile() { + return new File(map_filename_path, map_values.map_name + ".bin"); + } + + private File getMapInfoFile() { + return new File(map_filename_path, map_values.map_name + ".tmp.info"); + } + + private BufferedOutputStream getOutputStream(File outputFile, boolean resume) { + BufferedOutputStream buf; + try { + buf = new BufferedOutputStream(new FileOutputStream(outputFile, resume), + MAP_WRITE_FILE_BUFFER); + } catch (FileNotFoundException e) { + Log.e(TAG, "Could not open output file for writing: " + e); + buf = null; + } + return buf; + } + + private URLConnection initConnection(URL url) { + HttpURLConnection c; + try { + c = (HttpURLConnection) url.openConnection(); + c.setRequestMethod("GET"); + } catch (Exception e) { + Log.e(TAG, "Failed connecting server: " + e); + enableRetry(); + return null; + } + + c.setReadTimeout(SOCKET_READ_TIMEOUT); + c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT); + return c; + } + + private boolean readData(OutputStream buf, InputStream bif, long already_read, + long real_size_bytes) { + long start_timestamp = System.nanoTime(); + byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; + int len1; + long startOffset = already_read; + boolean success = false; + + try { + while (!stop_me && (len1 = bif.read(buffer)) != -1) { + already_read += len1; + updateProgress(start_timestamp, startOffset, already_read, real_size_bytes); + + try { + buf.write(buffer, 0, len1); + } catch (IOException e) { + Log.d(TAG, "Error: " + e); + if (!checkFreeSpace(real_size_bytes - already_read + MAP_WRITE_FILE_BUFFER)) { + if (deleteMap()) { + enableRetry(); + } else { + updateProgress(already_read, real_size_bytes, + Navit.getInstance().getTstring(R.string.map_download_download_error) + "\n" + + Navit.getInstance().getTstring(R.string.map_download_not_enough_free_space)); + } + } else { + updateProgress(already_read, real_size_bytes, + Navit.getInstance().getTstring(R.string.map_download_error_writing_map)); + } + + return false; + } + } + + if (stop_me) { + toast(Navit.getInstance().getTstring(R.string.map_download_download_aborted)); + } else if (already_read < real_size_bytes) { + Log.d(TAG, "Server send only " + already_read + " bytes of " + real_size_bytes); + enableRetry(); + } else { + success = true; + } + } catch (IOException e) { + Log.d(TAG, "Error: " + e); + + enableRetry(); + updateProgress(already_read, real_size_bytes, + Navit.getInstance().getTstring(R.string.map_download_download_error)); + } + + return success; + } + + private URL readFileInfo() { + URL url = null; + try { + ObjectInputStream infoStream = new ObjectInputStream( + new FileInputStream(getMapInfoFile())); + String resume_proto = infoStream.readUTF(); + infoStream.readUTF(); // read the host name (unused for now) + String resume_file = infoStream.readUTF(); + infoStream.close(); + // looks like the same file, try to resume + Log.v(TAG, "Try to resume download"); + url = new URL(resume_proto + "://" + "maps.navit-project.org" + resume_file); + } catch (Exception e) { + getMapInfoFile().delete(); + } + return url; + } + + private void toast(String message) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST, null, message, -1, 0, 0); + } + + private void updateProgress(long startTime, long offsetBytes, long readBytes, long maxBytes) { + long currentTime = System.nanoTime(); + + if ((currentTime > uiLastUpdated + UPDATE_PROGRESS_TIME_NS) && startTime != currentTime) { + float per_second_overall = + (readBytes - offsetBytes) / ((currentTime - startTime) / 1000000000f); + long bytes_remaining = maxBytes - readBytes; + int eta_seconds = (int) (bytes_remaining / per_second_overall); + + String eta_string; + if (eta_seconds > 60) { + eta_string = (int) (eta_seconds / 60f) + " m"; + } else { + eta_string = eta_seconds + " s"; + } + String info = + String.format("%s: %s\n %dMb / %dMb\n %.1f kb/s %s: %s", + Navit.getInstance().getTstring(R.string.map_downloading) + , map_values.map_name, readBytes / 1024 / 1024, maxBytes / 1024 / 1024, + per_second_overall / 1024f, Navit.getInstance().getTstring(R.string.map_download_eta), eta_string); + + if (retry_counter > 0) { + info += "\n Retry " + retry_counter + "/" + MAX_RETRIES; + } + Log.d(TAG, "info: " + info); + + updateProgress(readBytes, maxBytes, info); + uiLastUpdated = currentTime; + } + } + + private void updateProgress(long positionBytes, long maximumBytes, String infoText) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_PROGRESS_BAR, + Navit.getInstance().getTstring(R.string.map_download_title), infoText + , NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024), + (int) (positionBytes / 1024)); + } + + private void writeFileInfo(URLConnection c, long sizeInBytes) { + ObjectOutputStream infoStream; + try { + infoStream = new ObjectOutputStream(new FileOutputStream(getMapInfoFile())); + infoStream.writeUTF(c.getURL().getProtocol()); + infoStream.writeUTF(c.getURL().getHost()); + infoStream.writeUTF(c.getURL().getFile()); + infoStream.writeLong(sizeInBytes); + infoStream.close(); + } catch (Exception e) { + Log.e(TAG, + "Could not write info file for map download. Resuming will not be possible. (" + + e.getMessage() + ")"); + } + } + + private void enableRetry() { + retryDownload = true; + retry_counter++; + } + + public static class osm_map_values { + + final String lon1; + final String lat1; + final String lon2; + final String lat2; + final String map_name; + final long est_size_bytes; + final int level; + + + private osm_map_values(String mapname, String lon_1, String lat_1, String lon_2, + String lat_2, + long bytes_est, int level) { + this.map_name = mapname; + this.lon1 = lon_1; + this.lat1 = lat_1; + this.lon2 = lon_2; + this.lat2 = lat_2; + this.est_size_bytes = bytes_est; + this.level = level; + } + + public boolean isInMap(Location location) { + double longitude_1 = Double.valueOf(this.lon1); + double latitude_1 = Double.valueOf(this.lat1); + double longitude_2 = Double.valueOf(this.lon2); + double latitude_2 = Double.valueOf(this.lat2); + + if (location.getLongitude() < longitude_1) { + return false; + } + if (location.getLongitude() > longitude_2) { + return false; + } + if (location.getLatitude() < latitude_1) { + return false; + } + if (location.getLatitude() > latitude_2) { + return false; + } + + return true; + } + } } diff --git a/navit/android/src/org/navitproject/navit/NavitRestoreTask.java b/navit/android/src/org/navitproject/navit/NavitRestoreTask.java index aaffcb002..2cd76a931 100644 --- a/navit/android/src/org/navitproject/navit/NavitRestoreTask.java +++ b/navit/android/src/org/navitproject/navit/NavitRestoreTask.java @@ -1,7 +1,5 @@ - package org.navitproject.navit; -import android.app.Activity; import android.app.NotificationManager; import android.app.ProgressDialog; import android.content.Context; @@ -9,10 +7,8 @@ import android.content.SharedPreferences.Editor; import android.os.AsyncTask; import android.os.Environment; import android.widget.Toast; - import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Map; @@ -38,7 +34,7 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { /* Create a Wait Progress Dialog to inform the User that we are working */ mDialog = new ProgressDialog(mActivity); mDialog.setIndeterminate(true); - mDialog.setMessage(mActivity.getString(R.string.restoring)); + mDialog.setMessage(mActivity.getTstring(R.string.restoring)); mDialog.show(); } @@ -47,11 +43,14 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { protected String doInBackground(Void... v) { /* This is the Directory where all Subdirectories are stored by date */ - File backupDir = new File(Environment.getExternalStorageDirectory().getPath() + "/navit/backup/" + mTimestamp); - + File backupDir = new File( + Environment.getExternalStorageDirectory().getPath() + "/navit/backup/" + + mTimestamp); + /* Check if there is a Backup Directory */ - if (!backupDir.isDirectory()) - return mActivity.getString(R.string.backup_not_found); + if (!backupDir.isDirectory()) { + return mActivity.getTstring(R.string.backup_not_found); + } ObjectInputStream preferenceOIS = null; try { @@ -60,17 +59,22 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { mActivity.removeFileIfExists(Navit.NAVIT_DATA_DIR + "/home/destination.txt"); mActivity.removeFileIfExists(Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt"); - + /* Restore Files in home */ - mActivity.copyFileIfExists(backupDir.getPath() + "/bookmark.txt", Navit.NAVIT_DATA_DIR + "/home/bookmark.txt"); - mActivity.copyFileIfExists(backupDir.getPath() + "/destination.txt", Navit.NAVIT_DATA_DIR + "/home/destination.txt"); - mActivity.copyFileIfExists(backupDir.getPath() + "/gui_internal.txt", Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt"); + mActivity.copyFileIfExists(backupDir.getPath() + "/bookmark.txt", + Navit.NAVIT_DATA_DIR + "/home/bookmark.txt"); + mActivity.copyFileIfExists(backupDir.getPath() + "/destination.txt", + Navit.NAVIT_DATA_DIR + "/home/destination.txt"); + mActivity.copyFileIfExists(backupDir.getPath() + "/gui_internal.txt", + Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt"); /* Restore Shared Preferences */ - preferenceOIS = new ObjectInputStream(new FileInputStream(backupDir.getPath() + "/preferences.bak")); + preferenceOIS = new ObjectInputStream( + new FileInputStream(backupDir.getPath() + "/preferences.bak")); Map<String, ?> entries = (Map<String, ?>) preferenceOIS.readObject(); - Editor prefEditor = mActivity.getSharedPreferences(Navit.NAVIT_PREFS, Context.MODE_PRIVATE).edit(); + Editor prefEditor = mActivity + .getSharedPreferences(Navit.NAVIT_PREFS, Context.MODE_PRIVATE).edit(); /* Remove all old Preferences */ prefEditor.clear(); @@ -80,33 +84,33 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { Object value = entry.getValue(); String key = entry.getKey(); - if (value instanceof Boolean) + if (value instanceof Boolean) { prefEditor.putBoolean(key, ((Boolean) value).booleanValue()); - else if (value instanceof Float) + } else if (value instanceof Float) { prefEditor.putFloat(key, ((Float) value).floatValue()); - else if (value instanceof Integer) + } else if (value instanceof Integer) { prefEditor.putInt(key, ((Integer) value).intValue()); - else if (value instanceof Long) + } else if (value instanceof Long) { prefEditor.putLong(key, ((Long) value).longValue()); - else if (value instanceof String) + } else if (value instanceof String) { prefEditor.putString(key, (String) value); + } } - if (!prefEditor.commit()) - return mActivity.getString(R.string.failed_to_restore); + if (!prefEditor.commit()) { + return mActivity.getTstring(R.string.failed_to_restore); + } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - return mActivity.getString(R.string.failed_to_restore); - } - finally { + return mActivity.getTstring(R.string.failed_to_restore); + } finally { try { /* Close Stream to prevent Resource leak */ - if (preferenceOIS != null) + if (preferenceOIS != null) { preferenceOIS.close(); - } - catch (IOException e) { + } + } catch (IOException e) { } } @@ -128,8 +132,11 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { } /* Navit needs to be restarted. Currently the User has to restart it by himself */ - Toast.makeText(mActivity, mActivity.getString(R.string.restore_successful_please_restart_navit), Toast.LENGTH_LONG).show(); - NotificationManager nm = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE); + Toast.makeText(mActivity, + mActivity.getTstring(R.string.restore_successful_please_restart_navit), + Toast.LENGTH_LONG).show(); + NotificationManager nm = (NotificationManager) mActivity + .getSystemService(Context.NOTIFICATION_SERVICE); nm.cancel(R.string.app_name); NavitVehicle.removeListener(); mActivity.finish(); @@ -138,7 +145,8 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { @Override protected void onCancelled() { super.onCancelled(); - Toast.makeText(mActivity, mActivity.getString(R.string.restore_failed), Toast.LENGTH_LONG).show(); + Toast.makeText(mActivity, mActivity.getTstring(R.string.restore_failed), Toast.LENGTH_LONG) + .show(); mDialog.dismiss(); - } + } } diff --git a/navit/android/src/org/navitproject/navit/NavitSpeech2.java b/navit/android/src/org/navitproject/navit/NavitSpeech2.java index 23419ac0f..37685c681 100644 --- a/navit/android/src/org/navitproject/navit/NavitSpeech2.java +++ b/navit/android/src/org/navitproject/navit/NavitSpeech2.java @@ -1,90 +1,88 @@ /** - * Navit, a modular navigation system. - * Copyright (C) 2005-2008 Navit Team + * Navit, a modular navigation system. Copyright (C) 2005-2008 Navit Team * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License version 2 as published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. + * You should have received a copy of the GNU General Public License along with this program; if + * not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. */ package org.navitproject.navit; -import android.content.Intent; +import android.app.AlertDialog; import android.content.DialogInterface; +import android.content.Intent; import android.content.pm.PackageManager; -import android.app.AlertDialog; import android.speech.tts.TextToSpeech; import android.util.Log; @SuppressWarnings("unused") public class NavitSpeech2 implements TextToSpeech.OnInitListener, NavitActivityResult { - private TextToSpeech mTts; - private final Navit navit; - private final int MY_DATA_CHECK_CODE=1; + private final Navit navit; + private final int MY_DATA_CHECK_CODE = 1; + private final String TAG = this.getClass().getName(); + private TextToSpeech mTts; + + + NavitSpeech2(Navit navit) { + this.navit = navit; + navit.setActivityResult(1, this); + Log.d(TAG, "Create"); + Intent checkIntent = new Intent(); + checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); + if (navit.getPackageManager() + .resolveActivity(checkIntent, PackageManager.MATCH_DEFAULT_ONLY) != null) { + Log.d(TAG, "ACTION_CHECK_TTS_DATA available"); + navit.startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); + } else { + Log.e(TAG, "ACTION_CHECK_TTS_DATA not available, assume tts is working"); + mTts = new TextToSpeech(navit, this); + } + } - public void onInit(int status) - { - Log.d("NavitSpeech2","Status "+status); - } + public void onInit(int status) { + Log.d(TAG, "Status " + status); + } - public void onActivityResult(int requestCode, int resultCode, Intent data) - { - Log.d("NavitSpeech2","onActivityResult "+requestCode+" "+resultCode); - if (requestCode == MY_DATA_CHECK_CODE) { - if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { - // success, create the TTS instance - mTts = new TextToSpeech(navit, this); - } else { - // missing data, ask to install it - AlertDialog.Builder builder = new AlertDialog.Builder(navit); - builder - .setTitle(R.string.TTS_title_data_missing) - .setMessage(R.string.TTS_qery_install_data) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - Intent installIntent = new Intent(); - installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); - navit.startActivity(installIntent); - } - }) - .setNegativeButton(R.string.no, null) - .show(); - } - } - } + public void onActivityResult(int requestCode, int resultCode, Intent data) { + Log.d(TAG, "onActivityResult " + requestCode + " " + resultCode); + if (requestCode == MY_DATA_CHECK_CODE) { + if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { + // success, create the TTS instance + mTts = new TextToSpeech(navit, this); + } else { + // missing data, ask to install it + AlertDialog.Builder builder = new AlertDialog.Builder(navit); + builder + .setTitle(navit.getTstring(R.string.TTS_title_data_missing)) + .setMessage(navit.getTstring(R.string.TTS_qery_install_data)) + .setPositiveButton(navit.getTstring(R.string.yes), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + Intent installIntent = new Intent(); + installIntent.setAction( + TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); + navit.startActivity(installIntent); + } + }) + .setNegativeButton(navit.getTstring(R.string.no), null) + .show(); + } + } + } - NavitSpeech2(Navit navit) - { - this.navit=navit; - navit.setActivityResult(1, this); - Log.d("NavitSpeech2","Create"); - Intent checkIntent = new Intent(); - checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); - if (navit.getPackageManager().resolveActivity(checkIntent, PackageManager.MATCH_DEFAULT_ONLY) != null) { - Log.d("NavitSpeech2","ACTION_CHECK_TTS_DATA available"); - navit.startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); - } else { - Log.e("NavitSpeech2","ACTION_CHECK_TTS_DATA not available, assume tts is working"); - mTts = new TextToSpeech(navit, this); - } - } - public void say(String what) - { - if (mTts != null) { - mTts.speak(what, TextToSpeech.QUEUE_FLUSH, null); - } - } + public void say(String what) { + if (mTts != null) { + mTts.speak(what, TextToSpeech.QUEUE_FLUSH, null); + } + } } |