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}