• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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.contacts.interactions;
17 
18 import com.android.contacts.R;
19 import com.android.contacts.common.util.ContactDisplayUtils;
20 
21 import android.content.ContentValues;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.graphics.drawable.Drawable;
25 import android.net.Uri;
26 import android.provider.Telephony.Sms;
27 import android.text.BidiFormatter;
28 import android.text.Spannable;
29 import android.text.TextDirectionHeuristics;
30 
31 /**
32  * Represents an sms interaction, wrapping the columns in
33  * {@link android.provider.Telephony.Sms}.
34  */
35 public class SmsInteraction implements ContactInteraction {
36 
37     private static final String URI_TARGET_PREFIX = "smsto:";
38     private static final int SMS_ICON_RES = R.drawable.ic_message_24dp;
39     private static BidiFormatter sBidiFormatter = BidiFormatter.getInstance();
40 
41     private ContentValues mValues;
42 
SmsInteraction(ContentValues values)43     public SmsInteraction(ContentValues values) {
44         mValues = values;
45     }
46 
47     @Override
getIntent()48     public Intent getIntent() {
49         String address = getAddress();
50         return address == null ? null : new Intent(Intent.ACTION_VIEW).setData(
51                 Uri.parse(URI_TARGET_PREFIX + address));
52     }
53 
54     @Override
getInteractionDate()55     public long getInteractionDate() {
56         Long date = getDate();
57         return date == null ? -1 : date;
58     }
59 
60     @Override
getViewHeader(Context context)61     public String getViewHeader(Context context) {
62         String body = getBody();
63         if (getType() == Sms.MESSAGE_TYPE_SENT) {
64             body = context.getResources().getString(R.string.message_from_you_prefix, body);
65         }
66         return body;
67     }
68 
69     @Override
getViewBody(Context context)70     public String getViewBody(Context context) {
71         return getAddress();
72     }
73 
74     @Override
getViewFooter(Context context)75     public String getViewFooter(Context context) {
76         Long date = getDate();
77         return date == null ? null : ContactInteractionUtil.formatDateStringFromTimestamp(
78                 date, context);
79     }
80 
81     @Override
getIcon(Context context)82     public Drawable getIcon(Context context) {
83         return context.getResources().getDrawable(SMS_ICON_RES);
84     }
85 
86     @Override
getBodyIcon(Context context)87     public Drawable getBodyIcon(Context context) {
88         return null;
89     }
90 
91     @Override
getFooterIcon(Context context)92     public Drawable getFooterIcon(Context context) {
93         return null;
94     }
95 
getAddress()96     public String getAddress() {
97         final String address = mValues.getAsString(Sms.ADDRESS);
98         return address == null ? null :
99             sBidiFormatter.unicodeWrap(address, TextDirectionHeuristics.LTR);
100     }
101 
getBody()102     public String getBody() {
103         return mValues.getAsString(Sms.BODY);
104     }
105 
getDate()106     public Long getDate() {
107         return mValues.getAsLong(Sms.DATE);
108     }
109 
110 
getDateSent()111     public Long getDateSent() {
112         return mValues.getAsLong(Sms.DATE_SENT);
113     }
114 
getErrorCode()115     public Integer getErrorCode() {
116         return mValues.getAsInteger(Sms.ERROR_CODE);
117     }
118 
getLocked()119     public Boolean getLocked() {
120         return mValues.getAsBoolean(Sms.LOCKED);
121     }
122 
getPerson()123     public Integer getPerson() {
124         return mValues.getAsInteger(Sms.PERSON);
125     }
126 
getProtocol()127     public Integer getProtocol() {
128         return mValues.getAsInteger(Sms.PROTOCOL);
129     }
130 
getRead()131     public Boolean getRead() {
132         return mValues.getAsBoolean(Sms.READ);
133     }
134 
getReplyPathPresent()135     public Boolean getReplyPathPresent() {
136         return mValues.getAsBoolean(Sms.REPLY_PATH_PRESENT);
137     }
138 
getSeen()139     public Boolean getSeen() {
140         return mValues.getAsBoolean(Sms.SEEN);
141     }
142 
getServiceCenter()143     public String getServiceCenter() {
144         return mValues.getAsString(Sms.SERVICE_CENTER);
145     }
146 
getStatus()147     public Integer getStatus() {
148         return mValues.getAsInteger(Sms.STATUS);
149     }
150 
getSubject()151     public String getSubject() {
152         return mValues.getAsString(Sms.SUBJECT);
153     }
154 
getThreadId()155     public Integer getThreadId() {
156         return mValues.getAsInteger(Sms.THREAD_ID);
157     }
158 
getType()159     public Integer getType() {
160         return mValues.getAsInteger(Sms.TYPE);
161     }
162 
163     @Override
getContentDescription(Context context)164     public Spannable getContentDescription(Context context) {
165         final String phoneNumber = getViewBody(context);
166         final String contentDescription = context.getResources().getString(
167                 R.string.content_description_recent_sms,
168                 getViewHeader(context), phoneNumber, getViewFooter(context));
169         return ContactDisplayUtils.getTelephoneTtsSpannable(contentDescription, phoneNumber);
170     }
171 
172     @Override
getIconResourceId()173     public int getIconResourceId() {
174         return SMS_ICON_RES;
175     }
176 }
177