From 24ff73ab0688e9512b28f76a5dc537e595b3bc56 Mon Sep 17 00:00:00 2001 From: Peter Storch Date: Thu, 27 Aug 2020 08:11:10 +0200 Subject: [PATCH] Fix force close on stop button for older devices (#393) * correct thread handling in ButtonDelay Discovered in #390 for devices with API Level 25. Not fixing the whole issue, but a first step. * fix #390 crash when stopping for older devices The VectorDrawable ic_button_stop.xml referenced from withing the AnimatedVectorDrawable ic_button_stop_anim.xml was a problem for older devices. Now the VectorDrawable is expanded (duplicated) inside the AnimatedVectorDrawable. Now it is working. Even with the animation. --- .../opentracks/TrackController.java | 25 +++++++++---- src/main/res/drawable/ic_button_stop_anim.xml | 37 ++++++++++++++++++- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/TrackController.java b/src/main/java/de/dennisguse/opentracks/TrackController.java index 877b19fea..2825f9c11 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackController.java +++ b/src/main/java/de/dennisguse/opentracks/TrackController.java @@ -19,6 +19,7 @@ package de.dennisguse.opentracks; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.drawable.AnimatedVectorDrawable; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.view.Gravity; import android.view.MotionEvent; @@ -28,6 +29,8 @@ import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; +import androidx.core.content.ContextCompat; + import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.services.TrackRecordingServiceInterface; import de.dennisguse.opentracks.util.ActivityUtils; @@ -134,7 +137,7 @@ public class TrackController { private final Activity activity; private final OnClickListener clickListener; private final int delayMillis; - private final AnimatedVectorDrawable animatedDrawable; + private final Drawable drawable; private final int delayMessageId; private ButtonDelay(final Activity activity, final ImageButton imageButton, final int animDrawableId, final int delayMessageId, final OnClickListener clickListener) { @@ -142,24 +145,30 @@ public class TrackController { this.clickListener = clickListener; this.delayMillis = activity.getResources().getInteger(R.integer.buttonDelayMillis); this.imageButton = imageButton; - this.animatedDrawable = (AnimatedVectorDrawable) activity.getDrawable(animDrawableId); + this.drawable = ContextCompat.getDrawable(activity, animDrawableId); this.delayMessageId = delayMessageId; } @Override public void run() { - imageButton.setImageDrawable(animatedDrawable); - activity.runOnUiThread(animatedDrawable::start); + activity.runOnUiThread(()->{ + imageButton.setImageDrawable(drawable); + if (drawable instanceof AnimatedVectorDrawable) { + ((AnimatedVectorDrawable) drawable).start(); + } + ActivityUtils.vibrate(activity, 150); + ActivityUtils.toast(activity, delayMessageId, Toast.LENGTH_SHORT, Gravity.TOP); + }); - ActivityUtils.vibrate(activity, 150); - activity.runOnUiThread(()-> ActivityUtils.toast(activity, delayMessageId, Toast.LENGTH_SHORT, Gravity.TOP)); try { Thread.sleep(delayMillis); } catch (InterruptedException ignored) { } if (!canceled) { - activity.runOnUiThread(()-> clickListener.onClick(null)); - ActivityUtils.vibrate(activity, 1000); + activity.runOnUiThread(()-> { + clickListener.onClick(null); + ActivityUtils.vibrate(activity, 1000); + }); } } } diff --git a/src/main/res/drawable/ic_button_stop_anim.xml b/src/main/res/drawable/ic_button_stop_anim.xml index a389c2136..be687f36e 100644 --- a/src/main/res/drawable/ic_button_stop_anim.xml +++ b/src/main/res/drawable/ic_button_stop_anim.xml @@ -1,5 +1,40 @@ + xmlns:aapt="http://schemas.android.com/aapt"> + + + + + + + + +