Fix:Android:Improve startup time and simplify resource extraction
authorrikky <rikky@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Sat, 28 Apr 2012 22:53:43 +0000 (22:53 +0000)
committerrikky <rikky@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Sat, 28 Apr 2012 22:53:43 +0000 (22:53 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@5053 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/android/src/org/navitproject/navit/Navit.java

index b4b79a6..db2b2f3 100644 (file)
@@ -20,7 +20,6 @@
 package org.navitproject.navit;\r
 \r
 import java.io.File;\r
-import java.io.FileInputStream;\r
 import java.io.FileOutputStream;\r
 import java.io.InputStream;\r
 import java.util.ArrayList;\r
@@ -41,6 +40,9 @@ import android.content.Context;
 import android.content.DialogInterface;\r
 import android.content.Intent;\r
 import android.content.SharedPreferences;\r
+import android.content.pm.ApplicationInfo;\r
+import android.content.pm.PackageManager;\r
+import android.content.pm.PackageManager.NameNotFoundException;\r
 import android.content.res.Resources;\r
 import android.media.AudioManager;\r
 import android.net.Uri;\r
@@ -98,109 +100,61 @@ public class Navit extends Activity
        public static List<NavitAddress> NavitAddressResultList_foundItems = new ArrayList<NavitAddress>();\r
 \r
        public static final int          MAP_NUM_SECONDARY              = 12;\r
+       static final String              NAVIT_PACKAGE_NAME             = "org.navitproject.navit";\r
+       static final String              TAG                            = "Navit";\r
        static final String              MAP_FILENAME_PATH              = "/sdcard/navit/";\r
-       static final String              NAVIT_DATA_DIR                 = "/data/data/org.navitproject.navit";\r
+       static final String              NAVIT_DATA_DIR                 = "/data/data/" + NAVIT_PACKAGE_NAME;\r
        static final String              NAVIT_DATA_SHARE_DIR           = NAVIT_DATA_DIR + "/share";\r
        static final String              FIRST_STARTUP_FILE             = NAVIT_DATA_SHARE_DIR + "/has_run_once.txt";\r
        public static final String       NAVIT_PREFS                    = "NavitPrefs";\r
-       \r
+\r
        public static String get_text(String in)\r
        {\r
                return NavitTextTranslations.get_text(in);\r
        }\r
 \r
-       private boolean extractRes(String resname, String result)\r
-       {\r
-               int slash = -1;\r
+       private boolean extractRes(String resname, String result) {\r
                boolean needs_update = false;\r
-               File resultfile;\r
                Resources res = getResources();\r
-               Log.e("Navit", "Res Name " + resname);\r
-               Log.e("Navit", "result " + result);\r
-               int id = res.getIdentifier(resname, "raw", "org.navitproject.navit");\r
-               Log.e("Navit", "Res ID " + id);\r
-               if (id == 0) \r
+               Log.e(TAG, "Res Name " + resname + ", result " + result);\r
+               int id = res.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME);\r
+               Log.e(TAG, "Res ID " + id);\r
+               if (id == 0)\r
                        return false;\r
 \r
-               while ((slash = result.indexOf("/", slash + 1)) != -1)\r
-               {\r
-                       if (slash != 0)\r
-                       {\r
-                               Log.e("Navit", "Checking " + result.substring(0, slash));\r
-                               resultfile = new File(result.substring(0, slash));\r
-                               if (!resultfile.exists())\r
-                               {\r
-                                       Log.e("Navit", "Creating dir");\r
-                                       if (!resultfile.mkdir())\r
-                                               return false;\r
-                                       needs_update = true;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               resultfile = new File(result);\r
-               if (!resultfile.exists()) \r
+               File resultfile = new File(result);\r
+               if (!resultfile.exists()) {\r
                        needs_update = true;\r
-\r
-               if (!needs_update)\r
-               {\r
-                       try\r
-                       {\r
-                               InputStream resourcestream = res.openRawResource(id);\r
-                               FileInputStream resultfilestream = new FileInputStream(resultfile);\r
-                               byte[] resourcebuf = new byte[1024];\r
-                               byte[] resultbuf = new byte[1024];\r
-                               int i = 0;\r
-                               while ((i = resourcestream.read(resourcebuf)) != -1)\r
-                               {\r
-                                       if (resultfilestream.read(resultbuf) != i)\r
-                                       {\r
-                                               Log.e("Navit", "Result is too short");\r
-                                               needs_update = true;\r
-                                               break;\r
-                                       }\r
-                                       for (int j = 0; j < i; j++)\r
-                                       {\r
-                                               if (resourcebuf[j] != resultbuf[j])\r
-                                               {\r
-                                                       Log.e("Navit", "Result is different");\r
-                                                       needs_update = true;\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                                       if (needs_update) break;\r
-                               }\r
-                               if (!needs_update && resultfilestream.read(resultbuf) != -1)\r
-                               {\r
-                                       Log.e("Navit", "Result is too long");\r
-                                       needs_update = true;\r
-                               }\r
-\r
-                       }\r
-                       catch (Exception e)\r
-                       {\r
-                               Log.e("Navit", "Exception " + e.getMessage());\r
+                       if (!resultfile.mkdirs())\r
                                return false;\r
+               } else {\r
+                       PackageManager pm = getPackageManager();\r
+                       ApplicationInfo appInfo;\r
+                       long apkUpdateTime = 0;\r
+                       try {\r
+                               appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0);\r
+                               apkUpdateTime = new File(appInfo.sourceDir).lastModified();\r
+                       } catch (NameNotFoundException e) {\r
+                               Log.e(TAG, "Could not read package infos");\r
+                               e.printStackTrace();\r
                        }\r
+                       if (apkUpdateTime > resultfile.lastModified())\r
+                               needs_update = true;\r
                }\r
-               if (needs_update)\r
-               {\r
-                       Log.e("Navit", "Extracting resource");\r
 \r
-                       try\r
-                       {\r
+               if (needs_update) {\r
+                       Log.e(TAG, "Extracting resource");\r
+\r
+                       try {\r
                                InputStream resourcestream = res.openRawResource(id);\r
                                FileOutputStream resultfilestream = new FileOutputStream(resultfile);\r
                                byte[] buf = new byte[1024];\r
                                int i = 0;\r
-                               while ((i = resourcestream.read(buf)) != -1)\r
-                               {\r
+                               while ((i = resourcestream.read(buf)) != -1) {\r
                                        resultfilestream.write(buf, 0, i);\r
                                }\r
-                       }\r
-                       catch (Exception e)\r
-                       {\r
-                               Log.e("Navit", "Exception " + e.getMessage());\r
+                       } catch (Exception e) {\r
+                               Log.e(TAG, "Exception " + e.getMessage());\r
                                return false;\r
                        }\r
                }\r
@@ -211,8 +165,7 @@ public class Navit extends Activity
        {\r
                SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE);\r
                boolean firstStart = settings.getBoolean("firstStart", true);\r
-               \r
-               \r
+\r
                if (firstStart)\r
                {\r
                        AlertDialog.Builder infobox = new AlertDialog.Builder(this);\r
@@ -238,7 +191,6 @@ public class Navit extends Activity
                                }\r
                        });\r
 \r
-\r
                        // TRANS\r
                        infobox.setNeutralButton(getString(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() {\r
                                public void onClick(DialogInterface arg0, int arg1) {\r