Add:Android:download an OSM map selected from list
authorzoff99 <zoff99@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 17 Feb 2011 21:55:40 +0000 (21:55 +0000)
committerzoff99 <zoff99@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 17 Feb 2011 21:55:40 +0000 (21:55 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4187 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/android/AndroidManifest.xml.cmake
navit/navit/android/AndroidManifest.xml.in
navit/navit/android/src/org/navitproject/navit/Navit.java
navit/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java [new file with mode: 0644]
navit/navit/android/src/org/navitproject/navit/NavitMapDownloader.java

index 7d7a731..8edee94 100644 (file)
@@ -27,5 +27,6 @@
                                <data android:scheme="google.navigation" /> 
             </intent-filter>
         </activity>
+        <activity android:name=".NavitDownloadSelectMapActivity"></activity>
     </application>
 </manifest> 
index 3171087..9cdf24f 100644 (file)
@@ -26,5 +26,6 @@
                                <data android:scheme="google.navigation" /> 
             </intent-filter>
         </activity>
+        <activity android:name=".NavitDownloadSelectMapActivity"></activity>
     </application>
 </manifest> 
index bbd6408..2b588f9 100644 (file)
@@ -47,6 +47,7 @@ import android.view.Display;
 import android.view.Menu;\r
 import android.view.MenuItem;\r
 import android.view.inputmethod.InputMethodManager;\r
+import android.widget.Toast;\r
 \r
 \r
 public class Navit extends Activity implements Handler.Callback\r
@@ -68,6 +69,8 @@ public class Navit extends Activity implements Handler.Callback
        public static final int                                 MAPDOWNLOAD_DIALOG                                      = 1;\r
        public ProgressDialog                                   mapdownloader_dialog                                    = null;\r
        public static NavitMapDownloader                mapdownloader                                                   = null;\r
+       public static final int                                 NavitDownloaderSelectMap_id             = 967;\r
+       public static int                                                       download_map_it                                         = 0;\r
 \r
        private boolean extractRes(String resname, String result)\r
        {\r
@@ -429,11 +432,7 @@ public class Navit extends Activity implements Handler.Callback
                NavitActivity(-3);\r
        }\r
 \r
-       protected void onActivityResult(int requestCode, int resultCode, Intent data)\r
-       {\r
-               //Log.e("Navit", "onActivityResult " + requestCode + " " + resultCode);\r
-               ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data);\r
-       }\r
+\r
        public void setActivityResult(int requestCode, NavitActivityResult ActivityResult)\r
        {\r
                //Log.e("Navit", "setActivityResult " + requestCode);\r
@@ -524,8 +523,10 @@ public class Navit extends Activity implements Handler.Callback
                                Log.e("Navit", "onOptionsItemSelected -> zoom out");\r
                                break;\r
                        case 3 :\r
-                               // show the map download progressbar\r
-                               showDialog(Navit.MAPDOWNLOAD_DIALOG);\r
+                               Intent foo2 = new Intent(this, NavitDownloadSelectMapActivity.class);\r
+                               foo2.putExtra("title", "bla bla");\r
+                               foo2.putExtra("some stuff", "bla bla");\r
+                               this.startActivityForResult(foo2, Navit.NavitDownloaderSelectMap_id);\r
                                break;\r
                        case 99 :\r
                                this.exit();\r
@@ -540,6 +541,39 @@ public class Navit extends Activity implements Handler.Callback
                return true;\r
        }\r
 \r
+\r
+       protected void onActivityResult(int requestCode, int resultCode, Intent data)\r
+       {\r
+               switch (requestCode)\r
+               {\r
+                       case Navit.NavitDownloaderSelectMap_id :\r
+                               try\r
+                               {\r
+                                       if (resultCode == Activity.RESULT_OK)\r
+                                       {\r
+                                               // set map id to download\r
+                                               Navit.download_map_it = Integer.getInteger(data.getStringExtra("selected_id"), 0);\r
+                                               // show the map download progressbar, and download the map\r
+                                               showDialog(Navit.MAPDOWNLOAD_DIALOG);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               // user pressed back key\r
+                                       }\r
+                               }\r
+                               catch (Exception e)\r
+                               {\r
+                                       Log.d("Navit", "error on onActivityResult");\r
+                               }\r
+                               break;\r
+                       default :\r
+                               //Log.e("Navit", "onActivityResult " + requestCode + " " + resultCode);\r
+                               ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data);\r
+                               break;\r
+               }\r
+       }\r
+\r
+\r
        public Handler  progress_handler        = new Handler()\r
                                                                                                {\r
                                                                                                        public void handleMessage(Message msg)\r
@@ -562,6 +596,11 @@ public class Navit extends Activity implements Handler.Callback
                                                                                                                                mapdownloader_dialog.setMessage(msg.getData()\r
                                                                                                                                                .getString("text"));\r
                                                                                                                                break;\r
+                                                                                                                       case 2 :\r
+                                                                                                                               Toast.makeText(getApplicationContext(),\r
+                                                                                                                                               msg.getData().getString("text"),\r
+                                                                                                                                               Toast.LENGTH_SHORT).show();\r
+                                                                                                                               break;\r
                                                                                                                }\r
                                                                                                        }\r
                                                                                                };\r
@@ -579,10 +618,10 @@ public class Navit extends Activity implements Handler.Callback
                                mapdownloader_dialog.setCancelable(true);\r
                                mapdownloader_dialog.setProgress(0);\r
                                mapdownloader_dialog.setMax(200);\r
-                               mapdownloader = new NavitMapDownloader();\r
+                               mapdownloader = new NavitMapDownloader(this);\r
                                //map_download.download_osm_map(NavitMapDownloader.austria);\r
                                ProgressThread progressThread = mapdownloader.new ProgressThread(progress_handler,\r
-                                               NavitMapDownloader.austria);\r
+                                               NavitMapDownloader.OSM_MAPS[Navit.download_map_it]);\r
                                progressThread.start();\r
                                return mapdownloader_dialog;\r
                }\r
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 (file)
index 0000000..7a929fd
--- /dev/null
@@ -0,0 +1,77 @@
+/**\r
+ * Navit, a modular navigation system.\r
+ * Copyright (C) 2005-2008 Navit Team\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * version 2 as published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the\r
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,\r
+ * Boston, MA  02110-1301, USA.\r
+ */\r
+\r
+package org.navitproject.navit;\r
+\r
+import android.app.Activity;\r
+import android.app.ListActivity;\r
+import android.content.Intent;\r
+import android.os.Bundle;\r
+import android.util.Log;\r
+import android.view.View;\r
+import android.widget.ArrayAdapter;\r
+import android.widget.ListView;\r
+\r
+public class NavitDownloadSelectMapActivity extends ListActivity\r
+{\r
+\r
+       private int     selected_id     = -1;\r
+\r
+       @Override\r
+       public void onCreate(Bundle savedInstanceState)\r
+       {\r
+               super.onCreate(savedInstanceState);\r
+               Log.e("Navit", "all ok");\r
+\r
+               ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,\r
+                               android.R.layout.simple_list_item_1, NavitMapDownloader.OSM_MAP_NAME_LIST);\r
+               setListAdapter(adapter);\r
+       }\r
+\r
+       @Override\r
+       protected void onListItemClick(ListView l, View v, int position, long id)\r
+       {\r
+               super.onListItemClick(l, v, position, id);\r
+               // Get the item that was clicked\r
+               // Object o = this.getListAdapter().getItem(position);\r
+               // String keyword = o.toString();\r
+               this.selected_id = position;\r
+               // Toast.makeText(this, "You selected: " + position + " " + keyword, Toast.LENGTH_LONG).show();\r
+\r
+               // close this activity\r
+               executeDone();\r
+       }\r
+\r
+       //      @Override\r
+       //      public void onBackPressed()\r
+       //      {\r
+       //              executeDone();\r
+       //              super.onBackPressed();\r
+       //      }\r
+\r
+       private void executeDone()\r
+       {\r
+               Intent resultIntent = new Intent();\r
+               resultIntent.putExtra("selected_id", String\r
+                               .valueOf(NavitDownloadSelectMapActivity.this.selected_id));\r
+               setResult(Activity.RESULT_OK, resultIntent);\r
+               finish();\r
+       }\r
+\r
+}\r
index 95a408d..871f93b 100644 (file)
 \r
 package org.navitproject.navit;\r
 \r
+import java.io.BufferedOutputStream;\r
 import java.io.File;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
 import java.net.HttpURLConnection;\r
 import java.net.URL;\r
+import java.text.DecimalFormat;\r
+import java.text.NumberFormat;\r
 \r
 import android.os.Bundle;\r
 import android.os.Handler;\r
@@ -39,10 +42,13 @@ public class NavitMapDownloader
                String  lat1;\r
                String  lon2;\r
                String  lat2;\r
+               String  map_name                        = "";\r
                int             est_size_bytes  = 0;\r
 \r
-               public osm_map_values(String lon_1, String lat_1, String lon_2, String lat_2, int bytes_est)\r
+               public osm_map_values(String mapname, String lon_1, String lat_1, String lon_2, String lat_2,\r
+                               int bytes_est)\r
                {\r
+                       this.map_name = mapname;\r
                        this.lon1 = lon_1;\r
                        this.lat1 = lat_1;\r
                        this.lon2 = lon_2;\r
@@ -60,9 +66,19 @@ public class NavitMapDownloader
         */\r
        //\r
        // define the maps here\r
-       //                                                          lon1 , lat1   , lon2   , lat2, est. size in bytes\r
-       public static osm_map_values    austria = new osm_map_values("9.4", "46.32", "17.21", "49.1",\r
-                                                                                                                               219152384);\r
+       //                                                          name     , lon1 , lat1   , lon2   , lat2, est. size in bytes\r
+       public static osm_map_values            austria                         = new osm_map_values("Austria", "9.4",\r
+                                                                                                                                                               "46.32", "17.21", "49.1", 219152384);\r
+       public static osm_map_values            benelux                         = new osm_map_values("BeNeLux", "2.08",\r
+                                                                                                                                                               "48.87", "7.78", "54.52", 219152384);\r
+       public static osm_map_values            germany                         = new osm_map_values("Germany", "5.18",\r
+                                                                                                                                                               "46.84", "15.47", "55.64", 500000000);\r
+       public static osm_map_values[]  OSM_MAPS                                = new osm_map_values[]{\r
+                       NavitMapDownloader.austria, NavitMapDownloader.germany, NavitMapDownloader.benelux};\r
+       public static String[]                          OSM_MAP_NAME_LIST       = new String[]{\r
+                       NavitMapDownloader.OSM_MAPS[0].map_name, NavitMapDownloader.OSM_MAPS[1].map_name,\r
+                       NavitMapDownloader.OSM_MAPS[2].map_name         };\r
+\r
 \r
        public class ProgressThread extends Thread\r
        {\r
@@ -94,6 +110,13 @@ public class NavitMapDownloader
                }\r
        }\r
 \r
+       public Navit    navit_jmain     = null;\r
+\r
+       public NavitMapDownloader(Navit main)\r
+       {\r
+               this.navit_jmain = main;\r
+       }\r
+\r
        public void download_osm_map(Handler handler, osm_map_values map_values)\r
        {\r
                Message msg = handler.obtainMessage();\r
@@ -102,7 +125,7 @@ public class NavitMapDownloader
                b.putInt("max", map_values.est_size_bytes);\r
                b.putInt("cur", 0);\r
                b.putString("title", "Mapdownload");\r
-               b.putString("text", "downloading OSM map");\r
+               b.putString("text", "downloading: " + map_values.map_name);\r
                msg.setData(b);\r
                handler.sendMessage(msg);\r
                try\r
@@ -114,6 +137,14 @@ public class NavitMapDownloader
                {\r
                }\r
 \r
+               // output filename\r
+               String fileName = "navitmap.tmp";\r
+               String final_fileName = "navitmap.bin";\r
+               // output path for output filename\r
+               // String PATH = Environment.getExternalStorageDirectory() + "/download/";\r
+               String PATH = "/sdcard/";\r
+               Log.v("log_tag", "mapfilename tmp: " + PATH + fileName);\r
+\r
                try\r
                {\r
                        URL url = new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + ","\r
@@ -125,25 +156,30 @@ public class NavitMapDownloader
                        c.setConnectTimeout(5000);\r
                        c.connect();\r
 \r
-                       // output filename\r
-                       String fileName = "navitmap.tmp";\r
-                       // output path for output filename\r
-                       // String PATH = Environment.getExternalStorageDirectory() + "/download/";\r
-                       String PATH = "/sdcard/";\r
-                       Log.v("log_tag", "mapfilename tmp: " + PATH + fileName);\r
                        File file = new File(PATH);\r
                        File outputFile = new File(file, fileName);\r
+                       File final_outputFile = new File(file, final_fileName);\r
                        //outputFile.delete();\r
                        // seems this command overwrites the output file anyway\r
                        FileOutputStream fos = new FileOutputStream(outputFile);\r
+                       BufferedOutputStream buf = new BufferedOutputStream(fos, 1024 * 16); // buffer\r
 \r
                        InputStream is = c.getInputStream();\r
 \r
-                       byte[] buffer = new byte[1024 * 10]; // 10k buffer\r
+                       byte[] buffer = new byte[1024 * 4]; // buffer\r
                        int len1 = 0;\r
                        int already_read = 0;\r
-                       int alt = 10; // show progress about every 100k Bytes\r
+                       int alt = 5; // show progress about every xx cylces\r
                        int alt_cur = 0;\r
+                       String kbytes_per_second = "";\r
+                       long last_timestamp = 0;\r
+                       long start_timestamp = System.currentTimeMillis();\r
+                       int last_bytes = 0;\r
+                       NumberFormat formatter = new DecimalFormat("00000.0");\r
+                       String eta_string = "";\r
+                       float per_second_overall = 0f;\r
+                       int bytes_remaining = 0;\r
+                       int eta_seconds = 0;\r
                        while ((len1 = is.read(buffer)) != -1)\r
                        {\r
                                already_read = already_read + len1;\r
@@ -157,21 +193,74 @@ public class NavitMapDownloader
                                        msg.what = 1;\r
                                        b.putInt("max", map_values.est_size_bytes);\r
                                        b.putInt("cur", already_read);\r
-                                       b.putString("title", "Mapdownload");\r
-                                       b.putString("text", "downloading OSM map\n" + (int) (already_read / 1024f / 1024f)\r
-                                                       + "Mb / " + (int) (map_values.est_size_bytes / 1024f / 1024f) + "Mb");\r
+                                       b.putString("title", "Map download");\r
+                                       //                                      if (last_timestamp == 0)\r
+                                       //                                      {\r
+                                       //                                              kbytes_per_second = "--";\r
+                                       //                                      }\r
+                                       //                                      else\r
+                                       //                                      {\r
+                                       //                                              //float temp = (((already_read - last_bytes) / 1024f) / ((System\r
+                                       //                                              //              .currentTimeMillis() - last_timestamp) / 1000f));\r
+                                       //                                              //kbytes_per_second = formatter.format(temp);\r
+                                       //                                      }\r
+                                       last_timestamp = System.currentTimeMillis();\r
+                                       last_bytes = already_read;\r
+                                       per_second_overall = (float) already_read\r
+                                                       / (float) ((System.currentTimeMillis() - start_timestamp) / 1000);\r
+                                       kbytes_per_second = formatter.format((per_second_overall / 1024f));\r
+                                       // Log.d("NavitMapDownloader", "k " + kbytes_per_second);\r
+                                       bytes_remaining = map_values.est_size_bytes - already_read;\r
+                                       eta_seconds = (int) ((float) bytes_remaining / (float) per_second_overall);\r
+                                       if (eta_seconds > 60)\r
+                                       {\r
+                                               eta_string = (int) (eta_seconds / 60f) + " m";\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               eta_string = eta_seconds + " s";\r
+                                       }\r
+                                       b.putString("text", "downloading: " + map_values.map_name + "\n" + " "\r
+                                                       + (int) (already_read / 1024f / 1024f) + "Mb / "\r
+                                                       + (int) (map_values.est_size_bytes / 1024f / 1024f) + "Mb" + "\n" + " "\r
+                                                       + kbytes_per_second + "kb/s" + " ETA: " + eta_string);\r
                                        msg.setData(b);\r
                                        handler.sendMessage(msg);\r
                                }\r
-                               fos.write(buffer, 0, len1);\r
+                               //fos.write(buffer, 0, len1);\r
+                               buf.write(buffer, 0, len1);\r
                        }\r
+                       buf.close();\r
                        fos.close();\r
                        is.close();\r
+\r
+                       // delete an already final filename, first\r
+                       final_outputFile.delete();\r
+                       // rename file to final name\r
+                       outputFile.renameTo(final_outputFile);\r
                }\r
                catch (IOException e)\r
                {\r
+                       msg = handler.obtainMessage();\r
+                       b = new Bundle();\r
+                       msg.what = 2;\r
+                       b.putString("text", "Error downloading map!");\r
+                       msg.setData(b);\r
+                       handler.sendMessage(msg);\r
+\r
                        Log.d("NavitMapDownloader", "Error: " + e);\r
                }\r
+               catch (Exception e)\r
+               {\r
+                       msg = handler.obtainMessage();\r
+                       b = new Bundle();\r
+                       msg.what = 2;\r
+                       b.putString("text", "Error downloading map!");\r
+                       msg.setData(b);\r
+                       handler.sendMessage(msg);\r
+\r
+                       Log.d("NavitMapDownloader", "gerneral Error: " + e);\r
+               }\r
 \r
                msg = handler.obtainMessage();\r
                b = new Bundle();\r
@@ -179,12 +268,11 @@ public class NavitMapDownloader
                b.putInt("max", map_values.est_size_bytes);\r
                b.putInt("cur", map_values.est_size_bytes);\r
                b.putString("title", "Mapdownload");\r
-               b.putString("text", "ready");\r
+               b.putString("text", map_values.map_name + " ready");\r
                msg.setData(b);\r
                handler.sendMessage(msg);\r
 \r
 \r
                Log.d("NavitMapDownloader", "success");\r
        }\r
-\r
 }\r