• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 Esmertec AG.
3  * Copyright (C) 2008 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.mms.transaction;
19 
20 import com.android.mms.ui.MessagingPreferenceActivity;
21 import com.android.mms.util.SendingProgressTokenManager;
22 import com.google.android.mms.InvalidHeaderValueException;
23 import com.google.android.mms.MmsException;
24 import com.google.android.mms.pdu.EncodedStringValue;
25 import com.google.android.mms.pdu.GenericPdu;
26 import com.google.android.mms.pdu.PduHeaders;
27 import com.google.android.mms.pdu.PduPersister;
28 import com.google.android.mms.pdu.ReadRecInd;
29 import com.google.android.mms.pdu.SendReq;
30 
31 import android.content.ContentUris;
32 import android.content.Context;
33 import android.content.Intent;
34 import android.content.SharedPreferences;
35 import android.net.Uri;
36 import android.preference.PreferenceManager;
37 import android.provider.Telephony.Mms;
38 import android.util.Log;
39 
40 public class MmsMessageSender implements MessageSender {
41     private static final String TAG = "MmsMessageSender";
42 
43     private final Context mContext;
44     private final Uri mMessageUri;
45     private final long mMessageSize;
46 
47     // Default preference values
48     private static final boolean DEFAULT_DELIVERY_REPORT_MODE  = false;
49     private static final boolean DEFAULT_READ_REPORT_MODE      = false;
50     private static final long    DEFAULT_EXPIRY_TIME     = 7 * 24 * 60 * 60;
51     private static final int     DEFAULT_PRIORITY        = PduHeaders.PRIORITY_NORMAL;
52     private static final String  DEFAULT_MESSAGE_CLASS   = PduHeaders.MESSAGE_CLASS_PERSONAL_STR;
53 
MmsMessageSender(Context context, Uri location, long messageSize)54     public MmsMessageSender(Context context, Uri location, long messageSize) {
55         mContext = context;
56         mMessageUri = location;
57         mMessageSize = messageSize;
58 
59         if (mMessageUri == null) {
60             throw new IllegalArgumentException("Null message URI.");
61         }
62     }
63 
sendMessage(long token)64     public boolean sendMessage(long token) throws MmsException {
65         // Load the MMS from the message uri
66         PduPersister p = PduPersister.getPduPersister(mContext);
67         GenericPdu pdu = p.load(mMessageUri);
68 
69         if (pdu.getMessageType() != PduHeaders.MESSAGE_TYPE_SEND_REQ) {
70             throw new MmsException("Invalid message: " + pdu.getMessageType());
71         }
72 
73         SendReq sendReq = (SendReq) pdu;
74 
75         // Update headers.
76         updatePreferencesHeaders(sendReq);
77 
78         // MessageClass.
79         sendReq.setMessageClass(DEFAULT_MESSAGE_CLASS.getBytes());
80 
81         // Update the 'date' field of the message before sending it.
82         sendReq.setDate(System.currentTimeMillis() / 1000L);
83 
84         sendReq.setMessageSize(mMessageSize);
85 
86         p.updateHeaders(mMessageUri, sendReq);
87 
88         // Move the message into MMS Outbox
89         p.move(mMessageUri, Mms.Outbox.CONTENT_URI);
90 
91         // Start MMS transaction service
92         SendingProgressTokenManager.put(ContentUris.parseId(mMessageUri), token);
93         mContext.startService(new Intent(mContext, TransactionService.class));
94 
95         return true;
96     }
97 
98     // Update the headers which are stored in SharedPreferences.
updatePreferencesHeaders(SendReq sendReq)99     private void updatePreferencesHeaders(SendReq sendReq) throws MmsException {
100         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
101 
102         // Expiry.
103         sendReq.setExpiry(prefs.getLong(
104                 MessagingPreferenceActivity.EXPIRY_TIME, DEFAULT_EXPIRY_TIME));
105 
106         // Priority.
107         sendReq.setPriority(prefs.getInt(MessagingPreferenceActivity.PRIORITY, DEFAULT_PRIORITY));
108 
109         // Delivery report.
110         boolean dr = prefs.getBoolean(MessagingPreferenceActivity.MMS_DELIVERY_REPORT_MODE,
111                 DEFAULT_DELIVERY_REPORT_MODE);
112         sendReq.setDeliveryReport(dr?PduHeaders.VALUE_YES:PduHeaders.VALUE_NO);
113 
114         // Read report.
115         boolean rr = prefs.getBoolean(MessagingPreferenceActivity.READ_REPORT_MODE,
116                 DEFAULT_READ_REPORT_MODE);
117         sendReq.setReadReport(rr?PduHeaders.VALUE_YES:PduHeaders.VALUE_NO);
118     }
119 
sendReadRec(Context context, String to, String messageId, int status)120     public static void sendReadRec(Context context, String to, String messageId, int status) {
121         EncodedStringValue[] sender = new EncodedStringValue[1];
122         sender[0] = new EncodedStringValue(to);
123 
124         try {
125             final ReadRecInd readRec = new ReadRecInd(
126                     new EncodedStringValue(PduHeaders.FROM_INSERT_ADDRESS_TOKEN_STR.getBytes()),
127                     messageId.getBytes(),
128                     PduHeaders.CURRENT_MMS_VERSION,
129                     status,
130                     sender);
131 
132             readRec.setDate(System.currentTimeMillis() / 1000);
133 
134             PduPersister.getPduPersister(context).persist(readRec, Mms.Outbox.CONTENT_URI);
135             context.startService(new Intent(context, TransactionService.class));
136         } catch (InvalidHeaderValueException e) {
137             Log.e(TAG, "Invalide header value", e);
138         } catch (MmsException e) {
139             Log.e(TAG, "Persist message failed", e);
140         }
141     }
142 }
143