From 00c4463a5d3e7405d5c9c8506e2f7635f1855c54 Mon Sep 17 00:00:00 2001 From: zoff99 Date: Fri, 18 Feb 2011 17:38:55 +0000 Subject: [PATCH] Fix:Android:download an OSM map selected from list git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4204 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- .../android/src/org/navitproject/navit/Navit.java | 38 +++++++-- .../navit/NavitDownloadSelectMapActivity.java | 7 +- .../org/navitproject/navit/NavitMapDownloader.java | 89 +++++++++++++++++----- 3 files changed, 104 insertions(+), 30 deletions(-) diff --git a/navit/navit/android/src/org/navitproject/navit/Navit.java b/navit/navit/android/src/org/navitproject/navit/Navit.java index e0f289a..0db6f77 100644 --- a/navit/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/navit/android/src/org/navitproject/navit/Navit.java @@ -70,7 +70,8 @@ public class Navit extends Activity implements Handler.Callback public ProgressDialog mapdownloader_dialog = null; public static NavitMapDownloader mapdownloader = null; public static final int NavitDownloaderSelectMap_id = 967; - public static int download_map_it = 0; + public static int download_map_id = 0; + ProgressThread progressThread = null; private boolean extractRes(String resname, String result) { @@ -342,7 +343,6 @@ public class Navit extends Activity implements Handler.Callback } else { - // string not parsable, display alert and continue w/o string AlertDialog.Builder alertbox = new AlertDialog.Builder(this); alertbox.setMessage("Navit recieved the query " + intent_data @@ -410,6 +410,7 @@ public class Navit extends Activity implements Handler.Callback } } } + @Override public void onPause() { @@ -417,6 +418,7 @@ public class Navit extends Activity implements Handler.Callback Log.e("Navit", "OnPause"); NavitActivity(-1); } + @Override public void onStop() { @@ -424,6 +426,7 @@ public class Navit extends Activity implements Handler.Callback Log.e("Navit", "OnStop"); NavitActivity(-2); } + @Override public void onDestroy() { @@ -551,10 +554,18 @@ public class Navit extends Activity implements Handler.Callback { if (resultCode == Activity.RESULT_OK) { - // set map id to download - Navit.download_map_it = Integer.getInteger(data.getStringExtra("selected_id"), 0); - // show the map download progressbar, and download the map - showDialog(Navit.MAPDOWNLOAD_DIALOG); + try + { + Log.d("Navit", "id=" + Integer.parseInt(data.getStringExtra("selected_id"))); + // set map id to download + Navit.download_map_id = Integer.parseInt(data.getStringExtra("selected_id")); + // show the map download progressbar, and download the map + showDialog(Navit.MAPDOWNLOAD_DIALOG); + } + catch (NumberFormatException e) + { + Log.d("Navit", "NumberFormatException selected_id"); + } } else { @@ -618,10 +629,21 @@ public class Navit extends Activity implements Handler.Callback mapdownloader_dialog.setCancelable(true); mapdownloader_dialog.setProgress(0); mapdownloader_dialog.setMax(200); + DialogInterface.OnDismissListener mOnDismissListener = new DialogInterface.OnDismissListener() + { + public void onDismiss(DialogInterface dialog) + { + Log.e("Navit", "onDismiss: mapdownloader_dialog"); + dialog.dismiss(); + dialog.cancel(); + progressThread.stop_thread(); + } + }; + mapdownloader_dialog.setOnDismissListener(mOnDismissListener); mapdownloader = new NavitMapDownloader(this); //map_download.download_osm_map(NavitMapDownloader.austria); - ProgressThread progressThread = mapdownloader.new ProgressThread(progress_handler, - NavitMapDownloader.OSM_MAPS[Navit.download_map_it]); + progressThread = mapdownloader.new ProgressThread(progress_handler, + NavitMapDownloader.OSM_MAPS[Navit.download_map_id]); progressThread.start(); return mapdownloader_dialog; } diff --git a/navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java b/navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java index 7a929fd..6100503 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java @@ -52,7 +52,9 @@ public class NavitDownloadSelectMapActivity extends ListActivity // Object o = this.getListAdapter().getItem(position); // String keyword = o.toString(); this.selected_id = position; - // Toast.makeText(this, "You selected: " + position + " " + keyword, Toast.LENGTH_LONG).show(); + //Toast.makeText(this, "You selected: " + position + " " + keyword, Toast.LENGTH_LONG).show(); + Log.e("Navit", "p:" + position); + Log.e("Navit", "i:" + id); // close this activity executeDone(); @@ -68,8 +70,7 @@ public class NavitDownloadSelectMapActivity extends ListActivity private void executeDone() { Intent resultIntent = new Intent(); - resultIntent.putExtra("selected_id", String - .valueOf(NavitDownloadSelectMapActivity.this.selected_id)); + resultIntent.putExtra("selected_id", String.valueOf(this.selected_id)); setResult(Activity.RESULT_OK, resultIntent); finish(); } diff --git a/navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java b/navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java index 871f93b..de398aa 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java @@ -19,6 +19,7 @@ package org.navitproject.navit; +import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -67,17 +68,28 @@ public class NavitMapDownloader // // define the maps here // name , lon1 , lat1 , lon2 , lat2, est. size in bytes - public static osm_map_values austria = new osm_map_values("Austria", "9.4", - "46.32", "17.21", "49.1", 219152384); - public static osm_map_values benelux = new osm_map_values("BeNeLux", "2.08", - "48.87", "7.78", "54.52", 219152384); - public static osm_map_values germany = new osm_map_values("Germany", "5.18", - "46.84", "15.47", "55.64", 500000000); - public static osm_map_values[] OSM_MAPS = new osm_map_values[]{ + public static osm_map_values austria = new osm_map_values("Austria", + "9.4", "46.32", "17.21", + "49.1", 222000000); + public static osm_map_values benelux = new osm_map_values("BeNeLux", + "2.08", "48.87", "7.78", + "54.52", 530000000); + public static osm_map_values germany = new osm_map_values("Germany", + "5.18", "46.84", "15.47", + "55.64", 943000000); + public static osm_map_values[] OSM_MAPS = new osm_map_values[]{ NavitMapDownloader.austria, NavitMapDownloader.germany, NavitMapDownloader.benelux}; - public static String[] OSM_MAP_NAME_LIST = new String[]{ + public static String[] OSM_MAP_NAME_LIST = new String[]{ NavitMapDownloader.OSM_MAPS[0].map_name, NavitMapDownloader.OSM_MAPS[1].map_name, - NavitMapDownloader.OSM_MAPS[2].map_name }; + NavitMapDownloader.OSM_MAPS[2].map_name }; + + public Boolean stop_me = false; + static final int SOCKET_CONNECT_TIMEOUT = 6000; + static final int SOCKET_READ_TIMEOUT = 6000; + static final int MAP_WRITE_FILE_BUFFER = 1024 * 64; + static final int MAP_WRITE_MEM_BUFFER = 1024 * 64; + static final int MAP_READ_FILE_BUFFER = 1024 * 64; + static final int UPDATE_PROGRESS_EVERY_CYCLE = 2; public class ProgressThread extends Thread @@ -93,9 +105,8 @@ public class NavitMapDownloader public void run() { - Log.d("NavitMapDownloader", "run 1"); + stop_me = false; download_osm_map(mHandler, map_values); - Log.d("NavitMapDownloader", "run 2"); // ok, remove dialog Message msg = mHandler.obtainMessage(); @@ -103,10 +114,13 @@ public class NavitMapDownloader msg.what = 0; b.putInt("dialog_num", Navit.MAPDOWNLOAD_DIALOG); msg.setData(b); - Log.d("NavitMapDownloader", "run 3"); mHandler.sendMessage(msg); - Log.d("NavitMapDownloader", "run 4"); + } + public void stop_thread() + { + stop_me = true; + Log.d("NavitMapDownloader", "stop_me -> true"); } } @@ -152,24 +166,32 @@ public class NavitMapDownloader HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); - c.setReadTimeout(5000); - c.setConnectTimeout(5000); + c.setReadTimeout(SOCKET_READ_TIMEOUT); + c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT); + int real_size_bytes = c.getContentLength(); c.connect(); + if (real_size_bytes > 0) + { + // change the estimated filesize to reported filesize + map_values.est_size_bytes = real_size_bytes; + } + File file = new File(PATH); File outputFile = new File(file, fileName); File final_outputFile = new File(file, final_fileName); //outputFile.delete(); // seems this command overwrites the output file anyway FileOutputStream fos = new FileOutputStream(outputFile); - BufferedOutputStream buf = new BufferedOutputStream(fos, 1024 * 16); // buffer + BufferedOutputStream buf = new BufferedOutputStream(fos, MAP_WRITE_FILE_BUFFER); // buffer InputStream is = c.getInputStream(); + BufferedInputStream bif = new BufferedInputStream(is, MAP_READ_FILE_BUFFER); // buffer - byte[] buffer = new byte[1024 * 4]; // buffer + byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; // buffer int len1 = 0; int already_read = 0; - int alt = 5; // show progress about every xx cylces + int alt = UPDATE_PROGRESS_EVERY_CYCLE; // show progress about every xx cylces int alt_cur = 0; String kbytes_per_second = ""; long last_timestamp = 0; @@ -180,8 +202,23 @@ public class NavitMapDownloader float per_second_overall = 0f; int bytes_remaining = 0; int eta_seconds = 0; - while ((len1 = is.read(buffer)) != -1) + //while ((len1 = is.read(buffer)) != -1) + while ((len1 = bif.read(buffer)) != -1) { + if (stop_me) + { + // ok we need to be stopped! close all files and end + Log.d("NavitMapDownloader", "stop_me 1"); + buf.flush(); + buf.close(); + fos.close(); + bif.close(); + is.close(); + Log.d("NavitMapDownloader", "stop_me 2"); + c.disconnect(); + Log.d("NavitMapDownloader", "stop_me 3"); + return; + } already_read = already_read + len1; alt_cur++; if (alt_cur > alt) @@ -226,14 +263,28 @@ public class NavitMapDownloader + kbytes_per_second + "kb/s" + " ETA: " + eta_string); msg.setData(b); handler.sendMessage(msg); + // try + // { + // // little pause here + // Thread.sleep(50); + // } + // catch (InterruptedException e1) + // { + // } } //fos.write(buffer, 0, len1); buf.write(buffer, 0, len1); } + buf.flush(); + buf.close(); fos.close(); + + bif.close(); is.close(); + c.disconnect(); + // delete an already final filename, first final_outputFile.delete(); // rename file to final name -- 2.7.4