diff options
Diffstat (limited to 'navit/android/src/org/navitproject/navit')
20 files changed, 1954 insertions, 2122 deletions
diff --git a/navit/android/src/org/navitproject/navit/FileBrowserActivity.java b/navit/android/src/org/navitproject/navit/FileBrowserActivity.java index dc7462b76..2d7242264 100644 --- a/navit/android/src/org/navitproject/navit/FileBrowserActivity.java +++ b/navit/android/src/org/navitproject/navit/FileBrowserActivity.java @@ -1,30 +1,34 @@ package org.navitproject.navit; -//Heavily based on code from -//https://github.com/mburman/Android-File-Explore +// Heavily based on code from +// https://github.com/mburman/Android-File-Explore // Version of Aug 13, 2011 -//Also contributed: -// Sugan Krishnan (https://github.com/rgksugan) - Jan 2013. +// Also contributed: +// Sugan Krishnan (https://github.com/rgksugan) - Jan 2013. // -//Project type now is Android library: -// http://developer.android.com/guide/developing/projects/projects-eclipse.html#ReferencingLibraryProject +// Project type now is Android library: +// http://developer.android.com/guide/developing/projects/projects-eclipse.html#ReferencingLibraryProject -//Android imports import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; -import android.graphics.Color; import android.os.Bundle; import android.os.Environment; import android.os.StatFs; import android.util.Log; -import android.view.*; +import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; -import android.widget.*; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; -//General Java imports import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; @@ -32,44 +36,42 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -//Import of resources file for file browser -import org.navitproject.navit.R; public class FileBrowserActivity extends Activity { // Intent Action Constants public static final String INTENT_ACTION_SELECT_DIR = "ua.com.vassiliev.androidfilebrowser.SELECT_DIRECTORY_ACTION"; - public static final String INTENT_ACTION_SELECT_FILE = "ua.com.vassiliev.androidfilebrowser.SELECT_FILE_ACTION"; + private static final String INTENT_ACTION_SELECT_FILE = "ua.com.vassiliev.androidfilebrowser.SELECT_FILE_ACTION"; // Intent parameters names constants public static final String startDirectoryParameter = "ua.com.vassiliev.androidfilebrowser.directoryPath"; public static final String returnDirectoryParameter = "ua.com.vassiliev.androidfilebrowser.directoryPathRet"; - public static final String returnFileParameter = "ua.com.vassiliev.androidfilebrowser.filePathRet"; - public static final String showCannotReadParameter = "ua.com.vassiliev.androidfilebrowser.showCannotRead"; - public static final String filterExtension = "ua.com.vassiliev.androidfilebrowser.filterExtension"; + private static final String returnFileParameter = "ua.com.vassiliev.androidfilebrowser.filePathRet"; + private static final String showCannotReadParameter = "ua.com.vassiliev.androidfilebrowser.showCannotRead"; + private static final String filterExtension = "ua.com.vassiliev.androidfilebrowser.filterExtension"; // Stores names of traversed directories - ArrayList<String> pathDirsList = new ArrayList<String>(); + private final ArrayList<String> mPathDirsList = new ArrayList<>(); // Check if the first level of the directory structure is the one showing // private Boolean firstLvl = true; - private static final String LOGTAG = "F_PATH"; + private static final String TAG = "F_PATH"; - private List<Item> fileList = new ArrayList<Item>(); - private File path = null; - private String chosenFile; + private final List<Item> mFileList = new ArrayList<>(); + private File mPath = null; + private String mChosenFile; // private static final int DIALOG_LOAD_FILE = 1000; - ArrayAdapter<Item> adapter; + private ArrayAdapter<Item> mAdapter; - private boolean showHiddenFilesAndDirs = true; + private boolean mShowHiddenFilesAndDirs = true; - private boolean directoryShownIsEmpty = false; + private boolean mDirectoryShownIsEmpty = false; - private String filterFileExtension = null; + private String mFilterFileExtension = null; // Action constants - private static int currentAction = -1; + private static int sCurrentAction = -1; private static final int SELECT_DIRECTORY = 1; private static final int SELECT_FILE = 2; @@ -85,17 +87,17 @@ public class FileBrowserActivity extends Activity { // Set action for this activity Intent thisInt = this.getIntent(); - currentAction = SELECT_DIRECTORY;// This would be a default action in + sCurrentAction = SELECT_DIRECTORY;// This would be a default action in // case not set by intent if (thisInt.getAction().equalsIgnoreCase(INTENT_ACTION_SELECT_FILE)) { - Log.d(LOGTAG, "SELECT ACTION - SELECT FILE"); - currentAction = SELECT_FILE; + Log.d(TAG, "SELECT ACTION - SELECT FILE"); + sCurrentAction = SELECT_FILE; } - showHiddenFilesAndDirs = thisInt.getBooleanExtra( + mShowHiddenFilesAndDirs = thisInt.getBooleanExtra( showCannotReadParameter, true); - filterFileExtension = thisInt.getStringExtra(filterExtension); + mFilterFileExtension = thisInt.getStringExtra(filterExtension); setInitialDirectory(); @@ -105,7 +107,7 @@ public class FileBrowserActivity extends Activity { this.initializeButtons(); this.initializeFileListView(); updateCurrentDirectoryTextView(); - Log.d(LOGTAG, path.getAbsolutePath()); + Log.d(TAG, mPath.getAbsolutePath()); } private void setInitialDirectory() { @@ -116,85 +118,83 @@ public class FileBrowserActivity extends Activity { if (requestedStartDir != null && requestedStartDir.length() > 0) { // if(requestedStartDir!=null File tempFile = new File(requestedStartDir); if (tempFile.isDirectory()) { - this.path = tempFile; + this.mPath = tempFile; } } // if(requestedStartDir!=null - if (this.path == null) { // No or invalid directory supplied in intent parameter + if (this.mPath == null) { // No or invalid directory supplied in intent parameter if (Environment.getExternalStorageDirectory().isDirectory() && Environment.getExternalStorageDirectory().canRead()) { - path = Environment.getExternalStorageDirectory(); + mPath = Environment.getExternalStorageDirectory(); } else { - path = new File("/"); + mPath = new File("/"); } } // if(this.path==null) {//No or invalid directory supplied in intent parameter } // private void setInitialDirectory() { private void parseDirectoryPath() { - pathDirsList.clear(); - String pathString = path.getAbsolutePath(); + mPathDirsList.clear(); + String pathString = mPath.getAbsolutePath(); String[] parts = pathString.split("/"); int i = 0; while (i < parts.length) { - pathDirsList.add(parts[i]); + mPathDirsList.add(parts[i]); i++; } } private void initializeButtons() { - Button upDirButton = (Button) this.findViewById(R.id.upDirectoryButton); + Button upDirButton = this.findViewById(R.id.upDirectoryButton); upDirButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { - Log.d(LOGTAG, "onclick for upDirButton"); + Log.d(TAG, "onclick for upDirButton"); loadDirectoryUp(); loadFileList(); - adapter.notifyDataSetChanged(); + mAdapter.notifyDataSetChanged(); updateCurrentDirectoryTextView(); } });// upDirButton.setOnClickListener( - Button selectFolderButton = (Button) this + Button selectFolderButton = this .findViewById(R.id.selectCurrentDirectoryButton); - if (currentAction == SELECT_DIRECTORY) { + if (sCurrentAction == SELECT_DIRECTORY) { selectFolderButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { - Log.d(LOGTAG, "onclick for selectFolderButton"); + Log.d(TAG, "onclick for selectFolderButton"); returnDirectoryFinishActivity(); } }); - } else { // if(currentAction == this.SELECT_DIRECTORY) { + } else { // if(sCurrentAction == this.SELECT_DIRECTORY) { selectFolderButton.setVisibility(View.GONE); - } // } else {//if(currentAction == this.SELECT_DIRECTORY) { + } // } else {//if(sCurrentAction == this.SELECT_DIRECTORY) { } // private void initializeButtons() { private void loadDirectoryUp() { // present directory removed from list - String s = pathDirsList.remove(pathDirsList.size() - 1); + String s = mPathDirsList.remove(mPathDirsList.size() - 1); // path modified to exclude present directory - path = new File(path.toString().substring(0, - path.toString().lastIndexOf(s))); - fileList.clear(); + mPath = new File(mPath.toString().substring(0, + mPath.toString().lastIndexOf(s))); + mFileList.clear(); } private void updateCurrentDirectoryTextView() { int i = 0; String curDirString = ""; - while (i < pathDirsList.size()) { - curDirString += pathDirsList.get(i) + "/"; + while (i < mPathDirsList.size()) { + curDirString += mPathDirsList.get(i) + "/"; i++; } - if (pathDirsList.size() == 0) { - ((Button) this.findViewById(R.id.upDirectoryButton)) - .setEnabled(false); + if (mPathDirsList.size() == 0) { + this.findViewById(R.id.upDirectoryButton).setEnabled(false); curDirString = "/"; } else { - ((Button) this.findViewById(R.id.upDirectoryButton)) - .setEnabled(true); + this.findViewById(R.id.upDirectoryButton).setEnabled(true); } long freeSpace = getFreeSpace(curDirString); String formattedSpaceString = formatBytes(freeSpace); if (freeSpace == 0) { - Log.d(LOGTAG, "NO FREE SPACE"); + Log.d(TAG, "NO FREE SPACE"); File currentDir = new File(curDirString); if (!currentDir.canWrite()) { formattedSpaceString = "NON Writable"; @@ -213,35 +213,35 @@ public class FileBrowserActivity extends Activity { } private void initializeFileListView() { - ListView lView = (ListView) this.findViewById(R.id.fileListView); + ListView lView = this.findViewById(R.id.fileListView); LinearLayout.LayoutParams lParam = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); lParam.setMargins(15, 5, 15, 5); - lView.setAdapter(this.adapter); + lView.setAdapter(this.mAdapter); lView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - chosenFile = fileList.get(position).file; - File sel = new File(path + "/" + chosenFile); - Log.d(LOGTAG, "Clicked:" + chosenFile); + mChosenFile = mFileList.get(position).mFile; + File sel = new File(mPath + "/" + mChosenFile); + Log.d(TAG, "Clicked:" + mChosenFile); if (sel.isDirectory()) { if (sel.canRead()) { // Adds chosen directory to list - pathDirsList.add(chosenFile); - path = new File(sel + ""); - Log.d(LOGTAG, "Just reloading the list"); + mPathDirsList.add(mChosenFile); + mPath = new File(sel + ""); + Log.d(TAG, "Just reloading the list"); loadFileList(); - adapter.notifyDataSetChanged(); + mAdapter.notifyDataSetChanged(); updateCurrentDirectoryTextView(); - Log.d(LOGTAG, path.getAbsolutePath()); + Log.d(TAG, mPath.getAbsolutePath()); } else { // if(sel.canRead()) { showToast("Path does not exist or cannot be read"); } // } else {//if(sel.canRead()) { } else { // if (sel.isDirectory()) { // File picked or an empty directory message clicked - Log.d(LOGTAG, "item clicked"); - if (!directoryShownIsEmpty) { - Log.d(LOGTAG, "File selected:" + chosenFile); + Log.d(TAG, "item clicked"); + if (!mDirectoryShownIsEmpty) { + Log.d(TAG, "File selected:" + mChosenFile); returnFileFinishActivity(sel.getAbsolutePath()); } } // else {//if (sel.isDirectory()) { @@ -251,7 +251,7 @@ public class FileBrowserActivity extends Activity { private void returnDirectoryFinishActivity() { Intent retIntent = new Intent(); - retIntent.putExtra(returnDirectoryParameter, path.getAbsolutePath()); + retIntent.putExtra(returnDirectoryParameter, mPath.getAbsolutePath()); this.setResult(RESULT_OK, retIntent); this.finish(); } // END private void returnDirectoryFinishActivity() { @@ -265,28 +265,28 @@ public class FileBrowserActivity extends Activity { private void loadFileList() { try { - path.mkdirs(); + mPath.mkdirs(); } catch (SecurityException e) { - Log.e(LOGTAG, "unable to write on the sd card "); + Log.i(TAG, "unable to write on the sd card "); } - fileList.clear(); + mFileList.clear(); - if (path.exists() && path.canRead()) { + if (mPath.exists() && mPath.canRead()) { FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String filename) { File sel = new File(dir, filename); - boolean showReadableFile = showHiddenFilesAndDirs + boolean showReadableFile = mShowHiddenFilesAndDirs || sel.canRead(); // Filters based on whether the file is hidden or not - if (currentAction == SELECT_DIRECTORY) { + if (sCurrentAction == SELECT_DIRECTORY) { return (sel.isDirectory() && showReadableFile); } - if (currentAction == SELECT_FILE) { + if (sCurrentAction == SELECT_FILE) { // If it is a file check the extension if provided - if (sel.isFile() && filterFileExtension != null) { + if (sel.isFile() && mFilterFileExtension != null) { return (showReadableFile && sel.getName().endsWith( - filterFileExtension)); + mFilterFileExtension)); } return (showReadableFile); } @@ -294,12 +294,12 @@ public class FileBrowserActivity extends Activity { } // public boolean accept(File dir, String filename) { }; // FilenameFilter filter = new FilenameFilter() { - String[] fList = path.list(filter); - this.directoryShownIsEmpty = false; + String[] fList = mPath.list(filter); + this.mDirectoryShownIsEmpty = false; for (int i = 0; i < fList.length; i++) { // Convert into file path - File sel = new File(path, fList[i]); - Log.d(LOGTAG, "File:" + fList[i] + " readable:" + (Boolean.valueOf(sel.canRead())).toString()); + File sel = new File(mPath, fList[i]); + Log.d(TAG, "File:" + fList[i] + " readable:" + (Boolean.valueOf(sel.canRead())).toString()); int drawableID = R.drawable.file_icon; boolean canRead = sel.canRead(); // Set drawables @@ -310,36 +310,36 @@ public class FileBrowserActivity extends Activity { drawableID = R.drawable.folder_icon_light; } } - fileList.add(i, new Item(fList[i], drawableID, canRead)); + mFileList.add(i, new Item(fList[i], drawableID, canRead)); } // for (int i = 0; i < fList.length; i++) { - if (fileList.size() == 0) { + if (mFileList.size() == 0) { // Log.d(LOGTAG, "This directory is empty"); - this.directoryShownIsEmpty = true; - fileList.add(0, new Item("Directory is empty", -1, true)); + this.mDirectoryShownIsEmpty = true; + mFileList.add(0, new Item("Directory is empty", -1, true)); } else { // sort non empty list - Collections.sort(fileList, new ItemFileNameComparator()); + Collections.sort(mFileList, new ItemFileNameComparator()); } } else { - Log.e(LOGTAG, "path does not exist or cannot be read"); + Log.e(TAG, "path does not exist or cannot be read"); } // Log.d(TAG, "loadFileList finished"); } // private void loadFileList() { private void createFileListAdapter() { - adapter = new ArrayAdapter<Item>(this, + mAdapter = new ArrayAdapter<Item>(this, android.R.layout.select_dialog_item, android.R.id.text1, - fileList) { + mFileList) { @Override public View getView(int position, View convertView, ViewGroup parent) { // creates view View view = super.getView(position, convertView, parent); - TextView textView = (TextView) view + TextView textView = view .findViewById(android.R.id.text1); // put the image on the text view int drawableID = 0; - if (fileList.get(position).icon != -1) { + if (mFileList.get(position).mIcon != -1) { // If icon == -1, then directory is empty - drawableID = fileList.get(position).icon; + drawableID = mFileList.get(position).mIcon; } textView.setCompoundDrawablesWithIntrinsicBounds(drawableID, 0, 0, 0); @@ -360,33 +360,34 @@ public class FileBrowserActivity extends Activity { } // private createFileListAdapter(){ private class Item { - public String file; - public int icon; - public boolean canRead; + String mFile; + int mIcon; + public boolean mCanRead; - public Item(String file, Integer icon, boolean canRead) { - this.file = file; - this.icon = icon; + Item(String file, Integer icon, boolean canRead) { + this.mFile = file; + this.mIcon = icon; } @Override public String toString() { - return file; + return mFile; } } // END private class Item { private class ItemFileNameComparator implements Comparator<Item> { public int compare(Item lhs, Item rhs) { - return lhs.file.toLowerCase().compareTo(rhs.file.toLowerCase()); + return lhs.mFile.toLowerCase().compareTo(rhs.mFile.toLowerCase()); } } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - Log.d(LOGTAG, "ORIENTATION_LANDSCAPE"); + Log.d(TAG, "ORIENTATION_LANDSCAPE"); } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - Log.d(LOGTAG, "ORIENTATION_PORTRAIT"); + Log.d(TAG, "ORIENTATION_PORTRAIT"); } // Layout apparently changes itself, only have to provide good onMeasure // in custom components @@ -394,34 +395,32 @@ public class FileBrowserActivity extends Activity { // if(newConfig.keyboard == Configuration.KEYBOARDHIDDEN_YES) } // END public void onConfigurationChanged(Configuration newConfig) { - public static long getFreeSpace(String path) { + private static long getFreeSpace(String path) { StatFs stat = new StatFs(path); - long availSize = (long) stat.getAvailableBlocks() - * (long) stat.getBlockSize(); - return availSize; + return (long) stat.getAvailableBlocks() * (long) stat.getBlockSize(); } // END public static long getFreeSpace(String path) { - public static String formatBytes(long bytes) { + private static String formatBytes(long bytes) { // TODO: add flag to which part is needed (e.g. GB, MB, KB or bytes) String retStr = ""; // One binary gigabyte equals 1,073,741,824 bytes. if (bytes > 1073741824) { // Add GB long gbs = bytes / 1073741824; - retStr += (new Long(gbs)).toString() + "GB "; + retStr += (Long.valueOf(gbs)).toString() + "GB "; bytes = bytes - (gbs * 1073741824); } // One MB - 1048576 bytes if (bytes > 1048576) { // Add GB long mbs = bytes / 1048576; - retStr += (new Long(mbs)).toString() + "MB "; + retStr += (Long.valueOf(mbs)).toString() + "MB "; bytes = bytes - (mbs * 1048576); } if (bytes > 1024) { long kbs = bytes / 1024; - retStr += (new Long(kbs)).toString() + "KB"; + retStr += (Long.valueOf(kbs)).toString() + "KB"; bytes = bytes - (kbs * 1024); } else { - retStr += (new Long(bytes)).toString() + " bytes"; + retStr += (Long.valueOf(bytes)).toString() + " bytes"; } return retStr; } // public static String formatBytes(long bytes){ diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java index a2c1a4ff1..78ddff901 100644 --- a/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/android/src/org/navitproject/navit/Navit.java @@ -1,4 +1,4 @@ -/** +/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * @@ -19,11 +19,11 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.Manifest; -import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; -import android.app.Application; import android.app.Dialog; import android.app.Notification; import android.app.NotificationChannel; @@ -38,8 +38,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.AssetManager; import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Point; import android.media.AudioManager; import android.net.Uri; import android.os.Build; @@ -47,6 +45,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Message; import android.os.PowerManager; +import android.support.annotation.RequiresApi; import android.support.v4.app.ActivityCompat; import android.support.v4.app.NotificationCompat; import android.support.v4.content.ContextCompat; @@ -60,8 +59,8 @@ import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.Toast; + import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -71,130 +70,47 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; + + public class Navit extends Activity { - protected static NavitGraphics graphics = null; - private NavitDialogs dialogs; - private PowerManager.WakeLock wl; - private NavitActivityResult[] ActivityResults; - public static InputMethodManager mgr = null; - public static DisplayMetrics metrics = null; - 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"; + + public static DisplayMetrics sMetrics; + public static boolean sShowSoftKeyboardShowing; + private static Intent sStartupIntent; + private static long sStartupIntentTimestamp; + private static final int MY_PERMISSIONS_REQ_FINE_LOC = 103; 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 CHANNEL_ID = "org.navitproject.navit"; 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 = null; - - public static Navit getInstance() { - return navit; - } + static String sMapFilenamePath; + static String sNavitDataDir; + boolean mIsFullscreen; + private NavitDialogs mDialogs; + private PowerManager.WakeLock mWakeLock; + private NavitActivityResult[] mActivityResults; - /** - * @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(); - } - } private void createNotificationChannel() { /* * Create the NotificationChannel, but only on API 26+ because * the NotificationChannel class is new and not in the support library + * uses NAVIT_PACKAGE_NAME as id */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = getString(R.string.channel_name); - //String description = getString(R.string.channel_description); int importance = NotificationManager.IMPORTANCE_LOW; - NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); - //channel.setDescription(description); - /* - * Register the channel with the system; you can't change the importance - * or other notification behaviors after this - */ + NotificationChannel channel = new NotificationChannel(NAVIT_PACKAGE_NAME, name, importance); NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } } - 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 - * @return translated string - */ - String getTstring(int Rid) { - return getLocalizedString(getString(Rid)); - } - - /** - * Check if a specific file needs to be extracted from the apk archive + * Check if a specific file needs to be extracted from the apk archive. * This is based on whether the file already exist, and if so, whether it is older than the archive or not * * @param filename The full path to the file @@ -222,23 +138,20 @@ public class Navit extends Activity { Log.e(TAG, "Could not read package infos"); e.printStackTrace(); } - if (apkUpdateTime > resultfile.lastModified()) { - return true; - } + return apkUpdateTime > resultfile.lastModified(); } - return false; } /** - * Extract a ressource from the apk archive (res/raw) and save it to a local file + * Extract a resource from the apk archive (res/raw) and save it to a local file. * * @param result The full path to the local file - * @param resname The name of the ressource file in the archive + * @param resname The name of the resource file in the archive * @return true if the local file is extracted in @p result */ private boolean extractRes(String resname, String result) { Log.d(TAG, "Res Name " + resname + ", result " + result); - int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); + int id = NavitAppConfig.sResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); Log.d(TAG, "Res ID " + id); if (id == 0) { return false; @@ -248,7 +161,7 @@ public class Navit extends Activity { Log.d(TAG, "Extracting resource"); try { - InputStream resourcestream = NavitResources.openRawResource(id); + InputStream resourcestream = NavitAppConfig.sResources.openRawResource(id); FileOutputStream resultfilestream = new FileOutputStream(new File(result)); byte[] buf = new byte[1024]; int i; @@ -265,14 +178,14 @@ public class Navit extends Activity { } /** - * Extract an asset from the apk archive (assets) and save it to a local file + * Extract an asset from the apk archive (assets) and save it to a local file. * - * @param output The full path to the output local file - * @param assetFileName The full path of the asset file within the archive + * @param output The full path to the local file + * @param assetFileName The full path of the asset file in the archive * @return true if the local file is extracted in @p output */ private boolean extractAsset(String assetFileName, String output) { - AssetManager assetMgr = NavitResources.getAssets(); + AssetManager assetMgr = NavitAppConfig.sResources.getAssets(); InputStream assetstream; Log.d(TAG, "Asset Name " + assetFileName + ", output " + output); try { @@ -288,7 +201,7 @@ public class Navit extends Activity { try { FileOutputStream outputFilestream = new FileOutputStream(new File(output)); byte[] buf = new byte[1024]; - int i = 0; + int i; while ((i = assetstream.read(buf)) != -1) { outputFilestream.write(buf, 0, i); } @@ -298,12 +211,11 @@ public class Navit extends Activity { return false; } } - return true; } private void showInfos() { - SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); + SharedPreferences settings = getSharedPreferences(NavitAppConfig.NAVIT_PREFS, MODE_PRIVATE); boolean firstStart = settings.getBoolean("firstStart", true); if (firstStart) { @@ -330,167 +242,173 @@ public class Navit extends Activity { } }); infobox.show(); - SharedPreferences.Editor edit_settings = settings.edit(); - edit_settings.putBoolean("firstStart", false); - edit_settings.apply(); + SharedPreferences.Editor preferenceEditor = settings.edit(); + preferenceEditor.putBoolean("firstStart", false); + preferenceEditor.apply(); + } + } + + private void verifyPermissions() { + if (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.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQ_FINE_LOC); } } - /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - /* Whether this is the first launch of Navit (as opposed to the activity being recreated) */ - boolean isLaunch = (navit == null); 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(); + windowSetup(); + mDialogs = new NavitDialogs(this); // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.) - Navit.startup_intent = this.getIntent(); + Navit.sStartupIntent = 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 - if (isLaunch) - createNotificationChannel(); - nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager - PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); - - Notification NavitNotification; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - Notification.Builder builder; - builder = new Notification.Builder(getApplicationContext(), CHANNEL_ID); - 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); - NavitNotification = builder.build(); - } else { - NotificationCompat.Builder builder; - builder = new NotificationCompat.Builder(getApplicationContext()); - 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); - NavitNotification = builder.build(); - } - nm.notify(R.string.app_name, NavitNotification);// Show the notification + Navit.sStartupIntentTimestamp = System.currentTimeMillis(); + Log.d(TAG, "**1**A " + sStartupIntent.getAction()); + Log.d(TAG, "**1**D " + sStartupIntent.getDataString()); - 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); - } + createNotificationChannel(); + buildNotification(); + verifyPermissions(); // get the local language ------------- - Locale locale = java.util.Locale.getDefault(); + Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); String langc = lang; Log.d(TAG, "lang=" + lang); int pos = lang.indexOf('_'); + String navitLanguage; 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)); + 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); + 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/"); - + SharedPreferences prefs = getSharedPreferences(NavitAppConfig.NAVIT_PREFS,MODE_PRIVATE); + sNavitDataDir = getApplicationContext().getFilesDir().getPath(); + sMapFilenamePath = prefs.getString("filenamePath", sNavitDataDir + '/'); + Log.i(TAG,"NavitDataDir = " + sNavitDataDir); + Log.i(TAG,"mapFilenamePath = " + sMapFilenamePath); // 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(); + File navitMapsDir = new File(sMapFilenamePath); + navitMapsDir.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]; + File navitDataShareDir = new File(sNavitDataDir + "/share"); + navitDataShareDir.mkdirs(); + + Display display = getWindowManager().getDefaultDisplay(); + sMetrics = new DisplayMetrics(); + display.getMetrics(sMetrics); + int densityDpi = (int)((sMetrics.density * 160) - .5f); + Log.d(TAG, "-> pixels x=" + display.getWidth() + " pixels y=" + display.getHeight()); + Log.d(TAG, "-> dpi=" + densityDpi); + Log.d(TAG, "-> density=" + sMetrics.density); + Log.d(TAG, "-> scaledDensity=" + sMetrics.scaledDensity); + + mActivityResults = 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,"navit:DoNotDimScreen"); + mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"navit:DoNotDimScreen"); - if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) { + if (!extractRes(langc, sNavitDataDir + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) { Log.e(TAG, "Failed to extract language resource " + langc); } + String myDisplayDensity; if (densityDpi <= 120) { - my_display_density = "ldpi"; + myDisplayDensity = "ldpi"; } else if (densityDpi <= 160) { - my_display_density = "mdpi"; + myDisplayDensity = "mdpi"; } else if (densityDpi < 240) { - my_display_density = "hdpi"; + myDisplayDensity = "hdpi"; } else if (densityDpi < 320) { - my_display_density = "xhdpi"; + myDisplayDensity = "xhdpi"; } else if (densityDpi < 480) { - my_display_density = "xxhdpi"; + myDisplayDensity = "xxhdpi"; } else if (densityDpi < 640) { - my_display_density = "xxxhdpi"; + myDisplayDensity = "xxxhdpi"; } else { Log.w(TAG, "found device of very high density (" + densityDpi + ")"); Log.w(TAG, "using xxxhdpi values"); - my_display_density = "xxxhdpi"; + myDisplayDensity = "xxxhdpi"; } - Log.i(TAG, "Device density detected: " + my_display_density); + Log.i(TAG, "Device density detected: " + myDisplayDensity); try { - AssetManager assetMgr = NavitResources.getAssets(); - String[] children = assetMgr.list("config/" + my_display_density); + AssetManager assetMgr = NavitAppConfig.sResources.getAssets(); + String[] children = assetMgr.list("config/" + myDisplayDensity); for (String child : children) { Log.d(TAG, "Processing config file '" + child + "' from assets"); - if (!extractAsset("config/" + my_display_density + "/" + child, NAVIT_DATA_DIR + "/share/" + child)) { - Log.e(TAG, "Failed to extract asset config/" + my_display_density + "/" + child); + if (!extractAsset("config/" + myDisplayDensity + "/" + child, sNavitDataDir + "/share/" + child)) { + Log.e(TAG, "Failed to extract asset config/" + myDisplayDensity + "/" + child); } } } catch (IOException e) { Log.e(TAG, "Failed to access assets using AssetManager"); } + Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(Build.VERSION.SDK)); + navitMain(navitLanguage, sNavitDataDir + "/bin/navit", sMapFilenamePath); + showInfos(); + } - Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); - NavitMain(this, getApplication(), NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, - NAVIT_DATA_DIR + "/bin/navit", map_filename_path, isLaunch); - if (graphics != null) - graphics.setActivity(this); + private void windowSetup() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + this.requestWindowFeature(Window.FEATURE_NO_TITLE); + } else { + if (this.getActionBar() != null) { + this.getActionBar().hide(); + } + } + } - showInfos(); + /* uses NAVIT_PACKAGE_NAME as id */ - Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + private void buildNotification() { + NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); + + Notification navitNotification; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Notification.Builder builder; + builder = new Notification.Builder(getApplicationContext(), NAVIT_PACKAGE_NAME); + 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); + navitNotification = builder.build(); + } else { + NotificationCompat.Builder builder; + builder = new NotificationCompat.Builder(getApplicationContext()); + 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); + navitNotification = builder.build(); + } + notificationManager.notify(R.string.app_name, navitNotification);// Show the notification + } + + public void onRestart() { + super.onRestart(); + Log.d(TAG, "OnRestart"); + } + + public void onStart() { + super.onStart(); + Log.d(TAG, "OnStart"); } @Override @@ -503,79 +421,59 @@ public class Navit extends Activity { | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } - //InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + //InputMethodManager sInputMethodManager = (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()); + if (sStartupIntent != null) { + if (System.currentTimeMillis() <= Navit.sStartupIntentTimestamp + 4000L) { + Log.d(TAG, "**2**A " + sStartupIntent.getAction()); + Log.d(TAG, "**2**D " + sStartupIntent.getDataString()); + String naviScheme = sStartupIntent.getScheme(); + if (naviScheme != null && naviScheme.equals("google.navigation")) { + parseNavigationURI(sStartupIntent.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(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(); + if (requestCode == MY_PERMISSIONS_REQ_FINE_LOC) { + if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + 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) { + onDestroy(); + } + }); + 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]); - + Map<String,String> params = new HashMap<>(); + for (String naviDatum : naviData) { + Matcher m = p.matcher(naviDatum); if (m.matches()) { params.put(m.group(1), m.group(2)); } @@ -586,8 +484,8 @@ public class Navit extends Activity { // c: google.navigation:ll=48.25676,16.643 // b: google.navigation:q=48.25676,16.643 - Float lat; - Float lon; + float lat; + float lon; Bundle b = new Bundle(); String geoString = params.get("ll"); @@ -609,12 +507,12 @@ public class Navit extends Activity { 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()); + Message msg = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.CLB_SET_DESTINATION.ordinal()); msg.setData(b); msg.sendToTarget(); - Log.e(TAG, "target found (b): " + geoString); + Log.i(TAG, "target found (b): " + geoString); } catch (NumberFormatException e) { e.printStackTrace(); } @@ -625,23 +523,16 @@ public class Navit extends Activity { } } - public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) { - ActivityResults[requestCode] = ActivityResult; + public void setActivityResult(int requestCode, NavitActivityResult activityResult) { + mActivityResults[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 @@ -658,32 +549,15 @@ public class Navit extends Activity { 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("")) { + private void start_targetsearch_from_intent(String targetAddress) { + if (targetAddress == null || targetAddress.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); + Intent searchIntent = new Intent(this, NavitAddressSearchActivity.class); + searchIntent.putExtra("search_string", targetAddress); + this.startActivityForResult(searchIntent, NavitAddressSearch_id); } } @@ -693,44 +567,44 @@ public class Navit extends Activity { return true; } - public void runOptionsItem(int id) { + private void runOptionsItem(int id) { switch (id) { case 1 : // zoom in - Message.obtain(N_NavitGraphics.callback_handler, - NavitGraphics.msg_type.CLB_ZOOM_IN.ordinal()).sendToTarget(); + Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.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(); + Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.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); + Intent mapDownloadListActivity = new Intent(this, NavitDownloadSelectMapActivity.class); + startActivityForResult(mapDownloadListActivity, 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()); + Message msg = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.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()); + msg = Message.obtain(NavitGraphics.sCallbackHandler, NavitGraphics.MsgType.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()); + msg = Message.obtain(NavitGraphics.sCallbackHandler, NavitGraphics.MsgType.CLB_CALL_CMD.ordinal()); b = new Bundle(); b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");"); msg.setData(b); @@ -739,8 +613,8 @@ public class Navit extends Activity { break; case 6 : // ok startup address search activity - Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); - this.startActivityForResult(search_intent, NavitAddressSearch_id); + Intent searchIntent = new Intent(this, NavitAddressSearchActivity.class); + this.startActivityForResult(searchIntent, NavitAddressSearch_id); break; case 7 : /* Backup / Restore */ @@ -752,8 +626,10 @@ public class Navit extends Activity { case 99 : // exit this.onStop(); - this.exit(); + this.onDestroy(); break; + default: + Log.e(TAG,"unhandled OptionsItem id = " + id); } } @@ -761,74 +637,57 @@ public class Navit extends Activity { /** * 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. + * <p>Calling this method has the same effect as pressing the hardware Menu button, or touching + * the overflow button in the Action bar.</p> */ - public void showMenu() { + void showMenu() { openOptionsMenu(); } /** * Shows the native keyboard or other input method. + * + * @return 1 if keyboard is software, 0 if hardware */ - 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. - */ + int showNativeKeyboard() { + Log.d(TAG, "showNativeKeyboard"); Configuration config = getResources().getConfiguration(); if ((config.keyboard == Configuration.KEYBOARD_QWERTY) && (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)) { - /* physical keyboard present, exit */ + /* physical keyboard present */ 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; + ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)) + .showSoftInput(getCurrentFocus(), InputMethodManager.SHOW_FORCED); + sShowSoftKeyboardShowing = 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; + return 1; } /** * Hides the native keyboard or other input method. */ - public void hideNativeKeyboard() { - mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); - show_soft_keyboard_now_showing = false; + void hideNativeKeyboard() { + ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)) + .hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + sShowSoftKeyboardShowing = 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 + 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); + Message msg = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.CLB_SET_DESTINATION.ordinal()); msg.setData(b); msg.sendToTarget(); } @@ -837,7 +696,7 @@ public class Navit extends Activity { switch (requestCode) { case Navit.NavitDownloaderSelectMap_id : if (resultCode == Activity.RESULT_OK) { - Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD, + Message msg = mDialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD, data.getIntExtra("map_index", -1), 0); msg.sendToTarget(); } @@ -849,8 +708,8 @@ public class Navit extends Activity { 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()); + Message msg = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.CLB_SET_DESTINATION.ordinal()); msg.setData(destination); msg.sendToTarget(); } @@ -864,10 +723,10 @@ public class Navit extends Activity { } 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(); + SharedPreferences prefs = this.getSharedPreferences(NavitAppConfig.NAVIT_PREFS,MODE_PRIVATE); + SharedPreferences.Editor prefsEditor = prefs.edit(); + prefsEditor.putString("filenamePath", newDir); + prefsEditor.apply(); Toast.makeText(this, String.format(getTstring(R.string.map_location_changed),newDir), Toast.LENGTH_LONG).show(); @@ -876,27 +735,28 @@ public class Navit extends Activity { } break; default : - if (ActivityResults[requestCode] != null) - ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); + if (mActivityResults[requestCode] != null) { + mActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); + } break; } } @Override protected void onPrepareDialog(int id, Dialog dialog) { - dialogs.prepareDialog(id); + mDialogs.prepareDialog(id); super.onPrepareDialog(id, dialog); } protected Dialog onCreateDialog(int id) { - return dialogs.createDialog(id); + return mDialogs.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); + Intent searchIntent = new Intent(this, NavitAddressSearchActivity.class); + this.startActivityForResult(searchIntent, NavitAddressSearch_id); return true; } @@ -913,62 +773,49 @@ public class Navit extends Activity { public void onDestroy() { super.onDestroy(); Log.d(TAG, "OnDestroy"); + NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + notificationManager.cancelAll(); + NavitVehicle.removeListeners(this); + navitDestroy(); } - public void fullscreen(int fullscreen) { - int w, h; - isFullscreen = (fullscreen != 0); - if (isFullscreen) { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + public void onStop() { + super.onStop(); + Log.d(TAG, "OnStop"); + } + + + @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH) + void fullscreen(int fullscreen) { + + View decorView = getWindow().getDecorView(); + + mIsFullscreen = (fullscreen != 0); + if (mIsFullscreen) { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); - } else { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + decorView.setSystemUiVisibility(uiOptions); + } - 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; + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + decorView.setSystemUiVisibility(0); + } } - 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(); + mWakeLock.acquire(); + mWakeLock.release(); } - public native void NavitMain(Navit x, Application application, String lang, int version, - String display_density_string, String path, String path2, boolean isLaunch); + private native void navitMain(String lang, String path, String path2); - public native void NavitDestroy(); + 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/NavitActivityResult.java b/navit/android/src/org/navitproject/navit/NavitActivityResult.java index 7d3ef8cb4..fb785d1d3 100644 --- a/navit/android/src/org/navitproject/navit/NavitActivityResult.java +++ b/navit/android/src/org/navitproject/navit/NavitActivityResult.java @@ -3,5 +3,5 @@ package org.navitproject.navit; import android.content.Intent; public interface NavitActivityResult { - public void onActivityResult(int requestCode, int resultCode, Intent data); + void onActivityResult(int requestCode, int resultCode, Intent data); } diff --git a/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java b/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java index 5905433d6..3c0c489d1 100644 --- a/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java @@ -1,4 +1,4 @@ -/** +/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * @@ -19,6 +19,8 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -42,10 +44,10 @@ import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; -import android.widget.RelativeLayout; 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; @@ -53,41 +55,41 @@ 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; + static final class NavitAddress { + NavitAddress(int type, float latitude, float longitude, String address) { + mResultType = type; + mLat = latitude; + mLon = longitude; + mAddr = address; } - final int result_type; - final float lat; - final float lon; - final String addr; + final int mResultType; + final float mLat; + final float mLon; + final String mAddr; } 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 List<NavitAddress> mAddressesFound = null; + private List<NavitAddress> mAddressesShown = 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; + private ProgressDialog mSearchResultsWait = null; + private int mSearchResultsTowns = 0; + private int mSearchResultsStreets = 0; + private int mSearchResultsStreetsHn = 0; + private long mSearchHandle = 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 static String sLastAddressSearchString = ""; + private static Boolean sLastAddressPartialMatch = false; + private static String sLastCountry = ""; private int getDrawableID(String resourceName) { int drawableId = 0; @@ -105,17 +107,18 @@ public class NavitAddressSearchActivity extends Activity { // 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) { + int[] flagIconSizes = {24,32,48,64,96}; + int exactSize; + int nearestSize; + exactSize = (int)(Navit.sMetrics.density * 24.0 - .5); + nearestSize = flagIconSizes[0]; + for (int size: flagIconSizes) { + nearestSize = size; + if (exactSize <= size) { break; } } - mCountryButton.setImageResource(getDrawableID("country_" + mCountry + "_" + nearest_size + "_" + nearest_size)); + mCountryButton.setImageResource(getDrawableID("country_" + mCountry + "_" + nearestSize + "_" + nearestSize)); } @@ -125,17 +128,17 @@ public class NavitAddressSearchActivity extends Activity { Bundle extras = getIntent().getExtras(); if (extras != null) { - String search_string = extras.getString(("search_string")); - if (search_string != null) { + String searchString = extras.getString(("search_string")); + if (searchString != null) { mPartialSearch = true; - mAddressString = search_string; + mAddressString = searchString; executeSearch(); return; } } - mPartialSearch = last_address_partial_match; - mAddressString = last_address_search_string; + mPartialSearch = sLastAddressPartialMatch; + mAddressString = sLastAddressSearchString; getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); LinearLayout panel = new LinearLayout(this); @@ -143,15 +146,15 @@ public class NavitAddressSearchActivity extends Activity { panel.setOrientation(LinearLayout.VERTICAL); // address: label and text field - SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + SharedPreferences settings = getSharedPreferences(NavitAppConfig.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(); + SharedPreferences.Editor editSettings = settings.edit(); + editSettings.putString("DefaultCountry", mCountry); + editSettings.apply(); } mCountryButton = new ImageButton(this); @@ -165,33 +168,33 @@ public class NavitAddressSearchActivity extends Activity { }); // 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); + TextView addrView = new TextView(this); + addrView.setText(getTstring(R.string.address_enter_destination)); // TRANS + addrView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); + addrView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + addrView.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.setText(getTstring(R.string.address_partial_match)); // TRANS + checkboxPartialMatch.setChecked(sLastAddressPartialMatch); checkboxPartialMatch.setGravity(Gravity.CENTER); final EditText address_string = new EditText(this); - address_string.setText(last_address_search_string); + address_string.setText(sLastAddressSearchString); address_string.setSelectAllOnFocus(true); // search button final Button btnSearch = new Button(this); - btnSearch.setText(Navit.getInstance().getTstring(R.string.address_search_button)); // TRANS + btnSearch.setText(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; + sLastAddressPartialMatch = mPartialSearch; + sLastAddressSearchString = mAddressString; executeSearch(); } }); @@ -204,19 +207,19 @@ public class NavitAddressSearchActivity extends Activity { if (addressCount > 0) { String[] strAddresses = new String[addressCount]; for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { - strAddresses[addrIndex] = addresses.get(addrIndex).addr; + strAddresses[addrIndex] = addresses.get(addrIndex).mAddr; } ArrayAdapter<String> addressList = - new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strAddresses); + new ArrayAdapter<>(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); + resultIntent.putExtra("lat", addressSelected.mLat); + resultIntent.putExtra("lon", addressSelected.mLon); + resultIntent.putExtra("q", addressSelected.mAddr); setResult(Activity.RESULT_OK, resultIntent); finish(); @@ -232,7 +235,7 @@ public class NavitAddressSearchActivity extends Activity { searchSettingsLayout.addView(mCountryButton); searchSettingsLayout.addView(checkboxPartialMatch); - panel.addView(addr_view); + panel.addView(addrView); panel.addView(address_string); panel.addView(searchSettingsLayout); panel.addView(btnSearch); @@ -242,32 +245,31 @@ public class NavitAddressSearchActivity extends Activity { } private void requestCountryDialog() { - final String[][] all_countries = NavitGraphics.GetAllCountries(); + final String[][] all_countries = NavitGraphics.getAllCountries(); - Comparator<String[]> country_comperator = new Comparator<String[]>() { + Comparator<String[]> countryComparator = new Comparator<String[]>() { public int compare(String[] object1, String[] object2) { return object1[1].compareTo(object2[1]); } }; - Arrays.sort(all_countries, country_comperator); + Arrays.sort(all_countries, countryComparator); AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this); // ToDo also show icons and country code - String[] country_name = new String[all_countries.length]; + String[] countryName = 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]; + for (int countryIndex = 0; countryIndex < all_countries.length; countryIndex++) { + countryName[countryIndex] = all_countries[countryIndex][1]; } - mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() { + mapModeChooser.setItems(countryName, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { - SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + SharedPreferences settings = getSharedPreferences(NavitAppConfig.NAVIT_PREFS, MODE_PRIVATE); mCountry = all_countries[item][0]; - SharedPreferences.Editor edit_settings = settings.edit(); - edit_settings.putString("DefaultCountry", mCountry); - edit_settings.apply(); - + SharedPreferences.Editor editSettings = settings.edit(); + editSettings.putString("DefaultCountry", mCountry); + editSettings.apply(); setCountryButtonImage(); } }); @@ -277,36 +279,35 @@ public class NavitAddressSearchActivity extends Activity { 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); + //start a search on the map + void receiveAddress(int type, float latitude, float longitude, String address) { + Log.d(TAG, "(" + latitude + ", " + longitude + ") " + address); switch (type) { case 0: - search_results_towns++; + mSearchResultsTowns++; break; case 1: - search_results_streets++; + mSearchResultsStreets++; break; case 2: - search_results_streets_hn++; + mSearchResultsStreetsHn++; break; - + default: + Log.e(TAG,"Unexpected value: " + type); } - 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); + mSearchResultsWait.setMessage(getTstring(R.string.address_search_towns) + ":" + + mSearchResultsTowns + " " + + getTstring(R.string.address_search_streets) + ":" + mSearchResultsStreets + "/" + + mSearchResultsStreetsHn); - search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); + mSearchResultsWait.setProgress(mAddressesFound.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); - Addresses_found.add(new NavitAddress(type, latitude, longitude, address)); + mAddressesFound.add(new NavitAddress(type, latitude, longitude, address)); } - public void finishAddressSearch() { - if (Addresses_found.isEmpty()) { + void finishAddressSearch() { + if (mAddressesFound.isEmpty()) { // TRANS Toast.makeText(getApplicationContext(), getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); @@ -316,14 +317,14 @@ public class NavitAddressSearchActivity extends Activity { ListView addressesFound = new ListView(this); addressesFound.setFastScrollEnabled(true); ArrayAdapter<String> addressList = - new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); + new ArrayAdapter<>(this, android.R.layout.simple_list_item_1); - addresses_shown = new ArrayList<NavitAddress>(); + mAddressesShown = new ArrayList<>(); - for (NavitAddress currentAddress : Addresses_found) { - if (currentAddress.result_type != 0 || search_results_streets == 0) { - addressList.add(currentAddress.addr); - addresses_shown.add(currentAddress); + for (NavitAddress currentAddress : mAddressesFound) { + if (currentAddress.mResultType != 0 || mSearchResultsStreets == 0) { + addressList.add(currentAddress.mAddr); + mAddressesShown.add(currentAddress); } } @@ -331,12 +332,12 @@ public class NavitAddressSearchActivity extends Activity { addressesFound.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { - NavitAddress addressSelected = addresses_shown.get(arg2); + NavitAddress addressSelected = mAddressesShown.get(arg2); Intent resultIntent = new Intent(); - resultIntent.putExtra("lat", addressSelected.lat); - resultIntent.putExtra("lon", addressSelected.lon); - resultIntent.putExtra("q", addressSelected.addr); + resultIntent.putExtra("lat", addressSelected.mLat); + resultIntent.putExtra("lon", addressSelected.mLon); + resultIntent.putExtra("q", addressSelected.mAddr); setResult(Activity.RESULT_OK, resultIntent); finish(); @@ -344,39 +345,39 @@ public class NavitAddressSearchActivity extends Activity { }); setContentView(addressesFound); - search_results_wait.dismiss(); + mSearchResultsWait.dismiss(); } - public native long CallbackStartAddressSearch(int partial_match, String country, String s); + native long callbackStartAddressSearch(int partialMatch, String country, String s); - public native void CallbackCancelAddressSearch(long handle); + 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() { + mSearchResultsWait = new ProgressDialog(this); + mSearchResultsWait.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + mSearchResultsWait.setTitle("Loading search results"); + mSearchResultsWait.setMessage("--"); + mSearchResultsWait.setCancelable(true); + mSearchResultsWait.setProgress(0); + mSearchResultsWait.setMax(10); + + mAddressesFound = new ArrayList<>(); + mSearchResultsTowns = 0; + mSearchResultsStreets = 0; + mSearchResultsStreetsHn = 0; + + mSearchHandle = callbackStartAddressSearch(mPartialSearch ? 1 : 0, mCountry, mAddressString); + + mSearchResultsWait.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { - CallbackCancelAddressSearch(search_handle); - search_handle = 0; - search_results_wait.dismiss(); + callbackCancelAddressSearch(mSearchHandle); + mSearchHandle = 0; + mSearchResultsWait.dismiss(); } }); - return search_results_wait; + return mSearchResultsWait; } private void executeSearch() { diff --git a/navit/android/src/org/navitproject/navit/NavitAppConfig.java b/navit/android/src/org/navitproject/navit/NavitAppConfig.java index 22c310f70..322fcc9c7 100755 --- a/navit/android/src/org/navitproject/navit/NavitAppConfig.java +++ b/navit/android/src/org/navitproject/navit/NavitAppConfig.java @@ -2,6 +2,7 @@ package org.navitproject.navit; import android.app.Application; import android.content.SharedPreferences; +import android.content.res.Resources; import java.util.ArrayList; import java.util.List; @@ -10,34 +11,36 @@ import org.navitproject.navit.NavitAddressSearchActivity.NavitAddress; public class NavitAppConfig extends Application { + public static final String NAVIT_PREFS = "NavitPrefs"; private static final int MAX_LAST_ADDRESSES = 10; - private static final String TAG = "Navit"; - - private List<NavitAddress> mLastAddresses = null; + static Resources sResources; + private List<NavitAddress> mLastAddresses = null; private int mLastAddressField; private SharedPreferences mSettings; + @Override public void onCreate() { - mSettings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); super.onCreate(); + mSettings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); + sResources = getResources(); } - public List<NavitAddress> getLastAddresses() { + List<NavitAddress> getLastAddresses() { if (mLastAddresses == null) { - mLastAddresses = new ArrayList<NavitAddress>(); + mLastAddresses = new ArrayList<>(); int mLastAddressField = mSettings.getInt("LastAddress", -1); if (mLastAddressField >= 0) { int index = mLastAddressField; do { - String addr_str = mSettings.getString("LastAddress_" + String.valueOf(index), ""); + String addrStr = mSettings.getString("LastAddress_" + index, ""); - if (addr_str.length() > 0) { + if (addrStr.length() > 0) { mLastAddresses.add(new NavitAddress( 1, - mSettings.getFloat("LastAddress_Lat_" + String.valueOf(index), 0), - mSettings.getFloat("LastAddress_Lon_" + String.valueOf(index), 0), - addr_str)); + mSettings.getFloat("LastAddress_Lat_" + index, 0), + mSettings.getFloat("LastAddress_Lon_" + index, 0), + addrStr)); } if (--index < 0) { @@ -50,7 +53,7 @@ public class NavitAppConfig extends Application { return mLastAddresses; } - public void addLastAddress(NavitAddress newAddress) { + void addLastAddress(NavitAddress newAddress) { getLastAddresses(); mLastAddresses.add(newAddress); @@ -66,10 +69,33 @@ public class NavitAppConfig extends Application { SharedPreferences.Editor editSettings = mSettings.edit(); editSettings.putInt("LastAddress", mLastAddressField); - editSettings.putString("LastAddress_" + String.valueOf(mLastAddressField), newAddress.addr); - editSettings.putFloat("LastAddress_Lat_" + String.valueOf(mLastAddressField), newAddress.lat); - editSettings.putFloat("LastAddress_Lon_" + String.valueOf(mLastAddressField), newAddress.lon); + editSettings.putString("LastAddress_" + mLastAddressField, newAddress.mAddr); + editSettings.putFloat("LastAddress_Lat_" + mLastAddressField, newAddress.mLat); + editSettings.putFloat("LastAddress_Lon_" + mLastAddressField, newAddress.mLon); editSettings.apply(); } + + /** + * Translates a string from its id + * in R.strings + * + * @param riD resource identifier + * @return translated string + */ + static String getTstring(int riD) { + + return callbackLocalizedString(sResources.getString(riD)); + } + + static native String callbackLocalizedString(String s); + + /* + * 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/NavitBackupTask.java b/navit/android/src/org/navitproject/navit/NavitBackupTask.java index c3fbe0517..567acb137 100644 --- a/navit/android/src/org/navitproject/navit/NavitBackupTask.java +++ b/navit/android/src/org/navitproject/navit/NavitBackupTask.java @@ -1,5 +1,7 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; @@ -11,6 +13,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; + public class NavitBackupTask extends AsyncTask<Void, Void, String> { private Navit mActivity; @@ -28,7 +31,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.getTstring(R.string.backing_up)); + mDialog.setMessage(getTstring(R.string.backing_up)); mDialog.show(); } @@ -44,7 +47,7 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { /* Create the Main Backup Directory if it doesn't exist */ if (!mainBackupDir.isDirectory()) { if (!mainBackupDir.mkdirs()) { - return mActivity.getTstring(R.string.failed_to_create_backup_directory); + return getTstring(R.string.failed_to_create_backup_directory); } } @@ -70,29 +73,29 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { /* Create the Backup Directory if it doesn't exist */ if (!backupDir.isDirectory()) { if (!backupDir.mkdirs()) { - return mActivity.getTstring(R.string.failed_to_create_backup_directory); + return 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", + NavitUtils.copyFileIfExists(Navit.sNavitDataDir + "/home/bookmark.txt", backupDir.getPath() + "/bookmark.txt"); - mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/destination.txt", + NavitUtils.copyFileIfExists(Navit.sNavitDataDir + "/home/destination.txt", backupDir.getPath() + "/destination.txt"); - mActivity.copyFileIfExists(Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt", + NavitUtils.copyFileIfExists(Navit.sNavitDataDir + "/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) + mActivity.getSharedPreferences(NavitAppConfig.NAVIT_PREFS, Context.MODE_PRIVATE) .getAll()); } catch (IOException e) { e.printStackTrace(); - return mActivity.getTstring(R.string.backup_failed); + return getTstring(R.string.backup_failed); } finally { /* Close Stream to prevent Resource Leaks */ try { @@ -101,7 +104,7 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { } } catch (IOException e) { e.printStackTrace(); - return mActivity.getTstring(R.string.backup_failed); + return getTstring(R.string.backup_failed); } } @@ -121,14 +124,14 @@ public class NavitBackupTask extends AsyncTask<Void, Void, String> { return; } - Toast.makeText(mActivity, mActivity.getTstring(R.string.backup_successful), + Toast.makeText(mActivity, getTstring(R.string.backup_successful), Toast.LENGTH_LONG).show(); } @Override protected void onCancelled() { super.onCancelled(); - Toast.makeText(mActivity, mActivity.getTstring(R.string.backup_failed), Toast.LENGTH_LONG) + Toast.makeText(mActivity, getTstring(R.string.backup_failed), Toast.LENGTH_LONG) .show(); mDialog.dismiss(); } diff --git a/navit/android/src/org/navitproject/navit/NavitCamera.java b/navit/android/src/org/navitproject/navit/NavitCamera.java index 709686b97..1df26081a 100644 --- a/navit/android/src/org/navitproject/navit/NavitCamera.java +++ b/navit/android/src/org/navitproject/navit/NavitCamera.java @@ -25,58 +25,73 @@ import android.view.SurfaceView; import java.io.IOException; +class NavitCamera extends SurfaceView implements SurfaceHolder.Callback { - -public class NavitCamera extends SurfaceView implements SurfaceHolder.Callback { - SurfaceHolder mHolder; - Camera mCamera; - - + private Camera mCamera; + private static final String TAG = "NavitCamera"; NavitCamera(Context context) { super(context); - mHolder = getHolder(); - mHolder.addCallback(this); - mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); - Log.e("NavitCamera","Creator"); - - + if (android.support.v4.content.ContextCompat.checkSelfPermission(context, + android.Manifest.permission.CAMERA) + != android.content.pm.PackageManager.PERMISSION_GRANTED) { + Log.e(TAG,"No permission to access camera"); + return; + } + SurfaceHolder holder; + holder = getHolder(); + holder.addCallback(this); + holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + Log.v(TAG,"Creator"); } + /** + * {@inheritDoc} + * + * <p>acquire the camera and tell it where to draw.</p> + */ public void surfaceCreated(SurfaceHolder holder) { - // The Surface has been created, acquire the camera and tell it where - // to draw. - try { - mCamera = Camera.open(); - mCamera.setPreviewDisplay(holder); - } catch (IOException exception) { - mCamera.release(); - mCamera = null; - // TODO: add more exception handling logic here + if (mCamera != null) { + try { + mCamera = Camera.open(); + mCamera.setPreviewDisplay(holder); + } catch (IOException exception) { + mCamera.release(); + mCamera = null; + Log.e(TAG, "IOException"); + } + Log.i(TAG, "surfaceCreated"); + } else { + Log.e(TAG, "null camera"); } - Log.e("NavitCamera","surfaceCreated"); } + + /** + * {@inheritDoc} + * + * <p>stop the preview and release the camera.</p> + */ public void surfaceDestroyed(SurfaceHolder holder) { - // Surface will be destroyed when we return, so stop the preview. - // Because the CameraDevice object is not a shared resource, it's very - // important to release it when the activity is paused. mCamera.stopPreview(); mCamera = null; - Log.e("NavitCamera","surfaceDestroyed"); + Log.e(TAG,"surfaceDestroyed"); } + + /** + * {@inheritDoc} + * + * <p>set up the camera with the new parameters.</p> + */ public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - // Now that the size is known, set up the camera parameters and begin - // the preview. - Log.e("NavitCamera","surfaceChanged " + w + "x" + h); + Log.e(TAG,"surfaceChanged " + w + "x " + h); mCamera.stopPreview(); Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewSize(w, h); mCamera.setParameters(parameters); mCamera.startPreview(); } - } diff --git a/navit/android/src/org/navitproject/navit/NavitDialogs.java b/navit/android/src/org/navitproject/navit/NavitDialogs.java index 41cac61da..8a9d6de65 100644 --- a/navit/android/src/org/navitproject/navit/NavitDialogs.java +++ b/navit/android/src/org/navitproject/navit/NavitDialogs.java @@ -1,5 +1,7 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; @@ -14,11 +16,12 @@ import android.widget.ArrayAdapter; import android.widget.Toast; 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; + static final int DIALOG_MAPDOWNLOAD = 1; + static final int DIALOG_BACKUP_RESTORE = 2; // dialog messages static final int MSG_MAP_DOWNLOAD_FINISHED = 0; static final int MSG_PROGRESS_BAR = 1; @@ -27,30 +30,30 @@ public class NavitDialogs extends Handler { 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; + private static Handler sHandler; + private static final String TAG = "NavitDialogs"; + private ProgressDialog mMapdownloaderDialog = null; + private NavitMapDownloader mMapdownloader = null; + private final Navit mActivity; NavitDialogs(Navit activity) { super(); mActivity = activity; - mHandler = this; + sHandler = this; } - static public void sendDialogMessage(int what, String title, String text, int dialog_num, + static void sendDialogMessage(int what, String title, String text, int dialogNum, 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); + data.putInt("dialog_num", dialogNum); + Message msg = sHandler.obtainMessage(what); msg.setData(data); - mHandler.sendMessage(msg); + sHandler.sendMessage(msg); } @Override @@ -61,32 +64,32 @@ public class NavitDialogs extends Handler { 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()); + Message msgOut = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.CLB_LOAD_MAP.ordinal()); + msgOut.setData(msg.getData()); + msgOut.sendToTarget(); + + msgOut = Message + .obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.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; + double lon = (Double.parseDouble(NavitMapDownloader.osm_maps[mi].mLon1) + Double + .parseDouble(NavitMapDownloader.osm_maps[mi].mLon2)) / 2.0; + double lat = (Double.parseDouble(NavitMapDownloader.osm_maps[mi].mLat1) + Double + .parseDouble(NavitMapDownloader.osm_maps[mi].mLat2)) / 2.0; b.putString("cmd", "set_center(\"" + lon + " " + lat + "\",1); zoom=256"); - msg_out.setData(b); - msg_out.sendToTarget(); + msgOut.setData(b); + msgOut.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"))); + mMapdownloaderDialog.setMax(msg.getData().getInt("value1")); + mMapdownloaderDialog.setProgress(msg.getData().getInt("value2")); + mMapdownloaderDialog.setTitle(msg.getData().getString(("title"))); + mMapdownloaderDialog.setMessage(msg.getData().getString(("text"))); break; case MSG_TOAST: Toast.makeText(mActivity, msg.getData().getString(("text")), Toast.LENGTH_SHORT).show(); @@ -95,14 +98,14 @@ public class NavitDialogs extends Handler { 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); + int downloadMapId = msg.arg1; + Log.d(TAG, "PRI id=" + downloadMapId); // 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); + if (downloadMapId > -1) { + mMapdownloader = new NavitMapDownloader(downloadMapId); mActivity.showDialog(NavitDialogs.DIALOG_MAPDOWNLOAD); - mapdownloader.start(); + mMapdownloader.start(); } } break; @@ -111,6 +114,8 @@ public class NavitDialogs extends Handler { mActivity.dismissDialog(msg.getData().getInt("dialog_num")); mActivity.removeDialog(msg.getData().getInt("dialog_num")); break; + default: + Log.e(TAG,"Unexpected value: " + msg.what); } } @@ -119,53 +124,45 @@ public class NavitDialogs extends Handler { 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); + mMapdownloaderDialog = new ProgressDialog(mActivity); + mMapdownloaderDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + mMapdownloaderDialog.setTitle("--"); + mMapdownloaderDialog.setMessage("--"); + mMapdownloaderDialog.setCancelable(true); + mMapdownloaderDialog.setProgress(0); + mMapdownloaderDialog.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(); + Log.e(TAG, "onDismiss: mMapdownloaderDialog"); + if (mMapdownloader != null) { + mMapdownloader.stop_thread(); } } }; - mapdownloader_dialog.setOnDismissListener(onDismissListener); + mMapdownloaderDialog.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; + R.string.osm_copyright, Toast.LENGTH_LONG).show(); + return mMapdownloaderDialog; 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() { + builder.setTitle(getTstring(R.string.choose_an_action)) + .setCancelable(true) + .setItems(R.array.dialog_backup_restore_items, + new 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.makeText(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; + if (which == 0) { /* Backup */ + new NavitBackupTask(mActivity).execute(); + } else if (which == 1) { /* Restore */ + mActivity.showDialog(DIALOG_SELECT_BACKUP); } } }); @@ -183,13 +180,13 @@ public class NavitDialogs extends Handler { 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); + builder.setTitle(getTstring(R.string.no_backup_found)); + builder.setNegativeButton(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, + builder.setTitle(getTstring(R.string.select_backup)); + final ArrayAdapter<String> adapter = new ArrayAdapter<>(mActivity, android.R.layout.simple_spinner_item, backups); builder.setAdapter(adapter, new OnClickListener() { @@ -198,15 +195,17 @@ public class NavitDialogs extends Handler { new NavitRestoreTask(mActivity, adapter.getItem(which)).execute(); } }); - builder.setNegativeButton(mActivity.getTstring(android.R.string.cancel), null); + builder.setNegativeButton(getTstring(android.R.string.cancel), null); return builder.create(); + default: + Log.e(TAG,"Unexpected value: " + id); } // should never get here!! return null; } - public void prepareDialog(int id) { + void prepareDialog(int id) { /* Remove the Dialog to force Android to rerun onCreateDialog */ if (id == DIALOG_SELECT_BACKUP) { diff --git a/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java b/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java index bb66a8df7..8f816df60 100644 --- a/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java @@ -1,4 +1,4 @@ -/** +/* * 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 @@ -15,6 +15,8 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.Manifest; import android.app.Activity; import android.app.AlertDialog; @@ -37,58 +39,59 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; + public class NavitDownloadSelectMapActivity extends ExpandableListActivity { 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(); + private static SimpleExpandableListAdapter sAdapter = null; + private static ArrayList<HashMap<String, String>> sDownloadedMapsChilds = null; + private static ArrayList<HashMap<String, String>> sMapsCurrentPositionChilds = null; + private static boolean sCurrentLocationKnown = false; + private static final String TAG = "DownloadSelectMapAct"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (adapter == null) { - adapter = createAdapter(); + if (sAdapter == null) { + sAdapter = createAdapter(); } updateDownloadedMaps(); - updateMapsForLocation(NavitMapDownloader.osm_maps); - setListAdapter(adapter); + updateMapsForLocation(); + setListAdapter(sAdapter); try { - setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available"); + setTitle(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), + (getTstring(R.string.map_location_unavailable)), + Navit.sMapFilenamePath), -1, 0, 0); finish(); } } private long getFreeSpace() { - StatFs fsInfo = new StatFs(Navit.map_filename_path); + StatFs fsInfo = new StatFs(Navit.sMapFilenamePath); return (long) fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); } private void updateDownloadedMaps() { - downloaded_maps_childs.clear(); + sDownloadedMapsChilds.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"); + HashMap<String, String> child = new HashMap<>(); + child.put("map_name", map.mMapName + " " + (map.size() / 1024 / 1024) + "MB"); child.put("map_location", map.getLocation()); - downloaded_maps_childs.add(child); + sDownloadedMapsChilds.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)) { + private void updateMapsForLocation() { + Location currentLocation = NavitVehicle.sLastLocation; + if (sMapsCurrentPositionChilds.size() == 0 || (currentLocation != null + && !sCurrentLocationKnown)) { if (currentLocation == null) { LocationManager mapLocationManager = (LocationManager) getSystemService( Context.LOCATION_SERVICE); @@ -114,22 +117,23 @@ public class NavitDownloadSelectMapActivity extends ExpandableListActivity { } } } else { - currentLocationKnown = true; + sCurrentLocationKnown = 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; + for (int currentMapIndex = 0; currentMapIndex < NavitMapDownloader.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) + if (NavitMapDownloader.osm_maps[currentMapIndex].isInMap(currentLocation)) { + HashMap<String, String> currentPositionMapChild = new HashMap<>(); + currentPositionMapChild.put("map_name", NavitMapDownloader.osm_maps[currentMapIndex].mMapName + + " " + + (NavitMapDownloader.osm_maps[currentMapIndex].mEstSizeBytes / 1024 / 1024) + "MB"); currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex)); - maps_current_position_childs.add(currentPositionMapChild); + sMapsCurrentPositionChilds.add(currentPositionMapChild); } } } @@ -138,45 +142,41 @@ public class NavitDownloadSelectMapActivity extends ExpandableListActivity { 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>>>(); + ArrayList<HashMap<String, String>> resultGroups = new ArrayList<>(); // 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); + HashMap<String, String> downloadedMapsHash = new HashMap<>(); + downloadedMapsHash.put("category_name", getTstring(R.string.maps_installed)); + resultGroups.add(downloadedMapsHash); + sDownloadedMapsChilds = new ArrayList<>(); + ArrayList<ArrayList<HashMap<String, String>>> resultChilds = new ArrayList<>(); + resultChilds.add(sDownloadedMapsChilds); - ArrayList<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>(); - maps_current_position_childs = new ArrayList<HashMap<String, String>>(); + ArrayList<HashMap<String, String>> secList = new ArrayList<>(); + sMapsCurrentPositionChilds = new ArrayList<>(); // 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); - + HashMap<String, String> matchingMaps = new HashMap<>(); + matchingMaps.put("category_name", + getTstring(R.string.maps_for_current_location)); + resultGroups.add(matchingMaps); + resultChilds.add(sMapsCurrentPositionChilds); + NavitMapDownloader.OsmMapValues[] osmMaps = NavitMapDownloader.osm_maps; // add all maps - for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { - if (osm_maps[currentMapIndex].level == 0) { + for (int currentMapIndex = 0; currentMapIndex < osmMaps.length; currentMapIndex++) { + if (osmMaps[currentMapIndex].mLevel == 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); + secList = new ArrayList<>(); + HashMap<String, String> mapInfoHash = new HashMap<>(); + mapInfoHash.put("category_name", osmMaps[currentMapIndex].mMapName); + resultGroups.add(mapInfoHash); } - 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"); + HashMap<String, String> child = new HashMap<>(); + child.put("map_name", (osmMaps[currentMapIndex].mLevel > 1 ? MAP_BULLETPOINT : "") + + osmMaps[currentMapIndex].mMapName + " " + + (osmMaps[currentMapIndex].mEstSizeBytes / 1024 / 1024) + "MB"); child.put("map_index", String.valueOf(currentMapIndex)); secList.add(child); @@ -197,14 +197,14 @@ public class NavitDownloadSelectMapActivity extends ExpandableListActivity { Log.d(TAG, "p:" + groupPosition + ", child_pos:" + childPosition); @SuppressWarnings("unchecked") - HashMap<String, String> child = (HashMap<String, String>) adapter.getChild(groupPosition, childPosition); + HashMap<String, String> child = (HashMap<String, String>) sAdapter.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) { + String mapIndex = child.get("map_index"); + if (mapIndex != null) { + int mi = Integer.parseInt(mapIndex); + if (NavitMapDownloader.osm_maps[mi].mEstSizeBytes / 1024 / 1024 / 950 >= 4) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, - Navit.getInstance().getTstring(R.string.map_download_oversize), + getTstring(R.string.map_download_oversize), -1, 0, 0); return true; } @@ -219,25 +219,25 @@ public class NavitDownloadSelectMapActivity extends ExpandableListActivity { return true; } - private void askForMapDeletion(final String map_location) { + private void askForMapDeletion(final String mapLocation) { AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this); - deleteMapBox.setTitle(Navit.getInstance().getTstring(R.string.map_delete)); + deleteMapBox.setTitle(getTstring(R.string.map_delete)); deleteMapBox.setCancelable(true); - NavitMap maptoDelete = new NavitMap(map_location); + NavitMap maptoDelete = new NavitMap(mapLocation); deleteMapBox.setMessage( - maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + maptoDelete.mMapName + " " + maptoDelete.size() / 1024 / 1024 + "MB"); // TRANS - deleteMapBox.setPositiveButton(Navit.getInstance().getTstring(R.string.yes), + deleteMapBox.setPositiveButton(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()); + Message msg = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.CLB_DELETE_MAP.ordinal()); Bundle b = new Bundle(); - b.putString("title", map_location); + b.putString("title", mapLocation); msg.setData(b); msg.sendToTarget(); finish(); @@ -245,7 +245,7 @@ public class NavitDownloadSelectMapActivity extends ExpandableListActivity { }); // TRANS - deleteMapBox.setNegativeButton((Navit.getInstance().getTstring(R.string.no)), + deleteMapBox.setNegativeButton((getTstring(R.string.no)), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Log.d(TAG, "don't delete map"); diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/android/src/org/navitproject/navit/NavitGraphics.java index 22b9e8ca3..67fe2615e 100644 --- a/navit/android/src/org/navitproject/navit/NavitGraphics.java +++ b/navit/android/src/org/navitproject/navit/NavitGraphics.java @@ -1,4 +1,4 @@ -/** +/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * @@ -19,10 +19,15 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; @@ -32,9 +37,11 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Rect; +import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Message; +import android.support.annotation.RequiresApi; import android.support.v4.view.ViewConfigurationCompat; import android.util.Log; import android.view.ContextMenu; @@ -46,201 +53,223 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup.LayoutParams; import android.view.WindowInsets; +import android.view.WindowManager; 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; +import java.util.List; -public class NavitGraphics { +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; - private float trackball_y; - private int padding_left = 0; - private int padding_right = 0; - private int padding_top = 0; - private int padding_bottom = 0; - private View view; - private SystemBarTintView leftTintView; - private SystemBarTintView rightTintView; - private SystemBarTintView topTintView; - private SystemBarTintView bottomTintView; - private FrameLayout frameLayout; - private RelativeLayout relativelayout; - private NavitCamera camera = null; - 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 (leftTintView != null) { - leftTintView.setBackgroundColor(bgcolor); + private static final long TIME_FOR_LONG_PRESS = 300L; + private final NavitGraphics mParentGraphics; + private final ArrayList<NavitGraphics> mOverlays = new ArrayList<>(); + private int mBitmapWidth; + private int mBitmapHeight; + private int mPosX; + private int mPosY; + private int mPosWraparound; + private int mOverlayDisabled; + private int mBgColor; + private float mTrackballX; + private float mTrackballY; + private int mPaddingLeft; + private int mPaddingRight; + private int mPaddingTop; + private int mPaddingBottom; + private View mView; + static final Handler sCallbackHandler = new CallBackHandler(); + private SystemBarTintView mLeftTintView; + private SystemBarTintView mRightTintView; + private SystemBarTintView mTopTintView; + private SystemBarTintView mBottomTintView; + private FrameLayout mFrameLayout; + private RelativeLayout mRelativeLayout; + private NavitCamera mCamera; + private Navit mActivity; + private static boolean sInMap; + private boolean mTinting; + + + void setBackgroundColor(int bgcolor) { + this.mBgColor = bgcolor; + if (mLeftTintView != null) { + mLeftTintView.setBackgroundColor(bgcolor); } - if (rightTintView != null) { - rightTintView.setBackgroundColor(bgcolor); + if (mRightTintView != null) { + mRightTintView.setBackgroundColor(bgcolor); } - if (topTintView != null) { - topTintView.setBackgroundColor(bgcolor); + if (mTopTintView != null) { + mTopTintView.setBackgroundColor(bgcolor); } - if (bottomTintView != null) { - bottomTintView.setBackgroundColor(bgcolor); + if (mBottomTintView != null) { + mBottomTintView.setBackgroundColor(bgcolor); } } - private void SetCamera(int use_camera) { - if (use_camera != 0 && camera == null) { - // activity.requestWindowFeature(Window.FEATURE_NO_TITLE); + private void setCamera(int useCamera) { + if (useCamera != 0 && mCamera == null) { + // mActivity.requestWindowFeature(Window.FEATURE_NO_TITLE); addCamera(); addCameraView(); } } /** - * @brief Adds a camera. + * Adds a camera. * - * This method does not create the view for the camera. This must be done separately by calling - * {@link #addCameraView()}. + * <p>This method does not create the view for the camera. This must be done separately by calling + * {@link #addCameraView()}.</p> */ private void addCamera() { - camera = new NavitCamera(activity); + mCamera = new NavitCamera(mActivity); } - /** - * @brief Adds a view for the camera. - * - * If {@link #camera} is null, this method is a no-op. - */ private void addCameraView() { - if (camera != null) { - relativelayout.addView(camera); - relativelayout.bringChildToFront(view); + if (mCamera != null) { + mRelativeLayout.addView(mCamera); + mRelativeLayout.bringChildToFront(mView); } } private Rect get_rect() { Rect ret = new Rect(); - ret.left = pos_x; - ret.top = pos_y; - if (pos_wraparound != 0) { + ret.left = mPosX; + ret.top = mPosY; + if (mPosWraparound != 0) { if (ret.left < 0) { - ret.left += parent_graphics.bitmap_w; + ret.left += mParentGraphics.mBitmapWidth; } if (ret.top < 0) { - ret.top += parent_graphics.bitmap_h; + ret.top += mParentGraphics.mBitmapHeight; } } - 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; + ret.right = ret.left + mBitmapWidth; + ret.bottom = ret.top + mBitmapHeight; + if (mPosWraparound != 0) { + if (mBitmapWidth < 0) { + ret.right = ret.left + mBitmapWidth + mParentGraphics.mBitmapWidth; } - if (bitmap_h < 0) { - ret.bottom = ret.top + bitmap_h + parent_graphics.bitmap_h; + if (mBitmapHeight < 0) { + ret.bottom = ret.top + mBitmapHeight + mParentGraphics.mBitmapHeight; } } return ret; } private class NavitView extends View implements Runnable, MenuItem.OnMenuItemClickListener { - int touch_mode = NONE; - float oldDist = 0; + int mTouchMode = NONE; + float mOldDist = 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; - PointF mPressedPosition = null; - - public NavitView(Context context) { + 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"); + } + + public void onWindowFocusChanged(boolean hasWindowFocus) { + Log.v(TAG,"onWindowFocusChanged = " + hasWindowFocus); + // beter aanroepen in Navit of appconfig ? + if (Navit.sShowSoftKeyboardShowing && hasWindowFocus) { + InputMethodManager imm = (InputMethodManager) mActivity + .getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(this,InputMethodManager.SHOW_FORCED); + } + if (Navit.sShowSoftKeyboardShowing && !hasWindowFocus) { + InputMethodManager imm = (InputMethodManager) mActivity + .getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(this.getWindowToken(), 0); } } - @Override - @TargetApi(20) - public WindowInsets onApplyWindowInsets (WindowInsets insets) { - /* - * We're skipping the top inset here because it appears to have a bug on most Android versions tested, - * causing it to report between 24 and 64 dip more than what is actually occupied by the system UI. - * The top inset is retrieved in handleResize(), with logic depending on the platform version. - */ - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT_WATCH) { - padding_left = insets.getSystemWindowInsetLeft(); - padding_right = insets.getSystemWindowInsetRight(); - padding_bottom = insets.getSystemWindowInsetBottom(); + + @TargetApi(21) + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + Log.d(TAG,"onApplyWindowInsets"); + if (mTinting) { + mPaddingLeft = insets.getSystemWindowInsetLeft(); + mPaddingRight = insets.getSystemWindowInsetRight(); + mPaddingBottom = insets.getSystemWindowInsetBottom(); + mPaddingTop = insets.getSystemWindowInsetTop(); + Log.v(TAG, String.format("Padding -1a- left=%d top=%d right=%d bottom=%d", + mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom)); + int width = this.getWidth(); + int height = this.getHeight(); + if (width > 0 && height > 0) { + adjustSystemBarsTintingViews(); + sizeChangedCallback(mSizeChangedCallbackID, width, height); + } } - return super.onApplyWindowInsets(insets); + return insets; } + private static final int MENU_DRIVE_HERE = 1; + private static final int MENU_VIEW = 2; + private static final int MENU_CANCEL = 3; + @Override protected void onCreateContextMenu(ContextMenu menu) { super.onCreateContextMenu(menu); - - String clickCoord = getCoordForPoint(0, (int)mPressedPosition.x, (int)mPressedPosition.y); - menu.setHeaderTitle(activity.getTstring(R.string.position_popup_title) + " " + clickCoord); - menu.add(1, 1, NONE, activity.getTstring(R.string.position_popup_drive_here)) + String clickCoord = getCoordForPoint((int)mPressedPosition.x, (int)mPressedPosition.y, false); + menu.setHeaderTitle(NavitAppConfig.getTstring(R.string.position_popup_title) + " " + clickCoord); + menu.add(1, MENU_DRIVE_HERE, NONE, NavitAppConfig.getTstring(R.string.position_popup_drive_here)) .setOnMenuItemClickListener(this); - menu.add(1, 2, NONE, activity.getTstring(R.string.cancel)).setOnMenuItemClickListener(this); + Uri intentUri = Uri.parse("geo:" + getCoordForPoint((int)mPressedPosition.x, + (int)mPressedPosition.y, true)); + Intent mContextMenuMapViewIntent = new Intent(Intent.ACTION_VIEW, intentUri); + + PackageManager packageManager = this.getContext().getPackageManager(); + List<ResolveInfo> activities = packageManager.queryIntentActivities(mContextMenuMapViewIntent, + PackageManager.MATCH_DEFAULT_ONLY); + boolean isIntentSafe = (activities.size() > 0); // at least one candidate receiver + if (isIntentSafe) { // add view with external app option + menu.add(1, MENU_VIEW, NONE, NavitAppConfig.getTstring(R.string.position_popup_view)) + .setOnMenuItemClickListener(this); + } else { + Log.w(TAG, "No application available to handle ACTION_VIEW intent, option not displayed"); + } + menu.add(1, MENU_CANCEL, NONE, 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; + int itemId = item.getItemId(); + if (itemId == MENU_DRIVE_HERE) { + Message msg = Message.obtain(sCallbackHandler, MsgType.CLB_SET_DISPLAY_DESTINATION.ordinal(), + (int) mPressedPosition.x, (int) mPressedPosition.y); + msg.sendToTarget(); + } else if (itemId == MENU_VIEW) { + Uri intentUri = Uri.parse("geo:" + getCoordForPoint((int) mPressedPosition.x, + (int) mPressedPosition.y, true)); + Intent mContextMenuMapViewIntent = new Intent(Intent.ACTION_VIEW, intentUri); + if (mContextMenuMapViewIntent.resolveActivity(this.getContext().getPackageManager()) != null) { + this.getContext().startActivity(mContextMenuMapViewIntent); + } else { + Log.w(TAG, "ACTION_VIEW intent is not handled by any application, discarding..."); + } } - return false; + return true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - canvas.drawBitmap(draw_bitmap, pos_x, pos_y, null); - if (overlay_disabled == 0) { + canvas.drawBitmap(mDrawBitmap, mPosX, mPosY, null); + if (mOverlayDisabled == 0) { // assume we ARE in map view mode! - in_map = true; - for (NavitGraphics overlay : overlays) { - if (overlay.overlay_disabled == 0) { + sInMap = true; + for (NavitGraphics overlay : mOverlays) { + if (overlay.mOverlayDisabled == 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; + canvas.drawBitmap(overlay.mDrawBitmap, r.left, r.top, null); } } } @@ -249,33 +278,23 @@ public class NavitGraphics { @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); + Log.v(TAG, "onSizeChanged density=" + Navit.sMetrics.density); + Log.v(TAG, "onSizeChanged scaledDensity=" + Navit.sMetrics.scaledDensity); super.onSizeChanged(w, h, oldw, oldh); + mDrawBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + mDrawCanvas = new Canvas(mDrawBitmap); + mBitmapWidth = w; + mBitmapHeight = h; handleResize(w, h); + sizeChangedCallback(mSizeChangedCallbackID, w, h); } - void do_longpress_action() { - Log.d(TAG, "do_longpress_action enter"); - - activity.openContextMenu(this); + void doLongpressAction() { + Log.d(TAG, "doLongpressAction enter"); + mActivity.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 @@ -283,220 +302,153 @@ public class NavitGraphics { 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 + int switchValue = (event.getActionMasked()); + Log.d(TAG, "ACTION_ value = " + switchValue); + + if (switchValue == MotionEvent.ACTION_DOWN) { + mTouchMode = PRESSED; + Log.d(TAG, "ACTION_DOWN mode PRESSED"); + if (!sInMap) { + buttonCallback(mButtonCallbackID, 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"); + postDelayed(this, TIME_FOR_LONG_PRESS); - switch (touch_mode) { + } else if (switchValue == MotionEvent.ACTION_POINTER_DOWN) { + mOldDist = spacing(event); + if (mOldDist > 2f) { + mTouchMode = ZOOM; + Log.d(TAG, "ACTION_DOWN mode ZOOM started"); + } + } else if (switchValue == MotionEvent.ACTION_UP) { + Log.d(TAG, "ACTION_UP"); + switch (mTouchMode) { 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); - } + motionCallback(mMotionCallbackID, x, y); + buttonCallback(mButtonCallbackID, 0, 1, x, y); // up break; case PRESSED: - if (in_map) { - ButtonCallback(ButtonCallbackID, 1, 1, x, y); // down + if (sInMap) { + buttonCallback(mButtonCallbackID, 1, 1, x, y); // down } - ButtonCallback(ButtonCallbackID, 0, 1, x, y); // up - + buttonCallback(mButtonCallbackID, 0, 1, x, y); // up break; + default: + Log.i(TAG, "Unexpected touchmode: " + mTouchMode); } - touch_mode = NONE; - } else if (switch_value == MotionEvent.ACTION_MOVE) { - switch (touch_mode) { + mTouchMode = NONE; + } else if (switchValue == MotionEvent.ACTION_MOVE) { + switch (mTouchMode) { case DRAG: - MotionCallback(MotionCallbackID, x, y); + motionCallback(mMotionCallbackID, 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, ""); - } + doZoom(event); 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; + buttonCallback(mButtonCallbackID, 1, 1, x, y); // down + mTouchMode = DRAG; } break; - } - } else if (switch_value == _ACTION_POINTER_DOWN_) { - oldDist = spacing(getFloatValue(event, 0), getFloatValue(event, 1)); - if (oldDist > 2f) { - touch_mode = ZOOM; + default: + Log.i(TAG, "Unexpected touchmode: " + mTouchMode); } } return true; } + private void doZoom(MotionEvent event) { + if (event.findPointerIndex(0) == -1 || event.findPointerIndex(1) == -1) { + Log.e(TAG,"missing pointer"); + return; + } + float newDist = spacing(event); + float scale; + if (event.getActionMasked() == MotionEvent.ACTION_MOVE) { + scale = newDist / mOldDist; + Log.v(TAG, "New scale = " + scale); + if (scale > 1.2) { + // zoom in + callbackMessageChannel(1, ""); + mOldDist = newDist; + } else if (scale < 0.8) { + mOldDist = newDist; + // zoom out + callbackMessageChannel(2, ""); + } + } + } + + private float spacing(MotionEvent event) { + float x = event.getX(0) - event.getX(1); + float y = event.getY(0) - event.getY(1); + return (float) Math.sqrt(x * x + y * y); + } + 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); + Log.d(TAG,"onkeydown = " + keyCode); + String keyStr = null; + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + keyStr = String.valueOf((char) 13); + break; + case KeyEvent.KEYCODE_DEL: + keyStr = String.valueOf((char) 8); + break; + //case KeyEvent.KEYCODE_MENU: + // if (!sInMap) { + // this.postInvalidate(); + // return true; + // } + // break; + case KeyEvent.KEYCODE_SEARCH: + /* Handle event in Main Activity if map is shown */ + if (!sInMap) { + keyStr = String.valueOf((char) 19); + } + break; + case KeyEvent.KEYCODE_BACK: + keyStr = String.valueOf((char) 27); + break; + case KeyEvent.KEYCODE_CALL: + keyStr = String.valueOf((char) 3); + break; + case KeyEvent.KEYCODE_DPAD_DOWN: + keyStr = String.valueOf((char) 14); + break; + case KeyEvent.KEYCODE_DPAD_LEFT: + keyStr = String.valueOf((char) 2); + break; + case KeyEvent.KEYCODE_DPAD_RIGHT: + keyStr = String.valueOf((char) 6); + break; + case KeyEvent.KEYCODE_DPAD_UP: + keyStr = String.valueOf((char) 16); + break; + default: + Log.v(TAG, "keycode: " + keyCode); } - - if (s != null) { - KeypressCallback(KeypressCallbackID, s); + if (keyStr != null) { + keypressCallback(mKeypressCallbackID, keyStr); + return true; } - return true; + return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { + Log.d(TAG,"onkeyUp = " + keyCode); int i; String s = null; i = event.getUnicodeChar(); @@ -504,44 +456,39 @@ public class NavitGraphics { if (i == 0) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: - return (!in_map); case KeyEvent.KEYCODE_VOLUME_DOWN: - return (!in_map); + return (!sInMap); case KeyEvent.KEYCODE_SEARCH: /* Handle event in Main Activity if map is shown */ - if (in_map) { + if (sInMap) { return false; } break; case KeyEvent.KEYCODE_BACK: - if (Navit.show_soft_keyboard_now_showing) { - Navit.show_soft_keyboard_now_showing = false; + if (Navit.sShowSoftKeyboardShowing) { + Navit.sShowSoftKeyboardShowing = 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 (!sInMap) { + if (!Navit.sShowSoftKeyboardShowing) { // if in menu view: // use as OK (Enter) key s = String.valueOf((char) 13); - } + } // if soft keyboard showing on screen, dont use menu button as select key } else { - // if on map view: - // volume UP - //s = java.lang.String.valueOf((char) 1); return false; } break; + default: + Log.v(TAG, "keycode: " + keyCode); } } else if (i != 10) { s = java.lang.String.valueOf((char) i); } - if (s != null) { - KeypressCallback(KeypressCallbackID, s); + keypressCallback(mKeypressCallbackID, s); } return true; } @@ -551,7 +498,7 @@ public class NavitGraphics { String s; if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { s = event.getCharacters(); - KeypressCallback(KeypressCallbackID, s); + keypressCallback(mKeypressCallbackID, s); return true; } return super.onKeyMultiple(keyCode, count, event); @@ -564,424 +511,361 @@ public class NavitGraphics { 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) { + mTrackballX += event.getX(); + mTrackballY += event.getY(); + if (mTrackballX <= -1) { s = java.lang.String.valueOf((char) 2); - trackball_x += 1; + mTrackballX += 1; } - if (trackball_x >= 1) { + if (mTrackballX >= 1) { s = java.lang.String.valueOf((char) 6); - trackball_x -= 1; + mTrackballX -= 1; } - if (trackball_y <= -1) { + if (mTrackballY <= -1) { s = java.lang.String.valueOf((char) 16); - trackball_y += 1; + mTrackballY += 1; } - if (trackball_y >= 1) { + if (mTrackballY >= 1) { s = java.lang.String.valueOf((char) 14); - trackball_y -= 1; + mTrackballY -= 1; } } if (s != null) { - KeypressCallback(KeypressCallbackID, s); + keypressCallback(mKeypressCallbackID, s); } return true; } public void run() { - if (in_map && touch_mode == PRESSED) { - do_longpress_action(); - touch_mode = NONE; + if (sInMap && mTouchMode == PRESSED) { + doLongpressAction(); + mTouchMode = NONE; } } - } private class SystemBarTintView extends View { public SystemBarTintView(Context context) { super(context); - this.setBackgroundColor(bgcolor); + this.setBackgroundColor(mBgColor); } } - public NavitGraphics(final Activity activity, NavitGraphics parent, int x, int y, int w, int h, - int wraparound, int use_camera) { + NavitGraphics(final Activity navit, NavitGraphics parent, int x, int y, int w, int h, + int wraparound, int useCamera) { if (parent == null) { - if (use_camera != 0) { + if (useCamera != 0) { addCamera(); } - setActivity(activity); + setmActivity((Navit)navit); } 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); + mDrawBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + mBitmapWidth = w; + mBitmapHeight = h; + mPosX = x; + mPosY = y; + mPosWraparound = wraparound; + mDrawCanvas = new Canvas(mDrawBitmap); + parent.mOverlays.add(this); } - parent_graphics = parent; + mParentGraphics = parent; } /** - * @brief Sets up the main activity. - * - * @param activity The main activity. + * Sets up the main view. + * @param navit The main activity. */ - protected void setActivity(final Activity activity) { - if (Navit.graphics == null) - Navit.graphics = this; - this.activity = (Navit) activity; - view = new NavitView(activity); - view.setClickable(false); - view.setFocusable(true); - view.setFocusableInTouchMode(true); - view.setKeepScreenOn(true); - relativelayout = new RelativeLayout(activity); + private void setmActivity(final Navit navit) { + this.mActivity = navit; + mView = new NavitView(mActivity); + mView.setClickable(false); + mView.setFocusable(true); + mView.setFocusableInTouchMode(true); + mView.setKeepScreenOn(true); + mRelativeLayout = new RelativeLayout(mActivity); addCameraView(); - relativelayout.addView(view); - + mRelativeLayout.addView(mView); /* 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); - leftTintView = new SystemBarTintView(activity); - rightTintView = new SystemBarTintView(activity); - topTintView = new SystemBarTintView(activity); - bottomTintView = new SystemBarTintView(activity); - frameLayout.addView(leftTintView); - frameLayout.addView(rightTintView); - frameLayout.addView(topTintView); - frameLayout.addView(bottomTintView); - activity.setContentView(frameLayout); + mTinting = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + + if (mTinting) { + mFrameLayout = new FrameLayout(mActivity); + mFrameLayout.addView(mRelativeLayout); + mLeftTintView = new SystemBarTintView(mActivity); + mRightTintView = new SystemBarTintView(mActivity); + mTopTintView = new SystemBarTintView(mActivity); + mBottomTintView = new SystemBarTintView(mActivity); + mFrameLayout.addView(mLeftTintView); + mFrameLayout.addView(mRightTintView); + mFrameLayout.addView(mTopTintView); + mFrameLayout.addView(mBottomTintView); + mActivity.setContentView(mFrameLayout); } else { - activity.setContentView(relativelayout); + mActivity.setContentView(mRelativeLayout); } - - view.requestFocus(); + mView.requestFocus(); } - public enum msg_type { + enum MsgType { 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(); + private static final MsgType[] msg_values = MsgType.values(); - public final Handler callback_handler = new Handler() { + private static class CallBackHandler extends Handler { public void handleMessage(Message msg) { switch (msg_values[msg.what]) { case CLB_ZOOM_IN: - CallbackMessageChannel(1, ""); + callbackMessageChannel(1, ""); break; case CLB_ZOOM_OUT: - CallbackMessageChannel(2, ""); + callbackMessageChannel(2, ""); break; case CLB_MOVE: - MotionCallback(MotionCallbackID, msg.getData().getInt("x"), msg.getData().getInt("y")); + //motionCallback(mMotionCallbackID, 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); + callbackMessageChannel(3, lat + "#" + lon + "#" + q); break; case CLB_SET_DISPLAY_DESTINATION: int x = msg.arg1; int y = msg.arg2; - CallbackMessageChannel(4, "" + x + "#" + y); + callbackMessageChannel(4, "" + x + "#" + y); break; case CLB_CALL_CMD: String cmd = msg.getData().getString(("cmd")); - CallbackMessageChannel(5, cmd); + callbackMessageChannel(5, cmd); break; case CLB_BUTTON_UP: - ButtonCallback(ButtonCallbackID, 0, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); // up + //buttonCallback(mButtonCallbackID, 0, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); break; case CLB_BUTTON_DOWN: - // down - ButtonCallback(ButtonCallbackID, 1, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); + //buttonCallback(mButtonCallbackID, 1, 1, msg.getData().getInt("x"), msg.getData().getInt("y")); break; case CLB_COUNTRY_CHOOSER: break; case CLB_LOAD_MAP: - CallbackMessageChannel(6, msg.getData().getString(("title"))); + callbackMessageChannel(6, msg.getData().getString(("title"))); break; case CLB_DELETE_MAP: - File toDelete = new File(msg.getData().getString(("title"))); - toDelete.delete(); - //fallthrough + //unload map before deleting it !!! + callbackMessageChannel(7, msg.getData().getString(("title"))); + //remove commentlines below after testing + //File toDelete = new File(msg.getData().getString(("title"))); + //toDelete.delete(); + NavitUtils.removeFileIfExists(msg.getData().getString(("title"))); + break; case CLB_UNLOAD_MAP: - CallbackMessageChannel(7, msg.getData().getString(("title"))); + callbackMessageChannel(7, msg.getData().getString(("title"))); break; + case CLB_REDRAW: + default: + Log.d(TAG, "Unhandled callback : " + msg_values[msg.what]); } } - }; + } - public native void SizeChangedCallback(int id, int x, int y); - public native void PaddingChangedCallback(int id, int left, int right, int top, int bottom); + private native void sizeChangedCallback(long id, int x, int y); - public native void KeypressCallback(int id, String s); + private native void paddingChangedCallback(long id, int left, int top, int right, int bottom); - public native int CallbackMessageChannel(int i, String s); + private native void keypressCallback(long id, String s); - public native void ButtonCallback(int id, int pressed, int button, int x, int y); + private static native int callbackMessageChannel(int i, String s); - public native void MotionCallback(int id, int x, int y); + private native void buttonCallback(long id, int pressed, int button, int x, int y); - private native String getCoordForPoint(int id, int x, int y); + private native void motionCallback(long id, int x, int y); - public native String GetDefaultCountry(int id, String s); + private native String getCoordForPoint(int x, int y, boolean absolutCoord); - public static native String[][] GetAllCountries(); + static native String[][] getAllCountries(); - private Canvas draw_canvas; - private Bitmap draw_bitmap; - private int SizeChangedCallbackID; - private int PaddingChangedCallbackID; - private int ButtonCallbackID; - private int MotionCallbackID; - private int KeypressCallbackID; + private Canvas mDrawCanvas; + private Bitmap mDrawBitmap; + private long mSizeChangedCallbackID; + private long mPaddingChangedCallbackID; + private long mButtonCallbackID; + private long mMotionCallbackID; + private long mKeypressCallbackID; /** - * @brief Adjust views used to tint navigation and status bars. + * Adjust views used to tint navigation and status bars. * - * This method is called from handleResize. + * <p>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. + * padding for objects which should not be obstructed.</p> * */ private void adjustSystemBarsTintingViews() { + /* hide tint bars during update to prevent ugly effects */ - leftTintView.setVisibility(View.GONE); - rightTintView.setVisibility(View.GONE); - topTintView.setVisibility(View.GONE); - bottomTintView.setVisibility(View.GONE); + mLeftTintView.setVisibility(View.GONE); + mRightTintView.setVisibility(View.GONE); + mTopTintView.setVisibility(View.GONE); + mBottomTintView.setVisibility(View.GONE); - frameLayout.post(new Runnable() { + mFrameLayout.post(new Runnable() { @Override public void run() { - FrameLayout.LayoutParams leftLayoutParams = new FrameLayout.LayoutParams(padding_left, + FrameLayout.LayoutParams leftLayoutParams = new FrameLayout.LayoutParams(mPaddingLeft, LayoutParams.MATCH_PARENT, Gravity.BOTTOM | Gravity.LEFT); - leftTintView.setLayoutParams(leftLayoutParams); + mLeftTintView.setLayoutParams(leftLayoutParams); - FrameLayout.LayoutParams rightLayoutParams = new FrameLayout.LayoutParams(padding_right, + FrameLayout.LayoutParams rightLayoutParams = new FrameLayout.LayoutParams(mPaddingRight, LayoutParams.MATCH_PARENT, Gravity.BOTTOM | Gravity.RIGHT); - rightTintView.setLayoutParams(rightLayoutParams); + mRightTintView.setLayoutParams(rightLayoutParams); FrameLayout.LayoutParams topLayoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, - padding_top, Gravity.TOP); + mPaddingTop, Gravity.TOP); /* Prevent horizontal and vertical tint views from overlapping */ - topLayoutParams.setMargins(padding_left, 0, padding_right, 0); - topTintView.setLayoutParams(topLayoutParams); + topLayoutParams.setMargins(mPaddingLeft, 0, mPaddingRight, 0); + mTopTintView.setLayoutParams(topLayoutParams); FrameLayout.LayoutParams bottomLayoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, - padding_bottom, Gravity.BOTTOM); + mPaddingBottom, Gravity.BOTTOM); /* Prevent horizontal and vertical tint views from overlapping */ - bottomLayoutParams.setMargins(padding_left, 0, padding_right, 0); - bottomTintView.setLayoutParams(bottomLayoutParams); + bottomLayoutParams.setMargins(mPaddingLeft, 0, mPaddingRight, 0); + mBottomTintView.setLayoutParams(bottomLayoutParams); /* show tint bars again */ - leftTintView.setVisibility(View.VISIBLE); - rightTintView.setVisibility(View.VISIBLE); - topTintView.setVisibility(View.VISIBLE); - bottomTintView.setVisibility(View.VISIBLE); + mLeftTintView.setVisibility(View.VISIBLE); + mRightTintView.setVisibility(View.VISIBLE); + mTopTintView.setVisibility(View.VISIBLE); + mBottomTintView.setVisibility(View.VISIBLE); } }); - PaddingChangedCallback(PaddingChangedCallbackID, padding_left, padding_top, padding_right, padding_bottom); + paddingChangedCallback(mPaddingChangedCallbackID, mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom); } /** - * @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. + * Handles resize events. * + * <p>This method is called whenever the main View is resized in any way. This is the case when its + * {@code onSizeChanged()} event handler fires.</p> */ - @TargetApi(23) - public void handleResize(int w, int h) { - if (this.parent_graphics != null) { - this.parent_graphics.handleResize(w, h); - } else { + private void handleResize(int w, int h) { + if (this.mParentGraphics == null) { Log.d(TAG, String.format("handleResize w=%d h=%d", w, h)); - - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { - /* - * On API 23+ we can query window insets to determine the area which is obscured by the system bars. - * This appears to have a bug, though, causing an inset to be reported for the navigation bar even - * when it is not obstructing the window. Therefore, we are relying on the values previously obtained - * by NavitView#onApplyWindowInsets(), though this is affected by a different bug. Luckily, the two - * bugs appear to be complementary, allowing us to mix and match results. - */ - if (view == null) { - Log.w(TAG, "view is null, cannot update padding"); - } else { - Log.d(TAG, String.format("view w=%d h=%d x=%.0f y=%.0f", - view.getWidth(), view.getHeight(), view.getX(), view.getY())); - if (view.getRootWindowInsets() == null) - Log.w(TAG, "No root window insets, cannot update padding"); - else { - Log.d(TAG, String.format("RootWindowInsets left=%d right=%d top=%d bottom=%d", - view.getRootWindowInsets().getSystemWindowInsetLeft(), - view.getRootWindowInsets().getSystemWindowInsetRight(), - view.getRootWindowInsets().getSystemWindowInsetTop(), - view.getRootWindowInsets().getSystemWindowInsetBottom())); - padding_top = view.getRootWindowInsets().getSystemWindowInsetTop(); - } + if (mTinting) { + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { + resizePaddingKitkat(); } - } else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT_WATCH) { - /* - * API 20-22 do not support root window insets, forcing us to make an educated guess about the - * navigation bar height: - * - * The size is a platform default and does not change with rotation, but we have to figure out if it - * applies, i.e. if the status bar is visible. - * - * The status bar is always visible unless we are in fullscreen mode. (Fortunately, none of the - * versions affected by this support split screen mode, which would have further complicated things.) - */ - if (activity.isFullscreen) - padding_top = 0; - else { - Resources resources = view.getResources(); - int shid = resources.getIdentifier("status_bar_height", "dimen", "android"); - padding_top = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0; - } - } else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { - /* - * API 19 does not support window insets at all, forcing us to do even more guessing than on API 20-22: - * - * All system bar sizes are platform defaults and do not change with rotation, but we have - * to figure out which ones apply. - * - * Status bar visibility is as on API 20-22. - * - * The navigation bar is shown on devices that report they have no physical menu button. This seems to - * work even on devices that allow disabling the physical buttons (and use the navigation bar, in which - * case they report no physical menu button is available; tested with a OnePlus One running CyanogenMod). - * - * If shown, the navigation bar may appear on the side or at the bottom. The logic to determine this is - * taken from AOSP RenderSessionImpl.findNavigationBar() - * platform/frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java - */ - Resources resources = view.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"); - int status_bar_height = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0; - int action_bar_default_height = (adhid > 0) ? resources.getDimensionPixelSize(adhid) : 0; - int navigation_bar_height = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0; - int navigation_bar_height_landscape = (nhlid > 0) ? resources.getDimensionPixelSize(nhlid) : 0; - int 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 (activity == null) { - Log.w(TAG, "Main Activity is not a Navit instance, cannot update padding"); - } else if (frameLayout != null) { - /* frameLayout is only created on platforms supporting navigation and status bar tinting */ - - Navit navit = activity; - boolean isStatusShowing = !navit.isFullscreen; - boolean isNavShowing = !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(navit)); - Log.d(TAG, String.format("isStatusShowing=%b isNavShowing=%b", isStatusShowing, isNavShowing)); - - boolean isLandscape = (navit.getResources().getConfiguration().orientation - == Configuration.ORIENTATION_LANDSCAPE); - 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)); - - padding_left = 0; - padding_top = isStatusShowing ? status_bar_height : 0; - padding_right = (isNavShowing && !isNavAtBottom) ? navigation_bar_width : 0; - padding_bottom = (!(isNavShowing && isNavAtBottom)) ? 0 : ( - isLandscape ? navigation_bar_height_landscape : navigation_bar_height); - } - } else { - /* API 18 and below does not support drawing under the system bars, padding is 0 all around */ - padding_left = 0; - padding_right = 0; - padding_top = 0; - padding_bottom = 0; + adjustSystemBarsTintingViews(); // is incl paddingchangedcallback } + } + } - Log.d(TAG, String.format("Padding left=%d top=%d right=%d bottom=%d", - padding_left, padding_top, padding_right, padding_bottom)); - - 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); + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + private void resizePaddingKitkat() { + /* + * API 19 does not support window insets. + * + * All system bar sizes are device defaults and do not change with rotation, but we have + * to figure out which ones apply. + * + * Status bar visibility is as on API 20-22. + * + * The navigation bar is shown on devices that report they have no physical menu button. This seems to + * work even on devices that allow disabling the physical buttons (and use the navigation bar, in which + * case they report no physical menu button is available; tested with a OnePlus One running CyanogenMod) + * + * If shown, the navigation bar may appear on the side or at the bottom. The logic to determine this is + * taken from AOSP RenderSessionImpl.findNavigationBar() + * platform/frameworks/base/tools/layoutlib/bridge/src/com/android/ + * layoutlib/bridge/impl/RenderSessionImpl.java + */ + mPaddingLeft = 0; + if (!sInMap) { + mPaddingTop = 0; + mPaddingRight = 0; + mPaddingBottom = 0; + return; } + Resources resources = NavitAppConfig.sResources; + int shid = resources.getIdentifier("status_bar_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"); + int statusBarHeight = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0; + int navigationBarHeight = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0; + int navigationBarHeightLandscape = (nhlid > 0) ? resources.getDimensionPixelSize(nhlid) : 0; + int navigationBarWidth = (nwid > 0) ? resources.getDimensionPixelSize(nwid) : 0; + Log.v(TAG, String.format("statusBarHeight=%d, navigationBarHeight=%d, " + + "navigationBarHeightLandscape=%d, navigationBarWidth=%d", + statusBarHeight, navigationBarHeight, + navigationBarHeightLandscape, navigationBarWidth)); + boolean isStatusShowing = !mActivity.mIsFullscreen; + boolean isNavShowing = !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mActivity)); + Log.v(TAG, String.format("isStatusShowing=%b isNavShowing=%b", isStatusShowing, isNavShowing)); + boolean isLandscape = (mActivity.getResources().getConfiguration().orientation + == Configuration.ORIENTATION_LANDSCAPE); + boolean isNavAtBottom = (!isLandscape) + || (mActivity.getResources().getConfiguration().smallestScreenWidthDp >= 600); + Log.v(TAG, String.format("isNavAtBottom=%b (Config.smallestScreenWidthDp=%d, isLandscape=%b)", + isNavAtBottom, mActivity.getResources().getConfiguration().smallestScreenWidthDp, isLandscape)); + + mPaddingTop = isStatusShowing ? statusBarHeight : 0; + mPaddingRight = (isNavShowing && !isNavAtBottom) ? navigationBarWidth : 0; + mPaddingBottom = (!(isNavShowing && isNavAtBottom)) ? 0 : ( + isLandscape ? navigationBarHeightLandscape : navigationBarHeight); } + /** - * @brief Returns whether the device has a hardware menu button. + * 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 + * <p>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. + * {@code false}, as Honeycomb was a tablet-only release and did not require devices to have a Menu button.</p> * - * 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`. + * <p>Note that this method is not aware of non-standard mechanisms on some customized builds of Android</p> */ - public boolean hasMenuButton() { + 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(); + return ViewConfiguration.get(mActivity.getApplication()).hasPermanentMenuKey(); } } } - public void setSizeChangedCallback(int id) { - SizeChangedCallbackID = id; + void setSizeChangedCallback(long id) { + mSizeChangedCallbackID = id; } - public void setPaddingChangedCallback(int id) { - PaddingChangedCallbackID = id; + void setPaddingChangedCallback(long id) { + mPaddingChangedCallbackID = id; } - public void setButtonCallback(int id) { - ButtonCallbackID = id; + void setButtonCallback(long id) { + Log.v(TAG,"set Buttononcallback"); + mButtonCallbackID = id; } - public void setMotionCallback(int id) { - MotionCallbackID = id; - if (activity != null) { - activity.setMotionCallback(id, this); - } + void setMotionCallback(long id) { + mMotionCallbackID = id; + Log.v(TAG,"set Motioncallback"); } - public void setKeypressCallback(int id) { - KeypressCallbackID = id; - // set callback id also in main intent (for menus) - if (activity != null) { - activity.setKeypressCallback(id, this); - } + void setKeypressCallback(long id) { + Log.v(TAG,"set Keypresscallback"); + mKeypressCallbackID = id; } @@ -1011,7 +895,7 @@ public class NavitGraphics { path.lineTo(c[i], c[i + 1]); } //global_path.close(); - draw_canvas.drawPath(path, paint); + mDrawCanvas.drawPath(path, paint); paint.setPathEffect(null); } @@ -1027,7 +911,7 @@ public class NavitGraphics { path.lineTo(c[i], c[i + 1]); } //global_path.close(); - draw_canvas.drawPath(path, paint); + mDrawCanvas.drawPath(path, paint); } protected void draw_rectangle(Paint paint, int x, int y, int w, int h) { @@ -1035,12 +919,12 @@ public class NavitGraphics { paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); //paint.setStrokeWidth(0); - draw_canvas.drawRect(r, paint); + mDrawCanvas.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); + mDrawCanvas.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) { @@ -1062,27 +946,27 @@ public class NavitGraphics { paint.setColor(bgcolor); paint.setStyle(Paint.Style.STROKE); if (path == null) { - draw_canvas.drawText(text, x, y, paint); + mDrawCanvas.drawText(text, x, y, paint); } else { - draw_canvas.drawTextOnPath(text, path, 0, 0, paint); + mDrawCanvas.drawTextOnPath(text, path, 0, 0, paint); } paint.setStyle(Paint.Style.FILL); paint.setColor(oldcolor); } if (path == null) { - draw_canvas.drawText(text, x, y, paint); + mDrawCanvas.drawText(text, x, y, paint); } else { - draw_canvas.drawTextOnPath(text, path, 0, 0, paint); + mDrawCanvas.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); + mDrawCanvas.drawBitmap(bitmap, x, y, null); } - /* takes an image and draws it on the screen as a prerendered maptile + /* takes an image and draws it on the screen as a prerendered maptile. * * * @@ -1119,56 +1003,82 @@ public class NavitGraphics { matrix.preScale(scale, scale); matrix.postTranslate(p0x, p0y); matrix.postRotate(angle, p0x, p0y); - draw_canvas.drawBitmap(bitmap, matrix, paint); + mDrawCanvas.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; + private static final int DRAW_MODE_BEGIN = 0; + private static final int DRAW_MODE_END = 1; + /* Used by the pedestrian plugin, draws without a mapbackground */ + private static final int DRAW_MODE_BEGIN_CLEAR = 2; protected void draw_mode(int mode) { - if (mode == draw_mode_end) { - if (parent_graphics == null) { - view.invalidate(); + if (mode == DRAW_MODE_END) { + if (mParentGraphics == null) { + mView.invalidate(); } else { - parent_graphics.view.invalidate(get_rect()); + mParentGraphics.mView.invalidate(get_rect()); } } - if (mode == draw_mode_begin && parent_graphics != null) { - draw_bitmap.eraseColor(0); + if (mode == DRAW_MODE_BEGIN_CLEAR || (mode == DRAW_MODE_BEGIN && mParentGraphics != null)) { + mDrawBitmap.eraseColor(0); } } protected void draw_drag(int x, int y) { - pos_x = x; - pos_y = y; + mPosX = x; + mPosY = y; } protected void overlay_disable(int disable) { - Log.d(TAG,"overlay_disable: " + disable + "Parent: " + (parent_graphics != null)); + Log.v(TAG,"overlay_disable: " + disable + ", Parent: " + (mParentGraphics != null)); // assume we are NOT in map view mode! - if (parent_graphics == null) { - in_map = (disable == 0); + // but this backfires when dragging the map + if (mParentGraphics == null) { + sInMap = (disable == 0); + workAroundForGuiInternal(sInMap); } - if (overlay_disabled != disable) { - overlay_disabled = disable; - if (parent_graphics != null) { - parent_graphics.view.invalidate(get_rect()); + if (mOverlayDisabled != disable) { + mOverlayDisabled = disable; + if (mParentGraphics != null) { + mParentGraphics.mView.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 void workAroundForGuiInternal(Boolean inMap) { + if (!mTinting) { + return; + } + Log.v(TAG,"workaround gui internal"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && !inMap) { + mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && !inMap) { + mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + } } - public static native String CallbackLocalizedString(String s); + protected void overlay_resize(int x, int y, int w, int h, int wraparound) { + mDrawBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + mBitmapWidth = w; + mBitmapHeight = h; + mPosX = x; + mPosY = y; + mPosWraparound = wraparound; + mDrawCanvas.setBitmap(mDrawBitmap); + } } diff --git a/navit/android/src/org/navitproject/navit/NavitMap.java b/navit/android/src/org/navitproject/navit/NavitMap.java index ee0f11bb7..b3eb28d17 100644 --- a/navit/android/src/org/navitproject/navit/NavitMap.java +++ b/navit/android/src/org/navitproject/navit/NavitMap.java @@ -3,38 +3,38 @@ package org.navitproject.navit; import java.io.File; public class NavitMap { - private String fileName; - String mapName; - private String mapPath; + String mMapName; + private final String mFileName; + private final String mMapPath; - NavitMap(String path, String map_file_name) { - mapPath = path; - fileName = map_file_name; - if (map_file_name.endsWith(".bin")) { - mapName = map_file_name.substring(0, map_file_name.length() - 4); + NavitMap(String path, String mapFileName) { + mMapPath = path; + mFileName = mapFileName; + if (mapFileName.endsWith(".bin")) { + mMapName = mapFileName.substring(0, mapFileName.length() - 4); } else { - mapName = map_file_name; + mMapName = mapFileName; } } - NavitMap(String map_location) { - File mapFile = new File(map_location); + NavitMap(String mapLocation) { + File mapFile = new File(mapLocation); - mapPath = mapFile.getParent() + "/"; - fileName = mapFile.getName(); - if (fileName.endsWith(".bin")) { - mapName = fileName.substring(0, fileName.length() - 4); + mMapPath = mapFile.getParent() + "/"; + mFileName = mapFile.getName(); + if (mFileName.endsWith(".bin")) { + mMapName = mFileName.substring(0, mFileName.length() - 4); } else { - mapName = fileName; + mMapName = mFileName; } } public long size() { - File map_file = new File(mapPath + fileName); - return map_file.length(); + File mapFile = new File(mMapPath + mFileName); + return mapFile.length(); } public String getLocation() { - return mapPath + fileName; + return mMapPath + mFileName; } } diff --git a/navit/android/src/org/navitproject/navit/NavitMapDownloader.java b/navit/android/src/org/navitproject/navit/NavitMapDownloader.java index c2c40fe2e..51c362407 100644 --- a/navit/android/src/org/navitproject/navit/NavitMapDownloader.java +++ b/navit/android/src/org/navitproject/navit/NavitMapDownloader.java @@ -1,4 +1,4 @@ -/** +/* * 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 @@ -15,11 +15,14 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + 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; @@ -37,7 +40,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; -/** + +/* * @author rikky * */ @@ -47,438 +51,418 @@ 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", + static final OsmMapValues[] osm_maps = { + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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), + new OsmMapValues(getTstring(R.string.namibia) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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), + new OsmMapValues(getTstring(R.string.south_africa) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(getTstring(R.string.india) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(getTstring(R.string.japan) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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), + new OsmMapValues(getTstring(R.string.malaysia) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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), + new OsmMapValues(getTstring(R.string.australia) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(getTstring(R.string.victoria) + " + " + getTstring(R.string.new_south_wales), + "140.7", "-39.4", "153.7", "-26.9", 241500829L, 1), + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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), + new OsmMapValues(getTstring(R.string.spain) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(getTstring(R.string.usa) + getTstring(R.string.except_alaska_and_hawaii), + "-125.4", "24.3", "-66.5", "49.3", 4060487198L, 1), + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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), + new OsmMapValues(getTstring(R.string.argentina) + "+" + 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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(getTstring(R.string.guyana) + "+" + getTstring(R.string.suriname) + "+" + + 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", + new OsmMapValues(getTstring(R.string.haiti) + "+" + getTstring(R.string.dominican_republic), + "-74.8", "17.3", "-68.2", "20.1", 149925689L, 1), + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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", + new OsmMapValues(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) + new OsmMapValues(getTstring(R.string.uruguay), "-59.2", "-36.5", "-51.7", "-29.7", + 157482719L, 1), + new OsmMapValues(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. @@ -488,23 +472,23 @@ public class NavitMapDownloader extends Thread { 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; + private static final String TAG = "NavitMapDownLoader"; + private final String mMapFilenamePath; + private final OsmMapValues mMapValues; + private final int mMapId; + private Boolean mStopMe = false; + private long mUiLastUpdated = -1; + private Boolean mRetryDownload = false; //Download failed, but + private int mRetryCounter = 0; + + NavitMapDownloader(int mapId) { + this.mMapValues = osm_maps[mapId]; + this.mMapId = mapId; + this.mMapFilenamePath = Navit.sMapFilenamePath; } - public static NavitMap[] getAvailableMaps() { - class filterMaps implements FilenameFilter { + static NavitMap[] getAvailableMaps() { + class FilterMaps implements FilenameFilter { public boolean accept(File dir, String filename) { return (filename.endsWith(".bin")); @@ -512,75 +496,76 @@ public class NavitMapDownloader extends Thread { } 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]); + File mapDir = new File(Navit.sMapFilenamePath); + String[] mapFileNames = mapDir.list(new FilterMaps()); + if (mapFileNames != null) { + maps = new NavitMap[mapFileNames.length]; + for (int mapFileIndex = 0; mapFileIndex < mapFileNames.length; mapFileIndex++) { + maps[mapFileIndex] = new NavitMap(Navit.sMapFilenamePath, + mapFileNames[mapFileIndex]); } } return maps; } + @Override public void run() { - stop_me = false; - retry_counter = 0; + mStopMe = false; + mRetryCounter = 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); + Log.v(TAG, "start download " + mMapValues.mMapName); + updateProgress(0, mMapValues.mEstSizeBytes, + getTstring(R.string.map_downloading) + ": " + mMapValues.mMapName); boolean success; do { try { - Thread.sleep(10 + retry_counter * 1000); + Thread.sleep(10 + mRetryCounter * 1000); } catch (InterruptedException e) { e.printStackTrace(); } - retryDownload = false; + mRetryDownload = false; success = download_osm_map(); } while (!success - && retryDownload - && retry_counter < MAX_RETRIES - && !stop_me); + && mRetryDownload + && mRetryCounter < MAX_RETRIES + && !mStopMe); if (success) { - toast(map_values.map_name + " " + Navit.getInstance().getTstring(R.string.map_download_ready)); + toast(mMapValues.mMapName + " " + getTstring(R.string.map_download_ready)); getMapInfoFile().delete(); Log.d(TAG, "success"); } - if (success || stop_me) { + if (success || mStopMe) { NavitDialogs.sendDialogMessage(NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED, - map_filename_path + map_values.map_name + ".bin", null, -1, success ? 1 : 0, map_id); + mMapFilenamePath + mMapValues.mMapName + ".bin", null, -1, success ? 1 : 0, mMapId); } } - public void stop_thread() { - stop_me = true; - Log.d(TAG, "stop_me -> true"); + void stop_thread() { + mStopMe = true; + Log.d(TAG, "mStopMe -> true"); } - private boolean checkFreeSpace(long needed_bytes) { - long free_space = getFreeSpace(); + private boolean checkFreeSpace(long neededBytes) { + long freeSpace = getFreeSpace(); - if (needed_bytes <= 0) { - needed_bytes = MAP_WRITE_FILE_BUFFER; + if (neededBytes <= 0) { + neededBytes = MAP_WRITE_FILE_BUFFER; } - if (free_space < needed_bytes) { + if (freeSpace < neededBytes) { 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); + + neededBytes / 1024 / 1024 + "Mb."); + if (freeSpace < 0) { + msg = getTstring(R.string.map_download_medium_unavailable); } else { - msg = Navit.getInstance().getTstring(R.string.map_download_not_enough_free_space); + msg = 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); + updateProgress(freeSpace, neededBytes, + getTstring(R.string.map_download_download_error) + "\n" + msg); return false; } return true; @@ -590,8 +575,8 @@ public class NavitMapDownloader extends Thread { File finalOutputFile = getMapFile(); if (finalOutputFile.exists()) { - Message msg = Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, - NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); + Message msg = Message.obtain(NavitGraphics.sCallbackHandler, + NavitGraphics.MsgType.CLB_DELETE_MAP.ordinal()); Bundle b = new Bundle(); b.putString("title", finalOutputFile.getAbsolutePath()); msg.setData(b); @@ -603,15 +588,15 @@ public class NavitMapDownloader extends Thread { private boolean download_osm_map() { - long already_read = 0; - long real_size_bytes; + long alreadyRead = 0; + long realSizeBytes; boolean resume = true; File outputFile = getDestinationFile(); - long old_download_size = outputFile.length(); + long oldDownloadSize = outputFile.length(); URL url = null; - if (old_download_size > 0) { + if (oldDownloadSize > 0) { url = readFileInfo(); } @@ -625,32 +610,32 @@ public class NavitMapDownloader extends Thread { if (c != null) { if (resume) { - c.setRequestProperty("Range", "bytes=" + old_download_size + "-"); - already_read = old_download_size; + c.setRequestProperty("Range", "bytes=" + oldDownloadSize + "-"); + alreadyRead = oldDownloadSize; } try { - real_size_bytes = Long.parseLong(c.getHeaderField("Content-Length")) + already_read; + realSizeBytes = Long.parseLong(c.getHeaderField("Content-Length")) + alreadyRead; } catch (Exception e) { - real_size_bytes = -1; + realSizeBytes = -1; } long fileTime = c.getLastModified(); if (!resume) { outputFile.delete(); - writeFileInfo(c, real_size_bytes); + writeFileInfo(c, realSizeBytes); } - if (real_size_bytes <= 0) { - real_size_bytes = map_values.est_size_bytes; + if (realSizeBytes <= 0) { + realSizeBytes = mMapValues.mEstSizeBytes; } - Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + Log.d(TAG, "size: " + realSizeBytes + ", read: " + alreadyRead + ", timestamp: " + fileTime + ", Connection ref: " + c.getURL()); - if (checkFreeSpace(real_size_bytes - already_read) - && downloadData(c, already_read, real_size_bytes, resume, outputFile)) { + if (checkFreeSpace(realSizeBytes - alreadyRead) + && downloadData(c, alreadyRead, realSizeBytes, resume, outputFile)) { File finalOutputFile = getMapFile(); // delete an already existing file first @@ -664,19 +649,19 @@ public class NavitMapDownloader extends Thread { } private File getDestinationFile() { - File outputFile = new File(map_filename_path, map_values.map_name + ".tmp"); + File outputFile = new File(mMapFilenamePath, mMapValues.mMapName + ".tmp"); outputFile.getParentFile().mkdir(); return outputFile; } - private boolean downloadData(URLConnection c, long already_read, long real_size_bytes, boolean resume, + private boolean downloadData(URLConnection c, long alreadyRead, long realSizeBytes, 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); + success = readData(buf, bif, alreadyRead, realSizeBytes); // always cleanup, as we might get errors when trying to resume try { buf.flush(); @@ -694,11 +679,11 @@ public class NavitMapDownloader extends Thread { 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); + new URL("http://maps.navit-project.org/api/map/?bbox=" + mMapValues.mLon1 + "," + + mMapValues.mLat1 + + "," + mMapValues.mLon2 + "," + mMapValues.mLat2); } catch (MalformedURLException e) { - Log.e(TAG, "We failed to create a URL to " + map_values.map_name); + Log.e(TAG, "We failed to create a URL to " + mMapValues.mMapName); e.printStackTrace(); return null; } @@ -708,7 +693,7 @@ public class NavitMapDownloader extends Thread { private long getFreeSpace() { try { - StatFs fsInfo = new StatFs(map_filename_path); + StatFs fsInfo = new StatFs(mMapFilenamePath); return (long) fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); } catch (Exception e) { return -1; @@ -721,7 +706,7 @@ public class NavitMapDownloader extends Thread { 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) { + if (mRetryCounter > 0) { getMapInfoFile().delete(); } enableRetry(); @@ -735,11 +720,11 @@ public class NavitMapDownloader extends Thread { } private File getMapFile() { - return new File(map_filename_path, map_values.map_name + ".bin"); + return new File(mMapFilenamePath, mMapValues.mMapName + ".bin"); } private File getMapInfoFile() { - return new File(map_filename_path, map_values.map_name + ".tmp.info"); + return new File(mMapFilenamePath, mMapValues.mMapName + ".tmp.info"); } private BufferedOutputStream getOutputStream(File outputFile, boolean resume) { @@ -770,44 +755,44 @@ public class NavitMapDownloader extends Thread { return c; } - private boolean readData(OutputStream buf, InputStream bif, long already_read, - long real_size_bytes) { - long start_timestamp = System.nanoTime(); + private boolean readData(OutputStream buf, InputStream bif, long alreadyRead, + long realSizeBytes) { + long startTimestamp = System.nanoTime(); byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; int len1; - long startOffset = already_read; + long startOffset = alreadyRead; boolean success = false; try { - while (!stop_me && (len1 = bif.read(buffer)) != -1) { - already_read += len1; - updateProgress(start_timestamp, startOffset, already_read, real_size_bytes); + while (!mStopMe && (len1 = bif.read(buffer)) != -1) { + alreadyRead += len1; + updateProgress(startTimestamp, startOffset, alreadyRead, realSizeBytes); 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 (!checkFreeSpace(realSizeBytes - alreadyRead + 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)); + updateProgress(alreadyRead, realSizeBytes, + getTstring(R.string.map_download_download_error) + "\n" + + 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)); + updateProgress(alreadyRead, realSizeBytes, + 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); + if (mStopMe) { + toast(getTstring(R.string.map_download_download_aborted)); + } else if (alreadyRead < realSizeBytes) { + Log.d(TAG, "Server send only " + alreadyRead + " bytes of " + realSizeBytes); enableRetry(); } else { success = true; @@ -816,8 +801,8 @@ public class NavitMapDownloader extends Thread { Log.d(TAG, "Error: " + e); enableRetry(); - updateProgress(already_read, real_size_bytes, - Navit.getInstance().getTstring(R.string.map_download_download_error)); + updateProgress(alreadyRead, realSizeBytes, + getTstring(R.string.map_download_download_error)); } return success; @@ -828,13 +813,13 @@ public class NavitMapDownloader extends Thread { 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(); + String resumeFile = 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); + String resumeProto = infoStream.readUTF(); + url = new URL(resumeProto + "://" + "maps.navit-project.org" + resumeFile); } catch (Exception e) { getMapInfoFile().delete(); } @@ -848,36 +833,36 @@ public class NavitMapDownloader extends Thread { 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); + if ((currentTime > mUiLastUpdated + UPDATE_PROGRESS_TIME_NS) && startTime != currentTime) { + float perSecondOverall = (readBytes - offsetBytes) / ((currentTime - startTime) / 1000000000f); + long bytesRemaining = maxBytes - readBytes; + int etaSeconds = (int) (bytesRemaining / perSecondOverall); - String eta_string; - if (eta_seconds > 60) { - eta_string = (int) (eta_seconds / 60f) + " m"; + String etaString; + if (etaSeconds > 60) { + etaString = (int) (etaSeconds / 60f) + " m"; } else { - eta_string = eta_seconds + " s"; + etaString = etaSeconds + " 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); + getTstring(R.string.map_downloading), + mMapValues.mMapName, readBytes / 1024 / 1024, maxBytes / 1024 / 1024, + perSecondOverall / 1024f, getTstring(R.string.map_download_eta), + etaString); - if (retry_counter > 0) { - info += "\n Retry " + retry_counter + "/" + MAX_RETRIES; + if (mRetryCounter > 0) { + info += "\n Retry " + mRetryCounter + "/" + MAX_RETRIES; } Log.d(TAG, "info: " + info); updateProgress(readBytes, maxBytes, info); - uiLastUpdated = currentTime; + mUiLastUpdated = 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, + getTstring(R.string.map_download_title), infoText, NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024), (int) (positionBytes / 1024)); } @@ -899,53 +884,45 @@ public class NavitMapDownloader extends Thread { } private void enableRetry() { - retryDownload = true; - retry_counter++; + mRetryDownload = true; + mRetryCounter++; } - 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; + static class OsmMapValues { + + final String mLon1; + final String mLat1; + final String mLon2; + final String mLat2; + final String mMapName; + final long mEstSizeBytes; + final int mLevel; + + + private OsmMapValues(String mapName, String lon1, String lat1, String lon2, + String lat2, + long bytesEst, int level) { + this.mMapName = mapName; + this.mLon1 = lon1; + this.mLat1 = lat1; + this.mLon2 = lon2; + this.mLat2 = lat2; + this.mEstSizeBytes = bytesEst; + this.mLevel = 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); + boolean isInMap(Location location) { - if (location.getLongitude() < longitude_1) { + if (location.getLongitude() < Double.valueOf(this.mLon1)) { return false; } - if (location.getLongitude() > longitude_2) { + if (location.getLongitude() > Double.valueOf(this.mLon2)) { return false; } - if (location.getLatitude() < latitude_1) { + if (location.getLatitude() < Double.valueOf(this.mLat1)) { return false; } - if (location.getLatitude() > latitude_2) { - return false; - } - - return true; + return !(location.getLatitude() > Double.valueOf(this.mLat2)); } } } diff --git a/navit/android/src/org/navitproject/navit/NavitRestoreTask.java b/navit/android/src/org/navitproject/navit/NavitRestoreTask.java index e4c774fb9..2e10e896e 100644 --- a/navit/android/src/org/navitproject/navit/NavitRestoreTask.java +++ b/navit/android/src/org/navitproject/navit/NavitRestoreTask.java @@ -1,5 +1,7 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.app.NotificationManager; import android.app.ProgressDialog; import android.content.Context; @@ -7,6 +9,7 @@ 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.IOException; @@ -14,15 +17,15 @@ import java.io.ObjectInputStream; import java.util.Map; import java.util.Map.Entry; -public class NavitRestoreTask extends AsyncTask<Void, Void, String> { - private Navit mActivity; - private ProgressDialog mDialog; +public class NavitRestoreTask extends AsyncTask<Void, Void, String> { - private String mTimestamp; + private final Navit mActivity; + private ProgressDialog mDialog; + private final String mTimestamp; - public NavitRestoreTask(Navit context, String timestamp) { + NavitRestoreTask(Navit context, String timestamp) { mActivity = context; mTimestamp = timestamp; } @@ -34,7 +37,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.getTstring(R.string.restoring)); + mDialog.setMessage(getTstring(R.string.restoring)); mDialog.show(); } @@ -49,31 +52,31 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { /* Check if there is a Backup Directory */ if (!backupDir.isDirectory()) { - return mActivity.getTstring(R.string.backup_not_found); + return getTstring(R.string.backup_not_found); } ObjectInputStream preferenceOis = null; try { /* Delete all old Files in Home */ - mActivity.removeFileIfExists(Navit.NAVIT_DATA_DIR + "/home/bookmark.txt"); - mActivity.removeFileIfExists(Navit.NAVIT_DATA_DIR + "/home/destination.txt"); - mActivity.removeFileIfExists(Navit.NAVIT_DATA_DIR + "/home/gui_internal.txt"); + NavitUtils.removeFileIfExists(Navit.sNavitDataDir + "/home/bookmark.txt"); + NavitUtils.removeFileIfExists(Navit.sNavitDataDir + "/home/destination.txt"); + NavitUtils.removeFileIfExists(Navit.sNavitDataDir + "/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"); + NavitUtils.copyFileIfExists(backupDir.getPath() + "/bookmark.txt", + Navit.sNavitDataDir + "/home/bookmark.txt"); + NavitUtils.copyFileIfExists(backupDir.getPath() + "/destination.txt", + Navit.sNavitDataDir + "/home/destination.txt"); + NavitUtils.copyFileIfExists(backupDir.getPath() + "/gui_internal.txt", + Navit.sNavitDataDir + "/home/gui_internal.txt"); /* Restore Shared Preferences */ 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(NavitAppConfig.NAVIT_PREFS, Context.MODE_PRIVATE).edit(); /* Remove all old Preferences */ prefEditor.clear(); @@ -84,25 +87,25 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { String key = entry.getKey(); if (value instanceof Boolean) { - prefEditor.putBoolean(key, ((Boolean) value).booleanValue()); + prefEditor.putBoolean(key, (Boolean) value); } else if (value instanceof Float) { - prefEditor.putFloat(key, ((Float) value).floatValue()); + prefEditor.putFloat(key, (Float) value); } else if (value instanceof Integer) { - prefEditor.putInt(key, ((Integer) value).intValue()); + prefEditor.putInt(key, (Integer) value); } else if (value instanceof Long) { - prefEditor.putLong(key, ((Long) value).longValue()); + prefEditor.putLong(key, (Long) value); } else if (value instanceof String) { prefEditor.putString(key, (String) value); } } if (!prefEditor.commit()) { - return mActivity.getTstring(R.string.failed_to_restore); + return getTstring(R.string.failed_to_restore); } } catch (Exception e) { e.printStackTrace(); - return mActivity.getTstring(R.string.failed_to_restore); + return getTstring(R.string.failed_to_restore); } finally { try { /* Close Stream to prevent Resource leak */ @@ -111,7 +114,6 @@ public class NavitRestoreTask extends AsyncTask<Void, Void, String> { } } catch (IOException e) { // Catching but ignoring that exception when closing the stream - return null; } } return null; @@ -132,18 +134,17 @@ 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.getTstring(R.string.restore_successful_please_restart_navit), + 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(); } @Override protected void onCancelled() { super.onCancelled(); - Toast.makeText(mActivity, mActivity.getTstring(R.string.restore_failed), Toast.LENGTH_LONG) + Toast.makeText(mActivity, getTstring(R.string.restore_failed), Toast.LENGTH_LONG) .show(); mDialog.dismiss(); } diff --git a/navit/android/src/org/navitproject/navit/NavitSensors.java b/navit/android/src/org/navitproject/navit/NavitSensors.java index ad94bdfbe..3ffb6457a 100644 --- a/navit/android/src/org/navitproject/navit/NavitSensors.java +++ b/navit/android/src/org/navitproject/navit/NavitSensors.java @@ -21,34 +21,34 @@ import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.util.Log; +@SuppressWarnings("unused") +class NavitSensors implements SensorEventListener { + private final long mCallbackid; -public class NavitSensors implements SensorEventListener { - private SensorManager mSensorManager; - private int callbackid; + private native void sensorCallback(long id, int sensor, float x, float y, float z); - public native void SensorCallback(int id, int sensor, float x, float y, float z); - - NavitSensors(Context context, int cbid) { - mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); - mSensorManager.registerListener((SensorEventListener)this, + NavitSensors(Context context, long cbid) { + SensorManager mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), - SensorManager.SENSOR_DELAY_NORMAL); - mSensorManager.registerListener((SensorEventListener)this, + SensorManager.SENSOR_DELAY_UI); + mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), - SensorManager.SENSOR_DELAY_NORMAL); - callbackid = cbid; + SensorManager.SENSOR_DELAY_UI); + mCallbackid = cbid; } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent sev) { - // Log.e("NavitSensor","Type:" + sev.sensor.getType() + " X:" + sev.values[0] + " Y:"+sev.values[1]+" Z:" - // +sev.values[2]); - SensorCallback(callbackid, sev.sensor.getType(), sev.values[0], sev.values[1], sev.values[2]); + Log.v("NavitSensor","Type:" + sev.sensor.getType() + " X:" + sev.values[0] + " Y:" + + sev.values[1] + " Z:" + sev.values[2]); + sensorCallback(mCallbackid, sev.sensor.getType(), sev.values[0], sev.values[1], sev.values[2]); } } diff --git a/navit/android/src/org/navitproject/navit/NavitSpeech2.java b/navit/android/src/org/navitproject/navit/NavitSpeech2.java index c86fdd1c8..c36b9556e 100644 --- a/navit/android/src/org/navitproject/navit/NavitSpeech2.java +++ b/navit/android/src/org/navitproject/navit/NavitSpeech2.java @@ -1,4 +1,4 @@ -/** +/* * 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 @@ -15,6 +15,8 @@ package org.navitproject.navit; +import static org.navitproject.navit.NavitAppConfig.getTstring; + import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; @@ -23,17 +25,19 @@ import android.speech.tts.TextToSpeech; import android.util.Log; + + @SuppressWarnings("unused") -public class NavitSpeech2 implements TextToSpeech.OnInitListener, NavitActivityResult { +class NavitSpeech2 implements TextToSpeech.OnInitListener, NavitActivityResult { - private final Navit navit; - private final int MY_DATA_CHECK_CODE = 1; - private final String TAG = this.getClass().getName(); + private final Navit mNavit; + private static final int MY_DATA_CHECK_CODE = 1; + private static final String TAG = "NavitSpeech2"; private TextToSpeech mTts; NavitSpeech2(Navit navit) { - this.navit = navit; + this.mNavit = navit; navit.setActivityResult(1, this); Log.d(TAG, "Create"); Intent checkIntent = new Intent(); @@ -57,23 +61,23 @@ public class NavitSpeech2 implements TextToSpeech.OnInitListener, NavitActivityR if (requestCode == MY_DATA_CHECK_CODE) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { // success, create the TTS instance - mTts = new TextToSpeech(navit.getApplication(), this); + mTts = new TextToSpeech(mNavit.getApplication(), this); } else { // missing data, ask to install it - AlertDialog.Builder builder = new AlertDialog.Builder(navit); + AlertDialog.Builder builder = new AlertDialog.Builder(mNavit); 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), + .setTitle(getTstring(R.string.TTS_title_data_missing)) + .setMessage(getTstring(R.string.TTS_qery_install_data)) + .setPositiveButton(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); + mNavit.startActivity(installIntent); } }) - .setNegativeButton(navit.getTstring(R.string.no), null) + .setNegativeButton(getTstring(R.string.no), null) .show(); } } diff --git a/navit/android/src/org/navitproject/navit/NavitTimeout.java b/navit/android/src/org/navitproject/navit/NavitTimeout.java index 81451ab47..0975e9454 100644 --- a/navit/android/src/org/navitproject/navit/NavitTimeout.java +++ b/navit/android/src/org/navitproject/navit/NavitTimeout.java @@ -1,20 +1,20 @@ -/** - * 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. +/* + 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; @@ -24,36 +24,37 @@ import android.os.Message; import android.util.Log; +class NavitTimeout implements Runnable { -public class NavitTimeout implements Runnable { - private static Handler handler = new Handler() { - public void handleMessage(Message m) { - Log.e("Navit","Handler received message"); - } - }; - private boolean event_multi; - private int event_callbackid; - private int event_timeout; - - public native void TimeoutCallback(int id); - - NavitTimeout(int timeout, boolean multi, int callbackid) { - event_timeout = timeout; - event_multi = multi; - event_callbackid = callbackid; - handler.postDelayed(this, event_timeout); + private static final TimeoutHandler handler = new TimeoutHandler(); + private final long mEventCallbackid; + private final int mEventTimeout; + private final boolean mEventMulti; + + NavitTimeout(int timeout, boolean multi, long callbackid) { + mEventTimeout = timeout; + mEventMulti = multi; + mEventCallbackid = callbackid; + handler.postDelayed(this, mEventTimeout); } + public native void timeoutCallback(long id); + public void run() { - // Log.e("Navit","Handle Event"); - if (event_multi) { - handler.postDelayed(this, event_timeout); + Log.v("Navit","Handle Event"); + if (mEventMulti) { + handler.postDelayed(this, mEventTimeout); } - TimeoutCallback(event_callbackid); + timeoutCallback(mEventCallbackid); } public void remove() { handler.removeCallbacks(this); } -} + static class TimeoutHandler extends Handler { + public void handleMessage(Message m) { + Log.d("NavitTimeout", "Handler received message"); + } + } +} diff --git a/navit/android/src/org/navitproject/navit/NavitTraff.java b/navit/android/src/org/navitproject/navit/NavitTraff.java index a98b91948..c82d7d293 100644 --- a/navit/android/src/org/navitproject/navit/NavitTraff.java +++ b/navit/android/src/org/navitproject/navit/NavitTraff.java @@ -1,4 +1,4 @@ -/** +/* * Navit, a modular navigation system. * Copyright (C) 2005-2018 Navit Team * @@ -32,49 +32,42 @@ import android.util.Log; import java.util.List; /** - * @brief The TraFF receiver implementation. + * The TraFF receiver implementation. * - * This class registers the broadcast receiver for TraFF feeds, polls all registered sources once on creation, receives - * TraFF feeds and forwards them to the traffic module for processing. + * <p>This class registers the broadcast receiver for TraFF feeds, polls all registered sources once on creation, + * receives TraFF feeds and forwards them to the traffic module for processing.</p> */ public class NavitTraff extends BroadcastReceiver { - public static String ACTION_TRAFF_FEED = "org.traffxml.traff.FEED"; - - public static String ACTION_TRAFF_POLL = "org.traffxml.traff.POLL"; - - public static String EXTRA_FEED = "feed"; - - /** Identifier for the callback function. */ - private int cbid; - private Context context = null; - - /** An intent filter for TraFF events. */ - private IntentFilter traffFilter = new IntentFilter(); + private static final String ACTION_TRAFF_FEED = "org.traffxml.traff.FEED"; + private static final String ACTION_TRAFF_POLL = "org.traffxml.traff.POLL"; + private static final String EXTRA_FEED = "feed"; + private final long mCbid; /** - * @brief Forwards a newly received TraFF feed to the traffic module for processing. + * Forwards a newly received TraFF feed to the traffic module for processing. * - * This is called when a TraFF feed is received. + * <p>This is called when a TraFF feed is received.</p> * * @param id The identifier for the native callback implementation * @param feed The TraFF feed */ - public native void onFeedReceived(int id, String feed); + public native void onFeedReceived(long id, String feed); /** - * @brief Creates a new {@code NavitTraff} instance. + * Creates a new {@code NavitTraff} instance. * - * Creating a new {@code NavitTraff} instance registers a broadcast receiver for TraFF broadcasts and polls all - * registered sources once to ensure we have messages which were received by these sources before we started up. + * <p>Creating a new {@code NavitTraff} instance registers a broadcast receiver for TraFF broadcasts and polls all + * registered sources once to ensure we have messages which were received by these sources before we started up.</p> * * @param context The context * @param cbid The callback identifier for the native method to call upon receiving a feed */ - NavitTraff(Context context, int cbid) { - this.context = context; - this.cbid = cbid; + NavitTraff(Context context, long cbid) { + this.mCbid = cbid; + /* An intent filter for TraFF events. */ + IntentFilter traffFilter = new IntentFilter(); traffFilter.addAction(ACTION_TRAFF_FEED); traffFilter.addAction(ACTION_TRAFF_POLL); @@ -85,7 +78,7 @@ public class NavitTraff extends BroadcastReceiver { Intent outIntent = new Intent(ACTION_TRAFF_POLL); PackageManager pm = context.getPackageManager(); List<ResolveInfo> receivers = pm.queryBroadcastReceivers(outIntent, 0); - if (receivers != null) + if (receivers != null) { for (ResolveInfo receiver : receivers) { ComponentName cn = new ComponentName(receiver.activityInfo.applicationInfo.packageName, receiver.activityInfo.name); @@ -93,16 +86,18 @@ public class NavitTraff extends BroadcastReceiver { outIntent.setComponent(cn); context.sendBroadcast(outIntent, Manifest.permission.ACCESS_COARSE_LOCATION); } + } } @Override public void onReceive(Context context, Intent intent) { if ((intent != null) && (intent.getAction().equals(ACTION_TRAFF_FEED))) { String feed = intent.getStringExtra(EXTRA_FEED); - if (feed == null) + if (feed == null) { Log.w(this.getClass().getSimpleName(), "empty feed, ignoring"); - else - onFeedReceived(cbid, feed); + } else { + onFeedReceived(mCbid, feed); + } } } } diff --git a/navit/android/src/org/navitproject/navit/NavitUtils.java b/navit/android/src/org/navitproject/navit/NavitUtils.java new file mode 100644 index 000000000..bbdf6539e --- /dev/null +++ b/navit/android/src/org/navitproject/navit/NavitUtils.java @@ -0,0 +1,53 @@ +package org.navitproject.navit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +class NavitUtils { + + + static void removeFileIfExists(String source) { + File file = new File(source); + + if (!file.exists()) { + return; + } + + file.delete(); + } + + static 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(); + } + } + } + +} diff --git a/navit/android/src/org/navitproject/navit/NavitVehicle.java b/navit/android/src/org/navitproject/navit/NavitVehicle.java index 200fc3eec..e8c43e474 100644 --- a/navit/android/src/org/navitproject/navit/NavitVehicle.java +++ b/navit/android/src/org/navitproject/navit/NavitVehicle.java @@ -1,4 +1,4 @@ -/** +/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * @@ -41,52 +41,53 @@ import java.util.List; public class NavitVehicle { private static final String GPS_FIX_CHANGE = "android.location.GPS_FIX_CHANGE"; + static Location sLastLocation; + private static LocationManager sLocationManager; + private Context mContext; + private long mVehiclePcbid; + private long mVehicleScbid; + private long mVehicleFcbid; + private String mFastProvider; - public static Location lastLocation = null; + private static NavitLocationListener sPreciseLocationListener; + private static NavitLocationListener sFastLocationListener; - private static LocationManager sLocationManager = null; - private static Context context = null; - private int vehicle_pcbid; - private int vehicle_scbid; - private int vehicle_fcbid; - private String preciseProvider; - private String fastProvider; + public native void vehicleCallback(long id, Location location); - private static NavitLocationListener preciseLocationListener = null; - private static NavitLocationListener fastLocationListener = null; + public native void vehicleCallback(long id, int satsInView, int satsUsed); - public native void VehicleCallback(int id, Location location); - - public native void VehicleCallback(int id, int satsInView, int satsUsed); - - public native void VehicleCallback(int id, int enabled); + public native void vehicleCallback(long id, int enabled); private class NavitLocationListener extends BroadcastReceiver implements GpsStatus.Listener, LocationListener { - public boolean precise = false; + boolean mPrecise = false; public void onLocationChanged(Location location) { - lastLocation = location; // Disable the fast provider if still active - if (precise && fastProvider != null) { - sLocationManager.removeUpdates(fastLocationListener); - fastProvider = null; + if (mPrecise && mFastProvider != null) { + sLocationManager.removeUpdates(sFastLocationListener); + mFastProvider = null; } - - VehicleCallback(vehicle_pcbid, location); - VehicleCallback(vehicle_fcbid, 1); + vehicleCallback(mVehiclePcbid, location); + vehicleCallback(mVehicleFcbid, 1); } - public void onProviderDisabled(String provider) {} + public void onProviderDisabled(String provider) { + //unhandled + } - public void onProviderEnabled(String provider) {} + public void onProviderEnabled(String provider) { + //unhandled + } - public void onStatusChanged(String provider, int status, Bundle extras) {} + public void onStatusChanged(String provider, int status, Bundle extras) { + //unhandled + } /** * Called when the status of the GPS changes. */ public void onGpsStatusChanged(int event) { - if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) + if (ContextCompat.checkSelfPermission(mContext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted return; @@ -101,17 +102,17 @@ public class NavitVehicle { satsUsed++; } } - VehicleCallback(vehicle_scbid, satsInView, satsUsed); + vehicleCallback(mVehicleScbid, satsInView, satsUsed); } @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(GPS_FIX_CHANGE)) { if (intent.getBooleanExtra("enabled", false)) { - VehicleCallback(vehicle_fcbid, 1); + vehicleCallback(mVehicleFcbid, 1); } else { if (!intent.getBooleanExtra("enabled", true)) { - VehicleCallback(vehicle_fcbid, 0); + vehicleCallback(mVehicleFcbid, 0); } } } @@ -119,25 +120,25 @@ public class NavitVehicle { } /** - * @brief Creates a new {@code NavitVehicle} + * Creates a new {@code NavitVehicle}. * - * @param context + * @param context the context * @param pcbid The address of the position callback function called when a location update is received * @param scbid The address of the status callback function called when a status update is received * @param fcbid The address of the fix callback function called when a * {@code android.location.GPS_FIX_CHANGE} is received, indicating a change in GPS fix status */ - NavitVehicle(Context context, int pcbid, int scbid, int fcbid) { + NavitVehicle(Context context, long pcbid, long scbid, long fcbid) { if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted return; } - this.context = context; + this.mContext = context; sLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); - preciseLocationListener = new NavitLocationListener(); - preciseLocationListener.precise = true; - fastLocationListener = new NavitLocationListener(); + sPreciseLocationListener = new NavitLocationListener(); + sPreciseLocationListener.mPrecise = true; + sFastLocationListener = new NavitLocationListener(); /* Use 2 LocationProviders, one precise (usually GPS), and one not so precise, but possible faster. The fast provider is @@ -159,19 +160,19 @@ public class NavitVehicle { lowCriteria.setCostAllowed(true); lowCriteria.setPowerRequirement(Criteria.POWER_HIGH); - Log.e("NavitVehicle", "Providers " + sLocationManager.getAllProviders()); + Log.d("NavitVehicle", "Providers " + sLocationManager.getAllProviders()); - preciseProvider = sLocationManager.getBestProvider(highCriteria, false); - Log.e("NavitVehicle", "Precise Provider " + preciseProvider); - fastProvider = sLocationManager.getBestProvider(lowCriteria, false); - Log.e("NavitVehicle", "Fast Provider " + fastProvider); - vehicle_pcbid = pcbid; - vehicle_scbid = scbid; - vehicle_fcbid = fcbid; + String mPreciseProvider = sLocationManager.getBestProvider(highCriteria, false); + Log.d("NavitVehicle", "Precise Provider " + mPreciseProvider); + mFastProvider = sLocationManager.getBestProvider(lowCriteria, false); + Log.d("NavitVehicle", "Fast Provider " + mFastProvider); + mVehiclePcbid = pcbid; + mVehicleScbid = scbid; + mVehicleFcbid = fcbid; - context.registerReceiver(preciseLocationListener, new IntentFilter(GPS_FIX_CHANGE)); - sLocationManager.requestLocationUpdates(preciseProvider, 0, 0, preciseLocationListener); - sLocationManager.addGpsStatusListener(preciseLocationListener); + context.registerReceiver(sPreciseLocationListener, new IntentFilter(GPS_FIX_CHANGE)); + sLocationManager.requestLocationUpdates(mPreciseProvider, 0, 0, sPreciseLocationListener); + sLocationManager.addGpsStatusListener(sPreciseLocationListener); /* * Since Android criteria have no way to specify "fast fix", lowCriteria may return the same @@ -179,32 +180,31 @@ public class NavitVehicle { * listeners for the same provider but pick the fast provider manually. (Usually there will * only be two providers in total, which makes the choice easy.) */ - if (fastProvider == null || preciseProvider.compareTo(fastProvider) == 0) { + if (mFastProvider == null || mPreciseProvider.compareTo(mFastProvider) == 0) { List<String> fastProviderList = sLocationManager.getProviders(lowCriteria, false); - fastProvider = null; + mFastProvider = null; for (String fastCandidate: fastProviderList) { - if (preciseProvider.compareTo(fastCandidate) != 0) { - fastProvider = fastCandidate; + if (mPreciseProvider.compareTo(fastCandidate) != 0) { + mFastProvider = fastCandidate; break; } } } - if (fastProvider != null) { - sLocationManager.requestLocationUpdates(fastProvider, 0, 0, fastLocationListener); + if (mFastProvider != null) { + sLocationManager.requestLocationUpdates(mFastProvider, 0, 0, sFastLocationListener); } } - public static void removeListener() { + static void removeListeners(Navit navit) { if (sLocationManager != null) { - if (preciseLocationListener != null) { - sLocationManager.removeUpdates(preciseLocationListener); - sLocationManager.removeGpsStatusListener(preciseLocationListener); - context.unregisterReceiver(preciseLocationListener); + if (sPreciseLocationListener != null) { + sLocationManager.removeUpdates(sPreciseLocationListener); + sLocationManager.removeGpsStatusListener(sPreciseLocationListener); + navit.unregisterReceiver(sPreciseLocationListener); } - if (fastLocationListener != null) { - sLocationManager.removeUpdates(fastLocationListener); + if (sFastLocationListener != null) { + sLocationManager.removeUpdates(sFastLocationListener); } } - } } diff --git a/navit/android/src/org/navitproject/navit/NavitWatch.java b/navit/android/src/org/navitproject/navit/NavitWatch.java index 5f13c83a3..bfa56913e 100644 --- a/navit/android/src/org/navitproject/navit/NavitWatch.java +++ b/navit/android/src/org/navitproject/navit/NavitWatch.java @@ -1,4 +1,4 @@ -/** +/* * Navit, a modular navigation system. * Copyright (C) 2005-2008 Navit Team * @@ -23,87 +23,88 @@ import android.os.Handler; import android.os.Message; import android.util.Log; -import java.lang.Thread; +class NavitWatch implements Runnable { -public class NavitWatch implements Runnable { - private Thread thread; - private static Handler handler = new Handler() { - public void handleMessage(Message m) { - Log.e("NavitWatch","Handler received message"); - } - }; - private boolean removed; - private int watch_func; - private int watch_fd; - private int watch_cond; - private int watch_callbackid; - private boolean callback_pending; - private Runnable callback_runnable; - - public native void poll(int func, int fd, int cond); + private static WatchHandler sHandler = new WatchHandler(); + private Thread mThread; + private boolean mRemoved; + private long mWatchFunc; + private int mWatchFd; + private int mWatchCond; + private long mWatchCallbackid; + private boolean mCallbackPending; + private Runnable mCallbackRunnable; - public native void WatchCallback(int id); - - NavitWatch(int func, int fd, int cond, int callbackid) { - // Log.e("NavitWatch","Creating new thread for "+fd+" "+cond+" from current thread " - // + java.lang.Thread.currentThread().getName()); - watch_func = func; - watch_fd = fd; - watch_cond = cond; - watch_callbackid = callbackid; + NavitWatch(long func, int fd, int cond, long callbackid) { + Log.d("NavitWatch","Creating new thread for " + fd + " " + cond + " from current thread " + + java.lang.Thread.currentThread().getName()); + mWatchFunc = func; + mWatchFd = fd; + mWatchCond = cond; + mWatchCallbackid = callbackid; final NavitWatch navitwatch = this; - callback_runnable = new Runnable() { + mCallbackRunnable = new Runnable() { public void run() { navitwatch.callback(); } }; - thread = new Thread(this, "poll thread"); - thread.start(); + mThread = new Thread(this, "poll thread"); + mThread.start(); } + public native void poll(long func, int fd, int cond); + + public native void watchCallback(long id); + public void run() { - for (;;) { + for (; ; ) { // Log.e("NavitWatch","Polling "+watch_fd+" "+watch_cond + " from " // + java.lang.Thread.currentThread().getName()); - poll(watch_func, watch_fd, watch_cond); + poll(mWatchFunc, mWatchFd, mWatchCond); // Log.e("NavitWatch","poll returned"); - if (removed) { + if (mRemoved) { break; } - callback_pending = true; - handler.post(callback_runnable); + mCallbackPending = true; + sHandler.post(mCallbackRunnable); try { // Log.e("NavitWatch","wait"); synchronized (this) { - if (callback_pending) { + if (mCallbackPending) { this.wait(); } } // Log.e("NavitWatch","wait returned"); } catch (Exception e) { - Log.e("NavitWatch","Exception " + e.getMessage()); + Log.e("NavitWatch", "Exception " + e.getMessage()); } - if (removed) { + if (mRemoved) { break; } } } - public void callback() { + private void callback() { // Log.e("NavitWatch","Calling Callback"); - if (!removed) { - WatchCallback(watch_callbackid); + if (!mRemoved) { + watchCallback(mWatchCallbackid); } synchronized (this) { - callback_pending = false; + mCallbackPending = false; // Log.e("NavitWatch","Waking up"); this.notify(); } } public void remove() { - removed = true; - thread.interrupt(); + mRemoved = true; + mThread.interrupt(); + } + + static class WatchHandler extends Handler { + public void handleMessage(Message m) { + Log.d("NavitWatch", "Handler received message"); + } } } |