diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index d60ffeb749..7766844fc8 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -20,6 +20,7 @@ package eu.faircode.email; */ import android.Manifest; +import android.animation.Animator; import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; @@ -809,6 +810,7 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc for (Field field : f.getClass().getDeclaredFields()) { Class type = field.getType(); if (View.class.isAssignableFrom(type) || + Animator.class.isAssignableFrom(type) || RecyclerView.Adapter.class.isAssignableFrom(type)) { Log.i("Clearing " + f.getClass().getSimpleName() + ":" + field.getName()); field.setAccessible(true); diff --git a/app/src/main/java/eu/faircode/email/FragmentAccounts.java b/app/src/main/java/eu/faircode/email/FragmentAccounts.java index 4d6d230406..b3802db090 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccounts.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccounts.java @@ -330,11 +330,11 @@ public class FragmentAccounts extends FragmentBase { if (accounts.size() == 0) { fab.setCustomSize(Helper.dp2pixels(context, 2 * 56)); - if (!animator.isStarted()) + if (animator != null && !animator.isStarted()) animator.start(); } else { fab.clearCustomSize(); - if (animator.isStarted()) + if (animator != null && animator.isStarted()) animator.end(); } } diff --git a/app/src/main/java/eu/faircode/email/FragmentIdentities.java b/app/src/main/java/eu/faircode/email/FragmentIdentities.java index b4a3fc5b95..ef155c64a4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentIdentities.java +++ b/app/src/main/java/eu/faircode/email/FragmentIdentities.java @@ -211,11 +211,11 @@ public class FragmentIdentities extends FragmentBase { if (identities.size() == 0) { fab.setCustomSize(Helper.dp2pixels(context, 2 * 56)); - if (!animator.isStarted()) + if (animator != null && !animator.isStarted()) animator.start(); } else { fab.clearCustomSize(); - if (animator.isStarted()) + if (animator != null && animator.isStarted()) animator.end(); } } diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index e71e942961..ed0dc4156b 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1446,16 +1446,16 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. criteria.with_notes || criteria.with_types != null) { fabSearch.hide(); - if (animator.isStarted()) + if (animator != null && animator.isStarted()) animator.end(); } else { fabSearch.show(); - if (!animator.isStarted()) + if (animator != null && !animator.isStarted()) animator.start(); } } else { fabSearch.hide(); - if (animator.isStarted()) + if (animator != null && animator.isStarted()) animator.end(); } diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index e297dd814b..78cf8f70f9 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -640,11 +640,7 @@ public class Helper { } static ObjectAnimator getFabAnimator(View fab, LifecycleOwner owner) { - ObjectAnimator animator = ObjectAnimator.ofFloat(fab, "alpha", 0.9f, 1.0f); - animator.setDuration(750L); - animator.setRepeatCount(ValueAnimator.INFINITE); - animator.setRepeatMode(ValueAnimator.REVERSE); - animator.addUpdateListener(new ObjectAnimator.AnimatorUpdateListener() { + ObjectAnimator.AnimatorUpdateListener listener = new ObjectAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { if (!owner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) @@ -652,7 +648,27 @@ public class Helper { fab.setScaleX((float) animation.getAnimatedValue()); fab.setScaleY((float) animation.getAnimatedValue()); } + }; + + ObjectAnimator animator = ObjectAnimator.ofFloat(fab, "alpha", 0.9f, 1.0f); + animator.setDuration(750L); + animator.setRepeatCount(ValueAnimator.INFINITE); + animator.setRepeatMode(ValueAnimator.REVERSE); + animator.addUpdateListener(listener); + + owner.getLifecycle().addObserver(new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + public void onDestroyed() { + try { + animator.removeUpdateListener(listener); + fab.setAlpha(1.0f); + owner.getLifecycle().removeObserver(this); + } catch (Throwable ex) { + Log.e(ex); + } + } }); + return animator; }