// Copyright 2012 (C) Matthew Brejza // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. package com.brejza.matt.habmodem; import java.io.File; import java.util.Iterator; import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import android.graphics.Color; import android.graphics.Paint; import org.mapsforge.android.maps.MapActivity; import org.mapsforge.android.maps.MapView; import org.mapsforge.android.maps.overlay.ArrayItemizedOverlay; import org.mapsforge.android.maps.overlay.ArrayWayOverlay; import org.mapsforge.android.maps.overlay.ItemizedOverlay; import org.mapsforge.android.maps.overlay.OverlayItem; import org.mapsforge.android.maps.overlay.OverlayWay; import org.mapsforge.core.GeoPoint; import ukhas.Gps_coordinate; import ukhas.Telemetry_string; import com.brejza.matt.habmodem.Dsp_service.LocalBinder; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Parcelable; import android.os.PowerManager; import android.preference.PreferenceManager; import android.app.DialogFragment; import android.app.FragmentManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import group.pals.android.lib.ui.filechooser.FileChooserActivity; import group.pals.android.lib.ui.filechooser.io.localfile.LocalFile; public class Map_Activity extends MapActivity implements AddPayloadFragment.NoticeDialogListener,LocationSelectFragment.NoticeDialogListener { MapView mapView; private StringRxReceiver strrxReceiver; private HabitatRxReceiver habirxReceiver; private GPSRxReceiver gpsrxReceiver; private PredictRxReceiver predictrxReceiver; private LogEventReceiver logReceiver; boolean isReg = false; boolean requestUpdate = false; private static final int _ReqChooseFile = 0; protected PowerManager.WakeLock mWakeLock; boolean _mapFile_set = false; Timer timerLogging; private Handler handler; Button btnMapPath; Menu _menu; protected int last_colour = 0x0; //public ConcurrentHashMap<String,Integer> path_colours = new ConcurrentHashMap<String,Integer>(); //Drawable defaultMarker; //ArrayItemizedOverlay itemizedOverlay; protected ArrayItemizedOverlay array_img_balloons; private ArrayWayOverlay array_waypoints; protected OverlayItem overlayMyLocation; private ConcurrentHashMap<String,OverlayWay> map_prediction_overlays = new ConcurrentHashMap<String,OverlayWay>(); private ConcurrentHashMap<String,OverlayWay> map_path_overlays = new ConcurrentHashMap<String,OverlayWay>(); protected ConcurrentHashMap<String,OverlayItem> map_balloon_overlays = new ConcurrentHashMap<String,OverlayItem>(); Dsp_service mService; boolean mBound = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); // getActionBar().setDisplayHomeAsUpEnabled(true); mapView = (MapView) findViewById(R.id.mapView); mapView.setClickable(true); mapView.setBuiltInZoomControls(true); // mapView.setMapFile(new File("/mnt/sdcard/Pictures/england.map")); ////////////////////////////////// //now for some stuff that isnt test code Paint dw = new Paint(Paint.ANTI_ALIAS_FLAG); dw.setStyle(Paint.Style.STROKE); dw.setColor(Color.BLUE); array_waypoints = new ArrayWayOverlay(dw,dw); mapView.getOverlays().add(array_waypoints); array_img_balloons = new ArrayItemizedOverlay(getResources().getDrawable(R.drawable.ic_map_balloon)); mapView.getOverlays().add(array_img_balloons); setMapFile(); handler = new Handler(); //for timer to interact with ui } private void setMapFile(){ if (_mapFile_set) return; String mapst = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).getString("pref_map_path", ""); // SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); // String mapst = settings.getString("silentMode", ""); // mapst = "/mnt/sdcard/Alarms/england.map"; File file = new File(mapst); if(file.exists()) { mapView.setMapFile(file); _mapFile_set = true; } } private void showMapChooser() { Intent intent = new Intent(Map_Activity.this, FileChooserActivity.class); intent.putExtra(FileChooserActivity._Rootpath, (Parcelable) new LocalFile(Environment.getExternalStorageDirectory().getPath() )); intent.putExtra(FileChooserActivity._RegexFilenameFilter, "(?si).*\\.(map)$"); intent.putExtra(FileChooserActivity._Theme, android.R.style.Theme_Dialog); startActivityForResult(intent, _ReqChooseFile); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case _ReqChooseFile: if (resultCode == RESULT_OK) { /* * you can use two flags included in data */ // IFileProvider.FilterMode filterMode = (IFileProvider.FilterMode) // data.getSerializableExtra(FileChooserActivity._FilterMode); // boolean saveDialog = data.getBooleanExtra(FileChooserActivity._SaveDialog, false); /* * a list of files will always return, * if selection mode is single, the list contains one file */ List<LocalFile> files = (List<LocalFile>) data.getSerializableExtra(FileChooserActivity._Results); for (File f : files) { PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).edit().putString("pref_map_path", f.getPath()).commit(); System.out.println(f.toString()); } // RelativeLayout ll = (RelativeLayout)findViewById(R.id.balloon_data_holder); // ll.removeView(btnMapPath); // _drawFileButton = false; if (files.size() > 0){ if(files.get(0).exists()) { mapView.setMapFile(files.get(0)); _mapFile_set = true; } } } break; } } public void btnAddPayload(View view) { FragmentManager fm = getFragmentManager(); AddPayloadFragment di = new AddPayloadFragment(); di.setAutoPayload(mService.getPayloadList()); di.show(fm, "AddPayload"); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); _menu = menu; Boolean s = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("pref_test_enable", false); if (s == false){ MenuItem item = menu.findItem(R.id.btconnect_screen); item.setVisible(false); } if (mService != null){ if (mService.enableUploader) _menu.findItem(R.id.toggle_online).setChecked(true); } return true; } @Override public void onStart() { super.onStart(); // // Bind to LocalService Intent intent = new Intent(this, Dsp_service.class); startService(intent); if (Build.VERSION.SDK_INT >= 18){ Intent intentBt = new Intent(this, BluetoothLeService.class); startService(intentBt); } requestUpdate = true; System.out.println("DEBUG : STARTING ACTIVITY"); } @Override public void onStop() { super.onStop(); if (mBound) { unbindService(mConnection); mBound = false; } System.out.println("DEBUG : MAP UNBOUND from activity"); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection Intent intent; if (item.getItemId() == R.id.status_screen) { intent = new Intent(this, StatusScreen.class); startActivity(intent); return true; } else if (item.getItemId() == R.id.location_dialog) { FragmentManager fm = getFragmentManager(); LocationSelectFragment di = new LocationSelectFragment(); di.enChase = mService.getEnableChase(); di.enPos = mService.getEnablePosition(); di.show(fm, "Location Settings"); return true; } else if (item.getItemId() == R.id.refresh_button) { mService.updateActivePayloadsHabitat(); return true; } else if (item.getItemId() == R.id.btconnect_screen) { if (Build.VERSION.SDK_INT >= 18){ intent = new Intent(this, BtScreen.class); startActivity(intent); }else{ Toast.makeText(this, "BTLE not supported on this device".toString(), Toast.LENGTH_SHORT).show(); } return true; } else if (item.getItemId() == R.id.graphs_button) { if ( mService.getActivePayloadList().size() > 0) { showGraphDialog(mService.getActivePayloadList().get(0)); } /*List<String> ls = mService.getActivePayloadList(); if (ls.size() > 0){ FragmentManager fm = getFragmentManager(); GraphsFragment di = new GraphsFragment(); di.setActivePayloads(ls,mService.getPayloadList()); di.show(fm, "View Graphs");}*/} else if (item.getItemId() == R.id.log_screen) { FragmentManager fm = getFragmentManager(); ViewLogFragment di = new ViewLogFragment(); di.setLogList(mService.getLog()); di.show(fm, "View Logs");} else if (item.getItemId() == R.id.settings_screen) { intent = new Intent(this,Preferences_activity.class); startActivity(intent); return true;} else if (item.getItemId() == R.id.toggle_online){ //CheckBox chk = (CheckBox) findViewById(R.id.toggle_online); if (mService.enableUploader){ mService.enableUploader = false; item.setChecked(false); }else{ mService.enableUploader = true; item.setChecked(true); } return true;} return super.onOptionsItemSelected(item); } @Override public void onResume() { super.onResume(); if (mService != null && _menu != null){ if (mService.enableUploader) _menu.findItem(R.id.toggle_online).setChecked(true); } if (mapView.getMapFile() == null) showMapChooser(); else { String p1 = mapView.getMapFile().getAbsolutePath(); String p2 = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).getString("pref_map_path", ""); if (!p1.equals(p2)) { if (mService != null) mService.logEvent("Changing map file", false); mapView.setMapFile(new File(PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()).getString("pref_map_path", ""))); } } if (!mBound){ Intent intent = new Intent(this, Dsp_service.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } //string receiver if (strrxReceiver == null) strrxReceiver = new StringRxReceiver(); IntentFilter intentFilter1 = new IntentFilter(Dsp_service.TELEM_RX); if (!isReg) { registerReceiver(strrxReceiver, intentFilter1); } //habitat receiver if (habirxReceiver == null) habirxReceiver = new HabitatRxReceiver(); IntentFilter intentFilter2 = new IntentFilter(Dsp_service.HABITAT_NEW_DATA); if (!isReg) { registerReceiver(habirxReceiver, intentFilter2); } //gps receiver if (gpsrxReceiver == null) gpsrxReceiver = new GPSRxReceiver(); IntentFilter intentFilter3 = new IntentFilter(Dsp_service.GPS_UPDATED); if (!isReg) { registerReceiver(gpsrxReceiver, intentFilter3); } //prediction receiver if (predictrxReceiver == null) predictrxReceiver = new PredictRxReceiver(); IntentFilter intentFilter5 = new IntentFilter(Dsp_service.PREDICTION_NEW_DATA); if (!isReg) { registerReceiver(predictrxReceiver, intentFilter5); } //log receiver if (logReceiver == null) logReceiver = new LogEventReceiver(); IntentFilter intentFilter4 = new IntentFilter(Dsp_service.LOG_EVENT); if (!isReg) { registerReceiver(logReceiver, intentFilter4); } isReg = true; Boolean s = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("pref_keep_screen", true); //Toast.makeText(this, s.toString(), Toast.LENGTH_LONG).show(); if (s){ final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); mWakeLock.acquire(); } if (_menu != null){ s = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("pref_test_enable", false); if (s){ MenuItem item = _menu.findItem(R.id.btconnect_screen); item.setVisible(true); this.invalidateOptionsMenu(); }else{ MenuItem item = _menu.findItem(R.id.btconnect_screen); item.setVisible(false); this.invalidateOptionsMenu(); } } } @Override public void onPause(){ super.onPause(); if (mBound){ if (mService != null){ mService.saveState(); } } if (isReg) { if (habirxReceiver != null) unregisterReceiver(habirxReceiver); if (strrxReceiver != null) unregisterReceiver(strrxReceiver); if (gpsrxReceiver != null) unregisterReceiver(gpsrxReceiver); if (predictrxReceiver != null) unregisterReceiver(predictrxReceiver); if (logReceiver != null) unregisterReceiver(logReceiver); } isReg = false; if (mWakeLock != null){ try{ this.mWakeLock.release(); } catch(Throwable th) { mService.logEvent("Warning, code 01.1",false); } } } protected void showGraphDialog(String call_startup) { List<String> ls = mService.getActivePayloadList(); if (ls.size() > 0){ FragmentManager fm = getFragmentManager(); GraphsFragment di = new GraphsFragment(); di.setStartCall(call_startup); di.setActivePayloads(ls,mService.getPayloadList()); di.show(fm, "View Graphs"); } } private void updatePredictedPaths(List<GeoPoint> input, String callsign) { if (input == null) return; if (input.size() < 1) return; callsign = callsign.toUpperCase(); GeoPoint[][] points = new GeoPoint[1][input.size()]; OverlayWay way; for (int i = 0; i < input.size(); i++) { points[0][i] = input.get(i); } if (map_prediction_overlays.containsKey(callsign)) { way = map_prediction_overlays.get(callsign); way.setWayNodes(points); } else { Paint linepaint = new Paint(Paint.ANTI_ALIAS_FLAG); linepaint.setStyle(Paint.Style.STROKE); int c; float hsv[]= new float[3]; Color.colorToHSV(mService.getPayloadColour(callsign),hsv); hsv[1] = hsv[1] /2; c = Color.HSVToColor(hsv); linepaint.setColor(c); linepaint.setAlpha(128); linepaint.setStrokeWidth(4); linepaint.setStrokeJoin(Paint.Join.ROUND); way = new OverlayWay(points,linepaint,linepaint); way.setWayNodes(points); array_waypoints.addWay(way); map_prediction_overlays.put(callsign, way); } } private void UpdateBalloonLocation(Gps_coordinate coord, String callsign) { if (coord == null) return; if (!coord.latlong_valid) return ; if (coord.latitude == 0 && coord.longitude == 0) return ; callsign = callsign.toUpperCase(); if (mapView == null) return ; if (map_balloon_overlays.containsKey(callsign) && coord.latlong_valid) { map_balloon_overlays.get(callsign).setPoint(new GeoPoint(coord.latitude,coord.longitude)); array_img_balloons.requestRedraw(); } else { mService.logEvent("Adding New Balloon To Map : " + callsign,false); OverlayItem i = new OverlayItem(new GeoPoint(coord.latitude,coord.longitude), callsign, callsign + " location"); array_img_balloons.addItem(i); array_img_balloons.requestRedraw(); map_balloon_overlays.put(callsign, i); } } private void UpdateBalloonTrack(TreeMap<Long,Telemetry_string> telem, String callsign, boolean reAdd, boolean forceAppend)//, long dataStartTime, long dataEndTime) { if (mapView == null) return ; callsign = callsign.toUpperCase(); GeoPoint lp=new GeoPoint(0,0); //step1: check to see if data already exists if (map_path_overlays.containsKey(callsign)) { //if (last_update_time.containsKey(callsign)) //{ if (forceAppend)// || last_update_time.get(callsign).longValue() < dataStartTime) { //no conflict, just keep drawing //System.out.println("Update track, no conflict - add to end"); OverlayWay way = map_path_overlays.get(callsign); int size_org = way.getWayNodes()[0].length; GeoPoint[][] points = new GeoPoint[1][telem.size() + size_org]; //copy old points into new object System.arraycopy(way.getWayNodes()[0], 0, points[0], 0, size_org); //add new points to array int i=0; Iterator it = telem.entrySet().iterator(); while (it.hasNext()) { TreeMap.Entry pairs = (TreeMap.Entry)it.next(); Telemetry_string ts = (Telemetry_string) pairs.getValue(); if (ts != null){ if (ts.coords != null && !ts.isZeroGPS()) lp = new GeoPoint(ts.coords.latitude,ts.coords.longitude); } points[0][size_org+i] = lp; i++; // it.remove(); // avoids a ConcurrentModificationException } way.setWayNodes(points); array_waypoints.requestRedraw(); } else if (reAdd) { //wipe and start again, so get the data from the service System.out.println("Update track - wipe old array"); TreeMap<Long, Telemetry_string> tm = mService.getPayloadData(callsign); if (tm != null){ GeoPoint[][] points = new GeoPoint[1][tm.size()]; OverlayWay way = map_path_overlays.get(callsign); //add new points to array int i=0; Iterator it = telem.entrySet().iterator(); while (it.hasNext()) { TreeMap.Entry pairs = (TreeMap.Entry)it.next(); Telemetry_string ts = (Telemetry_string) pairs.getValue(); if (ts != null){ if (ts.coords != null && !ts.isZeroGPS()) lp = new GeoPoint(ts.coords.latitude,ts.coords.longitude); } points[0][i] = lp; i++; // it.remove(); // avoids a ConcurrentModificationException } //add new points to array (old) /* for (int i = 0 ; i < tm.size(); i++) { Telemetry_string ts = (tm.get(i)); if (ts != null){ if (ts.coords != null) lp = new GeoPoint(ts.coords.latitude,ts.coords.longitude); } points[0][i] = lp; } */ way.setWayNodes(points); array_waypoints.requestRedraw(); } } else { //do nothing System.out.println("Update track - do nothing"); } //} } else { //create new objects and start from scratch. //ignore reAdd as there was nothing here to begin with System.out.println("Update track - new track"); GeoPoint[][] points = new GeoPoint[1][telem.size()]; /* for (int i = 0 ; i < telem.size(); i++) { Telemetry_string ts =(telem.get(i)); if (ts != null) { if (ts.coords != null) lp = new GeoPoint(ts.coords.latitude,ts.coords.longitude); } points[0][i] = lp; } */ //add new points to array int i=0; Iterator it = telem.entrySet().iterator(); while (it.hasNext()) { TreeMap.Entry pairs = (TreeMap.Entry)it.next(); Telemetry_string ts = (Telemetry_string) pairs.getValue(); if (ts != null){ if (ts.coords != null && !ts.isZeroGPS()) lp = new GeoPoint(ts.coords.latitude,ts.coords.longitude); } points[0][i] = lp; i++; //it.remove(); // avoids a ConcurrentModificationException } Paint linepaint = new Paint(Paint.ANTI_ALIAS_FLAG); linepaint.setStyle(Paint.Style.STROKE); linepaint.setColor(mService.getPayloadColour(callsign)); linepaint.setAlpha(128); linepaint.setStrokeWidth(4); linepaint.setStrokeJoin(Paint.Join.ROUND); OverlayWay way = new OverlayWay(points,linepaint,linepaint); array_waypoints.addWay(way); map_path_overlays.put(callsign.toUpperCase(), way); array_waypoints.requestRedraw(); } //last_update_time.put(callsign.toUpperCase(), Long.valueOf(dataEndTime)); System.out.println("Update track - done"); } private void updateAll() { if (mapView == null) return ; Balloon_data_fragment fragment = (Balloon_data_fragment) getFragmentManager().findFragmentById(R.id.balloon_data_holder); //try //{ if (mBound && mService != null) { List<String> flights = mService.getActivePayloadList(); for (int i = 0; i < flights.size(); i++) { String call = flights.get(i).toUpperCase(); updatePredictedPaths(mService.getPredictedPath(call),call); fragment.AddPayload(flights.get(i),mService.getPayloadColour(call)); TreeMap <Long, Telemetry_string> tm = mService.getPayloadData(call); if (tm.size() > 0){ UpdateBalloonTrack(tm,call,true, false); fragment.updatePayload(tm.lastEntry().getValue(),mService.getAscentRate(call),mService.getMaxAltitude(call)); UpdateBalloonLocation(tm.lastEntry().getValue().coords,call); } } requestUpdate = false; } //} //catch (Exception e) //{ //} } private class StringRxReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Dsp_service.TELEM_RX)) { if (mService.getLastString() != null){ String call = mService.getLastString().callsign; if (mService.getLastString().coords != null ){ if (mService.getLastString().coords.latlong_valid) UpdateBalloonLocation(mService.getLastString().coords,call); } if (mService.getLastString().checksum_valid && mService.getLastString().time != null){ TreeMap<Long,Telemetry_string> l = new TreeMap<Long,Telemetry_string>(); l.put(mService.getLastString().time.getTime(),mService.getLastString()); UpdateBalloonTrack(l,call, false, true);//, 0, System.currentTimeMillis() / 1000L ); } Balloon_data_fragment fragment = (Balloon_data_fragment) getFragmentManager().findFragmentById(R.id.balloon_data_holder); fragment.updatePayload(mService.getLastString(),mService.getAscentRate(call),mService.getMaxAltitude(call)); } } } } private class GPSRxReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Dsp_service.GPS_UPDATED)) { //Do stuff if (mService.currentLocationValid && mService.getEnablePosition()) { if (overlayMyLocation == null) { // System.out.println("DEBUG : adding user onto map new " + mService.currentLatitude + " " + mService.currentLatitude); overlayMyLocation = new OverlayItem(new GeoPoint(mService.currentLatitude,mService.currentLongitude), "User Location","",ItemizedOverlay.boundCenterBottom(getResources().getDrawable(R.drawable.ic_map_rx))); array_img_balloons.addItem(overlayMyLocation); array_img_balloons.requestRedraw(); } else { // System.out.println("DEBUG : adding user onto map " + mService.currentLatitude + " " + mService.currentLongitude); overlayMyLocation.setPoint(new GeoPoint(mService.currentLatitude,mService.currentLongitude)); array_img_balloons.requestRedraw(); } } } } } private class PredictRxReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Dsp_service.PREDICTION_NEW_DATA)) { List<String> flights = mService.getActivePayloadList(); for (int i = 0; i < flights.size(); i++) { String call = flights.get(i).toUpperCase(); updatePredictedPaths(mService.getPredictedPath(call),call); } } } } private class HabitatRxReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Dsp_service.HABITAT_NEW_DATA)) { //Do stuff if (intent.hasExtra(Dsp_service.TELEM_STR)) { Telemetry_string str = new Telemetry_string( intent.getStringExtra(Dsp_service.TELEM_STR),null); //item.setPoint(new GeoPoint(str.coords.latitude,str.coords.longitude)); //itemizedOverlay.requestRedraw(); //TODO: check that our data is actually new if (mService.payloadExists(str.callsign) && str.time != null){ if (str.time.getTime()>= mService.getMostRecent(str.callsign).time.getTime()) UpdateBalloonLocation(str.coords,str.callsign); UpdateBalloonTrack(mService.getPayloadData(str.callsign),str.callsign,true, false);//, 0, System.currentTimeMillis() / 1000L ); } Balloon_data_fragment fragment = (Balloon_data_fragment) getFragmentManager().findFragmentById(R.id.balloon_data_holder); fragment.updatePayload(str,mService.getAscentRate(str.callsign),mService.getMaxAltitude(str.callsign)); } } } } private class LogEventReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Dsp_service.LOG_EVENT)) { //Do stuff if (intent.hasExtra(Dsp_service.LOG_STR)) { String str = intent.getStringExtra(Dsp_service.LOG_STR); TextView tv = (TextView)findViewById(R.id.txtLogStatus); if (str.length() > 85) str = str.substring(0, 85) + "..."; tv.setText(str); if (timerLogging != null) timerLogging.cancel(); timerLogging = new Timer(); timerLogging.schedule(new LoggingTimerTask(), 6 * 1000); } } } } class LoggingTimerTask extends TimerTask { public void run() { handler.post(new Runnable() { @Override public void run() { TextView tv = (TextView)findViewById(R.id.txtLogStatus); tv.setText(""); } }); } } /** Defines callbacks for service binding, passed to bindService() */ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // We've bound to LocalService, cast the IBinder and get LocalService instance LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; if (mService.enableUploader && _menu != null) _menu.findItem(R.id.toggle_online).setChecked(true); if (requestUpdate) updateAll(); } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; @Override public void onDialogPositiveClick(DialogFragment dialog, String callsign, int lookBehind) { // TODO Auto-generated method stub mService.addActivePayload(callsign,lookBehind); Balloon_data_fragment fragment = (Balloon_data_fragment) getFragmentManager().findFragmentById(R.id.balloon_data_holder); fragment.AddPayload(callsign,mService.getPayloadColour(callsign)); mService.updateActivePayloadsHabitat(); } public void removePayload(String callsign) { String call = callsign.toUpperCase(); if (mService.payloadExists(call)) mService.removeActivePayload(call); System.out.println("REMOVED PAYLOAD: " + callsign); if (map_balloon_overlays.containsKey(call)){ array_img_balloons.removeItem(map_balloon_overlays.get(call)); map_balloon_overlays.remove(call); } if (map_path_overlays.containsKey(call)){ array_waypoints.removeWay(map_path_overlays.get(call)); map_path_overlays.remove(call); } if (map_prediction_overlays.containsKey(call)){ array_waypoints.removeWay(map_prediction_overlays.get(call)); map_prediction_overlays.remove(call); } } @Override public void onDialogPositiveClick(DialogFragment dialog, boolean enPos, boolean enChase) { mService.changeLocationSettings(enPos,enChase); } }