kopia lustrzana https://github.com/sh123/codec2_talkie
172 wiersze
6.4 KiB
Java
172 wiersze
6.4 KiB
Java
package com.radio.codec2talkie.maps;
|
|
|
|
import android.content.Context;
|
|
import android.content.SharedPreferences;
|
|
import android.graphics.Bitmap;
|
|
import android.hardware.SensorEvent;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import android.view.Menu;
|
|
import android.view.MenuItem;
|
|
|
|
import androidx.appcompat.app.ActionBar;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import androidx.preference.PreferenceManager;
|
|
|
|
import com.radio.codec2talkie.BuildConfig;
|
|
import com.radio.codec2talkie.R;
|
|
import com.radio.codec2talkie.protocol.Aprs;
|
|
import com.radio.codec2talkie.protocol.aprs.tools.AprsSymbolTable;
|
|
import com.radio.codec2talkie.settings.PreferenceKeys;
|
|
|
|
import org.osmdroid.api.IMapController;
|
|
import org.osmdroid.config.Configuration;
|
|
import org.osmdroid.tileprovider.modules.SqlTileWriter;
|
|
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
|
|
import org.osmdroid.views.MapView;
|
|
import org.osmdroid.views.overlay.compass.CompassOverlay;
|
|
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;
|
|
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
|
|
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
|
|
|
|
public class MapActivity extends AppCompatActivity {
|
|
private static final String TAG = MapActivity.class.getSimpleName();
|
|
|
|
private static final double MAP_STARTUP_ZOOM = 5.0;
|
|
private static final double MAP_FOLLOW_ZOOM = 14.0;
|
|
|
|
private MapView _mapView;
|
|
private IMapController _mapController;
|
|
private MyLocationNewOverlay _myLocationNewOverlay;
|
|
|
|
private MapStations _mapStations;
|
|
private boolean _rotateMap = false;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
setTitle(R.string.menu_aprs_map);
|
|
setContentView(R.layout.activity_map_view);
|
|
|
|
ActionBar actionBar = getSupportActionBar();
|
|
if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
|
|
|
|
Context context = getApplicationContext();
|
|
Configuration.getInstance().setUserAgentValue(Aprs.APRS_ID + " " + BuildConfig.VERSION_NAME);
|
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
|
|
// my symbol
|
|
AprsSymbolTable aprsSymbolTable = AprsSymbolTable.getInstance(context);
|
|
String mySymbolCode = sharedPreferences.getString(PreferenceKeys.APRS_SYMBOL, "/[");
|
|
|
|
// map
|
|
_mapView = findViewById(R.id.map);
|
|
_mapView.setTileSource(TileSourceFactory.MAPNIK);
|
|
_mapView.setMultiTouchControls(true);
|
|
|
|
// controller
|
|
_mapController = _mapView.getController();
|
|
_mapController.zoomTo(MAP_STARTUP_ZOOM);
|
|
|
|
// compass
|
|
InternalCompassOrientationProvider compassOrientationProvider = new InternalCompassOrientationProvider(context) {
|
|
@Override
|
|
public void onSensorChanged(SensorEvent sensorEvent) {
|
|
if (_rotateMap) {
|
|
_mapView.setMapOrientation(-sensorEvent.values[0]);
|
|
}
|
|
super.onSensorChanged(sensorEvent);
|
|
}
|
|
};
|
|
CompassOverlay compassOverlay = new CompassOverlay(context, compassOrientationProvider, _mapView);
|
|
compassOverlay.enableCompass();
|
|
_mapView.getOverlays().add(compassOverlay);
|
|
|
|
// my location
|
|
_myLocationNewOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(context), _mapView);
|
|
Bitmap myBitmapIcon = aprsSymbolTable.bitmapFromSymbol(mySymbolCode, true);
|
|
_myLocationNewOverlay.setDirectionIcon(myBitmapIcon);
|
|
_myLocationNewOverlay.setPersonIcon(myBitmapIcon);
|
|
|
|
// my location overlay
|
|
_myLocationNewOverlay.enableMyLocation();
|
|
_myLocationNewOverlay.runOnFirstFix(() -> runOnUiThread(() -> {
|
|
_mapController.setCenter(_myLocationNewOverlay.getMyLocation());
|
|
_mapController.animateTo(_myLocationNewOverlay.getMyLocation());
|
|
}));
|
|
_mapView.getOverlays().add(_myLocationNewOverlay);
|
|
|
|
// stations
|
|
_mapStations = new MapStations(context, _mapView, this);
|
|
}
|
|
|
|
@Override
|
|
public boolean onCreateOptionsMenu(Menu menu) {
|
|
getMenuInflater().inflate(R.menu.map_menu, menu);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
int itemId = item.getItemId();
|
|
|
|
if (itemId == android.R.id.home) {
|
|
finish();
|
|
return true;
|
|
} else if (itemId == R.id.map_menu_clear_cache) {
|
|
new Thread(() -> {
|
|
_mapView.getTileProvider().clearTileCache();
|
|
SqlTileWriter sqlTileWriter = new SqlTileWriter();
|
|
boolean isCleared = sqlTileWriter.purgeCache(_mapView.getTileProvider().getTileSource().name());
|
|
if (isCleared)
|
|
Log.i(TAG, "Cleanup completed");
|
|
else
|
|
Log.e(TAG, "Cache was not cleared");
|
|
}).start();
|
|
return true;
|
|
} else if (itemId == R.id.map_menu_rotate_map) {
|
|
if (item.isChecked()) {
|
|
item.setChecked(false);
|
|
_rotateMap = false;
|
|
_mapView.setMapOrientation(0);
|
|
} else {
|
|
item.setChecked(true);
|
|
_rotateMap = true;
|
|
}
|
|
return true;
|
|
} else if (itemId == R.id.map_menu_show_range) {
|
|
boolean showCircles = false;
|
|
if (item.isChecked()) {
|
|
item.setChecked(false);
|
|
} else {
|
|
item.setChecked(true);
|
|
showCircles = true;
|
|
}
|
|
_mapStations.showRangeCircles(showCircles);
|
|
return true;
|
|
} else if (itemId == R.id.map_menu_show_moving) {
|
|
boolean showMoving = false;
|
|
if (item.isChecked()) {
|
|
item.setChecked(false);
|
|
} else {
|
|
item.setChecked(true);
|
|
showMoving = true;
|
|
}
|
|
_mapStations.showMovingStations(showMoving);
|
|
return true;
|
|
} else if (itemId == R.id.map_menu_move_map) {
|
|
if (item.isChecked()) {
|
|
item.setChecked(false);
|
|
_myLocationNewOverlay.disableFollowLocation();
|
|
} else {
|
|
item.setChecked(true);
|
|
_myLocationNewOverlay.enableFollowLocation();
|
|
_mapController.zoomTo(MAP_FOLLOW_ZOOM);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return super.onOptionsItemSelected(item);
|
|
}
|
|
}
|