package im.actor.sdk.controllers.conversation.inputbar; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.widget.EditText; import java.util.concurrent.CopyOnWriteArrayList; public class BarEditText extends EditText { public interface OnSelectionChangedListener { void onSelectionChanged(int start, int length); } private CopyOnWriteArrayList<OnSelectionChangedListener> listeners = new CopyOnWriteArrayList<>(); public BarEditText(Context context) { super(context); } public BarEditText(Context context, AttributeSet attrs) { super(context, attrs); } public BarEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public BarEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onSelectionChanged(int selStart, int selEnd) { super.onSelectionChanged(selStart, selEnd); // Constructor automatically calls it before our constructor is called if (listeners != null) { for (OnSelectionChangedListener l : listeners) { l.onSelectionChanged(selStart, selStart - selEnd); } } } public void addSelectionListener(OnSelectionChangedListener listener) { if (!listeners.contains(listener)) { listeners.add(listener); } } public void removeSelectionListener(OnSelectionChangedListener listener) { listeners.remove(listener); } }