package org.wikipedia.views; import android.graphics.drawable.Drawable; import android.os.Handler; import android.support.annotation.NonNull; import android.view.View; /** * A {@link Drawable.Callback} for any {@link Drawable} on any {@link View}. * {@link View#verifyDrawable} does not permit callbacks on unknown {@link Drawable}s so this * wrapper invokes the {@link View}'s {@link Handler} directly when available, or its own handler * otherwise. */ public class AlienDrawableCallback implements Drawable.Callback { @NonNull private final Handler handler; @NonNull private final View view; public AlienDrawableCallback(@NonNull View view) { handler = view.getHandler() == null ? new Handler() : view.getHandler(); this.view = view; } @Override public void invalidateDrawable(Drawable who) { // view.invalidate(who.getDirtyBounds()) would be more efficient but it doesn't seem to // be practical to obtain the relative coordinates of the Drawable. view.invalidate(); } @Override public void scheduleDrawable(Drawable who, Runnable what, long when) { handler.postAtTime(what, when); } @Override public void unscheduleDrawable(Drawable who, Runnable what) { handler.removeCallbacks(what); } }