/* @file ShotWindow.java * * @author marco corvi * @date may 2012 * * @brief TopoDroid survey shots management * -------------------------------------------------------- * 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.EOFException; // import java.io.DataInputStream; // import java.io.DataOutputStream; import java.io.BufferedReader; import java.io.FileReader; // import java.io.FileWriter; import java.util.List; import java.util.ArrayList; // import java.util.Stack; import android.os.Parcelable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.AsyncTask; import android.os.Debug; // import android.os.SystemClock; // import android.os.PowerManager; import android.content.res.Resources; import android.graphics.Rect; import android.app.Application; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.DialogInterface; // import android.content.DialogInterface.OnCancelListener; // import android.content.DialogInterface.OnDismissListener; // import android.content.res.ColorStateList; import android.provider.Settings.System; // import android.location.LocationManager; import android.content.Context; import android.content.Intent; import android.app.Dialog; import android.view.WindowManager; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.Menu; import android.view.MenuItem; import android.view.KeyEvent; // for FRAGMENT import android.view.ViewGroup; import android.view.LayoutInflater; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.PopupWindow; import android.widget.LinearLayout; import android.widget.ArrayAdapter; import android.widget.TextView; import android.widget.ListView; import android.widget.Toast; import android.preference.PreferenceManager; import android.provider.MediaStore; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.Paint.FontMetrics; import android.net.Uri; import android.util.Log; public class ShotWindow extends Activity implements OnItemClickListener // , OnItemLongClickListener , OnClickListener , OnLongClickListener , ILister , INewPlot { final static int BTN_DOWNLOAD = 0; final static int BTN_BLUETOOTH = 1; final static int BTN_PLOT = 3; final static int BTN_AZIMUTH = 7; private static int izons[] = { R.drawable.iz_download, R.drawable.iz_bt, R.drawable.iz_mode, R.drawable.iz_plot, R.drawable.iz_note, R.drawable.iz_plus, R.drawable.iz_station, R.drawable.iz_dial }; private static int izonsno[] = { 0, 0, 0, R.drawable.iz_plot, // TODO_IZ 0, 0, 0 }; private static int menus[] = { R.string.menu_close, R.string.menu_survey, R.string.menu_recover, R.string.menu_photo, R.string.menu_sensor, R.string.menu_3d, R.string.menu_distox, R.string.menu_options, R.string.menu_help }; private static int help_icons[] = { R.string.help_download, R.string.help_remote, R.string.help_display, R.string.help_plot, R.string.help_note, R.string.help_add_shot, R.string.help_current_station, R.string.help_azimuth, }; private static int help_menus[] = { R.string.help_close, R.string.help_survey_info, R.string.help_undelete, R.string.help_photo, R.string.help_sensor, R.string.help_3d, R.string.help_device, R.string.help_prefs, R.string.help_help }; private TopoDroidApp mApp; private DataDownloader mDataDownloader; private Activity mActivity; boolean mSplay = true; //!< whether to hide splay shots boolean mLeg = true; //!< whether to hide leg extra shots boolean mBlank = false; //!< whether to hide blank shots // private Bundle mSavedState = null; // long mSecondLastShotId = 0L; // long mLastShotId; String mRecentPlot = null; long mRecentPlotType = PlotInfo.PLOT_PLAN; int mButtonSize = 42; private Button[] mButton1; private int mNrButton1 = 0; public void setRefAzimuth( float azimuth, long fixed_extend ) { TDAzimuth.mFixedExtend = fixed_extend; TDAzimuth.mRefAzimuth = azimuth; setRefAzimuthButton(); } public void setRefAzimuthButton() { if ( ! TDSetting.mLevelOverNormal ) return; if ( TDAzimuth.mFixedExtend == 0 ) { android.graphics.Matrix m = new android.graphics.Matrix(); m.postRotate( TDAzimuth.mRefAzimuth - 90 ); // if ( mBMdial != null ) // extra care !!! { Bitmap bm1 = Bitmap.createScaledBitmap( mBMdial, mButtonSize, mButtonSize, true ); Bitmap bm2 = Bitmap.createBitmap( bm1, 0, 0, mButtonSize, mButtonSize, m, true); mButton1[ BTN_AZIMUTH ].setBackgroundDrawable( new BitmapDrawable( getResources(), bm2 ) ); } } else if ( TDAzimuth.mFixedExtend == -1L ) { mButton1[ BTN_AZIMUTH ].setBackgroundDrawable( mBMleft ); } else { mButton1[ BTN_AZIMUTH ].setBackgroundDrawable( mBMright ); } } long secondLastShotId() { return mApp.mSecondLastShotId; } private ListView mList; // private int mListPos = -1; // private int mListTop = 0; private DistoXDBlockAdapter mDataAdapter; private ArrayList< String > mShowSplay; // private long mLastExtend; // id of the last-extend-ed splay // private static final String LIST_STATE = "listState"; // private int mFirstPos = -1; // private int mScroll = 0; // private int mSavePos = -1; // shot entry position private int mShotPos = -1; // shot entry position private int mPrevPos = 0; // prev shot entry position private int mNextPos = 0; // next shot entry position // private TextView mSaveTextView = null; static long mSensorId; static long mPhotoId; static String mComment; static long mShotId; // photo/sensor shot id // ConnHandler mHandler; TopoDroidApp getApp() { return mApp; } // ------------------------------------------------------------------- // FXIME ok only for numbers // String getNextStationName() // { // return mApp.mData.getNextStationName( mApp.mSID ); // } private void computeMeans( List<DistoXDBlock> list ) { TopoDroidApp.mAccelerationMean = 0.0f; TopoDroidApp.mMagneticMean = 0.0f; TopoDroidApp.mDipMean = 0.0f; int size = list.size(); if ( size > 0 ) { int cnt = 0; for ( DistoXDBlock blk : list ) { if ( blk.mAcceleration > 10.0 ) { TopoDroidApp.mAccelerationMean += blk.mAcceleration; TopoDroidApp.mMagneticMean += blk.mMagnetic; TopoDroidApp.mDipMean += blk.mDip; ++ cnt; } } if ( cnt > 0 ) { TopoDroidApp.mAccelerationMean /= cnt; TopoDroidApp.mMagneticMean /= cnt; TopoDroidApp.mDipMean /= cnt; } // Log.v( TopoDroidApp.TAG, "Acc " + TopoDroidApp.mAccelerationMean + " Mag " + TopoDroidApp.mMagneticMean // + " Dip " + TopoDroidApp.mDipMean ); } } @Override public void refreshDisplay( int nr, boolean toast ) { setConnectionStatus( mDataDownloader.getStatus() ); if ( nr >= 0 ) { if ( nr > 0 ) { // mLastShotId = mApp.mData.getLastShotId( mApp.mSID ); updateDisplay( ); } if ( toast ) { Toast.makeText( mActivity, getResources().getQuantityString(R.plurals.read_data, nr, nr ), Toast.LENGTH_SHORT ).show(); // Toast.makeText( mActivity, " read_data: " + nr, Toast.LENGTH_SHORT ).show(); } } else if ( nr < 0 ) { if ( toast ) { // Toast.makeText( mActivity, getString(R.string.read_fail_with_code) + nr, Toast.LENGTH_SHORT ).show(); Toast.makeText( mActivity, mApp.DistoXConnectionError[ -nr ], Toast.LENGTH_SHORT ).show(); } } } public void updateDisplay( ) { // Log.v( "DistoX", "update Display() " ); highlightBlock( null ); DataHelper data = mApp.mData; if ( data != null && mApp.mSID >= 0 ) { List<DistoXDBlock> list = data.selectAllShots( mApp.mSID, TopoDroidApp.STATUS_NORMAL ); if ( list.size() > 4 ) computeMeans( list ); List< PhotoInfo > photos = data.selectAllPhotos( mApp.mSID, TopoDroidApp.STATUS_NORMAL ); // TDLog.Log( TDLog.LOG_SHOT, "update Display() shot list size " + list.size() ); // Log.v( TopoDroidApp.TAG, "update Display() shot list size " + list.size() ); updateShotList( list, photos ); setTheTitle( ); } else { Toast.makeText( mActivity, R.string.no_survey, Toast.LENGTH_SHORT ).show(); } } public void setTheTitle() { StringBuilder sb = new StringBuilder(); if ( TDSetting.mConnectionMode == TDSetting.CONN_MODE_MULTI ) { sb.append( "{" ); if ( mApp.mDevice != null ) sb.append( mApp.mDevice.getNickname() ); sb.append( "} " ); } sb.append( mApp.getConnectionStateTitleStr() ); sb.append( mApp.mySurvey ); mActivity.setTitle( sb.toString() ); // FIXME setTitleColor( TDConst.COLOR_NORMAL ); } boolean isCurrentStationName( String st ) { return mApp.isCurrentStationName( st ); } void setCurrentStationName( String st ) { mSkipItemClick = true; mApp.setCurrentStationName( st ); // updateDisplay( ); } // add a block to the adapter (ILister interface) // called by the RFcommThread after receiving a data packet @Override public void updateBlockList( long blk_id ) { // Log.v("DistoX", "Shot window update block list. Id: " + blk_id ); DistoXDBlock blk = mApp.mData.selectShot( blk_id, mApp.mSID ); if ( blk != null ) { updateBlockList( blk ); } } @Override public void updateBlockList( DistoXDBlock blk ) { // Log.v("DistoX", "Shot window update block list: " + blk.mLength + " " + blk.mBearing + " " + blk.mClino ); if ( mDataAdapter != null ) { mDataAdapter.addDataBlock( blk ); // FIXME 3.3.0 // mApp.assignStations( mDataAdapter.mItems ); mApp.assignStations( mDataAdapter.getItemsForAssign() ); mList.post( new Runnable() { @Override public void run() { mDataAdapter.notifyDataSetChanged(); } } ); // Message msg = Message.obtain(); // msg.what = MSG_ADD_BLK; // mListItemsHandler.sendMessage( msg ); } } void setShowIds( boolean show ) { mDataAdapter.show_ids = show; } boolean getShowIds() { return mDataAdapter.show_ids; } private void updateShotList( List<DistoXDBlock> list, List< PhotoInfo > photos ) { TDLog.Log( TDLog.LOG_SHOT, "updateShotList shots " + list.size() + " photos " + photos.size() ); // Log.v( "DistoX", "update Shot List shots " + list.size() + " photos " + photos.size() ); mDataAdapter.clear(); mList.setAdapter( mDataAdapter ); if ( list.size() == 0 ) { // Toast.makeText( mActivity, R.string.no_shots, Toast.LENGTH_SHORT ).show(); return; } processShotList( list ); mDataAdapter.reviseBlockWithPhotos( photos ); } private void processShotList( List<DistoXDBlock> list ) { // Log.v("DistoX", "process shot list"); DistoXDBlock prev = null; boolean prev_is_leg = false; for ( DistoXDBlock item : list ) { DistoXDBlock cur = item; int t = cur.type(); // TDLog.Log( TDLog.LOG_SHOT, "item " + cur.mLength + " " + cur.mBearing + " " + cur.mClino ); if ( cur.mType == DistoXDBlock.BLOCK_SEC_LEG || cur.isRelativeDistance( prev ) ) { // Log.v( "DistoX", "item close " + cur.type() + " " + cur.mLength + " " + cur.mBearing + " " + cur.mClino ); if ( cur.mType == DistoXDBlock.BLOCK_BLANK ) { // FIXME 20140612 cur.mType = DistoXDBlock.BLOCK_SEC_LEG; mApp.mData.updateShotLeg( cur.mId, mApp.mSID, 1L, true ); // cur.mType ); // FIXME 20140616 } // if ( prev != null && prev.mType == DistoXDBlock.BLOCK_BLANK ) prev.mType = DistoXDBlock.BLOCK_BLANK_LEG; if ( prev != null ) prev.setTypeBlankLeg(); if ( mLeg ) { // flag: hide leg extra shots // TDLog.Log( TDLog.LOG_SHOT, "close distance"); if ( mBlank && prev != null && prev.isTypeBlank() ) { // prev was skipped: draw it now if ( ! prev_is_leg ) { cur = prev; prev_is_leg = true; } else { continue; } } else { continue; } } else { // do not hide extra leg-shots if ( mBlank && prev != null && prev.isTypeBlank() ) { if ( ! prev_is_leg ) { mDataAdapter.add( prev ); prev_is_leg = true; } else { /* nothing */ } } else { /* nothing */ } } } else { // Log.v( "DistoX", "item not close " + cur.type() + " " + cur.mLength + " " + cur.mBearing + " " + cur.mClino ); // TDLog.Log( TDLog.LOG_SHOT, "not close distance"); prev_is_leg = false; if ( DistoXDBlock.isTypeBlank(t) ) { prev = cur; if ( mBlank ) continue; } else if ( t == DistoXDBlock.BLOCK_SPLAY ) { prev = null; if ( mSplay ) { // do hide splays, except those that are shown. // boolean skip = true; // for ( String st : mShowSplay ) { // if ( st.equals( cur.mFrom ) ) { skip = false; break; } // } // if ( skip ) continue; if ( ! showSplaysContains( cur.mFrom ) ) continue; } } else { // t == DistoXDBlock.BLOCK_MAIN_LEG prev = cur; } } // TDLog.Log( TDLog.LOG_SHOT, "adapter add " + cur.mLength + " " + cur.mBearing + " " + cur.mClino ); // Log.v( "DistoX", "shot adapter add " + cur.mLength + " " + cur.mBearing + " " + cur.mClino ); mDataAdapter.add( cur ); } } // --------------------------------------------------------------- // list items click // @Override // public boolean onItemLongClick(AdapterView<?> parent, View view, int pos, long id) // { // if ( closeMenu() ) return true; // if ( CutNPaste.dismissPopupBT() ) return true; // // TDLog.Log( TDLog.LOG_INPUT, "ShotWindow onItemLongClick id " + id); // DistoXDBlock blk = mDataAdapter.get(pos); // onBlockLongClick( blk, pos ); // return true; // } void onBlockLongClick( DistoXDBlock blk ) { mShotId = blk.mId; if ( TDSetting.mLevelOverNormal ) { (new PhotoSensorsDialog(mActivity, this, blk ) ).show(); } else { (new ShotDeleteDialog( mActivity, this, blk ) ).show(); } } private boolean mSkipItemClick = false; private void handleMenu( int pos ) { closeMenu(); int p = 0; if ( p++ == pos ) { // CLOSE super.onBackPressed(); } else if ( p++ == pos ) { // SURVEY ACTIVITY Intent intent = new Intent( this, SurveyWindow.class ); intent.putExtra( TDTag.TOPODROID_SURVEY, 0 ); // mustOpen intent.putExtra( TDTag.TOPODROID_OLDSID, -1 ); // old_sid intent.putExtra( TDTag.TOPODROID_OLDID, -1 ); // old_id startActivityForResult( intent, TDRequest.INFO_ACTIVITY ); // } else if ( TDSetting.mLevelOverBasic && p++ == pos ) { // CURRENT STATION // (new CurrentStationDialog( this, this, mApp )).show(); } else if ( TDSetting.mLevelOverBasic && p++ == pos ) { // RECOVER List< DistoXDBlock > shots = mApp.mData.selectAllShots( mApp.mSID, TopoDroidApp.STATUS_DELETED ); List< PlotInfo > plots = mApp.mData.selectAllPlots( mApp.mSID, TopoDroidApp.STATUS_DELETED ); if ( shots.size() == 0 && plots.size() == 0 ) { Toast.makeText( mActivity, R.string.no_undelete, Toast.LENGTH_SHORT ).show(); } else { (new UndeleteDialog(mActivity, this, mApp.mData, mApp.mSID, shots, plots ) ).show(); } // updateDisplay( ); } else if ( TDSetting.mLevelOverNormal && p++ == pos ) { // PHOTO mActivity.startActivity( new Intent( mActivity, PhotoActivity.class ) ); } else if ( TDSetting.mLevelOverNormal && p++ == pos ) { // SENSORS mActivity.startActivity( new Intent( mActivity, SensorListActivity.class ) ); } else if ( TDSetting.mLevelOverBasic && p++ == pos ) { // 3D if ( mApp.exportSurveyAsTh() != null ) { // make sure to have survey exported as therion try { Intent intent = new Intent( "Cave3D.intent.action.Launch" ); intent.putExtra( "survey", TDPath.getSurveyThFile( mApp.mySurvey ) ); mActivity.startActivity( intent ); } catch ( ActivityNotFoundException e ) { Toast.makeText( mActivity, R.string.no_cave3d, Toast.LENGTH_SHORT ).show(); } } } else if ( TDSetting.mLevelOverNormal && p++ == pos ) { // DEVICE if ( mApp.mBTAdapter.isEnabled() ) { mActivity.startActivity( new Intent( Intent.ACTION_VIEW ).setClass( mActivity, DeviceActivity.class ) ); } } else if ( p++ == pos ) { // OPTIONS Intent intent = new Intent( mActivity, TopoDroidPreferences.class ); intent.putExtra( TopoDroidPreferences.PREF_CATEGORY, TopoDroidPreferences.PREF_CATEGORY_SURVEY ); mActivity.startActivity( intent ); } else if ( p++ == pos ) { // HELP // int nn = mNrButton1; // + ( TopoDroidApp.mLevelOverNormal ? mNrButton2 : 0 ); (new HelpDialog(mActivity, izons, menus, help_icons, help_menus, mNrButton1, menus.length ) ).show(); } } @Override public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { if ( CutNPaste.dismissPopupBT() ) return; if ( mSkipItemClick ) { mSkipItemClick = false; return; } if ( mMenu == (ListView)parent ) { handleMenu( pos ); return; } if ( closeMenu() ) return; // TDLog.Log( TDLog.LOG_INPUT, "ShotWindow onItemClick id " + id); // DistoXDBlock blk = mDataAdapter.get(pos); // this is done by the DistoXDBlockAdapter // onBlockClick( blk, pos ); } void onBlockClick( DistoXDBlock blk, int pos ) { mShotPos = pos; // mSavePos = pos; // mFirstPos = mList.getFirstVisiblePosition(); // mScroll = mList.getScrollY(); // mSaveTextView = (TextView)view; // TextView tv = (TextView)view; // String msg = tv.getText().toString(); // String[] st = msg.split( " ", 6 ); // String data = st[2] + " " + st[3] + " " + st[4]; DistoXDBlock prevBlock = null; DistoXDBlock nextBlock = null; // if ( blk.type() == DistoXDBlock.BLOCK_BLANK ) { // prevBlock = mApp.mData.selectPreviousLegShot( blk.mId, mApp.mSID ); prevBlock = getPreviousLegShot( blk, false ); nextBlock = getNextLegShot( blk, false ); // if ( prevBlock != null ) { // TDLog.Log( TDLog.LOG_SHOT, "prev leg " + prevBlock.mFrom + " " + prevBlock.mTo ); // } // } (new ShotDialog( mActivity, this, pos, blk, prevBlock, nextBlock )).show(); } // --------------------------------------------------------------- void askPhotoComment( ) { (new PhotoCommentDialog(mActivity, this) ).show(); } void doTakePhoto( String comment ) { mComment = comment; mPhotoId = mApp.mData.nextPhotoId( mApp.mSID ); // imageFile := PHOTO_DIR / surveyId / photoId .jpg File imagefile = new File( TDPath.getSurveyJpgFile( mApp.mySurvey, Long.toString(mPhotoId) ) ); // TDLog.Log( TDLog.LOG_SHOT, "photo " + imagefile.toString() ); try { Uri outfileuri = Uri.fromFile( imagefile ); Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE ); intent.putExtra( MediaStore.EXTRA_OUTPUT, outfileuri ); intent.putExtra( "outputFormat", Bitmap.CompressFormat.JPEG.toString() ); startActivityForResult( intent, TDRequest.CAPTURE_IMAGE_ACTIVITY ); } catch ( ActivityNotFoundException e ) { Toast.makeText( mActivity, "No image capture mApp", Toast.LENGTH_SHORT ).show(); } } void askSensor( ) { mSensorId = mApp.mData.nextSensorId( mApp.mSID ); TDLog.Log( TDLog.LOG_SENSOR, "sensor " + mSensorId ); Intent intent = new Intent( mActivity, SensorActivity.class ); startActivityForResult( intent, TDRequest.SENSOR_ACTIVITY ); } // void askExternal( ) // { // mSensorId = mApp.mData.nextSensorId( mApp.mSID ); // TDLog.Log( TDLog.LOG_SENSOR, "sensor " + mSensorId ); // Intent intent = new Intent( this, ExternalActivity.class ); // startActivityForResult( intent, TDRequest.EXTERNAL_ACTIVITY ); // } // called to insert a manual shot after a given shot void insertShotAt( DistoXDBlock blk ) { (new ShotNewDialog( this, mApp, this, blk, mShotId )).show(); } // called by PhotoSensorDialog to split the survey // void askSurvey( ) // { // TopoDroidAlertDialog.makeAlert( this, getResources(), R.string.survey_split, // new DialogInterface.OnClickListener() { // @Override // public void onClick( DialogInterface dialog, int btn ) { // doSplitSurvey(); // } // } ); // } void doSplitSurvey() { long old_sid = mApp.mSID; long old_id = mShotId; // Log.v( TopoDroidApp.TAG, "split survey " + old_sid + " " + old_id ); if ( mApp.mShotWindow != null ) { mApp.mShotWindow.finish(); mApp.mShotWindow = null; } if ( mApp.mSurveyWindow != null ) { mApp.mSurveyWindow.finish(); mApp.mSurveyWindow = null; } mApp.mActivity.startSplitSurvey( old_sid, old_id ); // SPLIT SURVEY } void doDeleteShot( long id ) { mApp.mData.deleteShot( id, mApp.mSID, true ); updateDisplay( ); } void insertPhoto( ) { // long shotid = 0; mApp.mData.insertPhoto( mApp.mSID, mPhotoId, mShotId, "", TopoDroidUtil.currentDate(), mComment ); // FIXME TITLE has to go // FIXME NOTIFY ? no } // void deletePhoto( PhotoInfo photo ) // { // mApp.mData.deletePhoto( mApp.mSID, photo.id ); // File imagefile = new File( mApp.getSurveyJpgFile( Long.toString(photo.id) ) ); // try { // imagefile.delete(); // } catch ( IOException e ) { } // } @Override protected void onActivityResult( int reqCode, int resCode, Intent data ) { TDLog.Log( TDLog.LOG_ERR, "on Activity Result: request " + reqCode + " result " + resCode ); switch ( reqCode ) { case TDRequest.CAPTURE_IMAGE_ACTIVITY: mApp.resetLocale(); if ( resCode == Activity.RESULT_OK ) { // RESULT_OK = -1 (0xffffffff) // (new PhotoCommentDialog(this, this) ).show(); insertPhoto(); } else { // mApp.mData.deletePhoto( mApp.mSID, mPhotoId ); } break; case TDRequest.SENSOR_ACTIVITY: // case TDRequest.EXTERNAL_ACTIVITY: if ( resCode == Activity.RESULT_OK ) { Bundle extras = data.getExtras(); String type = extras.getString( TDTag.TOPODROID_SENSOR_TYPE ); String value = extras.getString( TDTag.TOPODROID_SENSOR_VALUE ); String comment = extras.getString( TDTag.TOPODROID_SENSOR_COMMENT ); TDLog.Log( TDLog.LOG_SENSOR, "insert sensor " + type + " " + value + " " + comment ); mApp.mData.insertSensor( mApp.mSID, mSensorId, mShotId, "", TopoDroidUtil.currentDate(), comment, type, value ); // FIXME NOTIFY ? no } break; case TDRequest.INFO_ACTIVITY: if ( resCode == Activity.RESULT_OK ) { finish(); } break; } } // --------------------------------------------------------------- // private Button mButtonHelp; HorizontalListView mListView; HorizontalButtonView mButtonView1; HorizontalButtonView mButtonView2; ListView mMenu = null; Button mImage; // HOVER // MyMenuAdapter mMenuAdapter; ArrayAdapter< String > mMenuAdapter; boolean onMenu = false; BitmapDrawable mBMbluetooth; BitmapDrawable mBMbluetooth_no; BitmapDrawable mBMdownload; BitmapDrawable mBMdownload_on; BitmapDrawable mBMdownload_wait; BitmapDrawable mBMdownload_no; // BitmapDrawable mBMadd; BitmapDrawable mBMplot; Bitmap mBMdial; BitmapDrawable mBMplot_no; BitmapDrawable mBMleft; BitmapDrawable mBMright; // FIXME made static: should not cause problems // private static Handler mListItemsHandler = null; // static final int MSG_ADD_BLK = 1; // void refreshList() // { // Log.v("DistoX", "refresh display" ); // mDataAdapter.notifyDataSetChanged(); // mList.invalidate(); // } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.shot_activity ); mApp = (TopoDroidApp) getApplication(); mApp.mShotWindow = this; // FIXME mDataDownloader = mApp.mDataDownloader; // new DataDownloader( this, mApp ); mActivity = this; mShowSplay = new ArrayList< String >(); mDataAdapter = new DistoXDBlockAdapter( this, this, R.layout.row, new ArrayList<DistoXDBlock>() ); // mListItemsHandler = new Handler() { // @Override // public void handleMessage( Message msg ) { // switch (msg.what) { // case MSG_ADD_BLK: // mDataAdapter.notifyDataSetChanged(); // break; // } // super.handleMessage( msg ); // } // }; mListView = (HorizontalListView) findViewById(R.id.listview); mButtonSize = mApp.setListViewHeight( mListView ); Resources res = getResources(); mNrButton1 = TDSetting.mLevelOverNormal ? 8 : ( TDSetting.mLevelOverBasic ? 6 : 5 ); mButton1 = new Button[ mNrButton1 ]; for ( int k=0; k<mNrButton1; ++k ) { mButton1[k] = MyButton.getButton( this, this, izons[k] ); if ( k == BTN_DOWNLOAD ) { mBMdownload = MyButton.getButtonBackground( mApp, res, izons[k] ); } else if ( k == BTN_BLUETOOTH ) { mBMbluetooth = MyButton.getButtonBackground( mApp, res, izons[k] ); } else if ( k == BTN_PLOT ) { mBMplot = MyButton.getButtonBackground( mApp, res, izons[k] ); } } mBMdial = BitmapFactory.decodeResource( res, R.drawable.iz_dial ); mBMplot_no = MyButton.getButtonBackground( mApp, res, R.drawable.iz_plot_no ); mBMdownload_on = MyButton.getButtonBackground( mApp, res, R.drawable.iz_download_on ); mBMdownload_wait = MyButton.getButtonBackground( mApp, res, R.drawable.iz_download_wait ); mBMdownload_no = MyButton.getButtonBackground( mApp, res, R.drawable.iz_download_no ); mBMleft = MyButton.getButtonBackground( mApp, res, R.drawable.iz_left ); mBMright = MyButton.getButtonBackground( mApp, res, R.drawable.iz_right ); mBMbluetooth_no = MyButton.getButtonBackground( mApp, res, R.drawable.iz_bt_no ); if ( TDSetting.mLevelOverBasic ) { mButton1[ BTN_DOWNLOAD ].setOnLongClickListener( this ); mButton1[ BTN_PLOT ].setOnLongClickListener( this ); } TDAzimuth.resetRefAzimuth( 90 ); // setRefAzimuthButton( ); // called by mApp.resetRefAzimuth mButtonView1 = new HorizontalButtonView( mButton1 ); mListView.setAdapter( mButtonView1.mAdapter ); mList = (ListView) findViewById(R.id.list); mList.setAdapter( mDataAdapter ); // mList.setOnItemClickListener( this ); // mList.setLongClickable( true ); // mList.setOnItemLongClickListener( this ); mList.setDividerHeight( 2 ); // mList.setSmoothScrollbarEnabled( true ); // mList.setFastScrollAlwaysVisible( true ); // API-11 // mList.setFastScrollEnabled( true ); // restoreInstanceFromData(); // mLastExtend = mApp.mData.getLastShotId( mApp.mSID ); List<DistoXDBlock> list = mApp.mData.selectAllShots( mApp.mSID, TopoDroidApp.STATUS_NORMAL ); // mSecondLastShotId = mApp.lastShotId( ); mImage = (Button) findViewById( R.id.handle ); mImage.setOnClickListener( this ); mImage.setBackgroundDrawable( MyButton.getButtonBackground( mApp, res, R.drawable.iz_menu ) ); mMenu = (ListView) findViewById( R.id.menu ); setMenuAdapter( getResources() ); onMenu = true; closeMenu(); // HOVER mMenu.setOnItemClickListener( this ); // CutNPaste.dismissPopupBT(); if ( mDataDownloader != null ) { mApp.registerLister( this ); } } // void enableSketchButton( boolean enabled ) // { // mApp.mEnableZip = enabled; // mButton1[ BTN_PLOT ].setEnabled( enabled ); // FIXME SKETCH BUTTON // mButton1[ BTN_PLOT ].setBackgroundDrawable( enabled ? mBMplot : mBMplot_no ); // } // @Override // public synchronized void onStart() // { // super.onStart(); // // Debug.startMethodTracing( "distox" ); // // Log.v( "DistoX", "Shot Activity onStart() " ); // } @Override public synchronized void onDestroy() { super.onDestroy(); // Log.v("DistoX", "ShotWindow onDestroy()" ); if ( mDataDownloader != null ) { mApp.unregisterLister( this ); mDataDownloader.onStop(); } mApp.disconnectRemoteDevice( false ); if ( doubleBackHandler != null ) { doubleBackHandler.removeCallbacks( doubleBackRunnable ); } } // @Override // public synchronized void onStop() // { // // Debug.stopMethodTracing( ); // super.onStop(); // // Log.v("DistoX", "ShotWindow onStop()" ); // } @Override public synchronized void onPause() { super.onPause(); // Log.v("DistoX", "ShotWindow onPause()" ); saveInstanceToData(); // mApp.unregisterConnListener( mHandler ); // if ( mApp.mComm != null ) { mApp.mComm.suspend(); } // FIXME NOTIFY unregister ILister } @Override public synchronized void onResume() { super.onResume(); // Log.v("DistoX", "ShotWindow onResume()" ); // FIXME NOTIFY register ILister // if ( mApp.mComm != null ) { mApp.mComm.resume(); } // Log.v( "DistoX", "Shot Activity onResume()" ); restoreInstanceFromData(); updateDisplay( ); if ( mDataDownloader != null ) mDataDownloader.onResume(); // mApp.registerConnListener( mHandler ); setConnectionStatus( mDataDownloader.getStatus() ); } // -------------------------------------------------------------- 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 ( closeMenu() ) return; if ( CutNPaste.dismissPopupBT() ) return; if ( doubleBack ) { if ( doubleBackToast != null ) doubleBackToast.cancel(); doubleBackToast = null; DrawingSurface.clearCache(); super.onBackPressed(); return; } doubleBack = true; doubleBackToast = Toast.makeText( mActivity, R.string.double_back, Toast.LENGTH_SHORT ); doubleBackToast.show(); doubleBackHandler.postDelayed( doubleBackRunnable, 1000 ); } // -------------------------------------------------------------- // FIXME NOTIFY: the display mode is local - do not notify private void restoreInstanceFromData() { String shots = mApp.mData.getValue( "DISTOX_SHOTS" ); if ( shots != null ) { String[] vals = shots.split( " " ); // FIXME assert( vals.length > 3 ); mSplay = vals[0].equals("1"); mLeg = vals[1].equals("1"); mBlank = vals[2].equals("1"); setShowIds( vals[3].equals("1") ); // Log.v("DistoX", "restore from data mSplay " + mSplay ); } } private void saveInstanceToData() { mApp.mData.setValue( "DISTOX_SHOTS", String.format("%d %d %d %d", mSplay?1:0, mLeg?1:0, mBlank?1:0, getShowIds()?1:0 ) ); // Log.v("DistoX", "save to data mSplay " + mSplay ); } void doBluetooth( Button b ) { if ( ! mDataDownloader.isDownloading() ) { if ( TDSetting.mLevelOverAdvanced && mApp.distoType() == Device.DISTO_X310 && TDSetting.mConnectionMode != TDSetting.CONN_MODE_MULTI ) { CutNPaste.showPopupBT( mActivity, this, mApp, b ); } else { mDataDownloader.setDownload( false ); mDataDownloader.stopDownloadData(); setConnectionStatus( mDataDownloader.getStatus() ); mApp.resetComm(); Toast.makeText(mActivity, R.string.bt_reset, Toast.LENGTH_SHORT).show(); } // } else { // downloading: nothing } } @Override public boolean onLongClick( View view ) { if ( closeMenu() ) return true; if ( CutNPaste.dismissPopupBT() ) return true; Button b = (Button)view; if ( b == mButton1[ BTN_DOWNLOAD ] ) { mDataDownloader.toggleDownload(); setConnectionStatus( mDataDownloader.getStatus() ); if ( TDSetting.mConnectionMode == TDSetting.CONN_MODE_MULTI && mDataDownloader.isDownloading() && mApp.mDData.getDevices().size() > 1 ) { (new DeviceSelectDialog( this, mApp, mDataDownloader, this )).show(); } else { mDataDownloader.doDataDownload( ); } } else if ( b == mButton1[ BTN_PLOT ] ) { if ( mRecentPlot != null ) { startExistingPlot( mRecentPlot, mRecentPlotType, null ); } } return true; } @Override public void onClick(View view) { if ( closeMenu() ) return; if ( CutNPaste.dismissPopupBT() ) return; Button b = (Button)view; if ( b == mImage ) { if ( mMenu.getVisibility() == View.VISIBLE ) { mMenu.setVisibility( View.GONE ); onMenu = false; } else { mMenu.setVisibility( View.VISIBLE ); onMenu = true; } return; } if ( b != null ) { Intent intent; int k1 = 0; // int k2 = 0; if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // DOWNLOAD if ( mApp.mDevice != null ) { setConnectionStatus( 2 ); // turn arrow orange // TDLog.Log( TDLog.LOG_INPUT, "Download button, mode " + TDSetting.mConnectionMode ); mDataDownloader.toggleDownload(); setConnectionStatus( mDataDownloader.getStatus() ); mDataDownloader.doDataDownload( ); } } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // BT RESET doBluetooth( b ); } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // DISPLAY new ShotDisplayDialog( mActivity, this ).show(); } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // SKETCH new PlotListDialog( mActivity, this, mApp, null ).show(); } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // NOTE if ( mApp.mySurvey != null ) { (new DistoXAnnotations( mActivity, mApp.mySurvey )).show(); } } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // ADD MANUAL SHOT if ( TDSetting.mLevelOverBasic ) { // mSecondLastShotId = mApp.lastShotId( ); DistoXDBlock last_blk = mApp.mData.selectLastLegShot( mApp.mSID ); // Log.v( "DistoX", "last blk: " + last_blk.toString() ); (new ShotNewDialog( mActivity, mApp, this, last_blk, -1L )).show(); } } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // STATIONS if ( TDSetting.mLevelOverNormal ) { (new CurrentStationDialog( mActivity, this, mApp )).show(); // ArrayList<DistoXDBlock> list = numberSplays(); // SPLAYS splays numbering no longer active // if ( list != null && list.size() > 0 ) { // updateDisplay( ); // } } } else if ( k1 < mNrButton1 && b == mButton1[k1++] ) { // AZIMUTH if ( TDSetting.mLevelOverNormal ) { if ( TDSetting.mAzimuthManual ) { setRefAzimuth( 0, - TDAzimuth.mFixedExtend ); } else { (new AzimuthDialDialog( mActivity, this, TDAzimuth.mRefAzimuth, mBMdial )).show(); } } } } } // ------------------------------------------------------------------ public boolean hasSurveyPlot( String name ) { return mApp.mData.hasSurveyPlot( mApp.mSID, name+"p" ); } public boolean hasSurveyStation( String start ) { return mApp.mData.hasSurveyStation( mApp.mSID, start ); } public void makeNewPlot( String name, String start, boolean extended, int project ) { long mPIDp = mApp.insert2dPlot( mApp.mSID, name, start, extended, project ); if ( mPIDp >= 0 ) { long mPIDs = mPIDp + 1L; // FIXME !!! this is true but not guaranteed startDrawingWindow( start, name+"p", mPIDp, name+"s", mPIDs, PlotInfo.PLOT_PLAN, null ); // } else { // Toast.makeText( mActivity, R.string.plot_duplicate_name, Toast.LENGTH_LONG).show(); } // updateDisplay( ); } /* FIXME BEGIN SKETCH_3D */ public void makeNewSketch3d( String name, String st1, String st2 ) { // FIXME xoffset yoffset, east south and vert (downwards) if ( st2 != null ) { if ( ! mApp.mData.hasShot( mApp.mSID, st1, st2 ) ) { Toast.makeText( mActivity, R.string.no_shot_between_stations, Toast.LENGTH_SHORT).show(); return; } } else { st2 = mApp.mData.nextStation( mApp.mSID, st1 ); } if ( st2 != null ) { float e = 0.0f; // NOTE (e,s,v) are the coord of station st1, and st1 is taken as the origin of the ref-frame float s = 0.0f; float v = 0.0f; long mPID = mApp.mData.insertSketch3d( mApp.mSID, -1L, name, 0L, st1, st1, st2, 0, // mApp.mDisplayWidth/(2*TopoDroidApp.mScaleFactor), 0, // mApp.mDisplayHeight/(2*TopoDroidApp.mScaleFactor), 10 * TopoDroidApp.mScaleFactor, 0, 0, 10 * TopoDroidApp.mScaleFactor, 0, 0, 10 * TopoDroidApp.mScaleFactor, e, s, v, 180, 0 ); if ( mPID >= 0 ) { startSketchWindow( name ); } } else { Toast.makeText( mActivity, "no to station", Toast.LENGTH_SHORT).show(); } } void startSketchWindow( String name ) { if ( mApp.mSID < 0 ) { Toast.makeText( mActivity, R.string.no_survey, Toast.LENGTH_SHORT ).show(); return; } if ( ! mApp.mData.hasSketch3d( mApp.mSID, name ) ) { Toast.makeText( mActivity, R.string.no_sketch, Toast.LENGTH_SHORT ).show(); return; } // notice when starting the SketchWindow the remote device is disconnected // FIXME mApp.disconnectRemoteDevice(); // TODO Intent sketchIntent = new Intent( Intent.ACTION_VIEW ).setClass( this, SketchWindow.class ); sketchIntent.putExtra( TDTag.TOPODROID_SURVEY_ID, mApp.mSID ); sketchIntent.putExtra( TDTag.TOPODROID_SKETCH_NAME, name ); startActivity( sketchIntent ); } /* END SKETCH_3D */ public void startExistingPlot( String name, long type, String station ) // name = plot/sketch3d name { // TDLog.Log( TDLog.LOG_SHOT, "start Existing Plot \"" + name + "\" type " + type + " sid " + mApp.mSID ); if ( type != PlotInfo.PLOT_SKETCH_3D ) { PlotInfo plot1 = mApp.mData.getPlotInfo( mApp.mSID, name+"p" ); if ( plot1 != null ) { mRecentPlot = name; mRecentPlotType = type; PlotInfo plot2 = mApp.mData.getPlotInfo( mApp.mSID, name+"s" ); startDrawingWindow( plot1.start, plot1.name, plot1.id, plot2.name, plot2.id, type, station ); return; } else { mRecentPlot = null; } /* FIXME BEGIN SKETCH_3D */ } else { Sketch3dInfo sketch = mApp.mData.getSketch3dInfo( mApp.mSID, name ); if ( sketch != null ) { startSketchWindow( sketch.name ); return; } /* END SKETCH_3D */ } Toast.makeText( mActivity, R.string.plot_not_found, Toast.LENGTH_SHORT).show(); } private void startDrawingWindow( String start, String plot1_name, long plot1_id, String plot2_name, long plot2_id, long type, String station ) { if ( mApp.mSID < 0 || plot1_id < 0 || plot2_id < 0 ) { Toast.makeText( mActivity, R.string.no_survey, Toast.LENGTH_SHORT ).show(); return; } // notice when starting the DrawingWindow the remote device is disconnected // FIXME mApp.disconnectRemoteDevice(); Intent drawIntent = new Intent( Intent.ACTION_VIEW ).setClass( this, DrawingWindow.class ); drawIntent.putExtra( TDTag.TOPODROID_SURVEY_ID, mApp.mSID ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_NAME, plot1_name ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_NAME2, plot2_name ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_TYPE, type ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_FROM, start ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_TO, "" ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_AZIMUTH, 0.0f ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_CLINO, 0.0f ); drawIntent.putExtra( TDTag.TOPODROID_PLOT_MOVE_TO, ((station==null)? "" : station) ); // drawIntent.putExtra( TDTag.TOPODROID_PLOT_ID, plot1_id ); // not necessary // drawIntent.putExtra( TDTag.TOPODROID_PLOT_ID2, plot2_id ); // not necessary startActivity( drawIntent ); } // --------------------------------------------------------------------------------- // public void dropShot( DistoXDBlock blk ) // { // mApp.mData.deleteShot( blk.mId, mApp.mSID ); // updateDisplay( ); // FIXME // } public DistoXDBlock getNextBlankLegShot( DistoXDBlock blk ) { DistoXDBlock ret = null; long id = 0; for ( int k=0; k<mDataAdapter.size(); ++k ) { DistoXDBlock b = mDataAdapter.get(k); if ( b.isTypeBlank() ) { id = b.mId - 1; break; } } List<DistoXDBlock> list = mApp.mData.selectShotsAfterId( mApp.mSID, id , 0 ); for ( DistoXDBlock b : list ) { if ( b.isTypeBlank() ) { // Log.v( TopoDroidApp.TAG, "BLANK " + b.mLength + " " + b.mBearing + " " + b.mClino ); if ( ret != null && ret.isRelativeDistance( b ) ) return ret; ret = b; } else if ( b.mType == DistoXDBlock.BLOCK_SEC_LEG ) { // Log.v( TopoDroidApp.TAG, "LEG " + b.mLength + " " + b.mBearing + " " + b.mClino ); if ( ret != null && ret.isRelativeDistance( b ) ) return ret; } else { // Log.v( TopoDroidApp.TAG, "OTHER " + b.mLength + " " + b.mBearing + " " + b.mClino ); ret = null; } } return null; } // get the next centerline shot and set mNextPos index public DistoXDBlock getNextLegShot( DistoXDBlock blk, boolean move_down ) { // TDLog.Log( TDLog.LOG_SHOT, "getNextLegShot: pos " + mShotPos ); if ( blk == null ) { // TDLog.Log( TDLog.LOG_SHOT, " block is null"); return null; } if ( move_down ) { mPrevPos = mShotPos; mShotPos = mNextPos; mNextPos = mPrevPos; // the old mShotPos; } else { mNextPos = mShotPos; } while ( mNextPos < mDataAdapter.size() && blk != mDataAdapter.get(mNextPos) ) ++ mNextPos; ++ mNextPos; // one position after blk while ( mNextPos < mDataAdapter.size() ) { DistoXDBlock b = mDataAdapter.get(mNextPos); int t = b.type(); if ( t == DistoXDBlock.BLOCK_MAIN_LEG ) { return b; } else if ( DistoXDBlock.isTypeBlank( t ) && mNextPos+1 < mDataAdapter.size() && b.isRelativeDistance( mDataAdapter.get(mNextPos+1) ) ) { return b; } ++ mNextPos; } return null; } // get the previous centerline shot and set the mPrevPos index public DistoXDBlock getPreviousLegShot( DistoXDBlock blk, boolean move_up ) { // TDLog.Log( TDLog.LOG_SHOT, "getPreviousLegShot: pos " + mShotPos ); if ( blk == null ) return null; if ( move_up ) { mNextPos = mShotPos; mShotPos = mPrevPos; mPrevPos = mNextPos; // the old mShotPos; } else { mPrevPos = mShotPos; } while ( mPrevPos >= 0 && blk != mDataAdapter.get(mPrevPos) ) -- mPrevPos; while ( mPrevPos > 0 ) { -- mPrevPos; DistoXDBlock b = mDataAdapter.get(mPrevPos); if ( b.type() == DistoXDBlock.BLOCK_MAIN_LEG ) { return b; } } return null; } void updateShotDistanceBearingClino( float d, float b, float c, DistoXDBlock blk ) { // Log.v("DistoX", "update shot DBC length " + d ); mApp.mData.updateShotDistanceBearingClino( blk.mId, mApp.mSID, d, b, c, true ); blk.mLength = d; blk.mBearing = b; blk.mClino = c; mDataAdapter.updateBlockView( blk.mId ); } void updateShot( String from, String to, long extend, long flag, boolean leg, String comment, DistoXDBlock blk ) { // TDLog.Log( TDLog.LOG_SHOT, "updateShot From >" + from + "< To >" + to + "< comment " + comment ); blk.setName( from, to ); int ret = mApp.mData.updateShot( blk.mId, mApp.mSID, from, to, extend, flag, leg?1:0, comment, true ); if ( ret == -1 ) { Toast.makeText( mActivity, R.string.no_db, Toast.LENGTH_SHORT ).show(); // } else if ( ret == -2 ) { // Toast.makeText( mActivity, R.string.makes_cycle, Toast.LENGTH_SHORT ).show(); } else { // update same shots of the given block List< DistoXDBlock > blk_list = mApp.mData.selectShotsAfterId( blk.mId, mApp.mSID, 0L ); for ( DistoXDBlock blk1 : blk_list ) { if ( ! blk1.isRelativeDistance( blk ) ) break; mApp.mData.updateShotLeg( blk1.mId, mApp.mSID, 1L, true ); } } if ( leg ) blk.mType = DistoXDBlock.BLOCK_SEC_LEG; DistoXDBlock blk3 = mDataAdapter.updateBlockView( blk.mId ); if ( blk3 != blk && blk3 != null ) { blk3.setName( from, to ); blk3.mExtend = extend; blk3.mFlag = flag; blk3.mComment = comment; // FIXME if ( leg ) blk3.mType = DistoXDBlock.BLOCK_SEC_LEG; mDataAdapter.updateBlockView( blk3.mId ); } } void highlightBlock( DistoXDBlock blk ) { // Log.v("DistoX", "highlight block " + ( (blk==null)? "null" : blk.mFrom ) ); mApp.setHighlightedSplay( blk ); // now if there is a plot open it if ( blk != null && mRecentPlot != null ) { // Log.v("DistoX", "highlight " + blk.mFrom ); startExistingPlot( mRecentPlot, mRecentPlotType, blk.mFrom ); } } // this method is called by ShotDialog() with to.length() == 0 ie to == "" // and blk splay shot public void updateSplayShots( String from, String to, long extend, long flag, boolean leg, String comment, DistoXDBlock blk ) { ArrayList< DistoXDBlock > splays = mDataAdapter.getSplaysAtId( blk.mId, blk.mFrom ); for ( DistoXDBlock b : splays ) { if ( b.mId == blk.mId ) { blk.setName( from, to ); // FIXME leg should be 0 int ret = mApp.mData.updateShot( blk.mId, mApp.mSID, from, to, extend, flag, leg?1:0, comment, true ); if ( ret == -1 ) { Toast.makeText( mActivity, R.string.no_db, Toast.LENGTH_SHORT ).show(); // } else if ( ret == -2 ) { // Toast.makeText( mActivity, R.string.makes_cycle, Toast.LENGTH_SHORT ).show(); } else { // // update same shots of the given block: SHOULD NOT HAPPEN // List< DistoXDBlock > blk_list = mApp.mData.selectShotsAfterId( blk.mId, mApp.mSID, 0L ); // for ( DistoXDBlock blk1 : blk_list ) { // if ( ! blk1.isRelativeDistance( blk ) ) break; // mApp.mData.updateShotLeg( blk1.mId, mApp.mSID, 1L, true ); // } } } else { b.setName( from, to ); mApp.mData.updateShotName( b.mId, mApp.mSID, from, to, true ); } mDataAdapter.updateBlockView( b.mId ); } } // ------------------------------------------------------------------------ @Override public boolean onSearchRequested() { // TDLog.Error( "search requested" ); Intent intent = new Intent( mActivity, TopoDroidPreferences.class ); intent.putExtra( TopoDroidPreferences.PREF_CATEGORY, TopoDroidPreferences.PREF_CATEGORY_SURVEY ); mActivity.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.ShotWindow ); 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; } // --------------------------------------------------------- private void setMenuAdapter( Resources res ) { int k = 0; // HOVER // mMenuAdapter = new MyMenuAdapter( mActivity, this, mMenu, R.layout.menu, new ArrayList< MyMenuItem >() ); mMenuAdapter = new ArrayAdapter<String>(mActivity, R.layout.menu ); mMenuAdapter.add( res.getString( menus[k++] ) ); // menu_survey mMenuAdapter.add( res.getString( menus[k++] ) ); // menu_close if ( TDSetting.mLevelOverBasic ) mMenuAdapter.add( res.getString( menus[k] ) ); k++; // menu_recover if ( TDSetting.mLevelOverNormal ) mMenuAdapter.add( res.getString( menus[k] ) ); k++; // menu_photo if ( TDSetting.mLevelOverNormal ) mMenuAdapter.add( res.getString( menus[k] ) ); k++; // menu_sensor if ( TDSetting.mLevelOverBasic ) mMenuAdapter.add( res.getString( menus[k] ) ); k++; // menu_3d if ( TDSetting.mLevelOverNormal ) mMenuAdapter.add( res.getString( menus[k] ) ); k++; // menu_distox mMenuAdapter.add( res.getString( menus[k++] ) ); // menu_options mMenuAdapter.add( res.getString( menus[k++] ) ); // menu_help mMenu.setAdapter( mMenuAdapter ); mMenu.invalidate(); } private boolean closeMenu() { if ( onMenu ) { mMenu.setVisibility( View.GONE ); // HOVER // mMenuAdapter.resetBgColor(); onMenu = false; return true; } return false; } void deletePlot( long pid1, long pid2 ) { mApp.mData.deletePlot( pid1, mApp.mSID ); mApp.mData.deletePlot( pid2, mApp.mSID ); // FIXME NOTIFY } void recomputeItems( String st, int pos ) { if ( mSplay ) { if ( ! mShowSplay.remove( st ) ) { mShowSplay.add( st ); } updateDisplay( ); mList.setSelection( (pos>5)? pos-5 : 0 ); } } private boolean showSplaysContains( String name ) { for ( String st : mShowSplay ) { if ( st.equals( name ) ) return true; } return false; } public void setConnectionStatus( int status ) { if ( mApp.mDevice == null ) { // mButton1[ BTN_DOWNLOAD ].setVisibility( View.GONE ); mButton1[BTN_DOWNLOAD].setBackgroundDrawable( mBMdownload_no ); mButton1[BTN_BLUETOOTH].setBackgroundDrawable( mBMbluetooth_no ); } else { // mButton1[ BTN_DOWNLOAD ].setVisibility( View.VISIBLE ); switch ( status ) { case 1: mButton1[BTN_DOWNLOAD].setBackgroundDrawable( mBMdownload_on ); mButton1[BTN_BLUETOOTH].setBackgroundDrawable( mBMbluetooth_no ); break; case 2: mButton1[BTN_DOWNLOAD].setBackgroundDrawable( mBMdownload_wait ); mButton1[BTN_BLUETOOTH].setBackgroundDrawable( mBMbluetooth_no ); break; default: mButton1[BTN_DOWNLOAD].setBackgroundDrawable( mBMdownload ); mButton1[BTN_BLUETOOTH].setBackgroundDrawable( mBMbluetooth ); } } } void renumberShotsAfter( DistoXDBlock blk ) { // Log.v("DistoX", "renumber shots after " + blk.mLength + " " + blk.mBearing + " " + blk.mClino ); // NEED TO FORWARD to the APP to change the stations accordingly List< DistoXDBlock > shots = mApp.mData.selectAllShotsAfter( blk.mId, mApp.mSID, TopoDroidApp.STATUS_NORMAL ); mApp.assignStationsAfter( blk, shots ); // DEBUG re-assign all the stations // List< DistoXDBlock > shots = mApp.mData.selectAllShots( mApp.mSID, TopoDroidApp.STATUS_NORMAL ); // mApp.assign Stations( shots ); updateDisplay(); } // merge this block to the following (or second following) block if this is a leg // if success update FROM/TO of the block long mergeToNextLeg( DistoXDBlock blk ) { long id = mApp.mData.mergeToNextLeg( blk, mApp.mSID, false ); // Log.v("DistoX", "merge next leg: block " + blk.mId + " leg " + id ); if ( id >= 0 && id != blk.mId ) { // mDataAdapter.updateBlockName( id, "", "" ); // name has already been updated in DB updateDisplay(); // FIXME change only block with id } return id; } // ------------------------------------------------------------------ public void doProjectionDialog( String name, String start ) { new ProjectionDialog( mActivity, this, mApp.mSID, name, start ).show(); } void doProjectedProfile( String name, String start, int azimuth ) { makeNewPlot( name, start, false, azimuth ); } }