extended maptool dir scan
This commit is contained in:
parent
23968b2a5b
commit
52b4dfb028
4 changed files with 336 additions and 5 deletions
|
@ -36,6 +36,8 @@ public class BRouterActivity extends Activity implements OnInitListener
|
||||||
private static final int DIALOG_SELECTBASEDIR_ID = 11;
|
private static final int DIALOG_SELECTBASEDIR_ID = 11;
|
||||||
private static final int DIALOG_MAINACTION_ID = 12;
|
private static final int DIALOG_MAINACTION_ID = 12;
|
||||||
private static final int DIALOG_OLDDATAHINT_ID = 13;
|
private static final int DIALOG_OLDDATAHINT_ID = 13;
|
||||||
|
private static final int DIALOG_SHOW_WP_HELP_ID = 14;
|
||||||
|
private static final int DIALOG_SHOW_WP_SCANRESULT_ID = 15;
|
||||||
|
|
||||||
private BRouterView mBRouterView;
|
private BRouterView mBRouterView;
|
||||||
private PowerManager mPowerManager;
|
private PowerManager mPowerManager;
|
||||||
|
@ -117,6 +119,51 @@ public class BRouterActivity extends Activity implements OnInitListener
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
return builder.create();
|
return builder.create();
|
||||||
|
case DIALOG_SHOW_WP_HELP_ID:
|
||||||
|
builder = new AlertDialog.Builder( this );
|
||||||
|
builder
|
||||||
|
.setTitle( "No Waypoint Database found" )
|
||||||
|
.setMessage(
|
||||||
|
"The simple scan did not find any map-tool directory including a waypoint database. "
|
||||||
|
+ "Reason could be there is no map-tool installed (osmand, locus or oruxmaps), or at an "
|
||||||
|
+ "unusual path, or it contains no waypoints yet. That's o.k. if you want to use BRouter "
|
||||||
|
+ "in server-mode only - in that case you can still use the 'Server-Mode' button to "
|
||||||
|
+ "configure the profile mapping. But you will not be able to use nogo-points or do "
|
||||||
|
+ "long distance calculations. If you know the path to your map-tool, you can manually "
|
||||||
|
+ "configure it in 'storageconfig.txt'. Or I can do an extended scan searching "
|
||||||
|
+ "your sd-card for a valid waypoint database" ).setPositiveButton( "Scan", new DialogInterface.OnClickListener()
|
||||||
|
{
|
||||||
|
public void onClick( DialogInterface dialog, int id )
|
||||||
|
{
|
||||||
|
mBRouterView.startWpDatabaseScan();
|
||||||
|
}
|
||||||
|
} ).setNegativeButton( "Exit", new DialogInterface.OnClickListener()
|
||||||
|
{
|
||||||
|
public void onClick( DialogInterface dialog, int id )
|
||||||
|
{
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
return builder.create();
|
||||||
|
case DIALOG_SHOW_WP_SCANRESULT_ID:
|
||||||
|
builder = new AlertDialog.Builder( this );
|
||||||
|
builder
|
||||||
|
.setTitle( "Waypoint Database " )
|
||||||
|
.setMessage( "Found Waypoint-Database(s) for maptool-dir: " + maptoolDirCandidate
|
||||||
|
+ " Configure that?" ).setPositiveButton( "Yes", new DialogInterface.OnClickListener()
|
||||||
|
{
|
||||||
|
public void onClick( DialogInterface dialog, int id )
|
||||||
|
{
|
||||||
|
mBRouterView.saveMaptoolDir( maptoolDirCandidate );
|
||||||
|
}
|
||||||
|
} ).setNegativeButton( "No", new DialogInterface.OnClickListener()
|
||||||
|
{
|
||||||
|
public void onClick( DialogInterface dialog, int id )
|
||||||
|
{
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
return builder.create();
|
||||||
case DIALOG_OLDDATAHINT_ID:
|
case DIALOG_OLDDATAHINT_ID:
|
||||||
builder = new AlertDialog.Builder( this );
|
builder = new AlertDialog.Builder( this );
|
||||||
builder
|
builder
|
||||||
|
@ -257,18 +304,26 @@ public class BRouterActivity extends Activity implements OnInitListener
|
||||||
} );
|
} );
|
||||||
return builder.create();
|
return builder.create();
|
||||||
case DIALOG_SHOWRESULT_ID:
|
case DIALOG_SHOWRESULT_ID:
|
||||||
String leftLabel = wpCount < 0 ? "Exit" : ( wpCount == 0 ? "Select from" : "Select to/via" );
|
String leftLabel = wpCount < 0 ? ( wpCount == -1 ? "Exit" : "Help") : ( wpCount == 0 ? "Select from" : "Select to/via" );
|
||||||
String rightLabel = wpCount < 2 ? "Server-Mode" : "Calc Route";
|
String rightLabel = wpCount < 2 ? "Server-Mode" : "Calc Route";
|
||||||
builder = new AlertDialog.Builder( this );
|
builder = new AlertDialog.Builder( this );
|
||||||
builder.setTitle( title ).setMessage( errorMessage ).setPositiveButton( leftLabel, new DialogInterface.OnClickListener()
|
builder.setTitle( title ).setMessage( errorMessage ).setPositiveButton( leftLabel, new DialogInterface.OnClickListener()
|
||||||
{
|
{
|
||||||
public void onClick( DialogInterface dialog, int id )
|
public void onClick( DialogInterface dialog, int id )
|
||||||
{
|
{
|
||||||
if ( wpCount < 0 )
|
if ( wpCount == -2 )
|
||||||
|
{
|
||||||
|
showWaypointDatabaseHelp();
|
||||||
|
}
|
||||||
|
else if ( wpCount == -1 )
|
||||||
|
{
|
||||||
finish();
|
finish();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
mBRouterView.pickWaypoints();
|
mBRouterView.pickWaypoints();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} ).setNegativeButton( rightLabel, new DialogInterface.OnClickListener()
|
} ).setNegativeButton( rightLabel, new DialogInterface.OnClickListener()
|
||||||
{
|
{
|
||||||
public void onClick( DialogInterface dialog, int id )
|
public void onClick( DialogInterface dialog, int id )
|
||||||
|
@ -338,6 +393,8 @@ public class BRouterActivity extends Activity implements OnInitListener
|
||||||
|
|
||||||
private List<OsmNodeNamed> nogoList;
|
private List<OsmNodeNamed> nogoList;
|
||||||
|
|
||||||
|
private String maptoolDirCandidate;
|
||||||
|
|
||||||
public boolean isOnline()
|
public boolean isOnline()
|
||||||
{
|
{
|
||||||
ConnectivityManager cm = (ConnectivityManager) getSystemService( Context.CONNECTIVITY_SERVICE );
|
ConnectivityManager cm = (ConnectivityManager) getSystemService( Context.CONNECTIVITY_SERVICE );
|
||||||
|
@ -441,6 +498,19 @@ public class BRouterActivity extends Activity implements OnInitListener
|
||||||
showNewDialog( DIALOG_PICKWAYPOINT_ID );
|
showNewDialog( DIALOG_PICKWAYPOINT_ID );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void showWaypointDatabaseHelp()
|
||||||
|
{
|
||||||
|
showNewDialog( DIALOG_SHOW_WP_HELP_ID );
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void showWpDatabaseScanSuccess( String bestGuess )
|
||||||
|
{
|
||||||
|
maptoolDirCandidate = bestGuess;
|
||||||
|
showNewDialog( DIALOG_SHOW_WP_SCANRESULT_ID );
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void selectNogos( List<OsmNodeNamed> nogoList )
|
public void selectNogos( List<OsmNodeNamed> nogoList )
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,7 +12,6 @@ import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
@ -32,6 +31,7 @@ import android.widget.Toast;
|
||||||
import btools.expressions.BExpressionContextGlobal;
|
import btools.expressions.BExpressionContextGlobal;
|
||||||
import btools.expressions.BExpressionMetaData;
|
import btools.expressions.BExpressionMetaData;
|
||||||
import btools.mapaccess.OsmNode;
|
import btools.mapaccess.OsmNode;
|
||||||
|
import btools.mapaccess.StorageConfigHelper;
|
||||||
import btools.router.OsmNodeNamed;
|
import btools.router.OsmNodeNamed;
|
||||||
import btools.router.OsmTrack;
|
import btools.router.OsmTrack;
|
||||||
import btools.router.RoutingContext;
|
import btools.router.RoutingContext;
|
||||||
|
@ -66,6 +66,8 @@ public class BRouterView extends View
|
||||||
private boolean needsNogoSelection;
|
private boolean needsNogoSelection;
|
||||||
private boolean needsWaypointSelection;
|
private boolean needsWaypointSelection;
|
||||||
|
|
||||||
|
private WpDatabaseScanner dataBaseScanner;
|
||||||
|
|
||||||
private long lastDataTime = System.currentTimeMillis();
|
private long lastDataTime = System.currentTimeMillis();
|
||||||
|
|
||||||
private CoordinateReader cor;
|
private CoordinateReader cor;
|
||||||
|
@ -358,6 +360,19 @@ public class BRouterView extends View
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void startWpDatabaseScan()
|
||||||
|
{
|
||||||
|
dataBaseScanner = new WpDatabaseScanner();
|
||||||
|
dataBaseScanner.start();
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveMaptoolDir( String dir )
|
||||||
|
{
|
||||||
|
ConfigMigration.saveAdditionalMaptoolDir( segmentDir, dir );
|
||||||
|
( (BRouterActivity) getContext() ).showResultMessage( "Success", "please restart to use new config", -1 );
|
||||||
|
}
|
||||||
|
|
||||||
public void finishWaypointSelection()
|
public void finishWaypointSelection()
|
||||||
{
|
{
|
||||||
needsWaypointSelection = false;
|
needsWaypointSelection = false;
|
||||||
|
@ -390,7 +405,7 @@ public class BRouterView extends View
|
||||||
String msg;
|
String msg;
|
||||||
if ( wpList.size() == 0 )
|
if ( wpList.size() == 0 )
|
||||||
{
|
{
|
||||||
msg = "no from/to found\n" + sourceHint;
|
msg = "Expecting waypoint selection\n" + sourceHint;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -398,7 +413,7 @@ public class BRouterView extends View
|
||||||
for ( int i = 0; i < wpList.size(); i++ )
|
for ( int i = 0; i < wpList.size(); i++ )
|
||||||
msg += ( i > 0 ? "->" : "" ) + wpList.get( i ).name;
|
msg += ( i > 0 ? "->" : "" ) + wpList.get( i ).name;
|
||||||
}
|
}
|
||||||
( (BRouterActivity) getContext() ).showResultMessage( "Select Action", msg, wpList.size() );
|
( (BRouterActivity) getContext() ).showResultMessage( "Select Action", msg, cor instanceof CoordinateReaderNone ? -2 : wpList.size() );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,8 +595,59 @@ public class BRouterView extends View
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showDatabaseScanning( Canvas canvas )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Thread.sleep( 100 );
|
||||||
|
}
|
||||||
|
catch (InterruptedException ie)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
Paint paint1 = new Paint();
|
||||||
|
paint1.setColor( Color.WHITE );
|
||||||
|
paint1.setTextSize( 20 );
|
||||||
|
|
||||||
|
Paint paint2 = new Paint();
|
||||||
|
paint2.setColor( Color.WHITE );
|
||||||
|
paint2.setTextSize( 10 );
|
||||||
|
|
||||||
|
String currentDir = dataBaseScanner.getCurrentDir();
|
||||||
|
String bestGuess = dataBaseScanner.getBestGuess();
|
||||||
|
|
||||||
|
if ( currentDir == null ) // scan finished
|
||||||
|
{
|
||||||
|
if ( bestGuess.length() == 0 )
|
||||||
|
{
|
||||||
|
( (BRouterActivity) getContext() ).showErrorMessage( "scan did not find any possible waypoint database" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
( (BRouterActivity) getContext() ).showWpDatabaseScanSuccess( bestGuess);
|
||||||
|
}
|
||||||
|
cr = null;
|
||||||
|
dataBaseScanner = null;
|
||||||
|
waitingForSelection = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.drawText( "Scanning:", 10, 30, paint1 );
|
||||||
|
canvas.drawText( currentDir, 0, 60, paint2 );
|
||||||
|
canvas.drawText( "Best Guess:", 10, 90, paint1 );
|
||||||
|
canvas.drawText( bestGuess, 0, 120, paint2 );
|
||||||
|
canvas.drawText( "Last Error:", 10, 150, paint1 );
|
||||||
|
canvas.drawText( dataBaseScanner.getLastError(), 0, 180, paint2 );
|
||||||
|
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
private void _onDraw( Canvas canvas )
|
private void _onDraw( Canvas canvas )
|
||||||
{
|
{
|
||||||
|
if ( dataBaseScanner != null )
|
||||||
|
{
|
||||||
|
showDatabaseScanning( canvas );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ( waitingForSelection )
|
if ( waitingForSelection )
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -86,4 +86,61 @@ public class ConfigMigration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static File saveAdditionalMaptoolDir( String segmentDir, String value )
|
||||||
|
{
|
||||||
|
return saveStorageLocation( segmentDir, "additional_maptool_dir=", value );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static File saveStorageLocation( String segmentDir, String tag, String value )
|
||||||
|
{
|
||||||
|
File res = null;
|
||||||
|
BufferedReader br = null;
|
||||||
|
BufferedWriter bw = null;
|
||||||
|
String configFile = segmentDir + "/storageconfig.txt";
|
||||||
|
List<String> lines = new ArrayList<String>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
br = new BufferedReader( new FileReader( configFile ) );
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
String line = br.readLine();
|
||||||
|
if ( line == null ) break;
|
||||||
|
if ( !line.trim().startsWith( tag ) )
|
||||||
|
{
|
||||||
|
lines.add( line );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lines.add( tag + value );
|
||||||
|
br.close();
|
||||||
|
br = null;
|
||||||
|
bw = new BufferedWriter( new FileWriter( configFile ) );
|
||||||
|
for( String line : lines )
|
||||||
|
{
|
||||||
|
bw.write( line + "\r\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) { /* ignore */ }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if ( br != null )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
br.close();
|
||||||
|
}
|
||||||
|
catch (Exception ee) { /* ignore */ }
|
||||||
|
}
|
||||||
|
if ( bw != null )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
bw.close();
|
||||||
|
}
|
||||||
|
catch (Exception ee) { /* ignore */ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
package btools.routingapp;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class WpDatabaseScanner extends Thread
|
||||||
|
{
|
||||||
|
private String currentDir = "";
|
||||||
|
private String bestGuess = "";
|
||||||
|
private String lastError = "";
|
||||||
|
|
||||||
|
private Object currentDirSync = new Object();
|
||||||
|
|
||||||
|
private long maxtimestamp = 0;
|
||||||
|
|
||||||
|
public String getCurrentDir()
|
||||||
|
{
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
return currentDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCurrentDir( String dir )
|
||||||
|
{
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
currentDir = dir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBestGuess()
|
||||||
|
{
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
return bestGuess;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastError()
|
||||||
|
{
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
return lastError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLastError( String msg )
|
||||||
|
{
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
lastError = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] vetos = new String[] { "dev", "sys", "system", "proc", "etc", "init", "d", "cache", "acct", "data" };
|
||||||
|
|
||||||
|
private void scan( File dir, int level )
|
||||||
|
{
|
||||||
|
if ( level > 8 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if ( dir.isDirectory() )
|
||||||
|
{
|
||||||
|
if ( level == 1 )
|
||||||
|
{
|
||||||
|
String name = dir.getName();
|
||||||
|
for( String veto: vetos )
|
||||||
|
{
|
||||||
|
if ( veto.equals( name ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
testPath( dir.getPath() );
|
||||||
|
File[] childs = dir.listFiles();
|
||||||
|
if ( childs == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for ( File child : childs )
|
||||||
|
{
|
||||||
|
scan( child, level+1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
setLastError( e.toString() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testPath( String path ) throws Exception
|
||||||
|
{
|
||||||
|
setCurrentDir( path );
|
||||||
|
|
||||||
|
testReader( new CoordinateReaderOsmAnd( path ) );
|
||||||
|
testReader( new CoordinateReaderOsmAnd( path, true ) );
|
||||||
|
testReader( new CoordinateReaderLocus( path ) );
|
||||||
|
testReader( new CoordinateReaderOrux( path ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testReader( CoordinateReader cor ) throws Exception
|
||||||
|
{
|
||||||
|
long ts = cor.getTimeStamp();
|
||||||
|
if ( ts > maxtimestamp )
|
||||||
|
{
|
||||||
|
maxtimestamp = ts;
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
bestGuess = cor.basedir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( ts > 0 && ts == maxtimestamp )
|
||||||
|
{
|
||||||
|
synchronized (currentDirSync)
|
||||||
|
{
|
||||||
|
if ( cor.basedir.length() < bestGuess.length() )
|
||||||
|
{
|
||||||
|
bestGuess = cor.basedir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
scan( new File( "/" ), 0 );
|
||||||
|
setCurrentDir( null );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue