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 */
16package com.android.voicemail.impl.sms;
17
18import android.os.Bundle;
19import android.support.annotation.Nullable;
20import com.android.voicemail.impl.NeededForTesting;
21import com.android.voicemail.impl.OmtpConstants;
22import java.text.ParseException;
23import java.text.SimpleDateFormat;
24import java.util.Locale;
25
26/**
27 * Structured data representation of an OMTP SYNC message.
28 *
29 * <p>Getters will return null if the field was not set in the message body or it could not be
30 * parsed.
31 */
32public class SyncMessage {
33  // Sync event that triggered this message.
34  private final String syncTriggerEvent;
35  // Total number of new messages on the server.
36  private final int newMessageCount;
37  // UID of the new message.
38  private final String messageId;
39  // Length of the message.
40  private final int messageLength;
41  // Content type (voice, video, fax...) of the new message.
42  private final String contentType;
43  // Sender of the new message.
44  private final String sender;
45  // Timestamp (in millis) of the new message.
46  private final long msgTimeMillis;
47
48  @Override
49  public String toString() {
50    return "SyncMessage [mSyncTriggerEvent="
51        + syncTriggerEvent
52        + ", mNewMessageCount="
53        + newMessageCount
54        + ", mMessageId="
55        + messageId
56        + ", mMessageLength="
57        + messageLength
58        + ", mContentType="
59        + contentType
60        + ", mSender="
61        + sender
62        + ", mMsgTimeMillis="
63        + msgTimeMillis
64        + "]";
65  }
66
67  public SyncMessage(Bundle wrappedData) {
68    syncTriggerEvent = getString(wrappedData, OmtpConstants.SYNC_TRIGGER_EVENT);
69    messageId = getString(wrappedData, OmtpConstants.MESSAGE_UID);
70    messageLength = getInt(wrappedData, OmtpConstants.MESSAGE_LENGTH);
71    contentType = getString(wrappedData, OmtpConstants.CONTENT_TYPE);
72    sender = getString(wrappedData, OmtpConstants.SENDER);
73    newMessageCount = getInt(wrappedData, OmtpConstants.NUM_MESSAGE_COUNT);
74    msgTimeMillis = parseTime(wrappedData.getString(OmtpConstants.TIME));
75  }
76
77  private static long parseTime(@Nullable String value) {
78    if (value == null) {
79      return 0L;
80    }
81    try {
82      return new SimpleDateFormat(OmtpConstants.DATE_TIME_FORMAT, Locale.US).parse(value).getTime();
83    } catch (ParseException e) {
84      return 0L;
85    }
86  }
87  /**
88   * @return the event that triggered the sync message. This is a mandatory field and must always be
89   *     set.
90   */
91  public String getSyncTriggerEvent() {
92    return syncTriggerEvent;
93  }
94
95  /** @return the number of new messages stored on the voicemail server. */
96  @NeededForTesting
97  public int getNewMessageCount() {
98    return newMessageCount;
99  }
100
101  /**
102   * @return the message ID of the new message.
103   *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
104   */
105  public String getId() {
106    return messageId;
107  }
108
109  /**
110   * @return the content type of the new message.
111   *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
112   */
113  @NeededForTesting
114  public String getContentType() {
115    return contentType;
116  }
117
118  /**
119   * @return the message length of the new message.
120   *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
121   */
122  public int getLength() {
123    return messageLength;
124  }
125
126  /**
127   * @return the sender's phone number of the new message specified as MSISDN.
128   *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
129   */
130  public String getSender() {
131    return sender;
132  }
133
134  /**
135   * @return the timestamp as milliseconds for the new message.
136   *     <p>Expected to be set only for {@link OmtpConstants#NEW_MESSAGE}
137   */
138  public long getTimestampMillis() {
139    return msgTimeMillis;
140  }
141
142  private static int getInt(Bundle wrappedData, String key) {
143    String value = wrappedData.getString(key);
144    if (value == null) {
145      return 0;
146    }
147    try {
148      return Integer.parseInt(value);
149    } catch (NumberFormatException e) {
150      return 0;
151    }
152  }
153
154  private static String getString(Bundle wrappedData, String key) {
155    String value = wrappedData.getString(key);
156    if (value == null) {
157      return "";
158    }
159    return value;
160  }
161}
162