diff options
Diffstat (limited to 'navit/android')
8 files changed, 3018 insertions, 3018 deletions
diff --git a/navit/android/res/layout/ua_com_vassiliev_filebrowser_layout.xml b/navit/android/res/layout/ua_com_vassiliev_filebrowser_layout.xml index 28bedf592..d45485f49 100644 --- a/navit/android/res/layout/ua_com_vassiliev_filebrowser_layout.xml +++ b/navit/android/res/layout/ua_com_vassiliev_filebrowser_layout.xml @@ -1,84 +1,84 @@ -<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- android:padding="3dp" >
-
- <!--
- android:layout_weight="1"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:layout_width="fill_parent"
- android:layout_gravity="top"
- android:background = "#f00"
- android:background = "#0f0"
-
- -->
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_margin="0dp"
- android:gravity="top"
- android:orientation="horizontal"
- android:padding="0dp" >
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_margin="0dp"
- android:layout_weight="1"
- android:gravity="top"
- android:orientation="horizontal"
- android:padding="0dp" >
-
- <Button
- android:id="@+id/upDirectoryButton"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:layout_margin="0dp"
- android:layout_weight="1"
- android:padding="0dp"
- android:drawableLeft="@drawable/dir_up"
- android:text="Up" />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_margin="0dp"
- android:layout_weight="1"
- android:gravity="top"
- android:orientation="horizontal"
- android:padding="0dp" >
-
- <Button
- android:id="@+id/selectCurrentDirectoryButton"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:gravity = "center|center_vertical"
- android:layout_margin="0dp"
- android:layout_weight="1"
- android:padding="0dp"
- android:text="Select" />
- </LinearLayout>
- </LinearLayout>
-
- <TextView
- android:id="@+id/currentDirectoryTextView"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Current folder: \n/THis/is/a/long/path/to/test/if/this/will/span/multiple/lines" />
-
- <ListView
- android:id="@+id/fileListView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_marginTop="5dp"
- android:layout_weight="1" />
-
+<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:orientation="vertical" + android:padding="3dp" > + + <!-- + android:layout_weight="1" + android:layout_weight="1" + android:layout_height="wrap_content" + android:layout_width="fill_parent" + android:layout_width="fill_parent" + android:layout_gravity="top" + android:background = "#f00" + android:background = "#0f0" + + --> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_margin="0dp" + android:gravity="top" + android:orientation="horizontal" + android:padding="0dp" > + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_margin="0dp" + android:layout_weight="1" + android:gravity="top" + android:orientation="horizontal" + android:padding="0dp" > + + <Button + android:id="@+id/upDirectoryButton" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="top" + android:layout_margin="0dp" + android:layout_weight="1" + android:padding="0dp" + android:drawableLeft="@drawable/dir_up" + android:text="Up" /> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_margin="0dp" + android:layout_weight="1" + android:gravity="top" + android:orientation="horizontal" + android:padding="0dp" > + + <Button + android:id="@+id/selectCurrentDirectoryButton" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="top" + android:gravity = "center|center_vertical" + android:layout_margin="0dp" + android:layout_weight="1" + android:padding="0dp" + android:text="Select" /> + </LinearLayout> + </LinearLayout> + + <TextView + android:id="@+id/currentDirectoryTextView" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="Current folder: \n/THis/is/a/long/path/to/test/if/this/will/span/multiple/lines" /> + + <ListView + android:id="@+id/fileListView" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:layout_marginTop="5dp" + android:layout_weight="1" /> + </LinearLayout>
\ No newline at end of file diff --git a/navit/android/src/org/navitproject/navit/FileBrowserActivity.java b/navit/android/src/org/navitproject/navit/FileBrowserActivity.java index f3dac4894..d24be64e3 100644 --- a/navit/android/src/org/navitproject/navit/FileBrowserActivity.java +++ b/navit/android/src/org/navitproject/navit/FileBrowserActivity.java @@ -1,430 +1,430 @@ -package org.navitproject.navit;
-
-//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.
-//
-
-//Project type now is Android library:
-// http://developer.android.com/guide/developing/projects/projects-eclipse.html#ReferencingLibraryProject
-
-//General Java imports
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Collections;
-
-//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.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.view.*;
-import android.widget.*;
-
-//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";
-
- // 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";
-
- // Stores names of traversed directories
- ArrayList<String> pathDirsList = new ArrayList<String>();
-
- // 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 List<Item> fileList = new ArrayList<Item>();
- private File path = null;
- private String chosenFile;
- // private static final int DIALOG_LOAD_FILE = 1000;
-
- ArrayAdapter<Item> adapter;
-
- private boolean showHiddenFilesAndDirs = true;
-
- private boolean directoryShownIsEmpty = false;
-
- private String filterFileExtension = null;
-
- // Action constants
- private static int currentAction = -1;
- private static final int SELECT_DIRECTORY = 1;
- private static final int SELECT_FILE = 2;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // In case of
- // ua.com.vassiliev.androidfilebrowser.SELECT_DIRECTORY_ACTION
- // Expects com.mburman.fileexplore.directoryPath parameter to
- // point to the start folder.
- // If empty or null, will start from SDcard root.
- setContentView(R.layout.ua_com_vassiliev_filebrowser_layout);
-
- // Set action for this activity
- Intent thisInt = this.getIntent();
- currentAction = 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;
- }
-
- showHiddenFilesAndDirs = thisInt.getBooleanExtra(
- showCannotReadParameter, true);
-
- filterFileExtension = thisInt.getStringExtra(filterExtension);
-
- setInitialDirectory();
-
- parseDirectoryPath();
- loadFileList();
- this.createFileListAdapter();
- this.initializeButtons();
- this.initializeFileListView();
- updateCurrentDirectoryTextView();
- Log.d(LOGTAG, path.getAbsolutePath());
- }
-
- private void setInitialDirectory() {
- Intent thisInt = this.getIntent();
- String requestedStartDir = thisInt
- .getStringExtra(startDirectoryParameter);
-
- if (requestedStartDir != null && requestedStartDir.length() > 0) {// if(requestedStartDir!=null
- File tempFile = new File(requestedStartDir);
- if (tempFile.isDirectory())
- this.path = tempFile;
- }// if(requestedStartDir!=null
-
- if (this.path == null) {// No or invalid directory supplied in intent
- // parameter
- if (Environment.getExternalStorageDirectory().isDirectory()
- && Environment.getExternalStorageDirectory().canRead())
- path = Environment.getExternalStorageDirectory();
- else
- path = 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();
- String[] parts = pathString.split("/");
- int i = 0;
- while (i < parts.length) {
- pathDirsList.add(parts[i]);
- i++;
- }
- }
-
- private void initializeButtons() {
- Button upDirButton = (Button) this.findViewById(R.id.upDirectoryButton);
- upDirButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Log.d(LOGTAG, "onclick for upDirButton");
- loadDirectoryUp();
- loadFileList();
- adapter.notifyDataSetChanged();
- updateCurrentDirectoryTextView();
- }
- });// upDirButton.setOnClickListener(
-
- Button selectFolderButton = (Button) this
- .findViewById(R.id.selectCurrentDirectoryButton);
- if (currentAction == SELECT_DIRECTORY) {
- selectFolderButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Log.d(LOGTAG, "onclick for selectFolderButton");
- returnDirectoryFinishActivity();
- }
- });
- } else {// if(currentAction == this.SELECT_DIRECTORY) {
- selectFolderButton.setVisibility(View.GONE);
- }// } else {//if(currentAction == this.SELECT_DIRECTORY) {
- }// private void initializeButtons() {
-
- private void loadDirectoryUp() {
- // present directory removed from list
- String s = pathDirsList.remove(pathDirsList.size() - 1);
- // path modified to exclude present directory
- path = new File(path.toString().substring(0,
- path.toString().lastIndexOf(s)));
- fileList.clear();
- }
-
- private void updateCurrentDirectoryTextView() {
- int i = 0;
- String curDirString = "";
- while (i < pathDirsList.size()) {
- curDirString += pathDirsList.get(i) + "/";
- i++;
- }
- if (pathDirsList.size() == 0) {
- ((Button) this.findViewById(R.id.upDirectoryButton))
- .setEnabled(false);
- curDirString = "/";
- } else
- ((Button) this.findViewById(R.id.upDirectoryButton))
- .setEnabled(true);
- long freeSpace = getFreeSpace(curDirString);
- String formattedSpaceString = formatBytes(freeSpace);
- if (freeSpace == 0) {
- Log.d(LOGTAG, "NO FREE SPACE");
- File currentDir = new File(curDirString);
- if(!currentDir.canWrite())
- formattedSpaceString = "NON Writable";
- }
-
- ((Button) this.findViewById(R.id.selectCurrentDirectoryButton))
- .setText("Select\n[" + formattedSpaceString
- + "]");
-
- ((TextView) this.findViewById(R.id.currentDirectoryTextView))
- .setText("Current directory: " + curDirString);
- }// END private void updateCurrentDirectoryTextView() {
-
- private void showToast(String message) {
- Toast.makeText(this, message, Toast.LENGTH_LONG).show();
- }
-
- private void initializeFileListView() {
- ListView lView = (ListView) 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.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);
- 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");
- loadFileList();
- adapter.notifyDataSetChanged();
- updateCurrentDirectoryTextView();
- Log.d(LOGTAG, path.getAbsolutePath());
- } else {// if(sel.canRead()) {
- showToast("Path does not exist or cannot be read");
- }// } else {//if(sel.canRead()) {
- }// if (sel.isDirectory()) {
- // File picked or an empty directory message clicked
- else {// if (sel.isDirectory()) {
- Log.d(LOGTAG, "item clicked");
- if (!directoryShownIsEmpty) {
- Log.d(LOGTAG, "File selected:" + chosenFile);
- returnFileFinishActivity(sel.getAbsolutePath());
- }
- }// else {//if (sel.isDirectory()) {
- }// public void onClick(DialogInterface dialog, int which) {
- });// lView.setOnClickListener(
- }// private void initializeFileListView() {
-
- private void returnDirectoryFinishActivity() {
- Intent retIntent = new Intent();
- retIntent.putExtra(returnDirectoryParameter, path.getAbsolutePath());
- this.setResult(RESULT_OK, retIntent);
- this.finish();
- }// END private void returnDirectoryFinishActivity() {
-
- private void returnFileFinishActivity(String filePath) {
- Intent retIntent = new Intent();
- retIntent.putExtra(returnFileParameter, filePath);
- this.setResult(RESULT_OK, retIntent);
- this.finish();
- }// END private void returnDirectoryFinishActivity() {
-
- private void loadFileList() {
- try {
- path.mkdirs();
- } catch (SecurityException e) {
- Log.e(LOGTAG, "unable to write on the sd card ");
- }
- fileList.clear();
-
- if (path.exists() && path.canRead()) {
- FilenameFilter filter = new FilenameFilter() {
- public boolean accept(File dir, String filename) {
- File sel = new File(dir, filename);
- boolean showReadableFile = showHiddenFilesAndDirs
- || sel.canRead();
- // Filters based on whether the file is hidden or not
- if (currentAction == SELECT_DIRECTORY) {
- return (sel.isDirectory() && showReadableFile);
- }
- if (currentAction == SELECT_FILE) {
-
- // If it is a file check the extension if provided
- if (sel.isFile() && filterFileExtension != null) {
- return (showReadableFile && sel.getName().endsWith(
- filterFileExtension));
- }
- return (showReadableFile);
- }
- return true;
- }// public boolean accept(File dir, String filename) {
- };// FilenameFilter filter = new FilenameFilter() {
-
- String[] fList = path.list(filter);
- this.directoryShownIsEmpty = 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());
- int drawableID = R.drawable.file_icon;
- boolean canRead = sel.canRead();
- // Set drawables
- if (sel.isDirectory()) {
- if (canRead) {
- drawableID = R.drawable.folder_icon;
- } else {
- drawableID = R.drawable.folder_icon_light;
- }
- }
- fileList.add(i, new Item(fList[i], drawableID, canRead));
- }// for (int i = 0; i < fList.length; i++) {
- if (fileList.size() == 0) {
- // Log.d(LOGTAG, "This directory is empty");
- this.directoryShownIsEmpty = true;
- fileList.add(0, new Item("Directory is empty", -1, true));
- } else {// sort non empty list
- Collections.sort(fileList, new ItemFileNameComparator());
- }
- } else {
- Log.e(LOGTAG, "path does not exist or cannot be read");
- }
- // Log.d(TAG, "loadFileList finished");
- }// private void loadFileList() {
-
- private void createFileListAdapter() {
- adapter = new ArrayAdapter<Item>(this,
- android.R.layout.select_dialog_item, android.R.id.text1,
- fileList) {
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // creates view
- View view = super.getView(position, convertView, parent);
- TextView 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 icon == -1, then directory is empty
- drawableID = fileList.get(position).icon;
- }
- textView.setCompoundDrawablesWithIntrinsicBounds(drawableID, 0,
- 0, 0);
-
- textView.setEllipsize(null);
-
- // add margin between image and text (support various screen
- // densities)
- // int dp5 = (int) (5 *
- // getResources().getDisplayMetrics().density + 0.5f);
- int dp3 = (int) (3 * getResources().getDisplayMetrics().density + 0.5f);
- // TODO: change next line for empty directory, so text will be
- // centered
- textView.setCompoundDrawablePadding(dp3);
- return view;
- }// public View getView(int position, View convertView, ViewGroup
- };// adapter = new ArrayAdapter<Item>(this,
- }// private createFileListAdapter(){
-
- private class Item {
- public String file;
- public int icon;
- public boolean canRead;
-
- public Item(String file, Integer icon, boolean canRead) {
- this.file = file;
- this.icon = icon;
- }
-
- @Override
- public String toString() {
- return file;
- }
- }// 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());
- }
- }
-
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
- Log.d(LOGTAG, "ORIENTATION_LANDSCAPE");
- } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
- Log.d(LOGTAG, "ORIENTATION_PORTRAIT");
- }
- // Layout apparently changes itself, only have to provide good onMeasure
- // in custom components
- // TODO: check with keyboard
- // if(newConfig.keyboard == Configuration.KEYBOARDHIDDEN_YES)
- }// END public void onConfigurationChanged(Configuration newConfig) {
-
- public static long getFreeSpace(String path) {
- StatFs stat = new StatFs(path);
- long availSize = (long) stat.getAvailableBlocks()
- * (long) stat.getBlockSize();
- return availSize;
- }// END public static long getFreeSpace(String path) {
-
- public 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 ";
- bytes = bytes - (gbs * 1073741824);
- }
- // One MB - 1048576 bytes
- if (bytes > 1048576) {// Add GB
- long mbs = bytes / 1048576;
- retStr += (new Long(mbs)).toString() + "MB ";
- bytes = bytes - (mbs * 1048576);
- }
- if (bytes > 1024) {
- long kbs = bytes / 1024;
- retStr += (new Long(kbs)).toString() + "KB";
- bytes = bytes - (kbs * 1024);
- } else
- retStr += (new Long(bytes)).toString() + " bytes";
- return retStr;
- }// public static String formatBytes(long bytes){
-
-}// END public class FileBrowserActivity extends Activity {
+package org.navitproject.navit; + +//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. +// + +//Project type now is Android library: +// http://developer.android.com/guide/developing/projects/projects-eclipse.html#ReferencingLibraryProject + +//General Java imports +import java.io.File; +import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Collections; + +//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.View.OnClickListener; +import android.view.ViewGroup.LayoutParams; +import android.view.*; +import android.widget.*; + +//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"; + + // 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"; + + // Stores names of traversed directories + ArrayList<String> pathDirsList = new ArrayList<String>(); + + // 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 List<Item> fileList = new ArrayList<Item>(); + private File path = null; + private String chosenFile; + // private static final int DIALOG_LOAD_FILE = 1000; + + ArrayAdapter<Item> adapter; + + private boolean showHiddenFilesAndDirs = true; + + private boolean directoryShownIsEmpty = false; + + private String filterFileExtension = null; + + // Action constants + private static int currentAction = -1; + private static final int SELECT_DIRECTORY = 1; + private static final int SELECT_FILE = 2; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // In case of + // ua.com.vassiliev.androidfilebrowser.SELECT_DIRECTORY_ACTION + // Expects com.mburman.fileexplore.directoryPath parameter to + // point to the start folder. + // If empty or null, will start from SDcard root. + setContentView(R.layout.ua_com_vassiliev_filebrowser_layout); + + // Set action for this activity + Intent thisInt = this.getIntent(); + currentAction = 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; + } + + showHiddenFilesAndDirs = thisInt.getBooleanExtra( + showCannotReadParameter, true); + + filterFileExtension = thisInt.getStringExtra(filterExtension); + + setInitialDirectory(); + + parseDirectoryPath(); + loadFileList(); + this.createFileListAdapter(); + this.initializeButtons(); + this.initializeFileListView(); + updateCurrentDirectoryTextView(); + Log.d(LOGTAG, path.getAbsolutePath()); + } + + private void setInitialDirectory() { + Intent thisInt = this.getIntent(); + String requestedStartDir = thisInt + .getStringExtra(startDirectoryParameter); + + if (requestedStartDir != null && requestedStartDir.length() > 0) {// if(requestedStartDir!=null + File tempFile = new File(requestedStartDir); + if (tempFile.isDirectory()) + this.path = tempFile; + }// if(requestedStartDir!=null + + if (this.path == null) {// No or invalid directory supplied in intent + // parameter + if (Environment.getExternalStorageDirectory().isDirectory() + && Environment.getExternalStorageDirectory().canRead()) + path = Environment.getExternalStorageDirectory(); + else + path = 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(); + String[] parts = pathString.split("/"); + int i = 0; + while (i < parts.length) { + pathDirsList.add(parts[i]); + i++; + } + } + + private void initializeButtons() { + Button upDirButton = (Button) this.findViewById(R.id.upDirectoryButton); + upDirButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + Log.d(LOGTAG, "onclick for upDirButton"); + loadDirectoryUp(); + loadFileList(); + adapter.notifyDataSetChanged(); + updateCurrentDirectoryTextView(); + } + });// upDirButton.setOnClickListener( + + Button selectFolderButton = (Button) this + .findViewById(R.id.selectCurrentDirectoryButton); + if (currentAction == SELECT_DIRECTORY) { + selectFolderButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + Log.d(LOGTAG, "onclick for selectFolderButton"); + returnDirectoryFinishActivity(); + } + }); + } else {// if(currentAction == this.SELECT_DIRECTORY) { + selectFolderButton.setVisibility(View.GONE); + }// } else {//if(currentAction == this.SELECT_DIRECTORY) { + }// private void initializeButtons() { + + private void loadDirectoryUp() { + // present directory removed from list + String s = pathDirsList.remove(pathDirsList.size() - 1); + // path modified to exclude present directory + path = new File(path.toString().substring(0, + path.toString().lastIndexOf(s))); + fileList.clear(); + } + + private void updateCurrentDirectoryTextView() { + int i = 0; + String curDirString = ""; + while (i < pathDirsList.size()) { + curDirString += pathDirsList.get(i) + "/"; + i++; + } + if (pathDirsList.size() == 0) { + ((Button) this.findViewById(R.id.upDirectoryButton)) + .setEnabled(false); + curDirString = "/"; + } else + ((Button) this.findViewById(R.id.upDirectoryButton)) + .setEnabled(true); + long freeSpace = getFreeSpace(curDirString); + String formattedSpaceString = formatBytes(freeSpace); + if (freeSpace == 0) { + Log.d(LOGTAG, "NO FREE SPACE"); + File currentDir = new File(curDirString); + if(!currentDir.canWrite()) + formattedSpaceString = "NON Writable"; + } + + ((Button) this.findViewById(R.id.selectCurrentDirectoryButton)) + .setText("Select\n[" + formattedSpaceString + + "]"); + + ((TextView) this.findViewById(R.id.currentDirectoryTextView)) + .setText("Current directory: " + curDirString); + }// END private void updateCurrentDirectoryTextView() { + + private void showToast(String message) { + Toast.makeText(this, message, Toast.LENGTH_LONG).show(); + } + + private void initializeFileListView() { + ListView lView = (ListView) 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.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); + 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"); + loadFileList(); + adapter.notifyDataSetChanged(); + updateCurrentDirectoryTextView(); + Log.d(LOGTAG, path.getAbsolutePath()); + } else {// if(sel.canRead()) { + showToast("Path does not exist or cannot be read"); + }// } else {//if(sel.canRead()) { + }// if (sel.isDirectory()) { + // File picked or an empty directory message clicked + else {// if (sel.isDirectory()) { + Log.d(LOGTAG, "item clicked"); + if (!directoryShownIsEmpty) { + Log.d(LOGTAG, "File selected:" + chosenFile); + returnFileFinishActivity(sel.getAbsolutePath()); + } + }// else {//if (sel.isDirectory()) { + }// public void onClick(DialogInterface dialog, int which) { + });// lView.setOnClickListener( + }// private void initializeFileListView() { + + private void returnDirectoryFinishActivity() { + Intent retIntent = new Intent(); + retIntent.putExtra(returnDirectoryParameter, path.getAbsolutePath()); + this.setResult(RESULT_OK, retIntent); + this.finish(); + }// END private void returnDirectoryFinishActivity() { + + private void returnFileFinishActivity(String filePath) { + Intent retIntent = new Intent(); + retIntent.putExtra(returnFileParameter, filePath); + this.setResult(RESULT_OK, retIntent); + this.finish(); + }// END private void returnDirectoryFinishActivity() { + + private void loadFileList() { + try { + path.mkdirs(); + } catch (SecurityException e) { + Log.e(LOGTAG, "unable to write on the sd card "); + } + fileList.clear(); + + if (path.exists() && path.canRead()) { + FilenameFilter filter = new FilenameFilter() { + public boolean accept(File dir, String filename) { + File sel = new File(dir, filename); + boolean showReadableFile = showHiddenFilesAndDirs + || sel.canRead(); + // Filters based on whether the file is hidden or not + if (currentAction == SELECT_DIRECTORY) { + return (sel.isDirectory() && showReadableFile); + } + if (currentAction == SELECT_FILE) { + + // If it is a file check the extension if provided + if (sel.isFile() && filterFileExtension != null) { + return (showReadableFile && sel.getName().endsWith( + filterFileExtension)); + } + return (showReadableFile); + } + return true; + }// public boolean accept(File dir, String filename) { + };// FilenameFilter filter = new FilenameFilter() { + + String[] fList = path.list(filter); + this.directoryShownIsEmpty = 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()); + int drawableID = R.drawable.file_icon; + boolean canRead = sel.canRead(); + // Set drawables + if (sel.isDirectory()) { + if (canRead) { + drawableID = R.drawable.folder_icon; + } else { + drawableID = R.drawable.folder_icon_light; + } + } + fileList.add(i, new Item(fList[i], drawableID, canRead)); + }// for (int i = 0; i < fList.length; i++) { + if (fileList.size() == 0) { + // Log.d(LOGTAG, "This directory is empty"); + this.directoryShownIsEmpty = true; + fileList.add(0, new Item("Directory is empty", -1, true)); + } else {// sort non empty list + Collections.sort(fileList, new ItemFileNameComparator()); + } + } else { + Log.e(LOGTAG, "path does not exist or cannot be read"); + } + // Log.d(TAG, "loadFileList finished"); + }// private void loadFileList() { + + private void createFileListAdapter() { + adapter = new ArrayAdapter<Item>(this, + android.R.layout.select_dialog_item, android.R.id.text1, + fileList) { + @Override + public View getView(int position, View convertView, ViewGroup parent) { + // creates view + View view = super.getView(position, convertView, parent); + TextView 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 icon == -1, then directory is empty + drawableID = fileList.get(position).icon; + } + textView.setCompoundDrawablesWithIntrinsicBounds(drawableID, 0, + 0, 0); + + textView.setEllipsize(null); + + // add margin between image and text (support various screen + // densities) + // int dp5 = (int) (5 * + // getResources().getDisplayMetrics().density + 0.5f); + int dp3 = (int) (3 * getResources().getDisplayMetrics().density + 0.5f); + // TODO: change next line for empty directory, so text will be + // centered + textView.setCompoundDrawablePadding(dp3); + return view; + }// public View getView(int position, View convertView, ViewGroup + };// adapter = new ArrayAdapter<Item>(this, + }// private createFileListAdapter(){ + + private class Item { + public String file; + public int icon; + public boolean canRead; + + public Item(String file, Integer icon, boolean canRead) { + this.file = file; + this.icon = icon; + } + + @Override + public String toString() { + return file; + } + }// 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()); + } + } + + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + Log.d(LOGTAG, "ORIENTATION_LANDSCAPE"); + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + Log.d(LOGTAG, "ORIENTATION_PORTRAIT"); + } + // Layout apparently changes itself, only have to provide good onMeasure + // in custom components + // TODO: check with keyboard + // if(newConfig.keyboard == Configuration.KEYBOARDHIDDEN_YES) + }// END public void onConfigurationChanged(Configuration newConfig) { + + public static long getFreeSpace(String path) { + StatFs stat = new StatFs(path); + long availSize = (long) stat.getAvailableBlocks() + * (long) stat.getBlockSize(); + return availSize; + }// END public static long getFreeSpace(String path) { + + public 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 "; + bytes = bytes - (gbs * 1073741824); + } + // One MB - 1048576 bytes + if (bytes > 1048576) {// Add GB + long mbs = bytes / 1048576; + retStr += (new Long(mbs)).toString() + "MB "; + bytes = bytes - (mbs * 1048576); + } + if (bytes > 1024) { + long kbs = bytes / 1024; + retStr += (new Long(kbs)).toString() + "KB"; + bytes = bytes - (kbs * 1024); + } else + retStr += (new Long(bytes)).toString() + " bytes"; + return retStr; + }// public static String formatBytes(long bytes){ + +}// END public class FileBrowserActivity extends Activity { diff --git a/navit/android/src/org/navitproject/navit/Navit.java b/navit/android/src/org/navitproject/navit/Navit.java index 9a0df2fb4..e2d122de2 100644 --- a/navit/android/src/org/navitproject/navit/Navit.java +++ b/navit/android/src/org/navitproject/navit/Navit.java @@ -1,899 +1,899 @@ -/**
- * Navit, a modular navigation system.
- * Copyright (C) 2005-2008 Navit Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-package org.navitproject.navit;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.Manifest;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Message;
-import android.os.PowerManager;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.Display;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Toast;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.content.ContextCompat;
-
-public class Navit extends Activity
-{
-
- public NavitDialogs dialogs;
- private PowerManager.WakeLock wl;
- private NavitActivityResult ActivityResults[];
- public static InputMethodManager mgr = null;
- public static DisplayMetrics metrics = null;
- public static int status_bar_height = 0;
- public static int action_bar_default_height = 0;
- public static int navigation_bar_height = 0;
- public static int navigation_bar_height_landscape= 0;
- public static int navigation_bar_width = 0;
- 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;
- public static String my_display_density = "mdpi";
- public static final int NavitDownloaderSelectMap_id = 967;
- public static final int NavitAddressSearch_id = 70;
- public static final int NavitSelectStorage_id = 43;
- public static String NavitLanguage;
- public static Resources NavitResources = null;
- static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit";
- static final String TAG = "Navit";
- static String map_filename_path = null;
- static final String NAVIT_DATA_DIR = "/data/data/" + NAVIT_PACKAGE_NAME;
- 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;
- public static NotificationManager nm;
- private static Navit navit;
-
- public static Navit getInstance() {
- return navit;
- }
-
-
- /**
- * @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();
- }
- }
-
-
- 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();
- }
- }
-
-
- public static String T(String in)
- {
- return NavitTextTranslations.get_text(in);
- }
-
- private boolean extractRes(String resname, String result) {
- boolean needs_update = false;
- Log.e(TAG, "Res Name " + resname + ", result " + result);
- int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME);
- Log.e(TAG, "Res ID " + id);
- if (id == 0)
- return false;
-
- File resultfile = new File(result);
- if (!resultfile.exists()) {
- needs_update = true;
- File path = resultfile.getParentFile();
- if ( !path.exists() && !resultfile.getParentFile().mkdirs())
- return false;
- } else {
- PackageManager pm = getPackageManager();
- ApplicationInfo appInfo;
- long apkUpdateTime = 0;
- try {
- appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0);
- apkUpdateTime = new File(appInfo.sourceDir).lastModified();
- } catch (NameNotFoundException e) {
- Log.e(TAG, "Could not read package infos");
- e.printStackTrace();
- }
- if (apkUpdateTime > resultfile.lastModified())
- needs_update = true;
- }
-
- if (needs_update) {
- Log.e(TAG, "Extracting resource");
-
- try {
- InputStream resourcestream = NavitResources.openRawResource(id);
- FileOutputStream resultfilestream = new FileOutputStream(resultfile);
- byte[] buf = new byte[1024];
- int i = 0;
- while ((i = resourcestream.read(buf)) != -1) {
- resultfilestream.write(buf, 0, i);
- }
- resultfilestream.close();
- } catch (Exception e) {
- Log.e(TAG, "Exception " + e.getMessage());
- return false;
- }
- }
- return true;
- }
-
- private void showInfos()
- {
- SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE);
- boolean firstStart = settings.getBoolean("firstStart", true);
-
- if (firstStart)
- {
- AlertDialog.Builder infobox = new AlertDialog.Builder(this);
- infobox.setTitle(getString(R.string.initial_info_box_title)); // TRANS
- infobox.setCancelable(false);
-
- infobox.setMessage(R.string.initial_info_box_message);
-
- // TRANS
- infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- Log.d(TAG, "Ok, user saw the infobox");
- }
- });
-
- // TRANS
- infobox.setNeutralButton(getString(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- Log.d(TAG, "user wants more info, show the website");
- String url = "http://wiki.navit-project.org/index.php/Navit_on_Android";
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setData(Uri.parse(url));
- startActivity(i);
- }
- });
- infobox.show();
- SharedPreferences.Editor edit_settings = settings.edit();
- edit_settings.putBoolean("firstStart", false);
- edit_settings.apply();
- }
- }
-
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- 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();
-
- // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.)
- Navit.startup_intent = 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());
-
- // init translated text
- NavitTextTranslations.init();
-
- // NOTIFICATION
- // Setup the status bar notification
- // This notification is removed in the exit() function
- nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager
- PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0);
-
- NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
- builder.setContentIntent(appIntent);
- builder.setAutoCancel(false).setOngoing(true);
- builder.setContentTitle(getString(R.string.app_name));
- builder.setContentText(getString(R.string.notification_event_default));
- builder.setSmallIcon(R.drawable.ic_notify);
- Notification NavitNotification = builder.build();
- nm.notify(R.string.app_name, NavitNotification);// Show the notification
-
- // Status and navigation bar sizes
- // These are platform defaults and do not change with rotation, but we have to figure out which ones apply
- // (is the navigation bar visible? on the side or at the bottom?)
- Resources resources = 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");
- status_bar_height = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0;
- action_bar_default_height = (adhid > 0) ? resources.getDimensionPixelSize(adhid) : 0;
- navigation_bar_height = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0;
- navigation_bar_height_landscape = (nhlid > 0) ? resources.getDimensionPixelSize(nhlid) : 0;
- 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 ((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);
- }
- // get the local language -------------
- Locale locale = java.util.Locale.getDefault();
- String lang = locale.getLanguage();
- String langc = lang;
- Log.d(TAG, "lang=" + lang);
- int pos = lang.indexOf('_');
- 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));
- // set lang. for translation
- NavitTextTranslations.main_language = langc;
- NavitTextTranslations.sub_language = 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);
- // set lang. for translation
- NavitTextTranslations.main_language = langc;
- NavitTextTranslations.sub_language = 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/");
-
- // 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();
-
- // 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];
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen");
-
- if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo"))
- {
- Log.e(TAG, "Failed to extract language resource " + langc);
- }
-
- if (densityDpi <= 120)
- {
- my_display_density = "ldpi";
- }
- else if (densityDpi <= 160)
- {
- my_display_density = "mdpi";
- }
- else if (densityDpi < 240)
- {
- my_display_density = "hdpi";
- }
- else if (densityDpi < 320)
- {
- my_display_density = "xhdpi";
- }
- else if (densityDpi < 480)
- {
- my_display_density = "xxhdpi";
- }
- else if (densityDpi < 640)
- {
- my_display_density = "xxxhdpi";
- }
- else
- {
- Log.e(TAG, "found device of very high density ("+densityDpi+")");
- Log.e(TAG, "using xxxhdpi values");
- my_display_density = "xxxhdpi";
- }
-
- if (!extractRes("navit" + my_display_density, NAVIT_DATA_DIR + "/share/navit.xml"))
- {
- Log.e(TAG, "Failed to extract navit.xml for " + my_display_density);
- }
-
- Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK));
- NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, NAVIT_DATA_DIR+"/bin/navit",map_filename_path);
-
- showInfos();
-
- Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- }
-
- @Override
- public void onResume()
- {
- super.onResume();
- Log.d(TAG, "OnResume");
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
- /* Required to make system bars fully transparent */
- getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
- }
- //InputMethodManager mgr = (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());
- }
- }
- 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(getString(R.string.permissions_info_box_title)); // TRANS
- infobox.setCancelable(false);
- infobox.setMessage(getString(R.string.permissions_not_granted));
- // TRANS
- infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- exit();
- }
- });
- 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]);
-
- if (m.matches()) {
- params.put(m.group(1), m.group(2));
- }
- }
-
- // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts)
- // a: google.navigation:ll=48.25676,16.643&q=blabla-strasse
- // c: google.navigation:ll=48.25676,16.643
- // b: google.navigation:q=48.25676,16.643
-
- Float lat;
- Float lon;
- Bundle b = new Bundle();
-
- String geoString = params.get("ll");
- if (geoString != null) {
- String address = params.get("q");
- if (address != null) b.putString("q", address);
- }
- else {
- geoString = params.get("q");
- }
-
- if ( geoString != null) {
- if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) {
- String geo[] = geoString.split(",");
- if (geo.length == 2) {
- try {
- lat = Float.valueOf(geo[0]);
- 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());
-
- msg.setData(b);
- msg.sendToTarget();
- Log.e(TAG, "target found (b): " + geoString);
- } catch (NumberFormatException e) {
- e.printStackTrace();
- }
- }
- }
- else {
- start_targetsearch_from_intent(geoString);
- }
- }
- }
-
- public void setActivityResult(int requestCode, NavitActivityResult ActivityResult)
- {
- ActivityResults[requestCode] = ActivityResult;
- }
-
- /*
- * This is unused since we dont have the dropdown
- * TODO: recheck if this is right and remove this!
- */
- @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, getString(R.string.optionsmenu_download_maps)); //TRANS
- menu.add(1, 5, 400, getString(R.string.optionsmenu_toggle_poi)); //TRANS
-
- menu.add(1, 6, 500, getString(R.string.optionsmenu_address_search)); //TRANS
- menu.add(1, 10, 600, getString(R.string.optionsmenu_set_map_location));
-
- menu.add(1, 99, 900, getString(R.string.optionsmenu_exit_navit)); //TRANS
-
- /* Only show the Backup to SD-Card Option if we really have one */
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
- menu.add(1, 7, 700, getString(R.string.optionsmenu_backup_restore)); //TRANS
-
- 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(""))
- {
- // empty search string entered
- Toast.makeText(getApplicationContext(), getString(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);
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item)
- {
- runOptionsItem(item.getItemId());
- return true;
- }
-
- public void runOptionsItem(int id)
- {
- switch (id)
- {
- case 1 :
- // zoom in
- Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.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();
- // 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);
- 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());
- 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());
- 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());
- b = new Bundle();
- b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");");
- msg.setData(b);
- msg.sendToTarget();
-
- break;
- case 6 :
- // ok startup address search activity
- Intent search_intent = new Intent(this, NavitAddressSearchActivity.class);
- this.startActivityForResult(search_intent, NavitAddressSearch_id);
- break;
- case 7 :
- /* Backup / Restore */
- showDialog(NavitDialogs.DIALOG_BACKUP_RESTORE);
- break;
- case 10:
- setMapLocation();
- break;
- case 99 :
- // exit
- this.onStop();
- this.exit();
- break;
- }
- }
-
-
- /**
- * @brief 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.
- */
- public void showMenu() {
- openOptionsMenu();
- }
-
-
- /**
- * @brief Shows the native keyboard or other input method.
- */
- 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.
- */
- Configuration config = getResources().getConfiguration();
- if ((config.keyboard == Configuration.KEYBOARD_QWERTY) && (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO))
- /* physical keyboard present, exit */
- 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;
-
- /*
- * 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;
- }
-
-
- /**
- * @brief Hides the native keyboard or other input method.
- */
- public void hideNativeKeyboard() {
- mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
- show_soft_keyboard_now_showing = false;
- }
-
-
- void setDestination(float latitude, float longitude, String address) {
- Toast.makeText( getApplicationContext(),getString(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);
- msg.setData(b);
- msg.sendToTarget();
- }
-
- protected void onActivityResult(int requestCode, int resultCode, Intent data)
- {
- switch (requestCode)
- {
- case Navit.NavitDownloaderSelectMap_id :
- if (resultCode == Activity.RESULT_OK)
- {
- Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD
- , data.getIntExtra("map_index", -1), 0);
- msg.sendToTarget();
- }
- break;
- case NavitAddressSearch_id :
- if (resultCode == Activity.RESULT_OK) {
- Bundle destination = data.getExtras();
- Toast.makeText( getApplicationContext(),getString(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());
- msg.setData(destination);
- msg.sendToTarget();
- }
- break;
- case NavitSelectStorage_id :
- if(resultCode == RESULT_OK) {
- String newDir = data.getStringExtra(FileBrowserActivity.returnDirectoryParameter);
- Log.d(TAG, "selected path= "+newDir);
- if(!newDir.contains("/navit"))
- newDir = newDir+"/navit/";
- 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();
- Toast.makeText(this, String.format(Navit.T("New location set to %s\nRestart Navit to apply the changes."),newDir),Toast.LENGTH_LONG).show();
- }
- else Log.w(TAG, "select path failed");
- break;
- default :
- ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data);
- break;
- }
- }
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- dialogs.prepareDialog(id, dialog);
- super.onPrepareDialog(id, dialog);
- }
-
- protected Dialog onCreateDialog(int id)
- {
- return dialogs.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);
-
- return true;
- }
-
- public void setMapLocation()
- {
- Intent fileExploreIntent = new Intent(this,FileBrowserActivity.class);
- fileExploreIntent
- .putExtra(FileBrowserActivity.startDirectoryParameter, "/mnt")
- .setAction(FileBrowserActivity.INTENT_ACTION_SELECT_DIR);
- startActivityForResult(fileExploreIntent,NavitSelectStorage_id);
- }
-
- @Override
- public void onDestroy()
- {
- super.onDestroy();
- Log.d(TAG, "OnDestroy");
- // TODO next call will kill our app the hard way. This should not be necessary, but ensures navit is
- // properly restarted and no resources are wasted with navit in background. Remove this call after
- // code review
- NavitDestroy();
- }
-
- public void fullscreen(int fullscreen) {
- int w, h;
-
- isFullscreen = (fullscreen != 0);
- if (isFullscreen) {
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- }
- else {
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
- }
-
- 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;
- }
- 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();
- }
-
- public void exit()
- {
- nm.cancelAll();
- NavitVehicle.removeListener();
- NavitDestroy();
- }
-
- public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path, String path2);
- public native void NavitDestroy();
-
- /*
- * 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");
- }
-}
+/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +package org.navitproject.navit; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Point; +import android.Manifest; +import android.media.AudioManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Message; +import android.os.PowerManager; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; +import android.support.v4.app.NotificationCompat; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; + +public class Navit extends Activity +{ + + public NavitDialogs dialogs; + private PowerManager.WakeLock wl; + private NavitActivityResult ActivityResults[]; + public static InputMethodManager mgr = null; + public static DisplayMetrics metrics = null; + public static int status_bar_height = 0; + public static int action_bar_default_height = 0; + public static int navigation_bar_height = 0; + public static int navigation_bar_height_landscape= 0; + public static int navigation_bar_width = 0; + 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; + public static String my_display_density = "mdpi"; + public static final int NavitDownloaderSelectMap_id = 967; + public static final int NavitAddressSearch_id = 70; + public static final int NavitSelectStorage_id = 43; + public static String NavitLanguage; + public static Resources NavitResources = null; + static final String NAVIT_PACKAGE_NAME = "org.navitproject.navit"; + static final String TAG = "Navit"; + static String map_filename_path = null; + static final String NAVIT_DATA_DIR = "/data/data/" + NAVIT_PACKAGE_NAME; + 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; + public static NotificationManager nm; + private static Navit navit; + + public static Navit getInstance() { + return navit; + } + + + /** + * @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(); + } + } + + + 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(); + } + } + + + public static String T(String in) + { + return NavitTextTranslations.get_text(in); + } + + private boolean extractRes(String resname, String result) { + boolean needs_update = false; + Log.e(TAG, "Res Name " + resname + ", result " + result); + int id = NavitResources.getIdentifier(resname, "raw", NAVIT_PACKAGE_NAME); + Log.e(TAG, "Res ID " + id); + if (id == 0) + return false; + + File resultfile = new File(result); + if (!resultfile.exists()) { + needs_update = true; + File path = resultfile.getParentFile(); + if ( !path.exists() && !resultfile.getParentFile().mkdirs()) + return false; + } else { + PackageManager pm = getPackageManager(); + ApplicationInfo appInfo; + long apkUpdateTime = 0; + try { + appInfo = pm.getApplicationInfo(NAVIT_PACKAGE_NAME, 0); + apkUpdateTime = new File(appInfo.sourceDir).lastModified(); + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not read package infos"); + e.printStackTrace(); + } + if (apkUpdateTime > resultfile.lastModified()) + needs_update = true; + } + + if (needs_update) { + Log.e(TAG, "Extracting resource"); + + try { + InputStream resourcestream = NavitResources.openRawResource(id); + FileOutputStream resultfilestream = new FileOutputStream(resultfile); + byte[] buf = new byte[1024]; + int i = 0; + while ((i = resourcestream.read(buf)) != -1) { + resultfilestream.write(buf, 0, i); + } + resultfilestream.close(); + } catch (Exception e) { + Log.e(TAG, "Exception " + e.getMessage()); + return false; + } + } + return true; + } + + private void showInfos() + { + SharedPreferences settings = getSharedPreferences(NAVIT_PREFS, MODE_PRIVATE); + boolean firstStart = settings.getBoolean("firstStart", true); + + if (firstStart) + { + AlertDialog.Builder infobox = new AlertDialog.Builder(this); + infobox.setTitle(getString(R.string.initial_info_box_title)); // TRANS + infobox.setCancelable(false); + + infobox.setMessage(R.string.initial_info_box_message); + + // TRANS + infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.d(TAG, "Ok, user saw the infobox"); + } + }); + + // TRANS + infobox.setNeutralButton(getString(R.string.initial_info_box_more_info), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.d(TAG, "user wants more info, show the website"); + String url = "http://wiki.navit-project.org/index.php/Navit_on_Android"; + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + startActivity(i); + } + }); + infobox.show(); + SharedPreferences.Editor edit_settings = settings.edit(); + edit_settings.putBoolean("firstStart", false); + edit_settings.apply(); + } + } + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + 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(); + + // only take arguments here, onResume gets called all the time (e.g. when screenblanks, etc.) + Navit.startup_intent = 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()); + + // init translated text + NavitTextTranslations.init(); + + // NOTIFICATION + // Setup the status bar notification + // This notification is removed in the exit() function + nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // Grab a handle to the NotificationManager + PendingIntent appIntent = PendingIntent.getActivity(getApplicationContext(), 0, getIntent(), 0); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this); + builder.setContentIntent(appIntent); + builder.setAutoCancel(false).setOngoing(true); + builder.setContentTitle(getString(R.string.app_name)); + builder.setContentText(getString(R.string.notification_event_default)); + builder.setSmallIcon(R.drawable.ic_notify); + Notification NavitNotification = builder.build(); + nm.notify(R.string.app_name, NavitNotification);// Show the notification + + // Status and navigation bar sizes + // These are platform defaults and do not change with rotation, but we have to figure out which ones apply + // (is the navigation bar visible? on the side or at the bottom?) + Resources resources = 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"); + status_bar_height = (shid > 0) ? resources.getDimensionPixelSize(shid) : 0; + action_bar_default_height = (adhid > 0) ? resources.getDimensionPixelSize(adhid) : 0; + navigation_bar_height = (nhid > 0) ? resources.getDimensionPixelSize(nhid) : 0; + navigation_bar_height_landscape = (nhlid > 0) ? resources.getDimensionPixelSize(nhlid) : 0; + 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 ((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); + } + // get the local language ------------- + Locale locale = java.util.Locale.getDefault(); + String lang = locale.getLanguage(); + String langc = lang; + Log.d(TAG, "lang=" + lang); + int pos = lang.indexOf('_'); + 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)); + // set lang. for translation + NavitTextTranslations.main_language = langc; + NavitTextTranslations.sub_language = 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); + // set lang. for translation + NavitTextTranslations.main_language = langc; + NavitTextTranslations.sub_language = 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/"); + + // 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(); + + // 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]; + setVolumeControlStream(AudioManager.STREAM_MUSIC); + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"NavitDoNotDimScreen"); + + if (!extractRes(langc, NAVIT_DATA_DIR + "/locale/" + langc + "/LC_MESSAGES/navit.mo")) + { + Log.e(TAG, "Failed to extract language resource " + langc); + } + + if (densityDpi <= 120) + { + my_display_density = "ldpi"; + } + else if (densityDpi <= 160) + { + my_display_density = "mdpi"; + } + else if (densityDpi < 240) + { + my_display_density = "hdpi"; + } + else if (densityDpi < 320) + { + my_display_density = "xhdpi"; + } + else if (densityDpi < 480) + { + my_display_density = "xxhdpi"; + } + else if (densityDpi < 640) + { + my_display_density = "xxxhdpi"; + } + else + { + Log.e(TAG, "found device of very high density ("+densityDpi+")"); + Log.e(TAG, "using xxxhdpi values"); + my_display_density = "xxxhdpi"; + } + + if (!extractRes("navit" + my_display_density, NAVIT_DATA_DIR + "/share/navit.xml")) + { + Log.e(TAG, "Failed to extract navit.xml for " + my_display_density); + } + + Log.d(TAG, "android.os.Build.VERSION.SDK_INT=" + Integer.valueOf(android.os.Build.VERSION.SDK)); + NavitMain(this, NavitLanguage, Integer.valueOf(android.os.Build.VERSION.SDK), my_display_density, NAVIT_DATA_DIR+"/bin/navit",map_filename_path); + + showInfos(); + + Navit.mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + } + + @Override + public void onResume() + { + super.onResume(); + Log.d(TAG, "OnResume"); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + /* Required to make system bars fully transparent */ + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + } + //InputMethodManager mgr = (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()); + } + } + 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(getString(R.string.permissions_info_box_title)); // TRANS + infobox.setCancelable(false); + infobox.setMessage(getString(R.string.permissions_not_granted)); + // TRANS + infobox.setPositiveButton(getString(R.string.initial_info_box_OK), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + exit(); + } + }); + 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]); + + if (m.matches()) { + params.put(m.group(1), m.group(2)); + } + } + + // d: google.navigation:q=blabla-strasse # (this happens when you are offline, or from contacts) + // a: google.navigation:ll=48.25676,16.643&q=blabla-strasse + // c: google.navigation:ll=48.25676,16.643 + // b: google.navigation:q=48.25676,16.643 + + Float lat; + Float lon; + Bundle b = new Bundle(); + + String geoString = params.get("ll"); + if (geoString != null) { + String address = params.get("q"); + if (address != null) b.putString("q", address); + } + else { + geoString = params.get("q"); + } + + if ( geoString != null) { + if (geoString.matches("^[+-]{0,1}\\d+(|\\.\\d*),[+-]{0,1}\\d+(|\\.\\d*)$")) { + String geo[] = geoString.split(","); + if (geo.length == 2) { + try { + lat = Float.valueOf(geo[0]); + 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()); + + msg.setData(b); + msg.sendToTarget(); + Log.e(TAG, "target found (b): " + geoString); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + } + else { + start_targetsearch_from_intent(geoString); + } + } + } + + public void setActivityResult(int requestCode, NavitActivityResult ActivityResult) + { + ActivityResults[requestCode] = ActivityResult; + } + + /* + * This is unused since we dont have the dropdown + * TODO: recheck if this is right and remove this! + */ + @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, getString(R.string.optionsmenu_download_maps)); //TRANS + menu.add(1, 5, 400, getString(R.string.optionsmenu_toggle_poi)); //TRANS + + menu.add(1, 6, 500, getString(R.string.optionsmenu_address_search)); //TRANS + menu.add(1, 10, 600, getString(R.string.optionsmenu_set_map_location)); + + menu.add(1, 99, 900, getString(R.string.optionsmenu_exit_navit)); //TRANS + + /* Only show the Backup to SD-Card Option if we really have one */ + if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) + menu.add(1, 7, 700, getString(R.string.optionsmenu_backup_restore)); //TRANS + + 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("")) + { + // empty search string entered + Toast.makeText(getApplicationContext(), getString(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); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + runOptionsItem(item.getItemId()); + return true; + } + + public void runOptionsItem(int id) + { + switch (id) + { + case 1 : + // zoom in + Message.obtain(N_NavitGraphics.callback_handler, NavitGraphics.msg_type.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(); + // 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); + 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()); + 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()); + 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()); + b = new Bundle(); + b.putString("cmd", "toggle_layer(\"Android-POI-Icons-full\");"); + msg.setData(b); + msg.sendToTarget(); + + break; + case 6 : + // ok startup address search activity + Intent search_intent = new Intent(this, NavitAddressSearchActivity.class); + this.startActivityForResult(search_intent, NavitAddressSearch_id); + break; + case 7 : + /* Backup / Restore */ + showDialog(NavitDialogs.DIALOG_BACKUP_RESTORE); + break; + case 10: + setMapLocation(); + break; + case 99 : + // exit + this.onStop(); + this.exit(); + break; + } + } + + + /** + * @brief 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. + */ + public void showMenu() { + openOptionsMenu(); + } + + + /** + * @brief Shows the native keyboard or other input method. + */ + 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. + */ + Configuration config = getResources().getConfiguration(); + if ((config.keyboard == Configuration.KEYBOARD_QWERTY) && (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)) + /* physical keyboard present, exit */ + 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; + + /* + * 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; + } + + + /** + * @brief Hides the native keyboard or other input method. + */ + public void hideNativeKeyboard() { + mgr.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + show_soft_keyboard_now_showing = false; + } + + + void setDestination(float latitude, float longitude, String address) { + Toast.makeText( getApplicationContext(),getString(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); + msg.setData(b); + msg.sendToTarget(); + } + + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) + { + case Navit.NavitDownloaderSelectMap_id : + if (resultCode == Activity.RESULT_OK) + { + Message msg = dialogs.obtainMessage(NavitDialogs.MSG_START_MAP_DOWNLOAD + , data.getIntExtra("map_index", -1), 0); + msg.sendToTarget(); + } + break; + case NavitAddressSearch_id : + if (resultCode == Activity.RESULT_OK) { + Bundle destination = data.getExtras(); + Toast.makeText( getApplicationContext(),getString(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()); + msg.setData(destination); + msg.sendToTarget(); + } + break; + case NavitSelectStorage_id : + if(resultCode == RESULT_OK) { + String newDir = data.getStringExtra(FileBrowserActivity.returnDirectoryParameter); + Log.d(TAG, "selected path= "+newDir); + if(!newDir.contains("/navit")) + newDir = newDir+"/navit/"; + 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(); + Toast.makeText(this, String.format(Navit.T("New location set to %s\nRestart Navit to apply the changes."),newDir),Toast.LENGTH_LONG).show(); + } + else Log.w(TAG, "select path failed"); + break; + default : + ActivityResults[requestCode].onActivityResult(requestCode, resultCode, data); + break; + } + } + + @Override + protected void onPrepareDialog(int id, Dialog dialog) { + dialogs.prepareDialog(id, dialog); + super.onPrepareDialog(id, dialog); + } + + protected Dialog onCreateDialog(int id) + { + return dialogs.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); + + return true; + } + + public void setMapLocation() + { + Intent fileExploreIntent = new Intent(this,FileBrowserActivity.class); + fileExploreIntent + .putExtra(FileBrowserActivity.startDirectoryParameter, "/mnt") + .setAction(FileBrowserActivity.INTENT_ACTION_SELECT_DIR); + startActivityForResult(fileExploreIntent,NavitSelectStorage_id); + } + + @Override + public void onDestroy() + { + super.onDestroy(); + Log.d(TAG, "OnDestroy"); + // TODO next call will kill our app the hard way. This should not be necessary, but ensures navit is + // properly restarted and no resources are wasted with navit in background. Remove this call after + // code review + NavitDestroy(); + } + + public void fullscreen(int fullscreen) { + int w, h; + + isFullscreen = (fullscreen != 0); + if (isFullscreen) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + } + else { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + 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; + } + 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(); + } + + public void exit() + { + nm.cancelAll(); + NavitVehicle.removeListener(); + NavitDestroy(); + } + + public native void NavitMain(Navit x, String lang, int version, String display_density_string, String path, String path2); + public native void NavitDestroy(); + + /* + * 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/NavitAddressSearchActivity.java b/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java index 80d285fa5..361a511ab 100644 --- a/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitAddressSearchActivity.java @@ -1,385 +1,385 @@ -/**
- * Navit, a modular navigation system.
- * Copyright (C) 2005-2008 Navit Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-package org.navitproject.navit;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.WindowManager;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.RelativeLayout;
-import android.widget.Toast;
-import android.widget.RelativeLayout.LayoutParams;
-import android.widget.TextView;
-
-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;
- }
-
- int result_type;
- float lat;
- float lon;
- String addr;
- }
-
- 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 String mAddressString = "";
- private boolean mPartialSearch = false;
- private String mCountry;
- private ImageButton mCountryButton;
- 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;
-
- // TODO remember settings
- private static String last_address_search_string = "";
- private static Boolean last_address_partial_match = false;
- private static String last_country = "";
-
- private int getDrawableID(String resourceName) {
- int drawableId = 0;
- try {
- Class<?> res = R.drawable.class;
- Field field = res.getField(resourceName);
- drawableId = field.getInt(null);
- } catch (Exception e) {
- Log.e("NavitAddressSearch", "Failure to get drawable id.", e);
- }
- return drawableId;
- }
-
- private void setCountryButtonImage() {
- // 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)
- break;
- }
- mCountryButton.setImageResource(getDrawableID("country_" + mCountry+"_"+nearest_size+"_"+nearest_size));
- }
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Bundle extras = getIntent().getExtras();
- if ( extras != null )
- {
- String search_string = extras.getString(("search_string"));
- if (search_string != null) {
- mPartialSearch = true;
- mAddressString = search_string;
- executeSearch();
- return;
- }
- }
-
- mPartialSearch = last_address_partial_match;
- mAddressString = last_address_search_string;
-
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- LinearLayout panel = new LinearLayout(this);
- panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
- panel.setOrientation(LinearLayout.VERTICAL);
-
- // address: label and text field
- SharedPreferences settings = getSharedPreferences(Navit.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.commit();
- }
-
- mCountryButton = new ImageButton(this);
-
- setCountryButtonImage();
-
- mCountryButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- requestCountryDialog();
- }
- });
-
- // address: label and text field
- TextView addr_view = new TextView(this);
- addr_view.setText(Navit.T("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);
-
- // partial match checkbox
- final CheckBox checkboxPartialMatch = new CheckBox(this);
- checkboxPartialMatch.setText(Navit.T("partial match")); // TRANS
- checkboxPartialMatch.setChecked(last_address_partial_match);
- checkboxPartialMatch.setGravity(Gravity.CENTER);
-
- final EditText address_string = new EditText(this);
- address_string.setText(last_address_search_string);
- address_string.setSelectAllOnFocus(true);
-
- // search button
- final Button btnSearch = new Button(this);
- btnSearch.setText(Navit.T("Search")); // 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;
- executeSearch();
- }
- });
-
- ListView lastAddresses = new ListView(this);
- NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext();
-
- final List<NavitAddress> addresses = navitConfig.getLastAddresses();
- int addressCount = addresses.size();
- if (addressCount > 0) {
- String[] strAddresses = new String[addressCount];
- for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) {
- strAddresses[addrIndex] = addresses.get(addrIndex).addr;
- }
- ArrayAdapter<String> addressList =
- new ArrayAdapter<String>(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);
-
- setResult(Activity.RESULT_OK, resultIntent);
- finish();
- }
- });
- }
-
- String title = getString(R.string.address_search_title);
-
- if (title != null && title.length() > 0)
- this.setTitle(title);
-
- LinearLayout searchSettingsLayout = new LinearLayout(this);
- searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL);
-
- searchSettingsLayout.addView(mCountryButton);
- searchSettingsLayout.addView(checkboxPartialMatch);
- panel.addView(addr_view);
- panel.addView(address_string);
- panel.addView(searchSettingsLayout);
- panel.addView(btnSearch);
- panel.addView(lastAddresses);
-
- setContentView(panel);
- }
-
- private void requestCountryDialog() {
- final String[][] all_countries = NavitGraphics.GetAllCountries();
-
- Comparator<String[]> country_comperator = new Comparator<String[]>() {
- public int compare(String[] object1, String[] object2) {
- return object1[1].compareTo(object2[1]);
- }
- };
-
- Arrays.sort(all_countries, country_comperator);
-
- AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this);
- // ToDo also show icons and country code
- String[] country_name = 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];
- }
-
- mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE);
- mCountry = all_countries[item][0];
- SharedPreferences.Editor edit_settings = settings.edit();
- edit_settings.putString("DefaultCountry", mCountry);
- edit_settings.commit();
-
- setCountryButtonImage();
- }
- });
-
- AlertDialog d=mapModeChooser.create();
- d.getListView().setFastScrollEnabled(true);
- 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);
-
- switch (type) {
- case 0:
- search_results_towns++;
- break;
- case 1:
- search_results_streets++;
- break;
- case 2:
- search_results_streets_hn++;
- break;
-
- }
- search_results_wait.setMessage(Navit.T("Towns") + ":" + search_results_towns + " "
- + Navit.T("Streets") + ":" + search_results_streets + "/"
- + search_results_streets_hn);
-
- search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1));
-
- Addresses_found.add(new NavitAddress(type, latitude, longitude, address));
- }
-
- public void finishAddressSearch() {
- if (Addresses_found.isEmpty()) {
- Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); //TRANS
- setResult(Activity.RESULT_CANCELED);
- finish();
- }
- ListView addressesFound = new ListView(this);
- addressesFound.setFastScrollEnabled(true);
- ArrayAdapter<String> addressList =
- new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
-
- addresses_shown = new ArrayList<NavitAddress>();
-
- for (NavitAddress currentAddress : Addresses_found) {
- if (currentAddress.result_type != 0 || search_results_streets == 0) {
- addressList.add(currentAddress.addr);
- addresses_shown.add(currentAddress);
- }
- }
-
- addressesFound.setAdapter(addressList);
-
- addressesFound.setOnItemClickListener(new OnItemClickListener() {
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- NavitAddress addressSelected = addresses_shown.get(arg2);
- Intent resultIntent = new Intent();
-
- resultIntent.putExtra("lat", addressSelected.lat);
- resultIntent.putExtra("lon", addressSelected.lon);
- resultIntent.putExtra("q", addressSelected.addr);
-
- setResult(Activity.RESULT_OK, resultIntent);
- finish();
- }
- });
-
- setContentView(addressesFound);
- search_results_wait.dismiss();
- }
-
- public native long CallbackStartAddressSearch(int partial_match, String country, String s);
- public 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() {
- @Override
- public void onCancel(DialogInterface dialog) {
- CallbackCancelAddressSearch(search_handle);
- search_handle = 0;
- search_results_wait.dismiss();
- }
- });
- return search_results_wait;
- }
-
- void executeSearch() {
- showDialog(0);
- }
-}
-
+/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +package org.navitproject.navit; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.Toast; +import android.widget.RelativeLayout.LayoutParams; +import android.widget.TextView; + +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; + } + + int result_type; + float lat; + float lon; + String addr; + } + + 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 String mAddressString = ""; + private boolean mPartialSearch = false; + private String mCountry; + private ImageButton mCountryButton; + 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; + + // TODO remember settings + private static String last_address_search_string = ""; + private static Boolean last_address_partial_match = false; + private static String last_country = ""; + + private int getDrawableID(String resourceName) { + int drawableId = 0; + try { + Class<?> res = R.drawable.class; + Field field = res.getField(resourceName); + drawableId = field.getInt(null); + } catch (Exception e) { + Log.e("NavitAddressSearch", "Failure to get drawable id.", e); + } + return drawableId; + } + + private void setCountryButtonImage() { + // 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) + break; + } + mCountryButton.setImageResource(getDrawableID("country_" + mCountry+"_"+nearest_size+"_"+nearest_size)); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle extras = getIntent().getExtras(); + if ( extras != null ) + { + String search_string = extras.getString(("search_string")); + if (search_string != null) { + mPartialSearch = true; + mAddressString = search_string; + executeSearch(); + return; + } + } + + mPartialSearch = last_address_partial_match; + mAddressString = last_address_search_string; + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND); + LinearLayout panel = new LinearLayout(this); + panel.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + panel.setOrientation(LinearLayout.VERTICAL); + + // address: label and text field + SharedPreferences settings = getSharedPreferences(Navit.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.commit(); + } + + mCountryButton = new ImageButton(this); + + setCountryButtonImage(); + + mCountryButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + requestCountryDialog(); + } + }); + + // address: label and text field + TextView addr_view = new TextView(this); + addr_view.setText(Navit.T("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); + + // partial match checkbox + final CheckBox checkboxPartialMatch = new CheckBox(this); + checkboxPartialMatch.setText(Navit.T("partial match")); // TRANS + checkboxPartialMatch.setChecked(last_address_partial_match); + checkboxPartialMatch.setGravity(Gravity.CENTER); + + final EditText address_string = new EditText(this); + address_string.setText(last_address_search_string); + address_string.setSelectAllOnFocus(true); + + // search button + final Button btnSearch = new Button(this); + btnSearch.setText(Navit.T("Search")); // 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; + executeSearch(); + } + }); + + ListView lastAddresses = new ListView(this); + NavitAppConfig navitConfig = (NavitAppConfig) getApplicationContext(); + + final List<NavitAddress> addresses = navitConfig.getLastAddresses(); + int addressCount = addresses.size(); + if (addressCount > 0) { + String[] strAddresses = new String[addressCount]; + for (int addrIndex = 0; addrIndex < addressCount; addrIndex++) { + strAddresses[addrIndex] = addresses.get(addrIndex).addr; + } + ArrayAdapter<String> addressList = + new ArrayAdapter<String>(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); + + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } + }); + } + + String title = getString(R.string.address_search_title); + + if (title != null && title.length() > 0) + this.setTitle(title); + + LinearLayout searchSettingsLayout = new LinearLayout(this); + searchSettingsLayout.setOrientation(LinearLayout.HORIZONTAL); + + searchSettingsLayout.addView(mCountryButton); + searchSettingsLayout.addView(checkboxPartialMatch); + panel.addView(addr_view); + panel.addView(address_string); + panel.addView(searchSettingsLayout); + panel.addView(btnSearch); + panel.addView(lastAddresses); + + setContentView(panel); + } + + private void requestCountryDialog() { + final String[][] all_countries = NavitGraphics.GetAllCountries(); + + Comparator<String[]> country_comperator = new Comparator<String[]>() { + public int compare(String[] object1, String[] object2) { + return object1[1].compareTo(object2[1]); + } + }; + + Arrays.sort(all_countries, country_comperator); + + AlertDialog.Builder mapModeChooser = new AlertDialog.Builder(this); + // ToDo also show icons and country code + String[] country_name = 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]; + } + + mapModeChooser.setItems(country_name, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + SharedPreferences settings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + mCountry = all_countries[item][0]; + SharedPreferences.Editor edit_settings = settings.edit(); + edit_settings.putString("DefaultCountry", mCountry); + edit_settings.commit(); + + setCountryButtonImage(); + } + }); + + AlertDialog d=mapModeChooser.create(); + d.getListView().setFastScrollEnabled(true); + 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); + + switch (type) { + case 0: + search_results_towns++; + break; + case 1: + search_results_streets++; + break; + case 2: + search_results_streets_hn++; + break; + + } + search_results_wait.setMessage(Navit.T("Towns") + ":" + search_results_towns + " " + + Navit.T("Streets") + ":" + search_results_streets + "/" + + search_results_streets_hn); + + search_results_wait.setProgress(Addresses_found.size() % (ADDRESS_RESULT_PROGRESS_MAX + 1)); + + Addresses_found.add(new NavitAddress(type, latitude, longitude, address)); + } + + public void finishAddressSearch() { + if (Addresses_found.isEmpty()) { + Toast.makeText( getApplicationContext(),getString(R.string.address_search_not_found) + "\n" + mAddressString, Toast.LENGTH_LONG).show(); //TRANS + setResult(Activity.RESULT_CANCELED); + finish(); + } + ListView addressesFound = new ListView(this); + addressesFound.setFastScrollEnabled(true); + ArrayAdapter<String> addressList = + new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); + + addresses_shown = new ArrayList<NavitAddress>(); + + for (NavitAddress currentAddress : Addresses_found) { + if (currentAddress.result_type != 0 || search_results_streets == 0) { + addressList.add(currentAddress.addr); + addresses_shown.add(currentAddress); + } + } + + addressesFound.setAdapter(addressList); + + addressesFound.setOnItemClickListener(new OnItemClickListener() { + public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { + NavitAddress addressSelected = addresses_shown.get(arg2); + Intent resultIntent = new Intent(); + + resultIntent.putExtra("lat", addressSelected.lat); + resultIntent.putExtra("lon", addressSelected.lon); + resultIntent.putExtra("q", addressSelected.addr); + + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } + }); + + setContentView(addressesFound); + search_results_wait.dismiss(); + } + + public native long CallbackStartAddressSearch(int partial_match, String country, String s); + public 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() { + @Override + public void onCancel(DialogInterface dialog) { + CallbackCancelAddressSearch(search_handle); + search_handle = 0; + search_results_wait.dismiss(); + } + }); + return search_results_wait; + } + + void executeSearch() { + showDialog(0); + } +} + diff --git a/navit/android/src/org/navitproject/navit/NavitAppConfig.java b/navit/android/src/org/navitproject/navit/NavitAppConfig.java index 244cef9ce..7cc5a6173 100755 --- a/navit/android/src/org/navitproject/navit/NavitAppConfig.java +++ b/navit/android/src/org/navitproject/navit/NavitAppConfig.java @@ -1,70 +1,70 @@ -package org.navitproject.navit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.navitproject.navit.NavitAddressSearchActivity.NavitAddress;
-
-import android.app.Application;
-import android.content.SharedPreferences;
-
-
-public class NavitAppConfig extends Application {
-
- private static final int MAX_LAST_ADDRESSES = 10;
- private static final String TAG = "Navit";
-
- private List<NavitAddress> mLastAddresses = null;
- private int mLastAddressField;
- private SharedPreferences mSettings;
-
- @Override
- public void onCreate() {
- mSettings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE);
- super.onCreate();
- }
-
- public List<NavitAddress> getLastAddresses() {
- if (mLastAddresses == null) {
- mLastAddresses = new ArrayList<NavitAddress>();
- int mLastAddressField = mSettings.getInt("LastAddress", -1);
- if (mLastAddressField >= 0) {
- int index = mLastAddressField;
- do {
- String addr_str = mSettings.getString("LastAddress_" + String.valueOf(index), "");
-
- if (addr_str.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));
- }
-
- if (--index < 0) index = MAX_LAST_ADDRESSES - 1;
-
- } while (index != mLastAddressField);
- }
- }
- return mLastAddresses;
- }
-
- public void addLastAddress(NavitAddress newAddress) {
- getLastAddresses();
-
- mLastAddresses.add(newAddress);
- if (mLastAddresses.size() > MAX_LAST_ADDRESSES) mLastAddresses.remove(0);
-
- mLastAddressField++;
- if (mLastAddressField >= MAX_LAST_ADDRESSES) mLastAddressField = 0;
-
- 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.apply();
- }
-}
+package org.navitproject.navit; + +import java.util.ArrayList; +import java.util.List; + +import org.navitproject.navit.NavitAddressSearchActivity.NavitAddress; + +import android.app.Application; +import android.content.SharedPreferences; + + +public class NavitAppConfig extends Application { + + private static final int MAX_LAST_ADDRESSES = 10; + private static final String TAG = "Navit"; + + private List<NavitAddress> mLastAddresses = null; + private int mLastAddressField; + private SharedPreferences mSettings; + + @Override + public void onCreate() { + mSettings = getSharedPreferences(Navit.NAVIT_PREFS, MODE_PRIVATE); + super.onCreate(); + } + + public List<NavitAddress> getLastAddresses() { + if (mLastAddresses == null) { + mLastAddresses = new ArrayList<NavitAddress>(); + int mLastAddressField = mSettings.getInt("LastAddress", -1); + if (mLastAddressField >= 0) { + int index = mLastAddressField; + do { + String addr_str = mSettings.getString("LastAddress_" + String.valueOf(index), ""); + + if (addr_str.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)); + } + + if (--index < 0) index = MAX_LAST_ADDRESSES - 1; + + } while (index != mLastAddressField); + } + } + return mLastAddresses; + } + + public void addLastAddress(NavitAddress newAddress) { + getLastAddresses(); + + mLastAddresses.add(newAddress); + if (mLastAddresses.size() > MAX_LAST_ADDRESSES) mLastAddresses.remove(0); + + mLastAddressField++; + if (mLastAddressField >= MAX_LAST_ADDRESSES) mLastAddressField = 0; + + 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.apply(); + } +} diff --git a/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java b/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java index 582179492..f0b01ee0f 100644 --- a/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java +++ b/navit/android/src/org/navitproject/navit/NavitDownloadSelectMapActivity.java @@ -1,238 +1,238 @@ -/**
- * Navit, a modular navigation system.
- * Copyright (C) 2005-2008 Navit Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-package org.navitproject.navit;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.ExpandableListActivity;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.location.Location;
-import android.location.LocationManager;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.StatFs;
-import android.util.Log;
-import android.view.View;
-import android.widget.ExpandableListView;
-import android.widget.RelativeLayout;
-import android.widget.SimpleExpandableListAdapter;
-import android.widget.TextView;
-
-public class NavitDownloadSelectMapActivity extends ExpandableListActivity {
-
- private static SimpleExpandableListAdapter adapter = null;
- private static final String MAP_BULLETPOINT = " * ";
- 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;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- if (adapter == null) {
- adapter = createAdapter();
- }
- updateDownloadedMaps();
- updateMapsForLocation(NavitMapDownloader.osm_maps);
- setListAdapter(adapter);
- try {
- setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available");
- } catch (Exception e) {
- Log.e("Navit","Exception "+e.getClass().getName()+" during getFreeSpace, reporting 'no sdcard present'");
- NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null,
- String.format(Navit.T("Current map location %s is not available\nPlease restart Navit after you attach an SD card or select a different map location."),Navit.map_filename_path),
- -1, 0, 0);
- finish();
- }
- }
-
- protected long getFreeSpace()
- {
- StatFs fsInfo = new StatFs(Navit.map_filename_path);
- return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize();
- }
-
- private void updateDownloadedMaps() {
- downloaded_maps_childs.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");
- child.put("map_location", map.getLocation());
- downloaded_maps_childs.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)) {
- if (currentLocation == null) {
- LocationManager mapLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- List<String> providers = mapLocationManager.getProviders(true);
- long lastUpdate = 0;
- long bestUpdateTime = -1;
- for (String provider : providers) {
- Location lastKnownLocation = mapLocationManager.getLastKnownLocation(provider);
- if (lastKnownLocation != null) {
- lastUpdate = lastKnownLocation.getTime();
- if (lastUpdate > bestUpdateTime) {
- currentLocation = lastKnownLocation;
- bestUpdateTime = lastUpdate;
- }
- }
- }
- } else currentLocationKnown = 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; 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) + "MB");
- currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex));
-
- maps_current_position_childs.add(currentPositionMapChild);
- }
- }
- }
- }
- }
-
- 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>>>();
-
- // 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.T("Downloaded maps"));
- resultGroups.add(downloaded_maps_hash);
- downloaded_maps_childs = new ArrayList<HashMap<String, String>>();
- resultChilds.add(downloaded_maps_childs);
-
- ArrayList<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>();
- maps_current_position_childs = new ArrayList<HashMap<String, String>>();
- // maps containing the current location
- HashMap<String, String> matching_maps = new HashMap<String, String>();
- matching_maps.put("category_name", Navit.NavitResources.getString(R.string.maps_for_current_location));
- resultGroups.add(matching_maps);
- resultChilds.add(maps_current_position_childs);
-
- // add all maps
- for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) {
- if (osm_maps[currentMapIndex].level == 0) {
- if (secList != null && 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);
- }
-
- 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");
- child.put("map_index", String.valueOf(currentMapIndex));
-
- secList.add(child);
- }
- resultChilds.add(secList);
-
- return new SimpleExpandableListAdapter(this, resultGroups, android.R.layout.simple_expandable_list_item_1,
- new String[] { "category_name" }, new int[] { android.R.id.text1 }, resultChilds,
- android.R.layout.simple_expandable_list_item_1, new String[] { "map_name" },
- new int[] { android.R.id.text1 });
- }
-
- @Override
- public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
- super.onChildClick(parent, v, groupPosition, childPosition, id);
- Log.d("Navit", "p:" + groupPosition + ", child_pos:" + childPosition);
-
- @SuppressWarnings("unchecked")
- HashMap<String, String> child = (HashMap<String, String>) adapter.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) {
- NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null,
- Navit.T("Sorry, we currently do not support maps above 3.8G on Android, please select a smaller one."),
- -1, 0, 0);
- return true;
- }
- Intent resultIntent = new Intent();
- resultIntent.putExtra("map_index", mi);
- setResult(Activity.RESULT_OK, resultIntent);
- finish();
- } else {
- // ask user if to delete this map
- askForMapDeletion(child.get("map_location"));
- }
- return true;
- }
-
- private void askForMapDeletion(final String map_location) {
- AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this);
- deleteMapBox.setTitle(R.string.map_delete); // Android also takes recource id
- deleteMapBox.setCancelable(true);
-
- NavitMap maptoDelete = new NavitMap(map_location);
- deleteMapBox.setMessage(maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + "MB");
-
-
- // TRANS
- deleteMapBox.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- Log.e("Navit", "Delete Map");
- Message msg =
- Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler,
- NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal());
- Bundle b = new Bundle();
- b.putString("title", map_location);
- msg.setData(b);
- msg.sendToTarget();
- finish();
- }
- });
-
- // TRANS
- deleteMapBox.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface arg0, int arg1) {
- Log.e("Navit", "don't delete map");
- }
- });
- deleteMapBox.show();
- }
-}
+/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +package org.navitproject.navit; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ExpandableListActivity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.location.Location; +import android.location.LocationManager; +import android.os.Bundle; +import android.os.Message; +import android.os.StatFs; +import android.util.Log; +import android.view.View; +import android.widget.ExpandableListView; +import android.widget.RelativeLayout; +import android.widget.SimpleExpandableListAdapter; +import android.widget.TextView; + +public class NavitDownloadSelectMapActivity extends ExpandableListActivity { + + private static SimpleExpandableListAdapter adapter = null; + private static final String MAP_BULLETPOINT = " * "; + 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; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (adapter == null) { + adapter = createAdapter(); + } + updateDownloadedMaps(); + updateMapsForLocation(NavitMapDownloader.osm_maps); + setListAdapter(adapter); + try { + setTitle(String.valueOf(getFreeSpace() / 1024 / 1024) + "MB available"); + } catch (Exception e) { + Log.e("Navit","Exception "+e.getClass().getName()+" during getFreeSpace, reporting 'no sdcard present'"); + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, + String.format(Navit.T("Current map location %s is not available\nPlease restart Navit after you attach an SD card or select a different map location."),Navit.map_filename_path), + -1, 0, 0); + finish(); + } + } + + protected long getFreeSpace() + { + StatFs fsInfo = new StatFs(Navit.map_filename_path); + return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); + } + + private void updateDownloadedMaps() { + downloaded_maps_childs.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"); + child.put("map_location", map.getLocation()); + downloaded_maps_childs.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)) { + if (currentLocation == null) { + LocationManager mapLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + List<String> providers = mapLocationManager.getProviders(true); + long lastUpdate = 0; + long bestUpdateTime = -1; + for (String provider : providers) { + Location lastKnownLocation = mapLocationManager.getLastKnownLocation(provider); + if (lastKnownLocation != null) { + lastUpdate = lastKnownLocation.getTime(); + if (lastUpdate > bestUpdateTime) { + currentLocation = lastKnownLocation; + bestUpdateTime = lastUpdate; + } + } + } + } else currentLocationKnown = 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; 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) + "MB"); + currentPositionMapChild.put("map_index", String.valueOf(currentMapIndex)); + + maps_current_position_childs.add(currentPositionMapChild); + } + } + } + } + } + + 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>>>(); + + // 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.T("Downloaded maps")); + resultGroups.add(downloaded_maps_hash); + downloaded_maps_childs = new ArrayList<HashMap<String, String>>(); + resultChilds.add(downloaded_maps_childs); + + ArrayList<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>(); + maps_current_position_childs = new ArrayList<HashMap<String, String>>(); + // maps containing the current location + HashMap<String, String> matching_maps = new HashMap<String, String>(); + matching_maps.put("category_name", Navit.NavitResources.getString(R.string.maps_for_current_location)); + resultGroups.add(matching_maps); + resultChilds.add(maps_current_position_childs); + + // add all maps + for (int currentMapIndex = 0; currentMapIndex < osm_maps.length; currentMapIndex++) { + if (osm_maps[currentMapIndex].level == 0) { + if (secList != null && 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); + } + + 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"); + child.put("map_index", String.valueOf(currentMapIndex)); + + secList.add(child); + } + resultChilds.add(secList); + + return new SimpleExpandableListAdapter(this, resultGroups, android.R.layout.simple_expandable_list_item_1, + new String[] { "category_name" }, new int[] { android.R.id.text1 }, resultChilds, + android.R.layout.simple_expandable_list_item_1, new String[] { "map_name" }, + new int[] { android.R.id.text1 }); + } + + @Override + public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { + super.onChildClick(parent, v, groupPosition, childPosition, id); + Log.d("Navit", "p:" + groupPosition + ", child_pos:" + childPosition); + + @SuppressWarnings("unchecked") + HashMap<String, String> child = (HashMap<String, String>) adapter.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) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST_LONG, null, + Navit.T("Sorry, we currently do not support maps above 3.8G on Android, please select a smaller one."), + -1, 0, 0); + return true; + } + Intent resultIntent = new Intent(); + resultIntent.putExtra("map_index", mi); + setResult(Activity.RESULT_OK, resultIntent); + finish(); + } else { + // ask user if to delete this map + askForMapDeletion(child.get("map_location")); + } + return true; + } + + private void askForMapDeletion(final String map_location) { + AlertDialog.Builder deleteMapBox = new AlertDialog.Builder(this); + deleteMapBox.setTitle(R.string.map_delete); // Android also takes recource id + deleteMapBox.setCancelable(true); + + NavitMap maptoDelete = new NavitMap(map_location); + deleteMapBox.setMessage(maptoDelete.mapName + " " + String.valueOf(maptoDelete.size() / 1024 / 1024) + "MB"); + + + // TRANS + deleteMapBox.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.e("Navit", "Delete Map"); + Message msg = + Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, + NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); + Bundle b = new Bundle(); + b.putString("title", map_location); + msg.setData(b); + msg.sendToTarget(); + finish(); + } + }); + + // TRANS + deleteMapBox.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface arg0, int arg1) { + Log.e("Navit", "don't delete map"); + } + }); + deleteMapBox.show(); + } +} diff --git a/navit/android/src/org/navitproject/navit/NavitMapDownloader.java b/navit/android/src/org/navitproject/navit/NavitMapDownloader.java index c3a6aadd0..dc520ff30 100644 --- a/navit/android/src/org/navitproject/navit/NavitMapDownloader.java +++ b/navit/android/src/org/navitproject/navit/NavitMapDownloader.java @@ -1,709 +1,709 @@ -/**
- * Navit, a modular navigation system.
- * Copyright (C) 2005-2008 Navit Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-package org.navitproject.navit;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import android.location.Location;
-import android.os.Bundle;
-import android.os.Message;
-import android.os.StatFs;
-import android.util.Log;
-
-/**
- * @author rikky
- *
- */
-public class NavitMapDownloader extends Thread
-{
- public static class osm_map_values
- {
- String lon1;
- String lat1;
- String lon2;
- String lat2;
- String map_name = "";
- long est_size_bytes = 0;
- int level = 0;
-
-
- 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;
- }
-
- 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);
-
- if (location.getLongitude() < longitude_1)
- return false;
- if (location.getLongitude() > longitude_2)
- return false;
- if (location.getLatitude() < latitude_1)
- return false;
- if (location.getLatitude() > latitude_2)
- return false;
-
- return true;
- }
- }
-
- //
- // define the maps here
- // size estimations updated 2017-06-22
- //
- public static final osm_map_values[] osm_maps = {
- new osm_map_values(Navit.T("Whole Planet"), "-180", "-90", "180", "90", 23992258630L, 0),
- new osm_map_values(Navit.T("Africa"), "-30.89", "-36.17", "61.68", "38.40", 2070076339L, 0),
- new osm_map_values(Navit.T("Angola"), "11.4", "-18.1", "24.2", "-5.3", 127557789L, 1),
- new osm_map_values(Navit.T("Burundi"), "28.9", "-4.5", "30.9", "-2.2", 124049667L, 1),
- new osm_map_values(Navit.T("Canary Islands"), "-18.69", "26.52", "-12.79", "29.99", 133565815L, 1),
- new osm_map_values(Navit.T("Congo, Democratic Republic of the"), "11.7", "-13.6", "31.5", "5.7", 244228485L, 1),
- new osm_map_values(Navit.T("Ethiopia"), "32.89", "3.33", "48.07", "14.97", 153067406L, 1),
- new osm_map_values(Navit.T("Guinea"), "-15.47", "7.12", "-7.58", "12.74", 188047126L, 1),
- new osm_map_values(Navit.T("Cote d'Ivoire"), "-8.72", "4.09", "-2.43", "10.80", 132187496L, 1),
- new osm_map_values(Navit.T("Kenya"), "33.8", "-5.2", "42.4", "4.9", 190073089L, 1),
- new osm_map_values(Navit.T("Lesotho"), "26.9", "-30.7", "29.6", "-28.4", 196189429L, 1),
- new osm_map_values(Navit.T("Liberia"), "-15.00", "-0.73", "-7.20", "8.65", 156257253L, 1),
- new osm_map_values(Navit.T("Libya"), "9.32", "19.40", "25.54", "33.63", 126046917L, 1),
- new osm_map_values(Navit.T("Madagascar"), "42.25", "-26.63", "51.20", "-11.31", 145210721L, 1),
- new osm_map_values(Navit.T("Namibia")+"+"+Navit.T("Botswana"), "11.4", "-29.1", "29.5", "-16.9", 248970987L, 1),
- new osm_map_values(Navit.T("Reunion"), "55.2", "-21.4", "55.9", "-20.9", 126008774L, 1),
- new osm_map_values(Navit.T("Rwanda"), "28.8", "-2.9", "30.9", "-1.0", 128267595L, 1),
- new osm_map_values(Navit.T("South Africa")+"+"+Navit.T("Lesotho"), "15.93", "-36.36", "33.65", "-22.08", 307280006L, 1),
- new osm_map_values(Navit.T("Tanzania, United Republic of"), "29.19", "-11.87", "40.74", "-0.88", 253621029L, 1),
- new osm_map_values(Navit.T("Uganda"), "29.3", "-1.6", "35.1", "4.3", 179134521L, 1),
- new osm_map_values(Navit.T("Asia"), "23.8", "0.1", "195.0", "82.4", 5113673780L, 0),
- new osm_map_values(Navit.T("Azerbaijan"), "44.74", "38.34", "51.69", "42.37", 138346406L, 1),
- new osm_map_values(Navit.T("China"), "67.3", "5.3", "135.0", "54.5", 1718108758L, 1),
- new osm_map_values(Navit.T("Cyprus"), "32.0", "34.5", "34.9", "35.8", 118472448L, 1),
- new osm_map_values(Navit.T("India")+"+"+Navit.T("Nepal"), "67.9", "5.5", "89.6", "36.0", 601877877L, 1),
- new osm_map_values(Navit.T("Indonesia"), "93.7", "-17.3", "155.5", "7.6", 420741405L, 1),
- new osm_map_values(Navit.T("Iran, Islamic Republic of"), "43.5", "24.4", "63.6", "40.4", 242016066L, 1),
- new osm_map_values(Navit.T("Iraq"), "38.7", "28.5", "49.2", "37.4", 160751805L, 1),
- new osm_map_values(Navit.T("Israel"), "33.99", "29.8", "35.95", "33.4", 155685778L, 1),
- new osm_map_values(Navit.T("Japan")+"+"+Navit.T("Korea"), "123.6", "25.2", "151.3", "47.1", 1029080156L, 1),
- new osm_map_values(Navit.T("Kazakhstan"), "46.44", "40.89", "87.36", "55.45", 407633007L, 1),
- new osm_map_values(Navit.T("Kyrgyzstan"), "69.23", "39.13", "80.33", "43.29", 147997835L, 1),
- new osm_map_values(Navit.T("Malaysia")+"+"+Navit.T("Singapore"), "94.3", "-5.9", "108.6", "6.8", 168816435L, 1),
- new osm_map_values(Navit.T("Mongolia"), "87.5", "41.4", "120.3", "52.7", 153534851L, 1),
- new osm_map_values(Navit.T("Pakistan"), "60.83", "23.28", "77.89", "37.15", 217644321L, 1),
- new osm_map_values(Navit.T("Philippines"), "115.58", "4.47", "127.85", "21.60", 281428307L, 1),
- new osm_map_values(Navit.T("Saudi Arabia"), "33.2", "16.1", "55.9", "33.5", 242648303L, 1),
- new osm_map_values(Navit.T("Taiwan"), "119.1", "21.5", "122.5", "25.2", 1029080156L, 1),
- new osm_map_values(Navit.T("Thailand"), "97.5", "5.7", "105.2", "19.7", 185135492L, 1),
- new osm_map_values(Navit.T("Turkey"), "25.1", "35.8", "46.4", "42.8", 331087441L, 1),
- new osm_map_values(Navit.T("Turkmenistan"), "51.78", "35.07", "66.76", "42.91", 131045087L, 1),
- new osm_map_values(Navit.T("UAE+Other"), "51.5", "22.6", "56.7", "26.5", 128934674L, 1),
- new osm_map_values(Navit.T("Australia")+"+"+Navit.T("Oceania"), "89.84", "-57.39", "179.79", "7.26", 782722650L, 0),
- new osm_map_values(Navit.T("Australia"), "110.5", "-44.2", "154.9", "-9.2", 348652900L, 0),
- new osm_map_values(Navit.T("Tasmania"), "144.0", "-45.1", "155.3", "-24.8", 253231890L, 1),
- new osm_map_values(Navit.T("Victoria")+"+"+Navit.T("New South Wales"), "140.7", "-39.4", "153.7", "-26.9", 241500829L, 1),
- new osm_map_values(Navit.T("New Caledonia"), "157.85", "-25.05", "174.15", "-16.85", 115512336L, 1),
- new osm_map_values(Navit.T("New Zealand"), "165.2", "-47.6", "179.1", "-33.7", 239264192L, 1),
- new osm_map_values(Navit.T("Europe"), "-12.97", "33.59", "34.15", "72.10", 11984126789L, 0),
- new osm_map_values(Navit.T("Western Europe"), "-17.6", "34.5", "42.9", "70.9", 12648810717L, 1),
- new osm_map_values(Navit.T("Austria"), "9.4", "46.32", "17.21", "49.1", 898273634L, 1),
- new osm_map_values(Navit.T("Azores"), "-31.62", "36.63", "-24.67", "40.13", 112687225L, 1),
- new osm_map_values(Navit.T("BeNeLux"), "2.08", "48.87", "7.78", "54.52", 1771971595L, 1),
- new osm_map_values(Navit.T("Netherlands"), "3.07", "50.75", "7.23", "53.73", 1191828033L, 1),
- new osm_map_values(Navit.T("Denmark"), "7.65", "54.32", "15.58", "58.07", 365606979L, 1),
- new osm_map_values(Navit.T("Faroe Islands"), "-7.8", "61.3", "-6.1", "62.5", 109377568L, 1),
- new osm_map_values(Navit.T("France"), "-5.45", "42.00", "8.44", "51.68", 3907969744L, 1),
- new osm_map_values(Navit.T("Alsace"), "6.79", "47.27", "8.48", "49.17", 354249349L, 2),
- new osm_map_values(Navit.T("Aquitaine"), "-2.27", "42.44", "1.50", "45.76", 443715019L, 2),
- new osm_map_values(Navit.T("Auvergne"), "2.01", "44.57", "4.54", "46.85", 287663213L, 2),
- new osm_map_values(Navit.T("Basse-Normandie"), "-2.09", "48.13", "1.03", "49.98", 262352354L, 2),
- new osm_map_values(Navit.T("Bourgogne"), "2.80", "46.11", "5.58", "48.45", 298868796L, 2),
- new osm_map_values(Navit.T("Bretagne"), "-5.58", "46.95", "-0.96", "48.99", 382770794L, 2),
- new osm_map_values(Navit.T("Centre"), "0.01", "46.29", "3.18", "48.99", 474224721L, 2),
- new osm_map_values(Navit.T("Champagne-Ardenne"), "3.34", "47.53", "5.94", "50.28", 269947824L, 2),
- new osm_map_values(Navit.T("Corse"), "8.12", "41.32", "9.95", "43.28", 129902146L, 2),
- new osm_map_values(Navit.T("Franche-Comte"), "5.20", "46.21", "7.83", "48.07", 324476070L, 2),
- new osm_map_values(Navit.T("Haute-Normandie"), "-0.15", "48.62", "1.85", "50.18", 202782876L, 2),
- new osm_map_values(Navit.T("Ile-de-France"), "1.40", "48.07", "3.61", "49.29", 311052699L, 2),
- new osm_map_values(Navit.T("Languedoc-Roussillon"), "1.53", "42.25", "4.89", "45.02", 380145667L, 2),
- new osm_map_values(Navit.T("Limousin"), "0.58", "44.87", "2.66", "46.50", 206696539L, 2),
- new osm_map_values(Navit.T("Lorraine"), "4.84", "47.77", "7.72", "49.73", 330777318L, 2),
- new osm_map_values(Navit.T("Midi-Pyrenees"), "-0.37", "42.18", "3.50", "45.10", 462618363L, 2),
- new osm_map_values(Navit.T("Nord-pas-de-Calais"), "1.42", "49.92", "4.49", "51.31", 368467511L, 2),
- new osm_map_values(Navit.T("Pays-de-la-Loire"), "-2.88", "46.20", "0.97", "48.62", 499471143L, 2),
- new osm_map_values(Navit.T("Picardie"), "1.25", "48.79", "4.31", "50.43", 374308041L, 2),
- new osm_map_values(Navit.T("Poitou-Charentes"), "-1.69", "45.04", "1.26", "47.23", 342125526L, 2),
- new osm_map_values(Navit.T("Provence-Alpes-Cote-d-Azur"), "4.21", "42.91", "7.99", "45.18", 390306134L, 2),
- new osm_map_values(Navit.T("Rhone-Alpes"), "3.65", "44.07", "7.88", "46.64", 510797942L, 2),
- new osm_map_values(Navit.T("Germany"), "5.18", "46.84", "15.47", "55.64", 3521359466L, 1),
- new osm_map_values(Navit.T("Baden-Wuerttemberg"), "7.32", "47.14", "10.57", "49.85", 674361124L, 2),
- new osm_map_values(Navit.T("Bayern"), "8.92", "47.22", "13.90", "50.62", 860161150L, 2),
- new osm_map_values(Navit.T("Mittelfranken"), "9.86", "48.78", "11.65", "49.84", 203055195L, 2),
- new osm_map_values(Navit.T("Niederbayern"), "11.55", "47.75", "14.12", "49.42", 312924770L, 2),
- new osm_map_values(Navit.T("Oberbayern"), "10.67", "47.05", "13.57", "49.14", 382734883L, 2),
- new osm_map_values(Navit.T("Oberfranken"), "10.31", "49.54", "12.49", "50.95", 235258691L, 2),
- new osm_map_values(Navit.T("Oberpfalz"), "11.14", "48.71", "13.47", "50.43", 264536012L, 2),
- new osm_map_values(Navit.T("Schwaben"), "9.27", "47.10", "11.36", "49.09", 321141607L, 2),
- new osm_map_values(Navit.T("Unterfranken"), "8.59", "49.16", "10.93", "50.67", 303720890L, 2),
- new osm_map_values(Navit.T("Berlin"), "13.03", "52.28", "13.81", "52.73", 169019946L, 2),
- new osm_map_values(Navit.T("Brandenburg"), "11.17", "51.30", "14.83", "53.63", 323497599L, 2),
- new osm_map_values(Navit.T("Bremen"), "8.43", "52.96", "9.04", "53.66", 150963608L, 2),
- new osm_map_values(Navit.T("Hamburg"), "9.56", "53.34", "10.39", "53.80", 156284421L, 2),
- new osm_map_values(Navit.T("Hessen"), "7.72", "49.34", "10.29", "51.71", 432279328L, 2),
- new osm_map_values(Navit.T("Mecklenburg-Vorpommern"), "10.54", "53.05", "14.48", "55.05", 213183908L, 2),
- new osm_map_values(Navit.T("Niedersachsen"), "6.40", "51.24", "11.69", "54.22", 819766939L, 2),
- new osm_map_values(Navit.T("Nordrhein-westfalen"), "5.46", "50.26", "9.52", "52.59", 967053517L, 2),
- new osm_map_values(Navit.T("Rheinland-Pfalz"), "6.06", "48.91", "8.56", "51.00", 442868899L, 2),
- new osm_map_values(Navit.T("Saarland"), "6.30", "49.06", "7.46", "49.69", 157721162L, 2),
- new osm_map_values(Navit.T("Sachsen-Anhalt"), "10.50", "50.88", "13.26", "53.11", 287785088L, 2),
- new osm_map_values(Navit.T("Sachsen"), "11.82", "50.11", "15.10", "51.73", 342620834L, 2),
- new osm_map_values(Navit.T("Schleswig-Holstein"), "7.41", "53.30", "11.98", "55.20", 280293910L, 2),
- new osm_map_values(Navit.T("Thueringen"), "9.81", "50.15", "12.72", "51.70", 269428239L, 2),
- new osm_map_values(Navit.T("Germany")+"+"+Navit.T("Austria")+"+"+Navit.T("Switzerland"), "3.4", "44.5", "18.6", "55.1", 5746126429L, 1),
- new osm_map_values(Navit.T("Iceland"), "-25.3", "62.8", "-11.4", "67.5", 124837162L, 1),
- new osm_map_values(Navit.T("Ireland"), "-11.17", "51.25", "-5.23", "55.9", 234750271L, 1),
- new osm_map_values(Navit.T("Italy"), "6.52", "36.38", "18.96", "47.19", 1610171395L, 1),
- new osm_map_values(Navit.T("Spain")+"+"+Navit.T("Portugal"), "-11.04", "34.87", "4.62", "44.41", 1039624918L, 1),
- new osm_map_values(Navit.T("Mallorca"), "2.2", "38.8", "4.7", "40.2", 137200636L, 2),
- new osm_map_values(Navit.T("Galicia"), "-10.0", "41.7", "-6.3", "44.1", 174549553L, 2),
- new osm_map_values(Navit.T("Scandinavia"), "4.0", "54.4", "32.1", "71.5", 1398661090L, 1),
- new osm_map_values(Navit.T("Finland"), "18.6", "59.2", "32.3", "70.3", 460997178L, 1),
- new osm_map_values(Navit.T("Denmark"), "7.49", "54.33", "13.05", "57.88", 321870414L, 1),
- new osm_map_values(Navit.T("Switzerland"), "5.79", "45.74", "10.59", "47.84", 552565332L, 1),
- new osm_map_values(Navit.T("United Kingdom"), "-9.7", "49.6", "2.2", "61.2", 901724648L, 1),
- new osm_map_values(Navit.T("England"), "-7.80", "48.93", "2.41", "56.14", 937728414L, 1),
- new osm_map_values(Navit.T("Buckinghamshire"), "-1.19", "51.44", "-0.43", "52.25", 142256978L, 2),
- new osm_map_values(Navit.T("Cambridgeshire"), "-0.55", "51.96", "0.56", "52.79", 142334001L, 2),
- new osm_map_values(Navit.T("Cumbria"), "-3.96", "53.85", "-2.11", "55.24", 144422460L, 2),
- new osm_map_values(Navit.T("East yorkshire with hull"), "-1.16", "53.50", "0.54", "54.26", 141518744L, 2),
- new osm_map_values(Navit.T("Essex"), "-0.07", "51.40", "1.36", "52.14", 162542730L, 2),
- new osm_map_values(Navit.T("Herefordshire"), "-3.19", "51.78", "-2.29", "52.45", 129368660L, 2),
- new osm_map_values(Navit.T("Kent"), "-0.02", "50.81", "1.65", "51.53", 145482562L, 2),
- new osm_map_values(Navit.T("Lancashire"), "-3.20", "53.43", "-2.00", "54.29", 148964975L, 2),
- new osm_map_values(Navit.T("Leicestershire"), "-1.65", "52.34", "-0.61", "53.03", 154199956L, 2),
- new osm_map_values(Navit.T("Norfolk"), "0.10", "52.30", "2.04", "53.41", 146017009L, 2),
- new osm_map_values(Navit.T("Nottinghamshire"), "-1.39", "52.73", "-0.62", "53.55", 147986548L, 2),
- new osm_map_values(Navit.T("Oxfordshire"), "-1.77", "51.41", "-0.82", "52.22", 142240992L, 2),
- new osm_map_values(Navit.T("Shropshire"), "-3.29", "52.26", "-2.18", "53.05", 136909363L, 2),
- new osm_map_values(Navit.T("Somerset"), "-3.89", "50.77", "-2.20", "51.40", 145186096L, 2),
- new osm_map_values(Navit.T("South yorkshire"), "-1.88", "53.25", "-0.80", "53.71", 145902650L, 2),
- new osm_map_values(Navit.T("Suffolk"), "0.29", "51.88", "1.81", "52.60", 143799697L, 2),
- new osm_map_values(Navit.T("Surrey"), "-0.90", "51.02", "0.10", "51.52", 157987139L, 2),
- new osm_map_values(Navit.T("Wiltshire"), "-2.41", "50.90", "-1.44", "51.76", 138652346L, 2),
- new osm_map_values(Navit.T("Scotland"), "-8.13", "54.49", "-0.15", "61.40", 258853845L, 2),
- new osm_map_values(Navit.T("Wales"), "-5.56", "51.28", "-2.60", "53.60", 193593409L, 2),
- new osm_map_values(Navit.T("Albania"), "19.09", "39.55", "21.12", "42.72", 146199817L, 1),
- new osm_map_values(Navit.T("Belarus"), "23.12", "51.21", "32.87", "56.23", 324470696L, 1),
- new osm_map_values(Navit.T("Russian Federation"), "27.9", "41.5", "190.4", "77.6", 2148314279L, 1),
- new osm_map_values(Navit.T("Bulgaria"), "24.7", "42.1", "24.8", "42.1", 109869373L, 1),
- new osm_map_values(Navit.T("Bosnia and Herzegovina"), "15.69", "42.52", "19.67", "45.32", 187122485L, 1),
- new osm_map_values(Navit.T("Czech Republic"), "11.91", "48.48", "19.02", "51.17", 904838442L, 1),
- new osm_map_values(Navit.T("Croatia"), "13.4", "42.1", "19.4", "46.9", 460854751L, 1),
- new osm_map_values(Navit.T("Estonia"), "21.5", "57.5", "28.2", "59.6", 173378927L, 1),
- new osm_map_values(Navit.T("Greece"), "28.9", "37.8", "29.0", "37.8", 109435051L, 1),
- new osm_map_values(Navit.T("Crete"), "23.3", "34.5", "26.8", "36.0", 115985063L, 1),
- new osm_map_values(Navit.T("Hungary"), "16.08", "45.57", "23.03", "48.39", 350318541L, 1),
- new osm_map_values(Navit.T("Latvia"), "20.7", "55.6", "28.3", "58.1", 188188140L, 1),
- new osm_map_values(Navit.T("Lithuania"), "20.9", "53.8", "26.9", "56.5", 217852597L, 1),
- new osm_map_values(Navit.T("Poland"), "13.6", "48.8", "24.5", "55.0", 1464968657L, 1),
- new osm_map_values(Navit.T("Romania"), "20.3", "43.5", "29.9", "48.4", 347931565L, 1),
- new osm_map_values(Navit.T("Ukraine"), "22.0", "44.3", "40.4", "52.4", 793611912L, 1),
- new osm_map_values(Navit.T("North America"), "-178.1", "6.5", "-10.4", "84.0", 5601866516L, 0),
- new osm_map_values(Navit.T("Alaska"), "-179.5", "49.5", "-129", "71.6", 207746039L, 1),
- new osm_map_values(Navit.T("Canada"), "-141.3", "41.5", "-52.2", "70.2", 2635719651L, 1),
- new osm_map_values(Navit.T("Hawaii"), "-161.07", "18.49", "-154.45", "22.85", 115016656L, 1),
- new osm_map_values(Navit.T("USA")+Navit.T(" (except Alaska and Hawaii)"), "-125.4", "24.3", "-66.5", "49.3", 4060487198L, 1),
- new osm_map_values(Navit.T("Midwest"), "-104.11", "35.92", "-80.46", "49.46", 1145596450L, 2),
- new osm_map_values(Navit.T("Michigan"), "-90.47", "41.64", "-79.00", "49.37", 538247019L, 2),
- new osm_map_values(Navit.T("Ohio"), "-84.87", "38.05", "-79.85", "43.53", 277022336L, 2),
- new osm_map_values(Navit.T("Northeast"), "-80.58", "38.72", "-66.83", "47.53", 1017160709L, 2),
- new osm_map_values(Navit.T("Massachusetts"), "-73.56", "40.78", "-68.67", "42.94", 340055487L, 2),
- new osm_map_values(Navit.T("Vermont"), "-73.49", "42.68", "-71.41", "45.07", 139626067L, 2),
- new osm_map_values(Navit.T("Pacific"), "-180.05", "15.87", "-129.75", "73.04", 207090640L, 2),
- new osm_map_values(Navit.T("South"), "-106.70", "23.98", "-71.46", "40.70", 1747935356L, 2),
- new osm_map_values(Navit.T("Arkansas"), "-94.67", "32.95", "-89.59", "36.60", 155658661L, 2),
- new osm_map_values(Navit.T("District of Columbia"), "-77.17", "38.74", "-76.86", "39.05", 129235755L, 2),
- new osm_map_values(Navit.T("Florida"), "-88.75", "23.63", "-77.67", "31.05", 224022108L, 2),
- new osm_map_values(Navit.T("Louisiana"), "-94.09", "28.09", "-88.62", "33.07", 210120605L, 2),
- new osm_map_values(Navit.T("Maryland"), "-79.54", "37.83", "-74.99", "40.22", 276462622L, 2),
- new osm_map_values(Navit.T("Mississippi"), "-91.71", "29.99", "-88.04", "35.05", 177858031L, 2),
- new osm_map_values(Navit.T("Oklahoma"), "-103.41", "33.56", "-94.38", "37.38", 200061473L, 2),
- new osm_map_values(Navit.T("Texas"), "-106.96", "25.62", "-92.97", "36.58", 430089141L, 2),
- new osm_map_values(Navit.T("Virginia"), "-83.73", "36.49", "-74.25", "39.52", 384187569L, 2),
- new osm_map_values(Navit.T("West Virginia"), "-82.70", "37.15", "-77.66", "40.97", 220552071L, 2),
- new osm_map_values(Navit.T("West"), "-133.11", "31.28", "-101.99", "49.51", 1152909162L, 2),
- new osm_map_values(Navit.T("Arizona"), "-114.88", "30.01", "-108.99", "37.06", 182826833L, 2),
- new osm_map_values(Navit.T("California"), "-125.94", "32.43", "-114.08", "42.07", 586923326L, 2),
- new osm_map_values(Navit.T("Colorado"), "-109.11", "36.52", "-100.41", "41.05", 228623724L, 2),
- new osm_map_values(Navit.T("Idaho"), "-117.30", "41.93", "-110.99", "49.18", 170684507L, 2),
- new osm_map_values(Navit.T("Montana"), "-116.10", "44.31", "-102.64", "49.74", 176229800L, 2),
- new osm_map_values(Navit.T("New Mexico"), "-109.10", "26.98", "-96.07", "37.05", 361793070L, 2),
- new osm_map_values(Navit.T("Nevada"), "-120.2", "35.0", "-113.8", "42.1", 200614482L, 2),
- new osm_map_values(Navit.T("Oregon"), "-124.8", "41.8", "-116.3", "46.3", 211462685L, 2),
- new osm_map_values(Navit.T("Utah"), "-114.11", "36.95", "-108.99", "42.05", 151590197L, 2),
- new osm_map_values(Navit.T("Washington State"), "-125.0", "45.5", "-116.9", "49.0", 222553768L, 2),
- new osm_map_values(Navit.T("South+Middle America"), "-83.5", "-56.3", "-30.8", "13.7", 958895383L, 0),
- new osm_map_values(Navit.T("Argentina"), "-73.9", "-57.3", "-51.6", "-21.0", 376857648L, 1),
- new osm_map_values(Navit.T("Argentina")+"+"+Navit.T("Chile"), "-77.2", "-56.3", "-52.7", "-16.1", 420275812L, 1),
- new osm_map_values(Navit.T("Bolivia"), "-70.5", "-23.1", "-57.3", "-9.3", 175937824L, 1),
- new osm_map_values(Navit.T("Brazil"), "-71.4", "-34.7", "-32.8", "5.4", 664872975L, 1),
- new osm_map_values(Navit.T("Chile"), "-81.77", "-58.50", "-65.46", "-17.41", 241657330L, 1),
- new osm_map_values(Navit.T("Cuba"), "-85.3", "19.6", "-74.0", "23.6", 129043575L, 1),
- new osm_map_values(Navit.T("Colombia"), "-79.1", "-4.0", "-66.7", "12.6", 212016580L, 1),
- new osm_map_values(Navit.T("Ecuador"), "-82.6", "-5.4", "-74.4", "2.3", 158857591L, 1),
- new osm_map_values(Navit.T("Guyana")+"+"+Navit.T("Suriname")+"+"+Navit.T("Guyane Francaise"), "-62.0", "1.0", "-51.2", "8.9", 123000072L, 1),
- new osm_map_values(Navit.T("Haiti")+"+"+Navit.T("Dominican Republic"), "-74.8", "17.3", "-68.2", "20.1", 149925689L, 1),
- new osm_map_values(Navit.T("Jamaica"), "-78.6", "17.4", "-75.9", "18.9", 113961998L, 1),
- new osm_map_values(Navit.T("Mexico"), "-117.6", "14.1", "-86.4", "32.8", 551307973L, 1),
- new osm_map_values(Navit.T("Paraguay"), "-63.8", "-28.1", "-53.6", "-18.8", 159498397L, 1),
- new osm_map_values(Navit.T("Peru"), "-82.4", "-18.1", "-67.5", "0.4", 212490557L, 1),
- new osm_map_values(Navit.T("Uruguay"), "-59.2", "-36.5", "-51.7", "-29.7", 157482719L, 1),
- new osm_map_values(Navit.T("Venezuela"), "-73.6", "0.4", "-59.7", "12.8", 167295729L, 1)
- };
-
- private String map_filename_path;
-
- public static NavitMap[] getAvailableMaps() {
- class filterMaps implements FilenameFilter {
- public boolean accept(File dir, String filename) {
- return (filename.endsWith(".bin"));
- }
- }
- 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]);
- }
- }
- return maps;
- }
- private Boolean stop_me = false;
- private osm_map_values map_values;
- private int map_id;
- private long uiLastUpdated = -1;
-
- private Boolean retryDownload = false; //Download failed, but
- //we should try to resume
- private static final int SOCKET_CONNECT_TIMEOUT = 60000; // 60 secs.
- private static final int SOCKET_READ_TIMEOUT = 120000; // 120 secs.
- private static final int MAP_WRITE_FILE_BUFFER = 1024 * 64;
- private static final int MAP_WRITE_MEM_BUFFER = 1024 * 64;
- 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 static final String TAG = "NavitMapDownloader";
-
- 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;
- }
-
- public void run() {
- stop_me = false;
- retry_counter = 0;
-
- Log.v(TAG, "start download " + map_values.map_name);
- updateProgress(0, map_values.est_size_bytes, Navit.T("downloading") + ": " + map_values.map_name);
-
- boolean success;
- do {
- try {
- Thread.sleep(10 + retry_counter * 1000);
- } catch (InterruptedException e1) {}
- retryDownload = false;
- success = download_osm_map();
- } while ( !success
- && retryDownload
- && retry_counter < MAX_RETRIES
- && !stop_me);
-
- if (success) {
- toast(map_values.map_name + " " + Navit.T("ready"));
- getMapInfoFile().delete();
- Log.d(TAG, "success");
- }
-
- if (success || stop_me ) {
- NavitDialogs.sendDialogMessage( NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED
- , map_filename_path + map_values.map_name + ".bin", null, -1, success ? 1 : 0 , map_id );
- }
- }
-
- public void stop_thread() {
- stop_me = true;
- Log.d(TAG, "stop_me -> true");
- }
-
- private boolean checkFreeSpace(long needed_bytes) {
- long free_space = getFreeSpace();
-
- if ( needed_bytes <= 0 )
- needed_bytes = MAP_WRITE_FILE_BUFFER;
-
- if (free_space < needed_bytes ) {
- 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.T("Media selected for map storage is not available");
- else
- msg=Navit.T("Not enough free space");
- updateProgress(free_space, needed_bytes, Navit.T("Error downloading map!") + "\n" + msg);
- return false;
- }
- return true;
- }
-
- private boolean deleteMap() {
- File finalOutputFile = getMapFile();
-
- if (finalOutputFile.exists()) {
- Message msg =
- Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler,
- NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal());
- Bundle b = new Bundle();
- b.putString("title", finalOutputFile.getAbsolutePath());
- msg.setData(b);
- msg.sendToTarget();
- return true;
- }
- return false;
- }
-
- /**
- * @param map_values
- * @return
- */
- private boolean download_osm_map() {
- long already_read = 0;
- long real_size_bytes = 0;
- boolean resume = true;
-
- File outputFile = getDestinationFile();
- long old_download_size = outputFile.length();
-
- URL url = null;
- if (old_download_size > 0) {
- url = readFileInfo();
- }
-
- if (url == null) {
- resume = false;
- url = getDownloadURL();
- }
-
- // URL url = new URL("http://192.168.2.101:8080/zweibruecken.bin");
- URLConnection c = initConnection(url);
- if (c != null) {
-
- if (resume) {
- c.setRequestProperty("Range", "bytes=" + old_download_size + "-");
- already_read = old_download_size;
- }
- try {
- real_size_bytes=Long.parseLong(c.getHeaderField("Content-Length")) + already_read;
- } catch(Exception e) {
- real_size_bytes=-1;
- }
-
- long fileTime = c.getLastModified();
-
- if (!resume) {
- outputFile.delete();
- writeFileInfo(c, real_size_bytes);
- }
-
- if (real_size_bytes <= 0)
- real_size_bytes = map_values.est_size_bytes;
-
- Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + fileTime
- + ", Connection ref: " + c.getURL());
-
- if (checkFreeSpace(real_size_bytes - already_read)
- && downloadData(c, already_read, real_size_bytes, resume, outputFile)) {
-
- File finalOutputFile = getMapFile();
- // delete an already existing file first
- finalOutputFile.delete();
- // rename file to its final name
- outputFile.renameTo(finalOutputFile);
- return true;
- }
- }
- return false;
- }
-
- private File getDestinationFile() {
- File outputFile = new File(map_filename_path, map_values.map_name + ".tmp");
- outputFile.getParentFile().mkdir();
- return outputFile;
- }
-
- private boolean downloadData(URLConnection c, long already_read, long real_size_bytes
- , 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);
- // always cleanup, as we might get errors when trying to resume
- try {
- buf.flush();
- buf.close();
-
- bif.close();
- } catch (IOException e) {
- }
- }
- return success;
- }
-
- private URL getDownloadURL() {
- URL url = null;
- try {
- url =
- new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," + map_values.lat1
- + "," + map_values.lon2 + "," + map_values.lat2);
- } catch (MalformedURLException e) {
- Log.e(TAG, "We failed to create a URL to " + map_values.map_name);
- e.printStackTrace();
- return null;
- }
- Log.v(TAG, "connect to " + url.toString());
- return url;
- }
-
- private long getFreeSpace() {
- try {
- StatFs fsInfo = new StatFs(map_filename_path);
- return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize();
- } catch(Exception e) {
- return -1;
- }
- }
-
- private BufferedInputStream getInputStream(URLConnection c) {
- BufferedInputStream bif = null;
- try {
- 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) {
- getMapInfoFile().delete();
- }
- enableRetry();
- bif = null;
- } catch (IOException e) {
- Log.e(TAG, "Error reading from server: " + e);
- enableRetry();
- bif = null;
- }
- return bif;
- }
-
- private File getMapFile() {
- return new File(map_filename_path, map_values.map_name + ".bin");
- }
-
- private File getMapInfoFile() {
- return new File(map_filename_path, map_values.map_name + ".tmp.info");
- }
-
- private BufferedOutputStream getOutputStream(File outputFile, boolean resume) {
- BufferedOutputStream buf = null;
- try {
- buf = new BufferedOutputStream(new FileOutputStream(outputFile, resume), MAP_WRITE_FILE_BUFFER);
- } catch (FileNotFoundException e) {
- Log.e(TAG, "Could not open output file for writing: " + e);
- buf = null;
- }
- return buf;
- }
-
- private URLConnection initConnection(URL url) {
- HttpURLConnection c = null;
- try {
- c = (HttpURLConnection) url.openConnection();
- c.setRequestMethod("GET");
- } catch (Exception e) {
- Log.e(TAG, "Failed connecting server: " + e);
- enableRetry();
- return null;
- }
-
- c.setReadTimeout(SOCKET_READ_TIMEOUT);
- c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT);
- return c;
- }
-
- private boolean readData(OutputStream buf, InputStream bif, long already_read, long real_size_bytes) {
- long start_timestamp = System.nanoTime();
- byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER];
- int len1 = 0;
- long mapFileSize = real_size_bytes;
- long startOffset = already_read;
- boolean success = false;
-
- try {
- while (!stop_me && (len1 = bif.read(buffer)) != -1) {
- already_read += len1;
- updateProgress(start_timestamp, startOffset, already_read, mapFileSize);
-
- 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 (deleteMap()) {
- enableRetry();
- } else {
- updateProgress(already_read, real_size_bytes, Navit.T("Error downloading map!") + "\n"
- + Navit.T("Not enough free space"));
- }
- } else {
- updateProgress(already_read, real_size_bytes, Navit.T("Error writing map!"));
- }
-
- return false;
- }
- }
-
- if (stop_me) {
- toast(Navit.T("Map download aborted!"));
- } else if ( already_read < real_size_bytes ) {
- Log.d(TAG, "Server send only " + already_read + " bytes of " + real_size_bytes);
- enableRetry();
- } else {
- success = true;
- }
- } catch (IOException e) {
- Log.d(TAG, "Error: " + e);
-
- enableRetry();
- updateProgress(already_read, real_size_bytes, Navit.T("Error downloading map!"));
- }
-
- return success;
- }
-
- private URL readFileInfo() {
- URL url = null;
- 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();
- 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);
- } catch (Exception e) {
- getMapInfoFile().delete();
- }
- return url;
- }
-
- private void toast(String message) {
- NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST, null, message, -1, 0, 0);
- }
-
- 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);
-
- String eta_string;
- if (eta_seconds > 60) {
- eta_string = (int) (eta_seconds / 60f) + " m";
- } else {
- eta_string = eta_seconds + " s";
- }
- String info =
- String.format("%s: %s\n %dMb / %dMb\n %.1f kb/s %s: %s", Navit.T("downloading")
- , map_values.map_name, readBytes / 1024 / 1024, maxBytes / 1024 / 1024,
- per_second_overall / 1024f, Navit.T("ETA"), eta_string);
-
- if (retry_counter > 0) {
- info += "\n Retry " + retry_counter + "/" + MAX_RETRIES;
- }
- Log.e(TAG, "info: " + info);
-
- updateProgress(readBytes, maxBytes, info);
- uiLastUpdated = currentTime;
- }
- }
-
- private void updateProgress(long positionBytes, long maximumBytes, String infoText) {
- NavitDialogs.sendDialogMessage(NavitDialogs.MSG_PROGRESS_BAR, Navit.T("Map download"), infoText
- , NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024),
- (int) (positionBytes / 1024));
- }
-
- private void writeFileInfo(URLConnection c, long sizeInBytes) {
- ObjectOutputStream infoStream;
- try {
- infoStream = new ObjectOutputStream(new FileOutputStream(getMapInfoFile()));
- infoStream.writeUTF(c.getURL().getProtocol());
- infoStream.writeUTF(c.getURL().getHost());
- infoStream.writeUTF(c.getURL().getFile());
- infoStream.writeLong(sizeInBytes);
- infoStream.close();
- } catch (Exception e) {
- Log.e(TAG, "Could not write info file for map download. Resuming will not be possible. (" + e.getMessage() + ")");
- }
- }
-
- private void enableRetry() {
- retryDownload = true;
- retry_counter++;
- }
- // dialog send helper methods
-}
+/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +package org.navitproject.navit; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +import android.location.Location; +import android.os.Bundle; +import android.os.Message; +import android.os.StatFs; +import android.util.Log; + +/** + * @author rikky + * + */ +public class NavitMapDownloader extends Thread +{ + public static class osm_map_values + { + String lon1; + String lat1; + String lon2; + String lat2; + String map_name = ""; + long est_size_bytes = 0; + int level = 0; + + + 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; + } + + 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); + + if (location.getLongitude() < longitude_1) + return false; + if (location.getLongitude() > longitude_2) + return false; + if (location.getLatitude() < latitude_1) + return false; + if (location.getLatitude() > latitude_2) + return false; + + return true; + } + } + + // + // define the maps here + // size estimations updated 2017-06-22 + // + public static final osm_map_values[] osm_maps = { + new osm_map_values(Navit.T("Whole Planet"), "-180", "-90", "180", "90", 23992258630L, 0), + new osm_map_values(Navit.T("Africa"), "-30.89", "-36.17", "61.68", "38.40", 2070076339L, 0), + new osm_map_values(Navit.T("Angola"), "11.4", "-18.1", "24.2", "-5.3", 127557789L, 1), + new osm_map_values(Navit.T("Burundi"), "28.9", "-4.5", "30.9", "-2.2", 124049667L, 1), + new osm_map_values(Navit.T("Canary Islands"), "-18.69", "26.52", "-12.79", "29.99", 133565815L, 1), + new osm_map_values(Navit.T("Congo, Democratic Republic of the"), "11.7", "-13.6", "31.5", "5.7", 244228485L, 1), + new osm_map_values(Navit.T("Ethiopia"), "32.89", "3.33", "48.07", "14.97", 153067406L, 1), + new osm_map_values(Navit.T("Guinea"), "-15.47", "7.12", "-7.58", "12.74", 188047126L, 1), + new osm_map_values(Navit.T("Cote d'Ivoire"), "-8.72", "4.09", "-2.43", "10.80", 132187496L, 1), + new osm_map_values(Navit.T("Kenya"), "33.8", "-5.2", "42.4", "4.9", 190073089L, 1), + new osm_map_values(Navit.T("Lesotho"), "26.9", "-30.7", "29.6", "-28.4", 196189429L, 1), + new osm_map_values(Navit.T("Liberia"), "-15.00", "-0.73", "-7.20", "8.65", 156257253L, 1), + new osm_map_values(Navit.T("Libya"), "9.32", "19.40", "25.54", "33.63", 126046917L, 1), + new osm_map_values(Navit.T("Madagascar"), "42.25", "-26.63", "51.20", "-11.31", 145210721L, 1), + new osm_map_values(Navit.T("Namibia")+"+"+Navit.T("Botswana"), "11.4", "-29.1", "29.5", "-16.9", 248970987L, 1), + new osm_map_values(Navit.T("Reunion"), "55.2", "-21.4", "55.9", "-20.9", 126008774L, 1), + new osm_map_values(Navit.T("Rwanda"), "28.8", "-2.9", "30.9", "-1.0", 128267595L, 1), + new osm_map_values(Navit.T("South Africa")+"+"+Navit.T("Lesotho"), "15.93", "-36.36", "33.65", "-22.08", 307280006L, 1), + new osm_map_values(Navit.T("Tanzania, United Republic of"), "29.19", "-11.87", "40.74", "-0.88", 253621029L, 1), + new osm_map_values(Navit.T("Uganda"), "29.3", "-1.6", "35.1", "4.3", 179134521L, 1), + new osm_map_values(Navit.T("Asia"), "23.8", "0.1", "195.0", "82.4", 5113673780L, 0), + new osm_map_values(Navit.T("Azerbaijan"), "44.74", "38.34", "51.69", "42.37", 138346406L, 1), + new osm_map_values(Navit.T("China"), "67.3", "5.3", "135.0", "54.5", 1718108758L, 1), + new osm_map_values(Navit.T("Cyprus"), "32.0", "34.5", "34.9", "35.8", 118472448L, 1), + new osm_map_values(Navit.T("India")+"+"+Navit.T("Nepal"), "67.9", "5.5", "89.6", "36.0", 601877877L, 1), + new osm_map_values(Navit.T("Indonesia"), "93.7", "-17.3", "155.5", "7.6", 420741405L, 1), + new osm_map_values(Navit.T("Iran, Islamic Republic of"), "43.5", "24.4", "63.6", "40.4", 242016066L, 1), + new osm_map_values(Navit.T("Iraq"), "38.7", "28.5", "49.2", "37.4", 160751805L, 1), + new osm_map_values(Navit.T("Israel"), "33.99", "29.8", "35.95", "33.4", 155685778L, 1), + new osm_map_values(Navit.T("Japan")+"+"+Navit.T("Korea"), "123.6", "25.2", "151.3", "47.1", 1029080156L, 1), + new osm_map_values(Navit.T("Kazakhstan"), "46.44", "40.89", "87.36", "55.45", 407633007L, 1), + new osm_map_values(Navit.T("Kyrgyzstan"), "69.23", "39.13", "80.33", "43.29", 147997835L, 1), + new osm_map_values(Navit.T("Malaysia")+"+"+Navit.T("Singapore"), "94.3", "-5.9", "108.6", "6.8", 168816435L, 1), + new osm_map_values(Navit.T("Mongolia"), "87.5", "41.4", "120.3", "52.7", 153534851L, 1), + new osm_map_values(Navit.T("Pakistan"), "60.83", "23.28", "77.89", "37.15", 217644321L, 1), + new osm_map_values(Navit.T("Philippines"), "115.58", "4.47", "127.85", "21.60", 281428307L, 1), + new osm_map_values(Navit.T("Saudi Arabia"), "33.2", "16.1", "55.9", "33.5", 242648303L, 1), + new osm_map_values(Navit.T("Taiwan"), "119.1", "21.5", "122.5", "25.2", 1029080156L, 1), + new osm_map_values(Navit.T("Thailand"), "97.5", "5.7", "105.2", "19.7", 185135492L, 1), + new osm_map_values(Navit.T("Turkey"), "25.1", "35.8", "46.4", "42.8", 331087441L, 1), + new osm_map_values(Navit.T("Turkmenistan"), "51.78", "35.07", "66.76", "42.91", 131045087L, 1), + new osm_map_values(Navit.T("UAE+Other"), "51.5", "22.6", "56.7", "26.5", 128934674L, 1), + new osm_map_values(Navit.T("Australia")+"+"+Navit.T("Oceania"), "89.84", "-57.39", "179.79", "7.26", 782722650L, 0), + new osm_map_values(Navit.T("Australia"), "110.5", "-44.2", "154.9", "-9.2", 348652900L, 0), + new osm_map_values(Navit.T("Tasmania"), "144.0", "-45.1", "155.3", "-24.8", 253231890L, 1), + new osm_map_values(Navit.T("Victoria")+"+"+Navit.T("New South Wales"), "140.7", "-39.4", "153.7", "-26.9", 241500829L, 1), + new osm_map_values(Navit.T("New Caledonia"), "157.85", "-25.05", "174.15", "-16.85", 115512336L, 1), + new osm_map_values(Navit.T("New Zealand"), "165.2", "-47.6", "179.1", "-33.7", 239264192L, 1), + new osm_map_values(Navit.T("Europe"), "-12.97", "33.59", "34.15", "72.10", 11984126789L, 0), + new osm_map_values(Navit.T("Western Europe"), "-17.6", "34.5", "42.9", "70.9", 12648810717L, 1), + new osm_map_values(Navit.T("Austria"), "9.4", "46.32", "17.21", "49.1", 898273634L, 1), + new osm_map_values(Navit.T("Azores"), "-31.62", "36.63", "-24.67", "40.13", 112687225L, 1), + new osm_map_values(Navit.T("BeNeLux"), "2.08", "48.87", "7.78", "54.52", 1771971595L, 1), + new osm_map_values(Navit.T("Netherlands"), "3.07", "50.75", "7.23", "53.73", 1191828033L, 1), + new osm_map_values(Navit.T("Denmark"), "7.65", "54.32", "15.58", "58.07", 365606979L, 1), + new osm_map_values(Navit.T("Faroe Islands"), "-7.8", "61.3", "-6.1", "62.5", 109377568L, 1), + new osm_map_values(Navit.T("France"), "-5.45", "42.00", "8.44", "51.68", 3907969744L, 1), + new osm_map_values(Navit.T("Alsace"), "6.79", "47.27", "8.48", "49.17", 354249349L, 2), + new osm_map_values(Navit.T("Aquitaine"), "-2.27", "42.44", "1.50", "45.76", 443715019L, 2), + new osm_map_values(Navit.T("Auvergne"), "2.01", "44.57", "4.54", "46.85", 287663213L, 2), + new osm_map_values(Navit.T("Basse-Normandie"), "-2.09", "48.13", "1.03", "49.98", 262352354L, 2), + new osm_map_values(Navit.T("Bourgogne"), "2.80", "46.11", "5.58", "48.45", 298868796L, 2), + new osm_map_values(Navit.T("Bretagne"), "-5.58", "46.95", "-0.96", "48.99", 382770794L, 2), + new osm_map_values(Navit.T("Centre"), "0.01", "46.29", "3.18", "48.99", 474224721L, 2), + new osm_map_values(Navit.T("Champagne-Ardenne"), "3.34", "47.53", "5.94", "50.28", 269947824L, 2), + new osm_map_values(Navit.T("Corse"), "8.12", "41.32", "9.95", "43.28", 129902146L, 2), + new osm_map_values(Navit.T("Franche-Comte"), "5.20", "46.21", "7.83", "48.07", 324476070L, 2), + new osm_map_values(Navit.T("Haute-Normandie"), "-0.15", "48.62", "1.85", "50.18", 202782876L, 2), + new osm_map_values(Navit.T("Ile-de-France"), "1.40", "48.07", "3.61", "49.29", 311052699L, 2), + new osm_map_values(Navit.T("Languedoc-Roussillon"), "1.53", "42.25", "4.89", "45.02", 380145667L, 2), + new osm_map_values(Navit.T("Limousin"), "0.58", "44.87", "2.66", "46.50", 206696539L, 2), + new osm_map_values(Navit.T("Lorraine"), "4.84", "47.77", "7.72", "49.73", 330777318L, 2), + new osm_map_values(Navit.T("Midi-Pyrenees"), "-0.37", "42.18", "3.50", "45.10", 462618363L, 2), + new osm_map_values(Navit.T("Nord-pas-de-Calais"), "1.42", "49.92", "4.49", "51.31", 368467511L, 2), + new osm_map_values(Navit.T("Pays-de-la-Loire"), "-2.88", "46.20", "0.97", "48.62", 499471143L, 2), + new osm_map_values(Navit.T("Picardie"), "1.25", "48.79", "4.31", "50.43", 374308041L, 2), + new osm_map_values(Navit.T("Poitou-Charentes"), "-1.69", "45.04", "1.26", "47.23", 342125526L, 2), + new osm_map_values(Navit.T("Provence-Alpes-Cote-d-Azur"), "4.21", "42.91", "7.99", "45.18", 390306134L, 2), + new osm_map_values(Navit.T("Rhone-Alpes"), "3.65", "44.07", "7.88", "46.64", 510797942L, 2), + new osm_map_values(Navit.T("Germany"), "5.18", "46.84", "15.47", "55.64", 3521359466L, 1), + new osm_map_values(Navit.T("Baden-Wuerttemberg"), "7.32", "47.14", "10.57", "49.85", 674361124L, 2), + new osm_map_values(Navit.T("Bayern"), "8.92", "47.22", "13.90", "50.62", 860161150L, 2), + new osm_map_values(Navit.T("Mittelfranken"), "9.86", "48.78", "11.65", "49.84", 203055195L, 2), + new osm_map_values(Navit.T("Niederbayern"), "11.55", "47.75", "14.12", "49.42", 312924770L, 2), + new osm_map_values(Navit.T("Oberbayern"), "10.67", "47.05", "13.57", "49.14", 382734883L, 2), + new osm_map_values(Navit.T("Oberfranken"), "10.31", "49.54", "12.49", "50.95", 235258691L, 2), + new osm_map_values(Navit.T("Oberpfalz"), "11.14", "48.71", "13.47", "50.43", 264536012L, 2), + new osm_map_values(Navit.T("Schwaben"), "9.27", "47.10", "11.36", "49.09", 321141607L, 2), + new osm_map_values(Navit.T("Unterfranken"), "8.59", "49.16", "10.93", "50.67", 303720890L, 2), + new osm_map_values(Navit.T("Berlin"), "13.03", "52.28", "13.81", "52.73", 169019946L, 2), + new osm_map_values(Navit.T("Brandenburg"), "11.17", "51.30", "14.83", "53.63", 323497599L, 2), + new osm_map_values(Navit.T("Bremen"), "8.43", "52.96", "9.04", "53.66", 150963608L, 2), + new osm_map_values(Navit.T("Hamburg"), "9.56", "53.34", "10.39", "53.80", 156284421L, 2), + new osm_map_values(Navit.T("Hessen"), "7.72", "49.34", "10.29", "51.71", 432279328L, 2), + new osm_map_values(Navit.T("Mecklenburg-Vorpommern"), "10.54", "53.05", "14.48", "55.05", 213183908L, 2), + new osm_map_values(Navit.T("Niedersachsen"), "6.40", "51.24", "11.69", "54.22", 819766939L, 2), + new osm_map_values(Navit.T("Nordrhein-westfalen"), "5.46", "50.26", "9.52", "52.59", 967053517L, 2), + new osm_map_values(Navit.T("Rheinland-Pfalz"), "6.06", "48.91", "8.56", "51.00", 442868899L, 2), + new osm_map_values(Navit.T("Saarland"), "6.30", "49.06", "7.46", "49.69", 157721162L, 2), + new osm_map_values(Navit.T("Sachsen-Anhalt"), "10.50", "50.88", "13.26", "53.11", 287785088L, 2), + new osm_map_values(Navit.T("Sachsen"), "11.82", "50.11", "15.10", "51.73", 342620834L, 2), + new osm_map_values(Navit.T("Schleswig-Holstein"), "7.41", "53.30", "11.98", "55.20", 280293910L, 2), + new osm_map_values(Navit.T("Thueringen"), "9.81", "50.15", "12.72", "51.70", 269428239L, 2), + new osm_map_values(Navit.T("Germany")+"+"+Navit.T("Austria")+"+"+Navit.T("Switzerland"), "3.4", "44.5", "18.6", "55.1", 5746126429L, 1), + new osm_map_values(Navit.T("Iceland"), "-25.3", "62.8", "-11.4", "67.5", 124837162L, 1), + new osm_map_values(Navit.T("Ireland"), "-11.17", "51.25", "-5.23", "55.9", 234750271L, 1), + new osm_map_values(Navit.T("Italy"), "6.52", "36.38", "18.96", "47.19", 1610171395L, 1), + new osm_map_values(Navit.T("Spain")+"+"+Navit.T("Portugal"), "-11.04", "34.87", "4.62", "44.41", 1039624918L, 1), + new osm_map_values(Navit.T("Mallorca"), "2.2", "38.8", "4.7", "40.2", 137200636L, 2), + new osm_map_values(Navit.T("Galicia"), "-10.0", "41.7", "-6.3", "44.1", 174549553L, 2), + new osm_map_values(Navit.T("Scandinavia"), "4.0", "54.4", "32.1", "71.5", 1398661090L, 1), + new osm_map_values(Navit.T("Finland"), "18.6", "59.2", "32.3", "70.3", 460997178L, 1), + new osm_map_values(Navit.T("Denmark"), "7.49", "54.33", "13.05", "57.88", 321870414L, 1), + new osm_map_values(Navit.T("Switzerland"), "5.79", "45.74", "10.59", "47.84", 552565332L, 1), + new osm_map_values(Navit.T("United Kingdom"), "-9.7", "49.6", "2.2", "61.2", 901724648L, 1), + new osm_map_values(Navit.T("England"), "-7.80", "48.93", "2.41", "56.14", 937728414L, 1), + new osm_map_values(Navit.T("Buckinghamshire"), "-1.19", "51.44", "-0.43", "52.25", 142256978L, 2), + new osm_map_values(Navit.T("Cambridgeshire"), "-0.55", "51.96", "0.56", "52.79", 142334001L, 2), + new osm_map_values(Navit.T("Cumbria"), "-3.96", "53.85", "-2.11", "55.24", 144422460L, 2), + new osm_map_values(Navit.T("East yorkshire with hull"), "-1.16", "53.50", "0.54", "54.26", 141518744L, 2), + new osm_map_values(Navit.T("Essex"), "-0.07", "51.40", "1.36", "52.14", 162542730L, 2), + new osm_map_values(Navit.T("Herefordshire"), "-3.19", "51.78", "-2.29", "52.45", 129368660L, 2), + new osm_map_values(Navit.T("Kent"), "-0.02", "50.81", "1.65", "51.53", 145482562L, 2), + new osm_map_values(Navit.T("Lancashire"), "-3.20", "53.43", "-2.00", "54.29", 148964975L, 2), + new osm_map_values(Navit.T("Leicestershire"), "-1.65", "52.34", "-0.61", "53.03", 154199956L, 2), + new osm_map_values(Navit.T("Norfolk"), "0.10", "52.30", "2.04", "53.41", 146017009L, 2), + new osm_map_values(Navit.T("Nottinghamshire"), "-1.39", "52.73", "-0.62", "53.55", 147986548L, 2), + new osm_map_values(Navit.T("Oxfordshire"), "-1.77", "51.41", "-0.82", "52.22", 142240992L, 2), + new osm_map_values(Navit.T("Shropshire"), "-3.29", "52.26", "-2.18", "53.05", 136909363L, 2), + new osm_map_values(Navit.T("Somerset"), "-3.89", "50.77", "-2.20", "51.40", 145186096L, 2), + new osm_map_values(Navit.T("South yorkshire"), "-1.88", "53.25", "-0.80", "53.71", 145902650L, 2), + new osm_map_values(Navit.T("Suffolk"), "0.29", "51.88", "1.81", "52.60", 143799697L, 2), + new osm_map_values(Navit.T("Surrey"), "-0.90", "51.02", "0.10", "51.52", 157987139L, 2), + new osm_map_values(Navit.T("Wiltshire"), "-2.41", "50.90", "-1.44", "51.76", 138652346L, 2), + new osm_map_values(Navit.T("Scotland"), "-8.13", "54.49", "-0.15", "61.40", 258853845L, 2), + new osm_map_values(Navit.T("Wales"), "-5.56", "51.28", "-2.60", "53.60", 193593409L, 2), + new osm_map_values(Navit.T("Albania"), "19.09", "39.55", "21.12", "42.72", 146199817L, 1), + new osm_map_values(Navit.T("Belarus"), "23.12", "51.21", "32.87", "56.23", 324470696L, 1), + new osm_map_values(Navit.T("Russian Federation"), "27.9", "41.5", "190.4", "77.6", 2148314279L, 1), + new osm_map_values(Navit.T("Bulgaria"), "24.7", "42.1", "24.8", "42.1", 109869373L, 1), + new osm_map_values(Navit.T("Bosnia and Herzegovina"), "15.69", "42.52", "19.67", "45.32", 187122485L, 1), + new osm_map_values(Navit.T("Czech Republic"), "11.91", "48.48", "19.02", "51.17", 904838442L, 1), + new osm_map_values(Navit.T("Croatia"), "13.4", "42.1", "19.4", "46.9", 460854751L, 1), + new osm_map_values(Navit.T("Estonia"), "21.5", "57.5", "28.2", "59.6", 173378927L, 1), + new osm_map_values(Navit.T("Greece"), "28.9", "37.8", "29.0", "37.8", 109435051L, 1), + new osm_map_values(Navit.T("Crete"), "23.3", "34.5", "26.8", "36.0", 115985063L, 1), + new osm_map_values(Navit.T("Hungary"), "16.08", "45.57", "23.03", "48.39", 350318541L, 1), + new osm_map_values(Navit.T("Latvia"), "20.7", "55.6", "28.3", "58.1", 188188140L, 1), + new osm_map_values(Navit.T("Lithuania"), "20.9", "53.8", "26.9", "56.5", 217852597L, 1), + new osm_map_values(Navit.T("Poland"), "13.6", "48.8", "24.5", "55.0", 1464968657L, 1), + new osm_map_values(Navit.T("Romania"), "20.3", "43.5", "29.9", "48.4", 347931565L, 1), + new osm_map_values(Navit.T("Ukraine"), "22.0", "44.3", "40.4", "52.4", 793611912L, 1), + new osm_map_values(Navit.T("North America"), "-178.1", "6.5", "-10.4", "84.0", 5601866516L, 0), + new osm_map_values(Navit.T("Alaska"), "-179.5", "49.5", "-129", "71.6", 207746039L, 1), + new osm_map_values(Navit.T("Canada"), "-141.3", "41.5", "-52.2", "70.2", 2635719651L, 1), + new osm_map_values(Navit.T("Hawaii"), "-161.07", "18.49", "-154.45", "22.85", 115016656L, 1), + new osm_map_values(Navit.T("USA")+Navit.T(" (except Alaska and Hawaii)"), "-125.4", "24.3", "-66.5", "49.3", 4060487198L, 1), + new osm_map_values(Navit.T("Midwest"), "-104.11", "35.92", "-80.46", "49.46", 1145596450L, 2), + new osm_map_values(Navit.T("Michigan"), "-90.47", "41.64", "-79.00", "49.37", 538247019L, 2), + new osm_map_values(Navit.T("Ohio"), "-84.87", "38.05", "-79.85", "43.53", 277022336L, 2), + new osm_map_values(Navit.T("Northeast"), "-80.58", "38.72", "-66.83", "47.53", 1017160709L, 2), + new osm_map_values(Navit.T("Massachusetts"), "-73.56", "40.78", "-68.67", "42.94", 340055487L, 2), + new osm_map_values(Navit.T("Vermont"), "-73.49", "42.68", "-71.41", "45.07", 139626067L, 2), + new osm_map_values(Navit.T("Pacific"), "-180.05", "15.87", "-129.75", "73.04", 207090640L, 2), + new osm_map_values(Navit.T("South"), "-106.70", "23.98", "-71.46", "40.70", 1747935356L, 2), + new osm_map_values(Navit.T("Arkansas"), "-94.67", "32.95", "-89.59", "36.60", 155658661L, 2), + new osm_map_values(Navit.T("District of Columbia"), "-77.17", "38.74", "-76.86", "39.05", 129235755L, 2), + new osm_map_values(Navit.T("Florida"), "-88.75", "23.63", "-77.67", "31.05", 224022108L, 2), + new osm_map_values(Navit.T("Louisiana"), "-94.09", "28.09", "-88.62", "33.07", 210120605L, 2), + new osm_map_values(Navit.T("Maryland"), "-79.54", "37.83", "-74.99", "40.22", 276462622L, 2), + new osm_map_values(Navit.T("Mississippi"), "-91.71", "29.99", "-88.04", "35.05", 177858031L, 2), + new osm_map_values(Navit.T("Oklahoma"), "-103.41", "33.56", "-94.38", "37.38", 200061473L, 2), + new osm_map_values(Navit.T("Texas"), "-106.96", "25.62", "-92.97", "36.58", 430089141L, 2), + new osm_map_values(Navit.T("Virginia"), "-83.73", "36.49", "-74.25", "39.52", 384187569L, 2), + new osm_map_values(Navit.T("West Virginia"), "-82.70", "37.15", "-77.66", "40.97", 220552071L, 2), + new osm_map_values(Navit.T("West"), "-133.11", "31.28", "-101.99", "49.51", 1152909162L, 2), + new osm_map_values(Navit.T("Arizona"), "-114.88", "30.01", "-108.99", "37.06", 182826833L, 2), + new osm_map_values(Navit.T("California"), "-125.94", "32.43", "-114.08", "42.07", 586923326L, 2), + new osm_map_values(Navit.T("Colorado"), "-109.11", "36.52", "-100.41", "41.05", 228623724L, 2), + new osm_map_values(Navit.T("Idaho"), "-117.30", "41.93", "-110.99", "49.18", 170684507L, 2), + new osm_map_values(Navit.T("Montana"), "-116.10", "44.31", "-102.64", "49.74", 176229800L, 2), + new osm_map_values(Navit.T("New Mexico"), "-109.10", "26.98", "-96.07", "37.05", 361793070L, 2), + new osm_map_values(Navit.T("Nevada"), "-120.2", "35.0", "-113.8", "42.1", 200614482L, 2), + new osm_map_values(Navit.T("Oregon"), "-124.8", "41.8", "-116.3", "46.3", 211462685L, 2), + new osm_map_values(Navit.T("Utah"), "-114.11", "36.95", "-108.99", "42.05", 151590197L, 2), + new osm_map_values(Navit.T("Washington State"), "-125.0", "45.5", "-116.9", "49.0", 222553768L, 2), + new osm_map_values(Navit.T("South+Middle America"), "-83.5", "-56.3", "-30.8", "13.7", 958895383L, 0), + new osm_map_values(Navit.T("Argentina"), "-73.9", "-57.3", "-51.6", "-21.0", 376857648L, 1), + new osm_map_values(Navit.T("Argentina")+"+"+Navit.T("Chile"), "-77.2", "-56.3", "-52.7", "-16.1", 420275812L, 1), + new osm_map_values(Navit.T("Bolivia"), "-70.5", "-23.1", "-57.3", "-9.3", 175937824L, 1), + new osm_map_values(Navit.T("Brazil"), "-71.4", "-34.7", "-32.8", "5.4", 664872975L, 1), + new osm_map_values(Navit.T("Chile"), "-81.77", "-58.50", "-65.46", "-17.41", 241657330L, 1), + new osm_map_values(Navit.T("Cuba"), "-85.3", "19.6", "-74.0", "23.6", 129043575L, 1), + new osm_map_values(Navit.T("Colombia"), "-79.1", "-4.0", "-66.7", "12.6", 212016580L, 1), + new osm_map_values(Navit.T("Ecuador"), "-82.6", "-5.4", "-74.4", "2.3", 158857591L, 1), + new osm_map_values(Navit.T("Guyana")+"+"+Navit.T("Suriname")+"+"+Navit.T("Guyane Francaise"), "-62.0", "1.0", "-51.2", "8.9", 123000072L, 1), + new osm_map_values(Navit.T("Haiti")+"+"+Navit.T("Dominican Republic"), "-74.8", "17.3", "-68.2", "20.1", 149925689L, 1), + new osm_map_values(Navit.T("Jamaica"), "-78.6", "17.4", "-75.9", "18.9", 113961998L, 1), + new osm_map_values(Navit.T("Mexico"), "-117.6", "14.1", "-86.4", "32.8", 551307973L, 1), + new osm_map_values(Navit.T("Paraguay"), "-63.8", "-28.1", "-53.6", "-18.8", 159498397L, 1), + new osm_map_values(Navit.T("Peru"), "-82.4", "-18.1", "-67.5", "0.4", 212490557L, 1), + new osm_map_values(Navit.T("Uruguay"), "-59.2", "-36.5", "-51.7", "-29.7", 157482719L, 1), + new osm_map_values(Navit.T("Venezuela"), "-73.6", "0.4", "-59.7", "12.8", 167295729L, 1) + }; + + private String map_filename_path; + + public static NavitMap[] getAvailableMaps() { + class filterMaps implements FilenameFilter { + public boolean accept(File dir, String filename) { + return (filename.endsWith(".bin")); + } + } + 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]); + } + } + return maps; + } + private Boolean stop_me = false; + private osm_map_values map_values; + private int map_id; + private long uiLastUpdated = -1; + + private Boolean retryDownload = false; //Download failed, but + //we should try to resume + private static final int SOCKET_CONNECT_TIMEOUT = 60000; // 60 secs. + private static final int SOCKET_READ_TIMEOUT = 120000; // 120 secs. + private static final int MAP_WRITE_FILE_BUFFER = 1024 * 64; + private static final int MAP_WRITE_MEM_BUFFER = 1024 * 64; + 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 static final String TAG = "NavitMapDownloader"; + + 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; + } + + public void run() { + stop_me = false; + retry_counter = 0; + + Log.v(TAG, "start download " + map_values.map_name); + updateProgress(0, map_values.est_size_bytes, Navit.T("downloading") + ": " + map_values.map_name); + + boolean success; + do { + try { + Thread.sleep(10 + retry_counter * 1000); + } catch (InterruptedException e1) {} + retryDownload = false; + success = download_osm_map(); + } while ( !success + && retryDownload + && retry_counter < MAX_RETRIES + && !stop_me); + + if (success) { + toast(map_values.map_name + " " + Navit.T("ready")); + getMapInfoFile().delete(); + Log.d(TAG, "success"); + } + + if (success || stop_me ) { + NavitDialogs.sendDialogMessage( NavitDialogs.MSG_MAP_DOWNLOAD_FINISHED + , map_filename_path + map_values.map_name + ".bin", null, -1, success ? 1 : 0 , map_id ); + } + } + + public void stop_thread() { + stop_me = true; + Log.d(TAG, "stop_me -> true"); + } + + private boolean checkFreeSpace(long needed_bytes) { + long free_space = getFreeSpace(); + + if ( needed_bytes <= 0 ) + needed_bytes = MAP_WRITE_FILE_BUFFER; + + if (free_space < needed_bytes ) { + 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.T("Media selected for map storage is not available"); + else + msg=Navit.T("Not enough free space"); + updateProgress(free_space, needed_bytes, Navit.T("Error downloading map!") + "\n" + msg); + return false; + } + return true; + } + + private boolean deleteMap() { + File finalOutputFile = getMapFile(); + + if (finalOutputFile.exists()) { + Message msg = + Message.obtain(Navit.getInstance().getNavitGraphics().callback_handler, + NavitGraphics.msg_type.CLB_DELETE_MAP.ordinal()); + Bundle b = new Bundle(); + b.putString("title", finalOutputFile.getAbsolutePath()); + msg.setData(b); + msg.sendToTarget(); + return true; + } + return false; + } + + /** + * @param map_values + * @return + */ + private boolean download_osm_map() { + long already_read = 0; + long real_size_bytes = 0; + boolean resume = true; + + File outputFile = getDestinationFile(); + long old_download_size = outputFile.length(); + + URL url = null; + if (old_download_size > 0) { + url = readFileInfo(); + } + + if (url == null) { + resume = false; + url = getDownloadURL(); + } + + // URL url = new URL("http://192.168.2.101:8080/zweibruecken.bin"); + URLConnection c = initConnection(url); + if (c != null) { + + if (resume) { + c.setRequestProperty("Range", "bytes=" + old_download_size + "-"); + already_read = old_download_size; + } + try { + real_size_bytes=Long.parseLong(c.getHeaderField("Content-Length")) + already_read; + } catch(Exception e) { + real_size_bytes=-1; + } + + long fileTime = c.getLastModified(); + + if (!resume) { + outputFile.delete(); + writeFileInfo(c, real_size_bytes); + } + + if (real_size_bytes <= 0) + real_size_bytes = map_values.est_size_bytes; + + Log.d(TAG, "size: " + real_size_bytes + ", read: " + already_read + ", timestamp: " + fileTime + + ", Connection ref: " + c.getURL()); + + if (checkFreeSpace(real_size_bytes - already_read) + && downloadData(c, already_read, real_size_bytes, resume, outputFile)) { + + File finalOutputFile = getMapFile(); + // delete an already existing file first + finalOutputFile.delete(); + // rename file to its final name + outputFile.renameTo(finalOutputFile); + return true; + } + } + return false; + } + + private File getDestinationFile() { + File outputFile = new File(map_filename_path, map_values.map_name + ".tmp"); + outputFile.getParentFile().mkdir(); + return outputFile; + } + + private boolean downloadData(URLConnection c, long already_read, long real_size_bytes + , 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); + // always cleanup, as we might get errors when trying to resume + try { + buf.flush(); + buf.close(); + + bif.close(); + } catch (IOException e) { + } + } + return success; + } + + private URL getDownloadURL() { + URL url = null; + try { + url = + new URL("http://maps.navit-project.org/api/map/?bbox=" + map_values.lon1 + "," + map_values.lat1 + + "," + map_values.lon2 + "," + map_values.lat2); + } catch (MalformedURLException e) { + Log.e(TAG, "We failed to create a URL to " + map_values.map_name); + e.printStackTrace(); + return null; + } + Log.v(TAG, "connect to " + url.toString()); + return url; + } + + private long getFreeSpace() { + try { + StatFs fsInfo = new StatFs(map_filename_path); + return (long)fsInfo.getAvailableBlocks() * fsInfo.getBlockSize(); + } catch(Exception e) { + return -1; + } + } + + private BufferedInputStream getInputStream(URLConnection c) { + BufferedInputStream bif = null; + try { + 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) { + getMapInfoFile().delete(); + } + enableRetry(); + bif = null; + } catch (IOException e) { + Log.e(TAG, "Error reading from server: " + e); + enableRetry(); + bif = null; + } + return bif; + } + + private File getMapFile() { + return new File(map_filename_path, map_values.map_name + ".bin"); + } + + private File getMapInfoFile() { + return new File(map_filename_path, map_values.map_name + ".tmp.info"); + } + + private BufferedOutputStream getOutputStream(File outputFile, boolean resume) { + BufferedOutputStream buf = null; + try { + buf = new BufferedOutputStream(new FileOutputStream(outputFile, resume), MAP_WRITE_FILE_BUFFER); + } catch (FileNotFoundException e) { + Log.e(TAG, "Could not open output file for writing: " + e); + buf = null; + } + return buf; + } + + private URLConnection initConnection(URL url) { + HttpURLConnection c = null; + try { + c = (HttpURLConnection) url.openConnection(); + c.setRequestMethod("GET"); + } catch (Exception e) { + Log.e(TAG, "Failed connecting server: " + e); + enableRetry(); + return null; + } + + c.setReadTimeout(SOCKET_READ_TIMEOUT); + c.setConnectTimeout(SOCKET_CONNECT_TIMEOUT); + return c; + } + + private boolean readData(OutputStream buf, InputStream bif, long already_read, long real_size_bytes) { + long start_timestamp = System.nanoTime(); + byte[] buffer = new byte[MAP_WRITE_MEM_BUFFER]; + int len1 = 0; + long mapFileSize = real_size_bytes; + long startOffset = already_read; + boolean success = false; + + try { + while (!stop_me && (len1 = bif.read(buffer)) != -1) { + already_read += len1; + updateProgress(start_timestamp, startOffset, already_read, mapFileSize); + + 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 (deleteMap()) { + enableRetry(); + } else { + updateProgress(already_read, real_size_bytes, Navit.T("Error downloading map!") + "\n" + + Navit.T("Not enough free space")); + } + } else { + updateProgress(already_read, real_size_bytes, Navit.T("Error writing map!")); + } + + return false; + } + } + + if (stop_me) { + toast(Navit.T("Map download aborted!")); + } else if ( already_read < real_size_bytes ) { + Log.d(TAG, "Server send only " + already_read + " bytes of " + real_size_bytes); + enableRetry(); + } else { + success = true; + } + } catch (IOException e) { + Log.d(TAG, "Error: " + e); + + enableRetry(); + updateProgress(already_read, real_size_bytes, Navit.T("Error downloading map!")); + } + + return success; + } + + private URL readFileInfo() { + URL url = null; + 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(); + 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); + } catch (Exception e) { + getMapInfoFile().delete(); + } + return url; + } + + private void toast(String message) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_TOAST, null, message, -1, 0, 0); + } + + 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); + + String eta_string; + if (eta_seconds > 60) { + eta_string = (int) (eta_seconds / 60f) + " m"; + } else { + eta_string = eta_seconds + " s"; + } + String info = + String.format("%s: %s\n %dMb / %dMb\n %.1f kb/s %s: %s", Navit.T("downloading") + , map_values.map_name, readBytes / 1024 / 1024, maxBytes / 1024 / 1024, + per_second_overall / 1024f, Navit.T("ETA"), eta_string); + + if (retry_counter > 0) { + info += "\n Retry " + retry_counter + "/" + MAX_RETRIES; + } + Log.e(TAG, "info: " + info); + + updateProgress(readBytes, maxBytes, info); + uiLastUpdated = currentTime; + } + } + + private void updateProgress(long positionBytes, long maximumBytes, String infoText) { + NavitDialogs.sendDialogMessage(NavitDialogs.MSG_PROGRESS_BAR, Navit.T("Map download"), infoText + , NavitDialogs.DIALOG_MAPDOWNLOAD, (int) (maximumBytes / 1024), + (int) (positionBytes / 1024)); + } + + private void writeFileInfo(URLConnection c, long sizeInBytes) { + ObjectOutputStream infoStream; + try { + infoStream = new ObjectOutputStream(new FileOutputStream(getMapInfoFile())); + infoStream.writeUTF(c.getURL().getProtocol()); + infoStream.writeUTF(c.getURL().getHost()); + infoStream.writeUTF(c.getURL().getFile()); + infoStream.writeLong(sizeInBytes); + infoStream.close(); + } catch (Exception e) { + Log.e(TAG, "Could not write info file for map download. Resuming will not be possible. (" + e.getMessage() + ")"); + } + } + + private void enableRetry() { + retryDownload = true; + retry_counter++; + } + // dialog send helper methods +} diff --git a/navit/android/src/org/navitproject/navit/NavitTextTranslations.java b/navit/android/src/org/navitproject/navit/NavitTextTranslations.java index 93aa5fe76..5deaca305 100644 --- a/navit/android/src/org/navitproject/navit/NavitTextTranslations.java +++ b/navit/android/src/org/navitproject/navit/NavitTextTranslations.java @@ -1,204 +1,204 @@ -/**
- * Navit, a modular navigation system.
- * Copyright (C) 2005-2008 Navit Team
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-package org.navitproject.navit;
-
-import java.util.HashMap;
-
-import android.util.Log;
-
-public class NavitTextTranslations
-{
- static String main_language = "en";
- static String sub_language = "EN";
- static String fallback_language = "en";
- static String fallback_sub_language = "EN";
- private static HashMap<String, HashMap<String, String>> Navit_text_lookup = new HashMap<String, HashMap<String, String>>();
-
- public static void init()
- {
- Log.e("NavitTextTranslations", "initializing translated text ...");
- String k = null;
- String[] v = null;
-/*
- k = "exit navit";
- v = new String[]{"en", "Exit Navit", "de", "Navit beenden", "nl", "Navit afsluiten", "fr","Quittez Navit"};
- p(k, v);
-
- k = "zoom in";
- v = new String[]{"en", "Zoom in", "fr", "Zoom-avant"};
- p(k, v);
-
- k = "zoom out";
- v = new String[]{"en", "Zoom out", "fr", "Zoom-arrière", "nl", "Zoom uit"};
- p(k, v);
-
- k = "address search";
- v = new String[]{"en", "Address search", "de", "Adresse suchen", "nl", "Zoek adres", "fr","Cherchez adresse"};
- p(k, v);
-
- k = "Mapdownload";
- v = new String[]{"en", "Mapdownload", "de", "Kartendownload"};
- p(k, v);
-
- k = "downloading";
- v = new String[]{"en", "downloading"};
- p(k, v);
-
- k = "Downloaded maps";
- v = new String[]{"en", "Downloaded maps", "de", "Heruntergeladene Karten", "nl", "Gedownloade kaarten", "fr","Cartes téléchargées" };
- p(k, v);
-
- k = "ETA";
- v = new String[]{"en", "ETA", "de", "fertig in"};
- p(k, v);
-
- k = "Error downloading map";
- v = new String[]{"en", "Error downloading map!", "de", "Fehler beim Kartendownload"};
- p(k, v);
-
- k = "ready";
- v = new String[]{"en", "ready", "de", "fertig"};
- p(k, v);
-
- k = "Ok";
- v = new String[]{"en", "OK"};
- p(k, v);
-
- k = "No address found";
- v = new String[]{"en", "No address found", "de", "Keine Adresse gefunden"};
- p(k, v);
-
- k = "Enter: City and Street";
- v = new String[]{"en", "Enter: City, Street", "de", "Stadt und Straße:"};
- p(k, v);
-
- k = "No search string entered";
- v = new String[]{"en", "No text entered", "de", "Keine Eingabe"};
- p(k, v);
-
- k = "setting destination to";
- v = new String[]{"en", "Setting destination to:", "de", "neues Fahrziel"};
- p(k, v);
-
- k = "getting search results";
- v = new String[]{"en", "getting search results", "de", "lade Suchergebnisse"};
- p(k, v);
-
- k = "searching ...";
- v = new String[]{"en", "searching ...", "de", "Suche läuft ..."};
- p(k, v);
-
- k = "No Results found!";
- v = new String[]{"en", "No Results found!", "de", "Suche liefert kein Ergebnis!"};
- p(k, v);
-
- k = "Map data (c) OpenStreetMap contributors, CC-BY-SA";
- v = new String[]{"en", "Map data (c) OpenStreetMap contributors, CC-BY-SA"};
- p(k, v);
-
- k = "partial match";
- v = new String[]{"en", "partial match", "de", "ungefähr"};
- p(k, v);
-
- k = "Search";
- v = new String[]{"en", "Search", "de", "suchen"};
- p(k, v);
-
- k = "drive here";
- v = new String[]{"en", "Route to here", "de", "Ziel setzen"};
- p(k, v);
-
- k = "loading search results";
- v = new String[]{"en", "Loading search results", "de", "lade Suchergebnisse"};
- p(k, v);
-
- k = "towns";
- v = new String[]{"en", "Towns", "de", "Städte"};
- p(k, v);
-*/
- Log.e("NavitTextTranslations", "... ready");
- }
-
- private static void p(String key, String[] values)
- {
- HashMap<String, String> t = new HashMap<String, String>();
- //Log.e("NavitTextTranslations", "trying: " + key);
- try
- {
- for (int i = 0; i < (int) (values.length / 2); i++)
- {
- t.put(values[i * 2], values[(i * 2) + 1]);
- }
- Navit_text_lookup.put(key, t);
- }
- catch (Exception e)
- {
- Log.e("NavitTextTranslations", "!!Error in translationkey: " + key);
- }
- }
-
- public static String get_text(String in)
- {
- String out = null;
- //Log.e("NavitTextTranslations", "lookup L:" + main_language + " T:" + in);
- try
- {
- out = Navit_text_lookup.get(in).get(main_language);
- }
- catch (Exception e)
- {
- // most likely there is not translation yet
- //Log.e("NavitTextTranslations", "lookup: exception");
- out = null;
- }
-
- if (out == null)
- {
- // always return a string for output (use fallback language)
- //Log.e("NavitTextTranslations", "using default language");
- try
- {
- out = Navit_text_lookup.get(in).get(fallback_language);
- }
- catch (Exception e)
- {
- //Log.e("NavitTextTranslations", "using default language: exception");
- // most likely there is not translation yet
- out = null;
- }
- }
-
- if (out == null)
- {
- // if we still dont have any text, use the ".mo" file and call the c-function gettext(in)
- out = NavitGraphics.getLocalizedString(in);
- if (out != null)
- {
- HashMap<String, String> langmap = new HashMap<String, String>();
- langmap.put(main_language, out);
- Navit_text_lookup.put(in, langmap);
- }
-
- //Log.e("NavitTextTranslations", "return the value from gettext() = " + out);
- }
- return out;
- }
-
-}
+/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +package org.navitproject.navit; + +import java.util.HashMap; + +import android.util.Log; + +public class NavitTextTranslations +{ + static String main_language = "en"; + static String sub_language = "EN"; + static String fallback_language = "en"; + static String fallback_sub_language = "EN"; + private static HashMap<String, HashMap<String, String>> Navit_text_lookup = new HashMap<String, HashMap<String, String>>(); + + public static void init() + { + Log.e("NavitTextTranslations", "initializing translated text ..."); + String k = null; + String[] v = null; +/* + k = "exit navit"; + v = new String[]{"en", "Exit Navit", "de", "Navit beenden", "nl", "Navit afsluiten", "fr","Quittez Navit"}; + p(k, v); + + k = "zoom in"; + v = new String[]{"en", "Zoom in", "fr", "Zoom-avant"}; + p(k, v); + + k = "zoom out"; + v = new String[]{"en", "Zoom out", "fr", "Zoom-arrière", "nl", "Zoom uit"}; + p(k, v); + + k = "address search"; + v = new String[]{"en", "Address search", "de", "Adresse suchen", "nl", "Zoek adres", "fr","Cherchez adresse"}; + p(k, v); + + k = "Mapdownload"; + v = new String[]{"en", "Mapdownload", "de", "Kartendownload"}; + p(k, v); + + k = "downloading"; + v = new String[]{"en", "downloading"}; + p(k, v); + + k = "Downloaded maps"; + v = new String[]{"en", "Downloaded maps", "de", "Heruntergeladene Karten", "nl", "Gedownloade kaarten", "fr","Cartes téléchargées" }; + p(k, v); + + k = "ETA"; + v = new String[]{"en", "ETA", "de", "fertig in"}; + p(k, v); + + k = "Error downloading map"; + v = new String[]{"en", "Error downloading map!", "de", "Fehler beim Kartendownload"}; + p(k, v); + + k = "ready"; + v = new String[]{"en", "ready", "de", "fertig"}; + p(k, v); + + k = "Ok"; + v = new String[]{"en", "OK"}; + p(k, v); + + k = "No address found"; + v = new String[]{"en", "No address found", "de", "Keine Adresse gefunden"}; + p(k, v); + + k = "Enter: City and Street"; + v = new String[]{"en", "Enter: City, Street", "de", "Stadt und Straße:"}; + p(k, v); + + k = "No search string entered"; + v = new String[]{"en", "No text entered", "de", "Keine Eingabe"}; + p(k, v); + + k = "setting destination to"; + v = new String[]{"en", "Setting destination to:", "de", "neues Fahrziel"}; + p(k, v); + + k = "getting search results"; + v = new String[]{"en", "getting search results", "de", "lade Suchergebnisse"}; + p(k, v); + + k = "searching ..."; + v = new String[]{"en", "searching ...", "de", "Suche läuft ..."}; + p(k, v); + + k = "No Results found!"; + v = new String[]{"en", "No Results found!", "de", "Suche liefert kein Ergebnis!"}; + p(k, v); + + k = "Map data (c) OpenStreetMap contributors, CC-BY-SA"; + v = new String[]{"en", "Map data (c) OpenStreetMap contributors, CC-BY-SA"}; + p(k, v); + + k = "partial match"; + v = new String[]{"en", "partial match", "de", "ungefähr"}; + p(k, v); + + k = "Search"; + v = new String[]{"en", "Search", "de", "suchen"}; + p(k, v); + + k = "drive here"; + v = new String[]{"en", "Route to here", "de", "Ziel setzen"}; + p(k, v); + + k = "loading search results"; + v = new String[]{"en", "Loading search results", "de", "lade Suchergebnisse"}; + p(k, v); + + k = "towns"; + v = new String[]{"en", "Towns", "de", "Städte"}; + p(k, v); +*/ + Log.e("NavitTextTranslations", "... ready"); + } + + private static void p(String key, String[] values) + { + HashMap<String, String> t = new HashMap<String, String>(); + //Log.e("NavitTextTranslations", "trying: " + key); + try + { + for (int i = 0; i < (int) (values.length / 2); i++) + { + t.put(values[i * 2], values[(i * 2) + 1]); + } + Navit_text_lookup.put(key, t); + } + catch (Exception e) + { + Log.e("NavitTextTranslations", "!!Error in translationkey: " + key); + } + } + + public static String get_text(String in) + { + String out = null; + //Log.e("NavitTextTranslations", "lookup L:" + main_language + " T:" + in); + try + { + out = Navit_text_lookup.get(in).get(main_language); + } + catch (Exception e) + { + // most likely there is not translation yet + //Log.e("NavitTextTranslations", "lookup: exception"); + out = null; + } + + if (out == null) + { + // always return a string for output (use fallback language) + //Log.e("NavitTextTranslations", "using default language"); + try + { + out = Navit_text_lookup.get(in).get(fallback_language); + } + catch (Exception e) + { + //Log.e("NavitTextTranslations", "using default language: exception"); + // most likely there is not translation yet + out = null; + } + } + + if (out == null) + { + // if we still dont have any text, use the ".mo" file and call the c-function gettext(in) + out = NavitGraphics.getLocalizedString(in); + if (out != null) + { + HashMap<String, String> langmap = new HashMap<String, String>(); + langmap.put(main_language, out); + Navit_text_lookup.put(in, langmap); + } + + //Log.e("NavitTextTranslations", "return the value from gettext() = " + out); + } + return out; + } + +} |