package com.artfulbits.ui; import android.text.Editable; import android.text.TextWatcher; import java.text.ParseException; /** * Mask editor. Watcher that keeps user input following specified mask.<br/> * <br/> * Reference:<br/> * <a href="http://horribileru.blogspot.com/2011/12/textedit.html">Masked editor</a> */ public class MaskedWatcher implements TextWatcher { // #region Members private String mMask; private String mResult = ""; // #endregion // #region Constructors public MaskedWatcher(String mask) { mMask = mask; } // #endregion // #region Overrides /** {@inheritDoc} */ @Override public void afterTextChanged(Editable s) { String mask = mMask; String value = s.toString(); if (value.equals(mResult)) return; try { // prepare the formatter MaskedFormatter formatter = new MaskedFormatter(mask); formatter.setValueContainsLiteralCharacters(false); formatter.setPlaceholderCharacter((char) 1); // get a string with applied mask and placeholder chars value = formatter.valueToString(value); try { // find first placeholder value = value.substring(0, value.indexOf((char) 1)); // process a mask char if (value.charAt(value.length() - 1) == mask.charAt(value.length() - 1)) { value = value.substring(0, value.length() - 1); } } catch (Exception e) { } mResult = value; s.replace(0, s.length(), value); } catch (ParseException e) { // the entered value does not match a mask int offset = e.getErrorOffset(); value = removeCharAt(value, offset); s.replace(0, s.length(), value); } } /** {@inheritDoc} */ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // do nothing } /** {@inheritDoc} */ @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // do nothing } // #endregion // #region Public methods public static String removeCharAt(final String s, int pos) { final StringBuffer buffer = new StringBuffer(s.length() - 1); buffer.append(s.substring(0, pos)).append(s.substring(pos + 1)); return buffer.toString(); } // #endregion }