Home | History | Annotate | Download | only in sms
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 package com.android.phone.vvm.omtp.sms;
     17 
     18 import android.text.TextUtils;
     19 import android.util.ArrayMap;
     20 import android.util.Log;
     21 
     22 import com.android.phone.vvm.omtp.OmtpConstants;
     23 
     24 import java.text.ParseException;
     25 import java.text.SimpleDateFormat;
     26 import java.util.Locale;
     27 import java.util.Map;
     28 
     29 /**
     30  * Class wrapping the raw OMTP message data, internally represented as as map of all key-value pairs
     31  * found in the SMS body.
     32  * <p>
     33  * Provides convenience methods to extract parse fields of different types.
     34  * <p>
     35  * All the methods return null if either the field was not present or it could not be parsed.
     36  */
     37 public class WrappedMessageData {
     38     private final String TAG = "WrappedMessageData";
     39     private final String mPrefix;
     40     private final Map<String, String> mFields;
     41 
     42     @Override
     43     public String toString() {
     44         return "WrappedMessageData [mFields=" + mFields + "]";
     45     }
     46 
     47     WrappedMessageData(String prefix, Map<String, String> keyValues) {
     48         mPrefix = prefix;
     49         mFields = new ArrayMap<String, String>();
     50         mFields.putAll(keyValues);
     51     }
     52 
     53     /**
     54      * @return The String prefix of the message, designating whether this is the message data of a
     55      * STATUS or SYNC sms.
     56      */
     57     String getPrefix() {
     58         return mPrefix;
     59     }
     60 
     61     /**
     62      * Extracts the requested field from underlying data and returns the String value as is.
     63      *
     64      * @param field The requested field.
     65      * @return the parsed string value, or null if the field was not present or not valid.
     66      */
     67     String extractString(final String field) {
     68         String value = mFields.get(field);
     69         if (value == null) {
     70             return null;
     71         }
     72 
     73         String[] possibleValues = OmtpConstants.possibleValuesMap.get(field);
     74         if (possibleValues == null) {
     75             return value;
     76         }
     77         for (int i = 0; i < possibleValues.length; i++) {
     78             if (TextUtils.equals(value, possibleValues[i])) {
     79                 return value;
     80             }
     81         }
     82         Log.e(TAG, "extractString - value \"" + value +
     83                 "\" of field \"" + field + "\" is not allowed.");
     84         return null;
     85     }
     86 
     87     /**
     88      * Extracts the requested field from underlying data and parses it as an {@link Integer}.
     89      *
     90      * @param field The requested field.
     91      * @return the parsed integer value, or null if the field was not present.
     92      */
     93     Integer extractInteger(final String field) {
     94         String value = mFields.get(field);
     95         if (value == null) {
     96             return null;
     97         }
     98 
     99         try {
    100             return Integer.decode(value);
    101         } catch (NumberFormatException e) {
    102             Log.e(TAG, "extractInteger - could not parse integer: " + value);
    103             return null;
    104         }
    105     }
    106 
    107     /**
    108      * Extracts the requested field from underlying data and parses it as a date/time represented in
    109      * {@link OmtpConstants#DATE_TIME_FORMAT} format.
    110      *
    111      * @param field The requested field.
    112      * @return the parsed string value, or null if the field was not present.
    113      */
    114     Long extractTime(final String field) {
    115         String value = mFields.get(field);
    116         if (value == null) {
    117             return null;
    118         }
    119 
    120         try {
    121             return new SimpleDateFormat(
    122                     OmtpConstants.DATE_TIME_FORMAT, Locale.US).parse(value).getTime();
    123         } catch (ParseException e) {
    124             Log.e(TAG, "extractTime - could not parse time: " + value);
    125             return null;
    126         }
    127     }
    128 }