From 3e40307d0f6416ddb6cc208e184f5f7ad2271b64 Mon Sep 17 00:00:00 2001 From: Hampus Rosenquist <hamro777@student.liu.se> Date: Fri, 7 Oct 2022 16:51:07 +0200 Subject: [PATCH] Osmdroid working partly --- .../android/app/AircraftMapView.java | 303 ++++++++++++++---- .../android/app/AircraftMapViewOld.java | 279 ---------------- 2 files changed, 242 insertions(+), 340 deletions(-) delete mode 100644 drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapViewOld.java diff --git a/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapView.java b/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapView.java index c6588fa..ea8cff4 100644 --- a/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapView.java +++ b/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapView.java @@ -9,67 +9,105 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; - -import com.google.android.gms.maps.OnMapReadyCallback; -import com.google.android.gms.maps.SupportMapFragment; +import androidx.fragment.app.Fragment; import org.dripdronescanner.android.R; +import org.dripdronescanner.android.data.AircraftObject; import org.osmdroid.config.Configuration; import org.osmdroid.tileprovider.tilesource.TileSourceFactory; import org.osmdroid.views.MapView; import java.util.ArrayList; +import java.util.HashMap; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.util.Pair; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.google.android.gms.internal.maps.zzt; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.CameraPosition; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.PolylineOptions; + +import org.dripdronescanner.android.data.AircraftObject; +import org.dripdronescanner.android.data.LocationData; +import org.dripdronescanner.android.data.SystemData; +import org.dripdronescanner.android.data.Util; + +import java.util.Collection; +import java.util.HashMap; -public class AircraftMapView extends SupportMapFragment implements OnMapReadyCallback { - private final int REQUEST_PERMISSIONS_REQUEST_CODE = 1; +public class AircraftMapView extends SupportMapFragment { private MapView map = null; + private static final String TAG = "AircraftMapView"; + private AircraftViewModel model; + private final HashMap<AircraftObject, MapObserver> aircraftObservers = new HashMap<>(); - @Override - public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) { - View view = super.onCreateView(layoutInflater, viewGroup, bundle); - getMapAsync(this); - return view; - } + private final Util.DiffObserver<AircraftObject> allAircraftObserver = new Util.DiffObserver<AircraftObject>() { + @Override + public void onAdded(Collection<AircraftObject> added) { + for (AircraftObject aircraftObject : added) { + trackAircraft(aircraftObject); + } + } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + @Override + public void onRemoved(Collection<AircraftObject> removed) { + for (AircraftObject aircraftObject : removed) { + stopTrackingAircraft(aircraftObject); + } + } + }; + + private void trackAircraft(AircraftObject aircraftObject) { + MapObserver observer = new MapObserver(aircraftObject); + aircraftObservers.put(aircraftObject, observer); + } - //handle permissions first, before map is created. not depicted here + private void stopTrackingAircraft(AircraftObject aircraftObject) { + MapObserver observer = aircraftObservers.remove(aircraftObject); + if (observer == null) return; + observer.stop(); + } - //load/initialize the osmdroid configuration, this can be done - Context ctx = getApplicationContext(); + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + Context ctx = getContext(); Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); - //setting this before the layout is inflated is a good idea - //it 'should' ensure that the map has a writable location for the map cache, even without permissions - //if no tiles are displayed, you can try overriding the cache path using Configuration.getInstance().setCachePath - //see also StorageUtils - //note, the load method also sets the HTTP User Agent to your application's package name, abusing osm's - //tile servers will get you banned based on this string - - //inflate and create the map - setContentView(R.layout.activity_main); - map = (MapView) findViewById(R.id.map_view); + View v = inflater.inflate(R.layout.activity_main, null); + map = v.findViewById(R.id.map_view); map.setTileSource(TileSourceFactory.MAPNIK); - - requestPermissionsIfNecessary(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE} - //arrayOf( - // if you need to show the current location, uncomment the line below - // Manifest.permission.ACCESS_FINE_LOCATION, - // WRITE_EXTERNAL_STORAGE is required in order to show the map - //Manifest.permission.WRITE_EXTERNAL_STORAGE - ); + return v; } @Override public void onResume() { super.onResume(); //this will refresh the osmdroid configuration on resuming. - //if you make changes to the configuration, use + //if you make changes to the configuration, use //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); //Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this)); map.onResume(); //needed for compass, my location overlays, v6.0.0 and up @@ -79,40 +117,183 @@ public class AircraftMapView extends SupportMapFragment implements OnMapReadyCal public void onPause() { super.onPause(); //this will refresh the osmdroid configuration on resuming. - //if you make changes to the configuration, use + //if you make changes to the configuration, use //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); //Configuration.getInstance().save(this, prefs); map.onPause(); //needed for compass, my location overlays, v6.0.0 and up } @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - ArrayList<String> permissionsToRequest = new ArrayList<>(); - for (int i = 0; i < grantResults.length; i++) { - permissionsToRequest.add(permissions[i]); - } - if (permissionsToRequest.size() > 0) { - ActivityCompat.requestPermissions( - this, - permissionsToRequest.toArray(new String[0]), - REQUEST_PERMISSIONS_REQUEST_CODE); - } + public void onActivityCreated(Bundle bundle) { + super.onActivityCreated(bundle); + setupModel(); + } + + private static final int DESIRED_ZOOM = 17; + private static final int ALLOWED_ZOOM_MARGIN = 2; + + private void setupModel() { + if (getActivity() == null) + return; + + model = ViewModelProviders.of(getActivity()).get(AircraftViewModel.class); + + model.getAllAircraft().observe(getViewLifecycleOwner(), allAircraftObserver); + model.getActiveAircraft().observe(getViewLifecycleOwner(), new Observer<AircraftObject>() { + MapObserver last = null; + + @Override + public void onChanged(@Nullable AircraftObject object) { + if (object == null || object.getLocation() == null || map == null) + return; + MapObserver observer = aircraftObservers.get(object); + if (observer == null) + return; + + if (object.getLocation().getLatitude() == 0.0 && object.getLocation().getLongitude() == 0.0) + return; + + LatLng ll = new LatLng(object.getLocation().getLatitude(), object.getLocation().getLongitude()); + Log.i(TAG, "centering on " + object + " at " + ll); + + if (last != null && last.marker != null) { + last.marker.setAlpha(0.5f); + if (last.markerPilot != null) + last.markerPilot.setAlpha(0.5f); + } + if (observer.marker != null) + observer.marker.setAlpha(1.0f); + if (observer.markerPilot != null) + observer.markerPilot.setAlpha(1.0f); + + last = observer; + + /*CameraPosition position = googleMap.getCameraPosition(); + if (position.zoom < DESIRED_ZOOM - ALLOWED_ZOOM_MARGIN || position.zoom > DESIRED_ZOOM + ALLOWED_ZOOM_MARGIN) + googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, DESIRED_ZOOM)); + else + googleMap.moveCamera(CameraUpdateFactory.newLatLng(ll)); + */ + } + }); } - private void requestPermissionsIfNecessary(String[] permissions) { - ArrayList<String> permissionsToRequest = new ArrayList<>(); - for (String permission : permissions) { - if (ContextCompat.checkSelfPermission(this, permission) - != PackageManager.PERMISSION_GRANTED) { - // Permission is not granted - permissionsToRequest.add(permission); + class MapObserver implements Observer<LocationData> { + private Marker marker; + private Marker markerPilot; + private Polyline polyline; + private PolylineOptions polylineOptions; + + private final AircraftObject aircraft; + + MapObserver(AircraftObject active) { + aircraft = active; + aircraft.location.observe(AircraftMapView.this, this); + aircraft.system.observe(AircraftMapView.this, systemObserver); + polylineOptions = new PolylineOptions() + .color(Color.RED) + .clickable(true); + } + + void stop() { + aircraft.location.removeObserver(this); + aircraft.system.removeObserver(systemObserver); + if (marker != null) { + marker.remove(); + marker = null; + } + if (markerPilot != null) { + markerPilot.remove(); + markerPilot = null; + } + if (polyline != null) { + polyline.remove(); + polyline = null; } + polylineOptions = null; } - if (permissionsToRequest.size() > 0) { - ActivityCompat.requestPermissions( - this, - permissionsToRequest.toArray(new String[0]), - REQUEST_PERMISSIONS_REQUEST_CODE); + + private final Observer<SystemData> systemObserver = new Observer<SystemData>() { + @Override + public void onChanged(@Nullable SystemData ignore) { + SystemData sys = aircraft.getSystem(); + if (sys == null || map == null) + return; + + // filter out zero data + if (sys.getOperatorLatitude() == 0.0 && sys.getOperatorLongitude() == 0.0) + return; + + LatLng latLng = new LatLng(sys.getOperatorLatitude(), sys.getOperatorLongitude()); + if (markerPilot == null) { + String id = "ID missing"; + if (aircraft.getIdentification() != null) + id = aircraft.getIdentification().getUasIdAsString(); + + Marker pilotMarker = new Marker((zzt) map); + pilotMarker.setPosition(latLng); + pilotMarker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); + pilotMarker.setTitle("pilot " + id); + pilotMarker.setAlpha(0.5f); + markerPilot = pilotMarker; + + /*googleMap.addMarker( + new MarkerOptions() + .alpha(0.5f) + .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) + .position(latLng) + .title("pilot " + id));*/ + markerPilot.setTag(new Pair<>(aircraft, this)); + } + markerPilot.setPosition(latLng); // duplicate? + } + }; + + @Override + public void onChanged(@Nullable LocationData ignore) { + boolean zoom = false; + LocationData loc = aircraft.getLocation(); + if (loc == null || map == null || polylineOptions == null) + return; + + // filter out zero data + if (loc.getLatitude() == 0.0 && loc.getLongitude() == 0.0) + return; + + LatLng latLng = new LatLng(loc.getLatitude(), loc.getLongitude()); + if (marker == null) { + String id = "ID missing"; + if (aircraft.getIdentification() != null) + id = aircraft.getIdentification().getUasIdAsString(); + + Marker aircraftMarker = new Marker((zzt) map); + aircraftMarker.setPosition(latLng); + aircraftMarker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); + aircraftMarker.setTitle("aircraft " + id); + aircraftMarker.setAlpha(0.5f); + marker = aircraftMarker; + + /*googleMap.addMarker( + new MarkerOptions() + .alpha(0.5f) + .position(latLng) + .title("aircraft " + id));*/ + marker.setTag(aircraft); + zoom = true; + } + + polylineOptions.add(latLng); + if (polyline != null) { + polyline.remove(); + polyline = null; + } + //polyline = googleMap.addPolyline(polylineOptions); + map.getOverlayManager().add((Overlay) polyline); + + marker.setPosition(latLng); + if (zoom) { + googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); + } } } } \ No newline at end of file diff --git a/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapViewOld.java b/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapViewOld.java deleted file mode 100644 index db4db20..0000000 --- a/drip-android-observer-master/Android/app/src/main/java/org/dripdronescanner/android/app/AircraftMapViewOld.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (C) 2019 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - * - */ -package org.dripdronescanner.android.app; - -import android.Manifest; -import android.content.pm.PackageManager; -import android.graphics.Color; -import android.os.Bundle; -import android.util.Log; -import android.util.Pair; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.Nullable; -import androidx.core.app.ActivityCompat; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProviders; - -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.OnMapReadyCallback; -import com.google.android.gms.maps.SupportMapFragment; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.CameraPosition; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.PolylineOptions; - -import org.dripdronescanner.android.data.AircraftObject; -import org.dripdronescanner.android.data.LocationData; -import org.dripdronescanner.android.data.SystemData; -import org.dripdronescanner.android.data.Util; - -import java.util.Collection; -import java.util.HashMap; - -public class AircraftMapViewOld extends SupportMapFragment implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener { - private static final String TAG = "AircraftMapView"; - private GoogleMap googleMap; - private AircraftViewModel model; - - private final HashMap<AircraftObject, MapObserver> aircraftObservers = new HashMap<>(); - - private final Util.DiffObserver<AircraftObject> allAircraftObserver = new Util.DiffObserver<AircraftObject>() { - @Override - public void onAdded(Collection<AircraftObject> added) { - for (AircraftObject aircraftObject : added) { - trackAircraft(aircraftObject); - } - } - - @Override - public void onRemoved(Collection<AircraftObject> removed) { - for (AircraftObject aircraftObject : removed) { - stopTrackingAircraft(aircraftObject); - } - } - }; - - private void trackAircraft(AircraftObject aircraftObject) { - MapObserver observer = new MapObserver(aircraftObject); - aircraftObservers.put(aircraftObject, observer); - } - - private void stopTrackingAircraft(AircraftObject aircraftObject) { - MapObserver observer = aircraftObservers.remove(aircraftObject); - if (observer == null) return; - observer.stop(); - } - - private static final int DESIRED_ZOOM = 17; - private static final int ALLOWED_ZOOM_MARGIN = 2; - - private void setupModel() { - if (getActivity() == null) - return; - - model = ViewModelProviders.of(getActivity()).get(AircraftViewModel.class); - - model.getAllAircraft().observe(getViewLifecycleOwner(), allAircraftObserver); - model.getActiveAircraft().observe(getViewLifecycleOwner(), new Observer<AircraftObject>() { - MapObserver last = null; - - @Override - public void onChanged(@Nullable AircraftObject object) { - if (object == null || object.getLocation() == null || googleMap == null) - return; - MapObserver observer = aircraftObservers.get(object); - if (observer == null) - return; - - if (object.getLocation().getLatitude() == 0.0 && object.getLocation().getLongitude() == 0.0) - return; - - LatLng ll = new LatLng(object.getLocation().getLatitude(), object.getLocation().getLongitude()); - Log.i(TAG, "centering on " + object + " at " + ll); - - if (last != null && last.marker != null) { - last.marker.setAlpha(0.5f); - if (last.markerPilot != null) - last.markerPilot.setAlpha(0.5f); - } - if (observer.marker != null) - observer.marker.setAlpha(1.0f); - if (observer.markerPilot != null) - observer.markerPilot.setAlpha(1.0f); - - last = observer; - - CameraPosition position = googleMap.getCameraPosition(); - if (position.zoom < DESIRED_ZOOM - ALLOWED_ZOOM_MARGIN || position.zoom > DESIRED_ZOOM + ALLOWED_ZOOM_MARGIN) - googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, DESIRED_ZOOM)); - else - googleMap.moveCamera(CameraUpdateFactory.newLatLng(ll)); - } - }); - } - - @Override - public boolean onMarkerClick(Marker marker) { - - if (marker != null) { - Object tag = marker.getTag(); - if (tag instanceof AircraftObject) { - model.setActiveAircraft((AircraftObject) tag); - return true; - } - } - return false; - } - - class MapObserver implements Observer<LocationData> { - private Marker marker; - private Marker markerPilot; - private Polyline polyline; - private PolylineOptions polylineOptions; - - private final AircraftObject aircraft; - - MapObserver(AircraftObject active) { - aircraft = active; - aircraft.location.observe(AircraftMapViewOld.this, this); - aircraft.system.observe(AircraftMapViewOld.this, systemObserver); - polylineOptions = new PolylineOptions() - .color(Color.RED) - .clickable(true); - } - - void stop() { - aircraft.location.removeObserver(this); - aircraft.system.removeObserver(systemObserver); - if (marker != null) { - marker.remove(); - marker = null; - } - if (markerPilot != null) { - markerPilot.remove(); - markerPilot = null; - } - if (polyline != null) { - polyline.remove(); - polyline = null; - } - polylineOptions = null; - } - - private final Observer<SystemData> systemObserver = new Observer<SystemData>() { - @Override - public void onChanged(@Nullable SystemData ignore) { - SystemData sys = aircraft.getSystem(); - if (sys == null || googleMap == null) - return; - - // filter out zero data - if (sys.getOperatorLatitude() == 0.0 && sys.getOperatorLongitude() == 0.0) - return; - - LatLng latLng = new LatLng(sys.getOperatorLatitude(), sys.getOperatorLongitude()); - if (markerPilot == null) { - String id = "ID missing"; - if (aircraft.getIdentification() != null) - id = aircraft.getIdentification().getUasIdAsString(); - markerPilot = googleMap.addMarker( - new MarkerOptions() - .alpha(0.5f) - .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) - .position(latLng) - .title("pilot " + id)); - markerPilot.setTag(new Pair<>(aircraft, this)); - } - markerPilot.setPosition(latLng); - } - }; - - @Override - public void onChanged(@Nullable LocationData ignore) { - boolean zoom = false; - LocationData loc = aircraft.getLocation(); - if (loc == null || googleMap == null || polylineOptions == null) - return; - - // filter out zero data - if (loc.getLatitude() == 0.0 && loc.getLongitude() == 0.0) - return; - - LatLng latLng = new LatLng(loc.getLatitude(), loc.getLongitude()); - if (marker == null) { - String id = "ID missing"; - if (aircraft.getIdentification() != null) - id = aircraft.getIdentification().getUasIdAsString(); - marker = googleMap.addMarker( - new MarkerOptions() - .alpha(0.5f) - .position(latLng) - .title("aircraft " + id)); - marker.setTag(aircraft); - zoom = true; - } - - polylineOptions.add(latLng); - if (polyline != null) { - polyline.remove(); - polyline = null; - } - polyline = googleMap.addPolyline(polylineOptions); - - marker.setPosition(latLng); - if (zoom) { - googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); - } - } - } - - @Override - public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) { - View view = super.onCreateView(layoutInflater, viewGroup, bundle); - getMapAsync(this); - return view; - } - - @Override - public void onActivityCreated(Bundle bundle) { - super.onActivityCreated(bundle); - setupModel(); - } - - @Override - public void onMapReady(GoogleMap googleMap) { - if (getActivity() == null) - return; - - this.googleMap = googleMap; - - if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && - ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - // TODO: Consider calling ActivityCompat#requestPermissions - // to request the missing permissions, and then overriding - // public void onRequestPermissionsResult(int requestCode, String[] permissions, - // int[] grantResults) - // to handle the case where the user grants the permission. See the documentation - // for ActivityCompat#requestPermissions for more details. - Log.e("XX", "##################### can't make the right permissions"); - return; - } - - googleMap.getUiSettings().setMyLocationButtonEnabled(true); - googleMap.getUiSettings().setMapToolbarEnabled(false); - googleMap.setMyLocationEnabled(true); - googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); - googleMap.setOnMarkerClickListener(this); - } -} -- GitLab