package roman10.tutorial.inlineanimation;
import java.util.ArrayList;
import java.util.UUID;
import roman10.tutorial.bitmap.SimpleImageMemCache;
import roman10.tutorial.frameanimation.AnimationAssetsSet;
import roman10.tutorial.frameanimation.AnimationSettings;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MyTextView extends TextView {
// private String mId = UUID.randomUUID().toString();
private SpannableStringBuilder mSb = new SpannableStringBuilder();
private String dummyText = "dummy " + System.currentTimeMillis();
private Context mContext;
private SimpleImageMemCache mImageCache;
private ArrayList<AnimatedImageSpan> mAnimatedImages = new ArrayList<AnimatedImageSpan>();
// public String getUID() {
// return mId;
// }
public MyTextView(Context context) {
super(context);
mContext = context;
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
}
public void setImageCache(SimpleImageMemCache pImageCache) {
mImageCache = pImageCache;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Log.d(this.getClass().getName(), "onDetachedFromWindow ");
for (AnimatedImageSpan ais : mAnimatedImages) {
Log.d(this.getClass().getName(), "animation playing " + ais.isPlaying());
if (ais.isPlaying()) {
ais.stopRendering();
}
}
mAnimatedImages.clear();
mSb.clearSpans();
mSb.clear();
}
public void appendText(String pStr) {
mSb.append(pStr);
}
public void appendAnimation(AnimationAssetsSet pAsset, AnimationSettings pSettings) {
mSb.append(dummyText);
AnimatedImageSpan ais = new AnimatedImageSpan(mContext);
ais.setImageCache(mImageCache);
ais.setAnimationAssets(pAsset);
mSb.setSpan(ais, mSb.length() - dummyText.length(), mSb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
AnimationClickableSpan clickSpan = new AnimationClickableSpan(this, ais, pSettings);
// Log.d(this.getClass().getName(), "clickSpan " + clickSpan.mlUUID);
mSb.setSpan(clickSpan, mSb.length() - dummyText.length(), mSb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mAnimatedImages.add(ais);
}
public void finishAddingContent() {
this.setText(mSb);
this.setMovementMethod(LinkMovementMethod.getInstance());
}
private static class AnimationClickableSpan extends ClickableSpan {
AnimatedImageSpan mAnimatedImage;
AnimationSettings mSettings;
AnimatedImageUpdateHandler mHandler;
// String mlUUID;
AnimationClickableSpan(MyTextView pView, AnimatedImageSpan pSpan, AnimationSettings pSettings) {
mAnimatedImage = pSpan;
mSettings = pSettings;
mHandler = new AnimatedImageUpdateHandler(pView);
// mlUUID = UUID.randomUUID().toString();
// Logger.d(this, "listener " + mHandler.getId() + " created using view " + pView.getUID() + ":" + pView.getId());
}
@Override
public void onClick(View widget) {
MyTextView view = (MyTextView) widget;
// Log.d(this.getClass().getName(), "animation clicked " + view.getUID() + " triggered by spannable :" + mlUUID);
if (mAnimatedImage.isPlaying()) {
mAnimatedImage.stopRendering();
} else {
mAnimatedImage.playGif(mSettings, mHandler);
}
}
}
}