17ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen/* 27ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Copyright (C) 2015 The Android Open Source Project 37ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * 47ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Licensed under the Apache License, Version 2.0 (the "License"); 57ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * you may not use this file except in compliance with the License. 67ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * You may obtain a copy of the License at 77ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * 87ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * http://www.apache.org/licenses/LICENSE-2.0 97ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * 107ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Unless required by applicable law or agreed to in writing, software 117ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * distributed under the License is distributed on an "AS IS" BASIS, 127ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * See the License for the specific language governing permissions and 147ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * limitations under the License 157ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen */ 167ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenpackage com.android.phone.vvm.omtp.sms; 177ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 187ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport android.text.TextUtils; 197ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport android.util.ArrayMap; 207ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport android.util.Log; 217ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 227ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport com.android.phone.vvm.omtp.OmtpConstants; 237ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 247ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport java.text.ParseException; 257ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport java.text.SimpleDateFormat; 267ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport java.util.Locale; 277ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenimport java.util.Map; 287ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 297ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen/** 307ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Class wrapping the raw OMTP message data, internally represented as as map of all key-value pairs 317ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * found in the SMS body. 327ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * <p> 337ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Provides convenience methods to extract parse fields of different types. 347ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * <p> 357ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * All the methods return null if either the field was not present or it could not be parsed. 367ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen */ 377ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chenpublic class WrappedMessageData { 387ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen private final String TAG = "WrappedMessageData"; 397ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen private final String mPrefix; 407ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen private final Map<String, String> mFields; 417ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 427ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen @Override 437ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen public String toString() { 447ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return "WrappedMessageData [mFields=" + mFields + "]"; 457ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 467ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 477ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen WrappedMessageData(String prefix, Map<String, String> keyValues) { 487ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen mPrefix = prefix; 497ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen mFields = new ArrayMap<String, String>(); 507ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen mFields.putAll(keyValues); 517ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 527ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 537ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen /** 547ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @return The String prefix of the message, designating whether this is the message data of a 557ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * STATUS or SYNC sms. 567ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen */ 577ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen String getPrefix() { 587ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return mPrefix; 597ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 607ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 617ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen /** 627ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Extracts the requested field from underlying data and returns the String value as is. 637ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * 647ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @param field The requested field. 657ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @return the parsed string value, or null if the field was not present or not valid. 667ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen */ 677ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen String extractString(final String field) { 687ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen String value = mFields.get(field); 6916080bf86eb0c42308b5fe767a69453358abb556Nancy Chen if (value == null) { 7016080bf86eb0c42308b5fe767a69453358abb556Nancy Chen return null; 7116080bf86eb0c42308b5fe767a69453358abb556Nancy Chen } 7216080bf86eb0c42308b5fe767a69453358abb556Nancy Chen 737ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen String[] possibleValues = OmtpConstants.possibleValuesMap.get(field); 747ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen if (possibleValues == null) { 757ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return value; 767ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 777ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen for (int i = 0; i < possibleValues.length; i++) { 787ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen if (TextUtils.equals(value, possibleValues[i])) { 797ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return value; 807ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 817ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 827ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen Log.e(TAG, "extractString - value \"" + value + 837ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen "\" of field \"" + field + "\" is not allowed."); 847ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return null; 857ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 867ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 877ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen /** 887ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Extracts the requested field from underlying data and parses it as an {@link Integer}. 897ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * 907ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @param field The requested field. 917ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @return the parsed integer value, or null if the field was not present. 927ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen */ 937ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen Integer extractInteger(final String field) { 947ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen String value = mFields.get(field); 957ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen if (value == null) { 967ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return null; 977ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 987ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 997ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen try { 1007ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return Integer.decode(value); 1017ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } catch (NumberFormatException e) { 1027ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen Log.e(TAG, "extractInteger - could not parse integer: " + value); 1037ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return null; 1047ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 1057ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 1067ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 1077ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen /** 1087ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * Extracts the requested field from underlying data and parses it as a date/time represented in 1097ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * {@link OmtpConstants#DATE_TIME_FORMAT} format. 1107ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * 1117ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @param field The requested field. 1127ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen * @return the parsed string value, or null if the field was not present. 1137ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen */ 1147ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen Long extractTime(final String field) { 1157ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen String value = mFields.get(field); 1167ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen if (value == null) { 1177ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return null; 1187ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 1197ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen 1207ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen try { 1217ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return new SimpleDateFormat( 1227ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen OmtpConstants.DATE_TIME_FORMAT, Locale.US).parse(value).getTime(); 1237ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } catch (ParseException e) { 1247ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen Log.e(TAG, "extractTime - could not parse time: " + value); 1257ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen return null; 1267ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 1277ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen } 1287ab73ace1a04f8feffc6fa8d271148dd930f197fNancy Chen}