1823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang/* 2823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * Copyright (C) 2008 The Android Open Source Project 3823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * 4823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * you may not use this file except in compliance with the License. 6823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * You may obtain a copy of the License at 7823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * 8823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * http://www.apache.org/licenses/LICENSE-2.0 9823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * 10823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * Unless required by applicable law or agreed to in writing, software 11823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * distributed under the License is distributed on an "AS IS" BASIS, 12823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * See the License for the specific language governing permissions and 14823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * limitations under the License. 15823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang */ 16823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 17823b6f3516076b92f78c3fc27037d24bb514e653Ying Wangpackage com.android.common; 18823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 19823b6f3516076b92f78c3fc27037d24bb514e653Ying Wangimport android.text.InputFilter; 20823b6f3516076b92f78c3fc27037d24bb514e653Ying Wangimport android.text.Spanned; 21823b6f3516076b92f78c3fc27037d24bb514e653Ying Wangimport android.text.SpannableStringBuilder; 22823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 23823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang/** 24823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * Implements special address cleanup rules: 25823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * The first space key entry following an "@" symbol that is followed by any combination 26823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * of letters and symbols, including one+ dots and zero commas, should insert an extra 27823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * comma (followed by the space). 28823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * 29823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang * @hide 30823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang */ 31823b6f3516076b92f78c3fc27037d24bb514e653Ying Wangpublic class Rfc822InputFilter implements InputFilter { 32823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 33823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang public CharSequence filter(CharSequence source, int start, int end, Spanned dest, 34823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang int dstart, int dend) { 35823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 36823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // quick check - did they enter a single space? 37823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang if (end-start != 1 || source.charAt(start) != ' ') { 38823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang return null; 39823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } 40823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 41823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // determine if the characters before the new space fit the pattern 42823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // follow backwards and see if we find a comma, dot, or @ 43823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang int scanBack = dstart; 44823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang boolean dotFound = false; 45823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang while (scanBack > 0) { 46823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang char c = dest.charAt(--scanBack); 47823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang switch (c) { 48823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang case '.': 49823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang dotFound = true; // one or more dots are req'd 50823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang break; 51823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang case ',': 52823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang return null; 53823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang case '@': 54823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang if (!dotFound) { 55823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang return null; 56823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } 57823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // we have found a comma-insert case. now just do it 58823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // in the least expensive way we can. 59823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang if (source instanceof Spanned) { 60823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang SpannableStringBuilder sb = new SpannableStringBuilder(","); 61823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang sb.append(source); 62823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang return sb; 63823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } else { 64823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang return ", "; 65823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } 66823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang default: 67823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // just keep going 68823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } 69823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } 70823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang 71823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang // no termination cases were found, so don't edit the input 72823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang return null; 73823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang } 74823b6f3516076b92f78c3fc27037d24bb514e653Ying Wang} 75