package org.getlantern.firetweet.view;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.text.SpannableString;
import android.util.AttributeSet;
import android.view.MotionEvent;
import org.getlantern.firetweet.view.iface.IExtendedView;
import org.getlantern.firetweet.view.themed.ThemedTextView;
public class StatusTextView extends ThemedTextView implements IExtendedView {
private TouchInterceptor mTouchInterceptor;
private OnSizeChangedListener mOnSizeChangedListener;
private OnSelectionChangeListener mOnSelectionChangeListener;
private OnFitSystemWindowsListener mOnFitSystemWindowsListener;
public StatusTextView(final Context context) {
super(context);
}
public StatusTextView(final Context context, final AttributeSet attrs) {
super(context, attrs);
}
public StatusTextView(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) {
mOnFitSystemWindowsListener = listener;
}
@Override
public final void setOnSizeChangedListener(final OnSizeChangedListener listener) {
mOnSizeChangedListener = listener;
}
@Override
public final void setTouchInterceptor(final TouchInterceptor listener) {
mTouchInterceptor = listener;
}
public void setOnSelectionChangeListener(final OnSelectionChangeListener l) {
mOnSelectionChangeListener = l;
}
@Override
protected boolean fitSystemWindows(@NonNull Rect insets) {
if (mOnFitSystemWindowsListener != null) {
mOnFitSystemWindowsListener.onFitSystemWindows(insets);
}
return super.fitSystemWindows(insets);
}
@Override
public final boolean dispatchTouchEvent(@NonNull final MotionEvent event) {
if (mTouchInterceptor != null) {
final boolean ret = mTouchInterceptor.dispatchTouchEvent(this, event);
if (ret) return true;
}
return super.dispatchTouchEvent(event);
}
@Override
protected final void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mOnSizeChangedListener != null) {
mOnSizeChangedListener.onSizeChanged(this, w, h, oldw, oldh);
}
}
@Override
protected void onSelectionChanged(final int selStart, final int selEnd) {
super.onSelectionChanged(selStart, selEnd);
if (mOnSelectionChangeListener != null) {
mOnSelectionChangeListener.onSelectionChanged(selStart, selEnd);
}
}
@Override
public void setText(CharSequence text, BufferType type) {
if (text == null) {
super.setText(null, type);
return;
}
super.setText(new SafeSpannableStringWrapper(text), type);
}
private static class SafeSpannableStringWrapper extends SpannableString {
public SafeSpannableStringWrapper(CharSequence source) {
super(source);
}
@Override
public void setSpan(Object what, int start, int end, int flags) {
if (start < 0 || end < 0) {
// Silently ignore
return;
}
super.setSpan(what, start, end, flags);
}
}
@Override
public final boolean onTouchEvent(@NonNull final MotionEvent event) {
if (mTouchInterceptor != null) {
final boolean ret = mTouchInterceptor.onTouchEvent(this, event);
if (ret) return true;
}
return super.onTouchEvent(event);
}
public interface OnSelectionChangeListener {
void onSelectionChanged(int selStart, int selEnd);
}
}