/* @file MainWindow.java
*
* @author marco corvi
* @date may 2012
*
* @brief TopoDroid main class: survey/calib list
* --------------------------------------------------------
* Copyright This sowftare is distributed under GPL-3.0 or later
* See the file COPYING.
* --------------------------------------------------------
*/
package com.topodroid.DistoX;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;
// import java.io.EOFException;
// import java.io.DataInputStream;
// import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.UUID;
import java.util.List;
import java.util.ArrayList;
import android.os.AsyncTask;
import android.os.Debug;
// import java.lang.Long;
// import java.lang.reflect.Method;
// import java.lang.reflect.InvocationTargetException;
import android.app.Application;
import android.app.Activity;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
// import android.content.res.ColorStateList;
import android.os.Bundle;
import android.os.Handler;
// import android.os.Message;
// import android.os.Parcelable;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.location.LocationManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.res.Resources;
import android.net.Uri;
import android.bluetooth.BluetoothDevice;
import android.widget.TextView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.Button;
import android.widget.LinearLayout;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.View.OnClickListener;
import android.view.KeyEvent;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.preference.PreferenceManager;
// import android.view.Menu;
// import android.view.MenuItem;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.util.Log;
/*
Method m = device.getClass().getMethod( "createRfcommSocket", new Class[] (int.class) );
socket = (BluetoothSocket) m.invoke( device, 2 );
socket.connect();
*/
public class MainWindow extends Activity
implements OnItemClickListener
, OnItemLongClickListener
, View.OnClickListener
, OnCancelListener
, OnDismissListener
{
private TopoDroidApp mApp;
private Activity mActivity = null;
private boolean onMenu; // whether menu is displaying
private LinearLayout mLayout;
private ListView mList;
// private ArrayAdapter<String> mArrayAdapter;
private ListItemAdapter mArrayAdapter;
private Button[] mButton1;
private static int izons[] = {
R.drawable.iz_disto2b, // iz_disto,
R.drawable.iz_plus,
R.drawable.iz_import,
R.drawable.iz_tools
// FIXME THMANAGER
// R.drawable.iz_therion,
// R.drawable.iz_database
};
private static int menus[] = {
// R.string.menu_palette,
R.string.menu_logs,
R.string.menu_join_survey,
R.string.menu_about,
R.string.menu_options,
R.string.menu_help
};
private static int help_icons[] = { R.string.help_device,
R.string.help_add_topodroid,
R.string.help_import,
R.string.help_symbol
// FIXME THMANAGER
// R.string.help_therion,
// R.string.help_database
};
private static int help_menus[] = {
// R.string.help_symbol,
R.string.help_log,
R.string.help_join_survey,
R.string.help_info_topodroid,
R.string.help_prefs,
R.string.help_help
};
// -------------------------------------------------------------
private boolean say_no_survey = true;
private boolean say_not_enabled = true; // whether to say that BT is not enabled
boolean do_check_bt = true; // one-time bluetooth check sentinel
// -------------------------------------------------------------------
public void updateDisplay( )
{
DataHelper data = mApp.mData;
if ( data != null ) {
List<String> list = data.selectAllSurveys();
updateList( list );
if ( say_no_survey && list.size() == 0 ) {
say_no_survey = false;
Toast.makeText( mActivity, R.string.no_survey, Toast.LENGTH_SHORT ).show();
}
}
}
private void updateList( List<String> list )
{
mArrayAdapter.clear();
if ( list.size() > 0 ) {
for ( String item : list ) {
mArrayAdapter.add( item );
}
}
}
// ---------------------------------------------------------------
// list items click
public void onClick(View view)
{
if ( onMenu ) {
closeMenu();
return;
}
// TDLog.Log( TDLog.LOG_INPUT, "MainWindow onClick() " + view.toString() );
Intent intent;
// int status = mStatus;
Button b0 = (Button)view;
if ( b0 == mImage ) {
if ( mMenu.getVisibility() == View.VISIBLE ) {
mMenu.setVisibility( View.GONE );
onMenu = false;
} else {
mMenu.setVisibility( View.VISIBLE );
onMenu = true;
}
// updateDisplay();
return;
}
int k1 = 0;
int k2 = 0;
{
if ( k1 < mNrButton1 && b0 == mButton1[k1++] ) { // mBtnDevice
if ( mApp.mBTAdapter == null ) {
Toast.makeText( mActivity, R.string.no_bt, Toast.LENGTH_SHORT ).show();
} else {
if ( mApp.mBTAdapter.isEnabled() ) {
// TDLog.Debug( "start device window");
startActivity( new Intent( Intent.ACTION_VIEW ).setClass( mActivity, DeviceActivity.class ) );
} else {
Toast.makeText( mActivity, R.string.not_enabled, Toast.LENGTH_SHORT ).show();
}
}
} else if ( k1 < mNrButton1 && b0 == mButton1[k1++] ) { // NEW SURVEY/CALIB
mApp.setSurveyFromName( null, true ); // new-survey dialog: tell app to clear survey name and id
(new SurveyNewDialog( mActivity, this, -1, -1 )).show();
} else if ( k1 < mNrButton1 && b0 == mButton1[k1++] ) { // IMPORT
(new ImportDialog( mActivity, this, mApp )).show();
} else if ( k1 < mNrButton1 && b0 == mButton1[k1++] ) { // PALETTE
BrushManager.makePaths( getResources() );
(new SymbolEnableDialog( mActivity, mApp )).show();
// FIXME THMANAGER
// } else if ( k1 < mNrButton1 && b0 == mButton1[k1++] ) { // THERION MANAGER ThManager
// try {
// intent = new Intent( "ThManager.intent.action.Launch" );
// // intent.putExtra( "survey", mApp.getSurveyThFile() );
// startActivity( intent );
// } catch ( ActivityNotFoundException e ) {
// Toast.makeText( mActivity, R.string.no_thmanager, Toast.LENGTH_SHORT ).show();
// }
// } else if ( k1 < mNrButton1 && b0 == mButton1[k1++] ) { // DATABASE
// try {
// intent = new Intent(Intent.ACTION_VIEW, Uri.parse("file://" + TDPath.getDatabase() ) );
// intent.addCategory("com.kokufu.intent.category.APP_DB_VIEWER");
// startActivity( intent );
// } catch ( ActivityNotFoundException e ) {
// Toast.makeText( mActivity, R.string.no_db_viewer, Toast.LENGTH_SHORT ).show();
// }
}
}
// if ( status != mStatus ) {
// updateDisplay( );
// }
}
// splitSurvey invokes this method with args: null, 0, old_sid, old_id
//
void startSurvey( String value, int mustOpen ) // , long old_sid, long old_id )
{
mApp.setSurveyFromName( value, false ); // open survey activity: tell app to update survey name+id, no forward
Intent surveyIntent = new Intent( Intent.ACTION_VIEW ).setClass( this, SurveyWindow.class );
surveyIntent.putExtra( TDTag.TOPODROID_SURVEY, mustOpen );
// surveyIntent.putExtra( TDTag.TOPODROID_OLDSID, old_sid );
// surveyIntent.putExtra( TDTag.TOPODROID_OLDID, old_id );
mActivity.startActivity( surveyIntent );
}
void startSplitSurvey( long old_sid, long old_id )
{
mApp.setSurveyFromName( null, false ); // FIXME JOIN-SURVEY
(new SurveyNewDialog( mActivity, this, old_sid, old_id )).show(); // WITH SPLIT
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int pos, long id)
{
if ( onMenu ) {
closeMenu();
return true;
}
CharSequence item = ((TextView) view).getText();
startSurvey( item.toString(), 0 ); // , -1, -1 );
return true;
}
void doOpenSurvey( String name )
{
mApp.setSurveyFromName( name, false ); // open survey: tell app to update survey name+id, no forward
Intent openIntent = new Intent( this, ShotWindow.class );
startActivity( openIntent );
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int pos, long id)
{
CharSequence item = ((TextView) view).getText();
if ( mMenu == (ListView)parent ) {
handleMenu( pos );
return;
}
if ( onMenu ) {
closeMenu();
return;
}
mApp.setSurveyFromName( item.toString(), true );
Intent openIntent = new Intent( this, ShotWindow.class );
startActivity( openIntent );
}
void setTheTitle()
{
// String title = getResources().getString( R.string.app_name );
setTitle( mApp.getConnectionStateTitleStr() + mApp.mCWD );
setTitleColor( TDConst.COLOR_NORMAL );
// Log.v("DistoX", "TopoDroid activity set the title <" + mApp.getConnectionStateTitleStr() + title + ">" );
}
// ---------------------------------------------------------------
// FILE IMPORT
// NOTE survey name must be guaranteed not be in the db
private class ImportTherionTask extends AsyncTask<String, Integer, Long >
{
@Override
protected Long doInBackground( String... str )
{
long sid = 0;
try {
ParserTherion parser = new ParserTherion( str[0], true ); // apply_declination = true
ArrayList< ParserShot > shots = parser.getShots();
ArrayList< ParserShot > splays = parser.getSplays();
ArrayList< ParserTherion.Station > stations = parser.getStations();
ArrayList< ParserTherion.Fix > fixes = parser.getFixes();
sid = mApp.setSurveyFromName( str[1], false ); // IMPORT TH no forward
mApp.mData.updateSurveyDayAndComment( sid, parser.mDate, parser.mTitle, false );
mApp.mData.updateSurveyDeclination( sid, parser.mDeclination, false );
mApp.mData.updateSurveyInitStation( sid, parser.initStation(), false );
long id = mApp.mData.insertShots( sid, 1, shots ); // start id = 1
mApp.mData.insertShots( sid, id, splays );
// FIXME this suppose CS long-lat, ie, e==long, n==lat
// WorldMagneticModel wmm = new WorldMagneticModel( mApp );
// for ( ParserTherion.Fix fix : fixes ) {
// // double asl = fix.z;
// double alt = wmm.geoidToEllipsoid( fix.n, fix.e, fix.z );
// mApp.mData.insertFixed( sid, -1L, fix.name, fix.e, fix.n, alt, fix.z, "", 0 );
// }
for ( ParserTherion.Station st : stations ) {
mApp.mData.insertStation( sid, st.name, st.comment, st.flag );
}
} catch ( ParserException e ) {
// Toast.makeText(mActivity, R.string.file_parse_fail, Toast.LENGTH_SHORT).show();
}
return sid;
}
@Override
protected void onProgressUpdate(Integer... progress) { }
@Override
protected void onPostExecute(Long result) {
setTheTitle( );
updateDisplay( );
}
}
private class ImportCompassTask extends AsyncTask<String, Integer, Long >
{
@Override
protected Long doInBackground( String... str )
{
long sid = 0;
try {
ParserCompass parser = new ParserCompass( str[0], true ); // apply_declination = true
ArrayList< ParserShot > shots = parser.getShots();
ArrayList< ParserShot > splays = parser.getSplays();
if ( mApp.mData.hasSurveyName( parser.mName ) ) {
return -1L;
}
sid = mApp.setSurveyFromName( parser.mName, false ); // IMPORT DAT no forward
mApp.mData.updateSurveyDayAndComment( sid, parser.mDate, parser.mTitle, false );
mApp.mData.updateSurveyDeclination( sid, parser.mDeclination, false );
mApp.mData.updateSurveyInitStation( sid, parser.initStation(), false );
long id = mApp.mData.insertShots( sid, 1, shots ); // start id = 1
mApp.mData.insertShots( sid, id, splays );
} catch ( ParserException e ) {
// Toast.makeText(mActivity, R.string.file_parse_fail, Toast.LENGTH_SHORT).show();
}
return sid;
}
@Override
protected void onProgressUpdate(Integer... progress) { }
@Override
protected void onPostExecute(Long result) {
setTheTitle( );
if ( result >= 0 ) {
updateDisplay( );
} else {
Toast.makeText(mActivity, R.string.import_already, Toast.LENGTH_SHORT).show();
}
}
}
private class ImportVisualTopoTask extends AsyncTask< String, Integer, Long >
{
@Override
protected Long doInBackground( String... str )
{
long sid = 0;
try {
ParserVisualTopo parser = new ParserVisualTopo( str[0], true ); // apply_declination = true
ArrayList< ParserShot > shots = parser.getShots();
ArrayList< ParserShot > splays = parser.getSplays();
if ( mApp.mData.hasSurveyName( parser.mName ) ) {
return -1L;
}
sid = mApp.setSurveyFromName( parser.mName, false );
mApp.mData.updateSurveyDayAndComment( sid, parser.mDate, parser.mTitle, false );
mApp.mData.updateSurveyDeclination( sid, parser.mDeclination, false );
mApp.mData.updateSurveyInitStation( sid, parser.initStation(), false );
long id = mApp.mData.insertShots( sid, 1, shots ); // start id = 1
mApp.mData.insertShots( sid, id, splays );
} catch ( ParserException e ) {
// Toast.makeText(mActivity, R.string.file_parse_fail, Toast.LENGTH_SHORT).show();
}
return sid;
}
@Override
protected void onProgressUpdate(Integer... progress) { }
@Override
protected void onPostExecute(Long result) {
setTheTitle( );
if ( result >= 0 ) {
updateDisplay( );
} else {
Toast.makeText(mActivity, R.string.import_already, Toast.LENGTH_SHORT).show();
}
}
}
private class ImportPocketTopoTask extends AsyncTask< String, Integer, Long >
{
@Override
protected Long doInBackground( String... str )
{
long sid = 0;
try {
// import PocketTopo (only data for the first trip)
ParserPocketTopo parser = new ParserPocketTopo( str[0], str[1], true ); // apply_declination = true
ArrayList< ParserShot > shots = parser.getShots();
if ( mApp.mData.hasSurveyName( parser.mName ) ) {
return -1L;
}
sid = mApp.setSurveyFromName( parser.mName, false );
mApp.mData.updateSurveyDayAndComment( sid, parser.mDate, parser.mTitle, false );
mApp.mData.updateSurveyDeclination( sid, parser.mDeclination, false );
mApp.mData.updateSurveyInitStation( sid, parser.initStation(), false );
long id = mApp.mData.insertShots( sid, 1, shots ); // start id = 1
TDLog.Log( TDLog.LOG_PTOPO, "SID " + sid + " inserted shots. return " + id );
if ( parser.mStartFrom != null ) {
mApp.insert2dPlot( sid, "1", parser.mStartFrom, true, 0 ); // true = plan-extended plot, 0 = proj_dir
}
// DistoXDBlock blk = mApp.mData.selectShot( 1, sid );
// String plan = parser.mOutline;
// String extended = parser.mSideview;
// if ( blk != null /* && plan != null || extended != null */ ) {
// // insert plot in DB
// // long pid =
// mApp.insert2dPlot( sid, "1", blk.mFrom );
// if ( plan == null ) plan = "";
// if ( extended == null ) extended = "";
// TDLog.Log( TDLog.LOG_PTOPO, "SID " + sid + " scraps " + plan.length() + " " + extended.length() );
// try {
// FIXME tdr vs. th2
// String filename1 = TDPath.getTh2File( parser.mName + "-1p.th2" );
// TDPath.checkPath( filename1 );
// FileWriter fw1 = new FileWriter( filename1 );
// PrintWriter pw1 = new PrintWriter( fw1 );
// pw1.format("%s", plan );
//
// String filename2 = TDPath.getTh2File( parser.mName + "-1s.th2" );
// TDPath.checkPath( filename2 );
// FileWriter fw2 = new FileWriter( filename2 );
// PrintWriter pw2 = new PrintWriter( fw2 );
// pw2.format("%s", extended );
// } catch ( IOException e ) {
// TDLog.Error( "SID " + sid + " scraps IO error " + e );
// }
// }
} catch ( ParserException e ) {
// Toast.makeText(mActivity, R.string.file_parse_fail, Toast.LENGTH_SHORT).show();
}
return sid;
}
@Override
protected void onProgressUpdate(Integer... progress) { }
@Override
protected void onPostExecute(Long result) {
setTheTitle( );
if ( result >= 0 ) {
updateDisplay( );
} else {
Toast.makeText(mActivity, R.string.import_already, Toast.LENGTH_SHORT).show();
}
}
}
private class ImportZipTask extends AsyncTask< String, Integer, Long >
{
MainWindow parent;
ImportZipTask( MainWindow act ) { parent = act; }
@Override
protected Long doInBackground( String... str )
{
String filename = str[0];
Archiver archiver = new Archiver( mApp );
int ret = archiver.unArchive( TDPath.getZipFile( filename ), filename.replace(".zip", ""));
return (long)ret;
}
// @Override
// protected void onProgressUpdate(Integer... progress) { }
@Override
protected void onPostExecute(Long result) {
parent.setTheTitle( );
parent.updateDisplay( );
if ( result < -4 ) {
Toast.makeText( parent, R.string.unzip_fail, Toast.LENGTH_SHORT).show();
} else if ( result == -4 ) {
Toast.makeText( parent, R.string.unzip_fail_survey, Toast.LENGTH_SHORT).show();
} else if ( result == -3 ) {
Toast.makeText( parent, R.string.unzip_fail_db, Toast.LENGTH_SHORT).show();
} else if ( result == -2 ) {
Toast.makeText( parent, R.string.unzip_fail_td, Toast.LENGTH_SHORT).show();
} else if ( result == -1 ) {
Toast.makeText( parent, R.string.import_already, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText( parent, R.string.import_zip_ok, Toast.LENGTH_SHORT).show();
}
}
}
void importFile( String filename )
{
// FIXME connect-title string
mActivity.setTitle( R.string.import_title );
mActivity.setTitleColor( TDConst.COLOR_CONNECTED );
if ( filename.endsWith(".th") ) {
String filepath = TDPath.getImportFile( filename );
String name = filename.replace(".th", "" );
if ( mApp.mData.hasSurveyName( name ) ) {
Toast.makeText(mActivity, R.string.import_already, Toast.LENGTH_SHORT).show();
return;
}
// Toast.makeText(mActivity, R.string.import_wait, Toast.LENGTH_SHORT).show();
new ImportTherionTask().execute( filepath, name );
} else if ( filename.endsWith(".dat") ) {
String filepath = TDPath.getImportFile( filename );
new ImportCompassTask().execute( filepath );
} else if ( filename.endsWith(".top") ) {
String filepath = TDPath.getImportFile( filename );
new ImportPocketTopoTask().execute( filepath, filename ); // TODO pass the drawer as arg
} else if ( filename.endsWith(".tro") ) {
String filepath = TDPath.getImportFile( filename );
new ImportVisualTopoTask().execute( filepath );
} else if ( filename.endsWith(".zip") ) {
Toast.makeText(mActivity, R.string.import_zip_wait, Toast.LENGTH_LONG).show();
new ImportZipTask( this ) .execute( filename );
}
// FIXME SYNC updateDisplay();
}
// ---------------------------------------------------------------
TopoDroidAbout mTopoDroidAbout = null;
HorizontalListView mListView;
// HorizontalImageButtonView mButtonView1;
HorizontalButtonView mButtonView1;
Button mImage;
ListView mMenu;
// HOVER
// MyMenuAdapter mMenuAdapter = null;
ArrayAdapter< String > mMenuAdapter;
void setMenuAdapter( Resources res )
{
// HOVER
// mMenuAdapter = new MyMenuAdapter( this, this, mMenu, R.layout.menu, new ArrayList< MyMenuItem >() );
mMenuAdapter = new ArrayAdapter<String>(mActivity, R.layout.menu );
// mMenuAdapter.add( res.getString( menus[0] ) );
if ( TDSetting.mLevelOverAdvanced ) mMenuAdapter.add( res.getString( menus[0] ) );
if ( TDSetting.mLevelOverAdvanced && mApp.mCosurvey ) mMenuAdapter.add( res.getString( menus[1] ) );
mMenuAdapter.add( res.getString( menus[2] ) );
mMenuAdapter.add( res.getString( menus[3] ) );
mMenuAdapter.add( res.getString( menus[4] ) );
mMenu.setAdapter( mMenuAdapter );
mMenu.invalidate();
}
private void closeMenu()
{
mMenu.setVisibility( View.GONE );
// HOVER
// mMenuAdapter.resetBgColor();
onMenu = false;
}
private void handleMenu( int pos )
{
closeMenu();
// Toast.makeText(mActivity, item.toString(), Toast.LENGTH_SHORT).show();
int p = 0;
// if ( p++ == pos ) { // PALETTE
// BrushManager.makePaths( getResources() );
// (new SymbolEnableDialog( mActivity, mApp )).show();
// } else {
Intent intent;
if ( TDSetting.mLevelOverAdvanced && p++ == pos ) { // LOGS
intent = new Intent( mActivity, TopoDroidPreferences.class );
intent.putExtra( TopoDroidPreferences.PREF_CATEGORY, TopoDroidPreferences.PREF_CATEGORY_LOG );
startActivity( intent );
} else {
if ( TDSetting.mLevelOverAdvanced && mApp.mCosurvey && p++ == pos ) { // CO-SURVEY
(new ConnectDialog( mActivity, mApp )).show();
} else {
if ( p++ == pos ) { // ABOUT
(new TopoDroidAbout( mActivity )).show();
} else {
if ( p++ == pos ) { // SETTINGS
intent = new Intent( mActivity, TopoDroidPreferences.class );
intent.putExtra( TopoDroidPreferences.PREF_CATEGORY, TopoDroidPreferences.PREF_CATEGORY_ALL );
startActivity( intent );
} else {
if ( p++ == pos ) { // HELP
(new HelpDialog(mActivity, izons, menus, help_icons, help_menus, mNrButton1, menus.length ) ).show();
}
}
}
}
}
// }
// updateDisplay();
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate( savedInstanceState );
// TDLog.Profile("TDActivity onCreate");
setContentView(R.layout.topodroid_activity);
mApp = (TopoDroidApp) getApplication();
mActivity = this;
mApp.mActivity = this;
// mArrayAdapter = new ArrayAdapter<String>( this, R.layout.message );
mArrayAdapter = new ListItemAdapter( this, R.layout.message );
mLayout = (LinearLayout) findViewById( R.id.td_layout );
mList = (ListView) findViewById(R.id.td_list);
mList.setAdapter( mArrayAdapter );
mList.setOnItemClickListener( this );
mList.setLongClickable( true );
mList.setOnItemLongClickListener( this );
mList.setDividerHeight( 2 );
// TDLog.Profile("TDActivity menu");
mImage = (Button) findViewById( R.id.handle );
mImage.setOnClickListener( this );
mMenu = (ListView) findViewById( R.id.menu );
mMenuAdapter = null;
setMenuAdapter( getResources() );
closeMenu();
// HOVER
mMenu.setOnItemClickListener( this );
// TDLog.Profile("TDActivity buttons");
mListView = (HorizontalListView) findViewById(R.id.listview);
resetButtonBar();
if ( mApp.mWelcomeScreen ) {
mApp.setBooleanPreference( "DISTOX_WELCOME_SCREEN", false );
mApp.mWelcomeScreen = false;
mTopoDroidAbout = new TopoDroidAbout( this );
mTopoDroidAbout.setOnCancelListener( this );
mTopoDroidAbout.setOnDismissListener( this );
mTopoDroidAbout.show();
}
// FIXME INSTALL_SYMBOL
// if ( mApp.askSymbolUpdate ) {
// // (new TopoDroidVersionDialog(this, mApp)).show();
// // FIXME SYMBOL if symbol have not been updated TopoDroid exits
// // if ( mApp.askSymbolUpdate ) finish();
// TopoDroidAlertDialog.makeAlert( this, getResources(), R.string.version_ask,
// new DialogInterface.OnClickListener() {
// @Override
// public void onClick( DialogInterface dialog, int btn ) {
// mApp.installSymbols( true );
// }
// } );
// }
// // mApp.installSymbols( true );
// setTitleColor( 0x006d6df6 );
// new AsyncTask<Void,Void,Void>() {
// @Override
// protected Void doInBackground(Void... arg0)
// {
// BrushManager.doMakePaths( );
// WorldMagneticModel.loadEGM9615( mApp );
// // int n_terms = MagUtil.CALCULATE_NUMTERMS( 12 );
// // WorldMagneticModel.loadWMM( mApp, n_terms );
// return null;
// }
// };
// TDLog.Profile("TDActivity thread");
Thread loader = new Thread() {
@Override
public void run() {
mApp.startupStep2();
Resources res = getResources();
BrushManager.reloadPointLibrary( res ); // reload symbols
BrushManager.reloadLineLibrary( res );
BrushManager.reloadAreaLibrary( res );
BrushManager.doMakePaths( );
WorldMagneticModel.loadEGM9615( mApp );
}
};
loader.setPriority( Thread.MIN_PRIORITY );
loader.start();
setTheTitle();
}
int mNrButton1 = 4;
void resetButtonBar()
{
int size = mApp.setListViewHeight( mListView );
MyButton.resetCache( /* mApp, */ size );
// FIXME THMANAGER
// mNrButton1 = 3 + ( TDSetting.mLevelOverAdvanced ? 2 : 0 );
mButton1 = new Button[mNrButton1];
mImage.setBackgroundDrawable( MyButton.getButtonBackground( mApp, getResources(), R.drawable.iz_menu ) );
for (int k=0; k<mNrButton1; ++k ) {
mButton1[k] = MyButton.getButton( mActivity, this, izons[k] );
}
// mButtonView1 = new HorizontalImageButtonView( mButton1 );
mButtonView1 = new HorizontalButtonView( mButton1 );
mListView.setAdapter( mButtonView1.mAdapter );
}
@Override
public void onDismiss( DialogInterface d )
{
if ( d == (Dialog)mTopoDroidAbout ) {
mTopoDroidAbout = null;
}
}
@Override
public void onCancel( DialogInterface d )
{
if ( d == (Dialog)mTopoDroidAbout ) {
mTopoDroidAbout = null;
}
}
// private void restoreInstanceState(Bundle map )
// {
// }
// private void restoreInstanceFromData()
// {
// }
// private void saveInstanceToData()
// {
// }
// @Override
// public void onSaveInstanceState(Bundle outState)
// {
// }
// ------------------------------------------------------------------
// LIFECYCLE
//
// onCreate --> onStart --> onResume
// --> onSaveInstanceState --> onPause --> onStop | drawing | --> onStart --> onResume
// --> onSaveInstanceState --> onPause [ off/on ] --> onResume
// --> onPause --> onStop --> onDestroy
@Override
public void onStart()
{
super.onStart();
// restoreInstanceFromFile();
// TDLog.Log( TopoDroidLoLogOG_MAIN, "onStart check BT " + mApp.mCheckBT + " enabled " + mApp.mBTAdapter.isEnabled() );
// TDLog.Profile("TDActivity onStart");
if ( do_check_bt ) {
do_check_bt = false;
if ( mApp.mBTAdapter == null ) {
Toast.makeText( this, R.string.no_bt, Toast.LENGTH_SHORT ).show();
} else {
if ( TDSetting.mCheckBT == 1 && ! mApp.mBTAdapter.isEnabled() ) {
Intent enableIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE );
startActivityForResult( enableIntent, TDRequest.REQUEST_ENABLE_BT );
} else {
// nothing to do: scanBTDEvices(); is called by menu CONNECT
}
// FIXME_BT
// setBTMenus( mApp.mBTAdapter.isEnabled() );
}
}
// mApp.checkAutoPairing(); // already done when prefs are loaded
}
@Override
public synchronized void onResume()
{
super.onResume();
// TDLog.Profile("TDActivity onResume");
// TDLog.Log( TDLog.LOG_MAIN, "onResume " );
// mApp.resetLocale();
mApp.resumeComm();
// restoreInstanceFromFile();
// This is necessary: switching display off/on there is the call sequence
// [off] onSaveInstanceState
// [on] onResume
updateDisplay( );
}
@Override
protected synchronized void onPause()
{
super.onPause();
// TDLog.Log( TDLog.LOG_MAIN, "onPause " );
mApp.suspendComm();
}
@Override
public void onStop()
{
super.onStop();
if ( TopoDroidApp.isTracing ) {
Debug.stopMethodTracing();
}
}
@Override
public synchronized void onDestroy()
{
super.onDestroy();
if ( doubleBackHandler != null ) {
doubleBackHandler.removeCallbacks( doubleBackRunnable );
}
// TDLog.Log( TDLog.LOG_MAIN, "onDestroy " );
// FIXME if ( mApp.mComm != null ) { mApp.mComm.interrupt(); }
// FIXME BT_RECEIVER mApp.resetCommBTReceiver();
// saveInstanceToData();
mApp.stopPairingRequest();
}
private boolean doubleBack = false;
private Handler doubleBackHandler = new Handler();
private Toast doubleBackToast = null;
private final Runnable doubleBackRunnable = new Runnable() {
@Override
public void run() {
doubleBack = false;
if ( doubleBackToast != null ) doubleBackToast.cancel();
doubleBackToast = null;
}
};
@Override
public void onBackPressed () // askClose
{
if ( onMenu ) {
closeMenu();
return;
}
if ( doubleBack ) {
if ( doubleBackToast != null ) doubleBackToast.cancel();
doubleBackToast = null;
super.onBackPressed();
return;
}
doubleBack = true;
doubleBackToast = Toast.makeText( this, R.string.double_back, Toast.LENGTH_SHORT );
doubleBackToast.show();
doubleBackHandler.postDelayed( doubleBackRunnable, 1000 );
}
// ------------------------------------------------------------------
public void onActivityResult( int request, int result, Intent intent )
{
// TDLog.Log( TDLog.LOG_MAIN, "on Activity Result: request " + mRequestName[request] + " result: " + result );
Bundle extras = (intent != null )? intent.getExtras() : null;
switch ( request ) {
case TDRequest.REQUEST_ENABLE_BT:
// mApp.resetLocale(); // apparently this does not affect locale
if ( result == Activity.RESULT_OK ) {
// nothing to do: scanBTDEvices() is called by menu CONNECT
} else if ( say_not_enabled ) {
say_not_enabled = false;
Toast.makeText(this, R.string.not_enabled, Toast.LENGTH_SHORT).show();
// finish();
}
// FIXME_BT
// FIXME mApp.mBluetooth = ( result == Activity.RESULT_OK );
// setBTMenus( mApp.mBTAdapter.isEnabled() );
updateDisplay( );
break;
}
}
@Override
public boolean onSearchRequested()
{
// TDLog.Error( "search requested" );
Intent intent = new Intent( mActivity, TopoDroidPreferences.class );
intent.putExtra( TopoDroidPreferences.PREF_CATEGORY, TopoDroidPreferences.PREF_CATEGORY_ALL );
startActivity( intent );
return true;
}
@Override
public boolean onKeyDown( int code, KeyEvent event )
{
switch ( code ) {
case KeyEvent.KEYCODE_BACK: // HARDWARE BACK (4)
onBackPressed();
return true;
case KeyEvent.KEYCODE_SEARCH:
return onSearchRequested();
case KeyEvent.KEYCODE_MENU: // HARDWRAE MENU (82)
String help_page = getResources().getString( R.string.MainWindow );
if ( help_page != null ) UserManualActivity.showHelpPage( mActivity, help_page );
return true;
// case KeyEvent.KEYCODE_VOLUME_UP: // (24)
// case KeyEvent.KEYCODE_VOLUME_DOWN: // (25)
default:
// TDLog.Error( "key down: code " + code );
}
return false;
}
}