diff --git a/app/src/main/java/de/storchp/opentracks/osmplugin/MapsActivity.java b/app/src/main/java/de/storchp/opentracks/osmplugin/MapsActivity.java index 6134591a..e3dc9c4e 100644 --- a/app/src/main/java/de/storchp/opentracks/osmplugin/MapsActivity.java +++ b/app/src/main/java/de/storchp/opentracks/osmplugin/MapsActivity.java @@ -4,7 +4,6 @@ import android.content.Intent; import android.database.ContentObserver; import android.database.Cursor; -import android.hardware.SensorManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -14,7 +13,6 @@ import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; -import android.widget.ImageView; import android.widget.Toast; import androidx.appcompat.widget.Toolbar; @@ -56,7 +54,7 @@ import de.storchp.opentracks.osmplugin.dashboardapi.APIConstants; import de.storchp.opentracks.osmplugin.dashboardapi.TrackpointsColumn; import de.storchp.opentracks.osmplugin.dashboardapi.TracksColumn; -import de.storchp.opentracks.osmplugin.maps.CompassListener; +import de.storchp.opentracks.osmplugin.maps.CompassView; import de.storchp.opentracks.osmplugin.maps.MapsforgeMapView; import de.storchp.opentracks.osmplugin.maps.StyleColorCreator; import de.storchp.opentracks.osmplugin.maps.utils.PreferencesUtils; @@ -83,7 +81,6 @@ public class MapsActivity extends BaseActivity { private StyleColorCreator colorCreator = null; private LatLong startPos; private LatLong endPos; - private CompassListener compassListener; static Paint createPaint(int color, int strokeWidth, Style style) { Paint paint = AndroidGraphicFactory.INSTANCE.createPaint(); @@ -107,8 +104,6 @@ protected void onCreate(Bundle savedInstanceState) { Toolbar toolbar = findViewById(R.id.maps_toolbar); setSupportActionBar(toolbar); - compassListener = new CompassListener((SensorManager) getSystemService(SENSOR_SERVICE), (ImageView) findViewById(R.id.compass)); - createMapViews(); createTileCaches(); createLayers(); @@ -438,7 +433,6 @@ public void onResume() { if (this.layer instanceof TileDownloadLayer) { ((TileDownloadLayer) this.layer).onResume(); } - compassListener.onResume(); } @Override @@ -460,7 +454,6 @@ protected void onPause() { if (this.layer instanceof TileDownloadLayer) { ((TileDownloadLayer) this.layer).onPause(); } - compassListener.onPause(); super.onPause(); } diff --git a/app/src/main/java/de/storchp/opentracks/osmplugin/maps/CompassListener.java b/app/src/main/java/de/storchp/opentracks/osmplugin/maps/CompassView.java similarity index 77% rename from app/src/main/java/de/storchp/opentracks/osmplugin/maps/CompassListener.java rename to app/src/main/java/de/storchp/opentracks/osmplugin/maps/CompassView.java index 8c62419e..e22a27d8 100644 --- a/app/src/main/java/de/storchp/opentracks/osmplugin/maps/CompassListener.java +++ b/app/src/main/java/de/storchp/opentracks/osmplugin/maps/CompassView.java @@ -1,14 +1,19 @@ package de.storchp.opentracks.osmplugin.maps; +import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.util.AttributeSet; import android.view.animation.Animation; import android.view.animation.RotateAnimation; -import android.widget.ImageView; -public class CompassListener implements SensorEventListener { +import androidx.annotation.Nullable; + +import static android.content.Context.SENSOR_SERVICE; + +public class CompassView extends androidx.appcompat.widget.AppCompatImageView implements SensorEventListener { private SensorManager sensorManager; private final float[] accelerometerReading = new float[3]; @@ -17,17 +22,33 @@ public class CompassListener implements SensorEventListener { private boolean lastMagnetometerSet = false; private final float[] rotationMatrix = new float[9]; private final float[] orientationAngles = new float[3]; - private ImageView compassView; private int lastDegreePos = -1; private float[] lastDegrees = new float[5]; private float currentDegree = 0; - public CompassListener(SensorManager sensorManager, ImageView compassView) { - this.sensorManager = sensorManager; - this.compassView = compassView; + public CompassView(Context context) { + super(context); + createSensorManager(context); + } + + public CompassView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + createSensorManager(context); + } + + public CompassView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + createSensorManager(context); } - public void onResume() { + private void createSensorManager(Context context) { + this.sensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { sensorManager.registerListener(this, accelerometer, @@ -40,8 +61,10 @@ public void onResume() { } } - public void onPause() { + @Override + protected void onDetachedFromWindow() { sensorManager.unregisterListener(this); + super.onDetachedFromWindow(); } @Override @@ -56,7 +79,7 @@ public void onSensorChanged(SensorEvent event) { lastMagnetometerSet = true; } - if (lastAccelerometerSet && lastMagnetometerSet && compassView != null) { + if (lastAccelerometerSet && lastMagnetometerSet) { SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); SensorManager.getOrientation(rotationMatrix, orientationAngles); float azimuthInRadians = orientationAngles[0]; @@ -84,7 +107,7 @@ public void onSensorChanged(SensorEvent event) { ra.setFillAfter(true); // Start the animation - compassView.startAnimation(ra); + startAnimation(ra); currentDegree = newDegree; } } diff --git a/app/src/main/res/layout/mapviewer.xml b/app/src/main/res/layout/mapviewer.xml index 74ce47b8..587dfb01 100644 --- a/app/src/main/res/layout/mapviewer.xml +++ b/app/src/main/res/layout/mapviewer.xml @@ -23,7 +23,7 @@ android:textColor="#000" android:textSize="@dimen/attribution_size" /> -