/* * Tencent is pleased to support the open source community by making * Tencent GT (Version 2.4 and subsequent versions) available. * * Notwithstanding anything to the contrary herein, any previous version * of Tencent GT shall not be subject to the license hereunder. * All right, title, and interest, including all intellectual property rights, * in and to the previous version of Tencent GT (including any and all copies thereof) * shall be owned and retained by Tencent and subject to the license under the * Tencent GT End User License Agreement (http://gt.qq.com/wp-content/EULA_EN.html). * * Copyright (C) 2015 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the MIT License (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://opensource.org/licenses/MIT * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ package com.tencent.wstt.gt.manager; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import android.util.SparseArray; import com.tencent.wstt.gt.InPara; public class DefaultInParaManager implements IInParaManager { // 入参缓存容器 protected LinkedHashMap<String, InPara> inParaMap = new LinkedHashMap<String, InPara>(); // 保存UI对入参的显示序列 protected SparseArray<InPara> sortedInParas = new SparseArray<InPara>(); // 按sortedInParas顺序保存的列表,弥补SparseArray无法getAll的缺陷 protected LinkedList<InPara> sortedInParaList = new LinkedList<InPara>(); // 所属客户端 protected Client client; public DefaultInParaManager(Client client) { this.client = client; } @Override public void register(String paraName, String alias, String defaultValue, String... optionalValues) { if (alias.length() > 4) { alias = alias.substring(0, 3) + "."; } InPara para = new InPara(); para.setKey(paraName); para.setAlias(alias); para.setClient(client.getKey()); List<String> vals = new ArrayList<String>(); vals.add(defaultValue); for (String ov : optionalValues) { vals.add(ov); } para.setValues(vals); para.setDisplayProperty(InPara.DISPLAY_NORMAL); synchronized (inParaMap) { if (checkInParaAvilable(para)) { inParaMap.put(paraName, para); sortedInParas.put(sortedInParas.size(), para); sortedInParaList.add(para); } } } /** * 由客户端首次注册,直接入缓存 * @param para */ @Override public void register(InPara para) { /* * 只有当悬浮框出参为空时,才会更新悬浮框,这样有已关注参数时,新来的AC参数不会打扰用户 * 此时后来的参数应该主动设置为非AC状态,否则在将AC参数都拖下去后,后来的AC参数会立即 * 增补到悬浮框上,而参数列表不同步,会比较怪异 */ synchronized (inParaMap) { if (para != null && null != para.getKey() && !contains(para.getKey())) { para.setClient(client.getKey()); inParaMap.put(para.getKey(), para); sortedInParas.put(sortedInParas.size(), para); sortedInParaList.add(para); // 悬浮窗需要立即反应,所以如果是AC参数立即更新UI列表 IpUIManager.addItemToAC(para); } } } @Override public void removeOutPara(String paraName){ synchronized (inParaMap) { InPara para = inParaMap.remove(paraName); int position = sortedInParas.indexOfValue(para); if (position > 0) { sortedInParas.remove(sortedInParas.keyAt(position)); sortedInParaList.remove(para); } if( null != IpUIManager.list_ip && IpUIManager.list_ip.contains(para)){ IpUIManager.list_ip.remove(para); } } } private boolean checkInParaAvilable(InPara inPara) { String key = inPara.getKey(); boolean result = true; if (null != inParaMap.get(key)) { result = false; } return result; } private boolean contains(String paraName) { return getInPara(paraName) == null ? false : true; } @Override public void clear() { synchronized (inParaMap) { List<InPara> tmpList = getAll(); inParaMap.clear(); sortedInParas.clear(); sortedInParaList.clear(); for (InPara para : tmpList) { IpUIManager.list_ip.remove(para); } } } @Override public boolean isEmpty() { synchronized (inParaMap) { return inParaMap.isEmpty(); } } @Override public List<InPara> getAll() { List<InPara> result = new ArrayList<InPara>(); result.addAll(sortedInParaList); // 考虑下直接返回sortedInParaList有无风险 return result; } @Override public InPara getInPara(int positon) { return sortedInParas.get(positon); } public InPara getInPara(String paraName) { return inParaMap.get(paraName); } @Override public String getInPara(String paraName, String origVal) { InPara iv = inParaMap.get(paraName); String value = origVal; if (null != iv) { List<String> vals = iv.getValues(); value = vals.get(0); } return value; } @Override public boolean getInPara(String paraName, boolean origVal) { InPara iv = inParaMap.get(paraName); boolean value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "boolean")) { value = Boolean.parseBoolean(val); } } return value; } @Override public int getInPara(String paraName, int origVal) { InPara iv = inParaMap.get(paraName); int value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "int")) { value = Integer.parseInt(val); } } return value; } @Override public float getInPara(String paraName, float origVal) { InPara iv = inParaMap.get(paraName); float value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "float")) { value = Float.parseFloat(val); } } return value; } @Override public double getInPara(String paraName, double origVal) { InPara iv = inParaMap.get(paraName); double value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "double")) { value = Double.parseDouble(val); } } return value; } @Override public short getInPara(String paraName, short origVal) { InPara iv = inParaMap.get(paraName); short value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "short")) { value = Short.parseShort(val); } } return value; } @Override public byte getInPara(String paraName, byte origVal) { InPara iv = inParaMap.get(paraName); byte value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "byte")) { value = Byte.parseByte(val); } } return value; } @Override public long getInPara(String paraName, long origVal) { InPara iv = inParaMap.get(paraName); long value = origVal; if (null != iv) { List<String> vals = iv.getValues(); String val = vals.get(0); if (matchInParaType(val, "long")) { value = Long.parseLong(val); } } return value; } private static boolean matchInParaType(String str, String type) { boolean result = false; if (type.equals("int")) { result = determineInParaType(str, 0); } if (type.equals("boolean")) { result = determineInParaType(str, 1); } if (type.equals("long")) { result = determineInParaType(str, 2); } if (type.equals("double")) { result = determineInParaType(str, 3); } if (type.equals("float")) { result = determineInParaType(str, 4); } if (type.equals("short")) { result = determineInParaType(str, 5); } if (type.equals("byte")) { result = determineInParaType(str, 6); } return result; } private static boolean determineInParaType(String str, int type) { boolean result = true; switch (type) { case 0: char[] cs = str.toCharArray(); for (int i = 0; i < cs.length; i++) { int ascii = (int) cs[i]; if (ascii < 48 || ascii > 57) { result = false; break; } } break; case 1: if (!str.equals("true") && !str.equals("false")) { result = false; } break; case 2: char[] cs_long = str.toCharArray(); for (int i = 0; i < cs_long.length; i++) { int ascii = (int) cs_long[i]; if (ascii < 48 || ascii > 57) { result = false; break; } } break; case 3: char[] cs_double = str.toCharArray(); for (int i = 0; i < cs_double.length; i++) { int ascii = (int) cs_double[i]; if (ascii < 48 || ascii > 57) { result = false; break; } } break; case 4: char[] cs_float = str.toCharArray(); for (int i = 0; i < cs_float.length; i++) { int ascii = (int) cs_float[i]; if (ascii < 48 || ascii > 57) { result = false; break; } } break; case 5: char[] cs_short = str.toCharArray(); for (int i = 0; i < cs_short.length; i++) { int ascii = (int) cs_short[i]; if (ascii < 48 || ascii > 57) { result = false; break; } } break; case 6: char[] cs_byte = str.toCharArray(); for (int i = 0; i < cs_byte.length; i++) { int ascii = (int) cs_byte[i]; if (ascii < 48 || ascii > 57) { result = false; break; } } break; } return result; } }