From 8b057eb173d64ef33bcbc005fa9846078759bee8 Mon Sep 17 00:00:00 2001 From: zoff99 Date: Thu, 17 Feb 2011 21:55:40 +0000 Subject: [PATCH] Add:Android:download an OSM map selected from list git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4187 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/android/AndroidManifest.xml.cmake | 1 + navit/navit/android/AndroidManifest.xml.in | 1 + .../android/src/org/navitproject/navit/Navit.java | 57 ++++++++-- .../navit/NavitDownloadSelectMapActivity.java | 77 +++++++++++++ .../org/navitproject/navit/NavitMapDownloader.java | 126 +++++++++++++++++---- 5 files changed, 234 insertions(+), 28 deletions(-) create mode 100644 navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java diff --git a/navit/navit/android/AndroidManifest.xml.cmake b/navit/navit/android/AndroidManifest.xml.cmake index 7d7a731..8edee94 100644 --- a/navit/navit/android/AndroidManifest.xml.cmake +++ b/navit/navit/android/AndroidManifest.xml.cmake @@ -27,5 +27,6 @@ + diff --git a/navit/navit/android/AndroidManifest.xml.in b/navit/navit/android/AndroidManifest.xml.in index 3171087..9cdf24f 100644 --- a/navit/navit/android/AndroidManifest.xml.in +++ b/navit/navit/android/AndroidManifest.xml.in @@ -26,5 +26,6 @@ + diff --git a/navit/navit/android/src/org/navitproject/navit/Navit.java b/navit/navit/android/src/org/navitproject/navit/Navit.java index bbd6408..2b588f9 100644 --- a/navit/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/navit/android/src/org/navitproject/navit/Navit.java @@ -47,6 +47,7 @@ import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; public class Navit extends Activity implements Handler.Callback @@ -68,6 +69,8 @@ public class Navit extends Activity implements Handler.Callback public static final int MAPDOWNLOAD_DIALOG = 1; public ProgressDialog mapdownloader_dialog = null; public static NavitMapDownloader mapdownloader = null; + public static final int NavitDownloaderSelectMap_id = 967; + public static int download_map_it = 0; private boolean extractRes(String resname, String result) { @@ -429,11 +432,7 @@ public class Navit extends Activity implements Handler.Callback NavitActivity(-3); } - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - //Log.e("Navit", "onActivityResult " + requestCode + " " + resultCode); - ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); - } + public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) { //Log.e("Navit", "setActivityResult " + requestCode); @@ -524,8 +523,10 @@ public class Navit extends Activity implements Handler.Callback Log.e("Navit", "onOptionsItemSelected -> zoom out"); break; case 3 : - // show the map download progressbar - showDialog(Navit.MAPDOWNLOAD_DIALOG); + Intent foo2 = new Intent(this, NavitDownloadSelectMapActivity.class); + foo2.putExtra("title", "bla bla"); + foo2.putExtra("some stuff", "bla bla"); + this.startActivityForResult(foo2, Navit.NavitDownloaderSelectMap_id); break; case 99 : this.exit(); @@ -540,6 +541,39 @@ public class Navit extends Activity implements Handler.Callback return true; } + + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) + { + case Navit.NavitDownloaderSelectMap_id : + try + { + 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); + } + else + { + // user pressed back key + } + } + catch (Exception e) + { + Log.d("Navit", "error on onActivityResult"); + } + break; + default : + //Log.e("Navit", "onActivityResult " + requestCode + " " + resultCode); + ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); + break; + } + } + + public Handler progress_handler = new Handler() { public void handleMessage(Message msg) @@ -562,6 +596,11 @@ public class Navit extends Activity implements Handler.Callback mapdownloader_dialog.setMessage(msg.getData() .getString("text")); break; + case 2 : + Toast.makeText(getApplicationContext(), + msg.getData().getString("text"), + Toast.LENGTH_SHORT).show(); + break; } } }; @@ -579,10 +618,10 @@ public class Navit extends Activity implements Handler.Callback mapdownloader_dialog.setCancelable(true); mapdownloader_dialog.setProgress(0); mapdownloader_dialog.setMax(200); - mapdownloader = new NavitMapDownloader(); + mapdownloader = new NavitMapDownloader(this); //map_download.download_osm_map(NavitMapDownloader.austria); ProgressThread progressThread = mapdownloader.new ProgressThread(progress_handler, - NavitMapDownloader.austria); + NavitMapDownloader.OSM_MAPS[Navit.download_map_it]); 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 new file mode 100644 index 0000000..7a929fd --- /dev/null +++ b/navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java @@ -0,0 +1,77 @@ +/** + * 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 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. + */ + +package org.navitproject.navit; + +import android.app.Activity; +import android.app.ListActivity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +public class NavitDownloadSelectMapActivity extends ListActivity +{ + + private int selected_id = -1; + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Log.e("Navit", "all ok"); + + ArrayAdapter adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, NavitMapDownloader.OSM_MAP_NAME_LIST); + setListAdapter(adapter); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) + { + super.onListItemClick(l, v, position, id); + // Get the item that was clicked + // 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(); + + // close this activity + executeDone(); + } + + // @Override + // public void onBackPressed() + // { + // executeDone(); + // super.onBackPressed(); + // } + + private void executeDone() + { + Intent resultIntent = new Intent(); + resultIntent.putExtra("selected_id", String + .valueOf(NavitDownloadSelectMapActivity.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 95a408d..871f93b 100644 --- a/navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java +++ b/navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java @@ -19,12 +19,15 @@ package org.navitproject.navit; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; +import java.text.DecimalFormat; +import java.text.NumberFormat; import android.os.Bundle; import android.os.Handler; @@ -39,10 +42,13 @@ public class NavitMapDownloader String lat1; String lon2; String lat2; + String map_name = ""; int est_size_bytes = 0; - public osm_map_values(String lon_1, String lat_1, String lon_2, String lat_2, int bytes_est) + public osm_map_values(String mapname, String lon_1, String lat_1, String lon_2, String lat_2, + int bytes_est) { + this.map_name = mapname; this.lon1 = lon_1; this.lat1 = lat_1; this.lon2 = lon_2; @@ -60,9 +66,19 @@ public class NavitMapDownloader */ // // define the maps here - // lon1 , lat1 , lon2 , lat2, est. size in bytes - public static osm_map_values austria = new osm_map_values("9.4", "46.32", "17.21", "49.1", - 219152384); + // 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[]{ + NavitMapDownloader.austria, NavitMapDownloader.germany, NavitMapDownloader.benelux}; + 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 }; + public class ProgressThread extends Thread { @@ -94,6 +110,13 @@ public class NavitMapDownloader } } + public Navit navit_jmain = null; + + public NavitMapDownloader(Navit main) + { + this.navit_jmain = main; + } + public void download_osm_map(Handler handler, osm_map_values map_values) { Message msg = handler.obtainMessage(); @@ -102,7 +125,7 @@ public class NavitMapDownloader b.putInt("max", map_values.est_size_bytes); b.putInt("cur", 0); b.putString("title", "Mapdownload"); - b.putString("text", "downloading OSM map"); + b.putString("text", "downloading: " + map_values.map_name); msg.setData(b); handler.sendMessage(msg); try @@ -114,6 +137,14 @@ public class NavitMapDownloader { } + // output filename + String fileName = "navitmap.tmp"; + String final_fileName = "navitmap.bin"; + // output path for output filename + // String PATH = Environment.getExternalStorageDirectory() + "/download/"; + String PATH = "/sdcard/"; + Log.v("log_tag", "mapfilename tmp: " + PATH + fileName); + try { URL url = new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," @@ -125,25 +156,30 @@ public class NavitMapDownloader c.setConnectTimeout(5000); c.connect(); - // output filename - String fileName = "navitmap.tmp"; - // output path for output filename - // String PATH = Environment.getExternalStorageDirectory() + "/download/"; - String PATH = "/sdcard/"; - Log.v("log_tag", "mapfilename tmp: " + PATH + fileName); 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 InputStream is = c.getInputStream(); - byte[] buffer = new byte[1024 * 10]; // 10k buffer + byte[] buffer = new byte[1024 * 4]; // buffer int len1 = 0; int already_read = 0; - int alt = 10; // show progress about every 100k Bytes + int alt = 5; // show progress about every xx cylces int alt_cur = 0; + String kbytes_per_second = ""; + long last_timestamp = 0; + long start_timestamp = System.currentTimeMillis(); + int last_bytes = 0; + NumberFormat formatter = new DecimalFormat("00000.0"); + String eta_string = ""; + float per_second_overall = 0f; + int bytes_remaining = 0; + int eta_seconds = 0; while ((len1 = is.read(buffer)) != -1) { already_read = already_read + len1; @@ -157,21 +193,74 @@ public class NavitMapDownloader msg.what = 1; b.putInt("max", map_values.est_size_bytes); b.putInt("cur", already_read); - b.putString("title", "Mapdownload"); - b.putString("text", "downloading OSM map\n" + (int) (already_read / 1024f / 1024f) - + "Mb / " + (int) (map_values.est_size_bytes / 1024f / 1024f) + "Mb"); + b.putString("title", "Map download"); + // if (last_timestamp == 0) + // { + // kbytes_per_second = "--"; + // } + // else + // { + // //float temp = (((already_read - last_bytes) / 1024f) / ((System + // // .currentTimeMillis() - last_timestamp) / 1000f)); + // //kbytes_per_second = formatter.format(temp); + // } + last_timestamp = System.currentTimeMillis(); + last_bytes = already_read; + per_second_overall = (float) already_read + / (float) ((System.currentTimeMillis() - start_timestamp) / 1000); + kbytes_per_second = formatter.format((per_second_overall / 1024f)); + // Log.d("NavitMapDownloader", "k " + kbytes_per_second); + bytes_remaining = map_values.est_size_bytes - already_read; + eta_seconds = (int) ((float) bytes_remaining / (float) per_second_overall); + if (eta_seconds > 60) + { + eta_string = (int) (eta_seconds / 60f) + " m"; + } + else + { + eta_string = eta_seconds + " s"; + } + b.putString("text", "downloading: " + map_values.map_name + "\n" + " " + + (int) (already_read / 1024f / 1024f) + "Mb / " + + (int) (map_values.est_size_bytes / 1024f / 1024f) + "Mb" + "\n" + " " + + kbytes_per_second + "kb/s" + " ETA: " + eta_string); msg.setData(b); handler.sendMessage(msg); } - fos.write(buffer, 0, len1); + //fos.write(buffer, 0, len1); + buf.write(buffer, 0, len1); } + buf.close(); fos.close(); is.close(); + + // delete an already final filename, first + final_outputFile.delete(); + // rename file to final name + outputFile.renameTo(final_outputFile); } catch (IOException e) { + msg = handler.obtainMessage(); + b = new Bundle(); + msg.what = 2; + b.putString("text", "Error downloading map!"); + msg.setData(b); + handler.sendMessage(msg); + Log.d("NavitMapDownloader", "Error: " + e); } + catch (Exception e) + { + msg = handler.obtainMessage(); + b = new Bundle(); + msg.what = 2; + b.putString("text", "Error downloading map!"); + msg.setData(b); + handler.sendMessage(msg); + + Log.d("NavitMapDownloader", "gerneral Error: " + e); + } msg = handler.obtainMessage(); b = new Bundle(); @@ -179,12 +268,11 @@ public class NavitMapDownloader b.putInt("max", map_values.est_size_bytes); b.putInt("cur", map_values.est_size_bytes); b.putString("title", "Mapdownload"); - b.putString("text", "ready"); + b.putString("text", map_values.map_name + " ready"); msg.setData(b); handler.sendMessage(msg); Log.d("NavitMapDownloader", "success"); } - } -- 2.7.4