1package de.gultsch.chat.entities;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import de.gultsch.chat.crypto.OtrEngine;
7import de.gultsch.chat.xmpp.XmppConnection;
8
9import net.java.otr4j.OtrException;
10import net.java.otr4j.session.SessionID;
11import net.java.otr4j.session.SessionImpl;
12import net.java.otr4j.session.SessionStatus;
13
14import android.content.ContentValues;
15import android.content.Context;
16import android.database.Cursor;
17import android.net.Uri;
18import android.util.Log;
19
20public class Conversation extends AbstractEntity {
21
22 private static final long serialVersionUID = -6727528868973996739L;
23
24 public static final String TABLENAME = "conversations";
25
26 public static final int STATUS_AVAILABLE = 0;
27 public static final int STATUS_ARCHIVED = 1;
28 public static final int STATUS_DELETED = 2;
29
30 public static final int MODE_MULTI = 1;
31 public static final int MODE_SINGLE = 0;
32
33 public static final String NAME = "name";
34 public static final String ACCOUNT = "accountUuid";
35 public static final String CONTACT = "contactUuid";
36 public static final String CONTACTJID = "contactJid";
37 public static final String STATUS = "status";
38 public static final String CREATED = "created";
39 public static final String MODE = "mode";
40
41 private String name;
42 private String contactUuid;
43 private String accountUuid;
44 private String contactJid;
45 private int status;
46 private long created;
47 private int mode;
48
49 private transient List<Message> messages = null;
50 private transient Account account = null;
51 private transient Contact contact;
52
53 private transient SessionImpl otrSession;
54 private transient String foreignOtrPresence;
55
56 public Conversation(String name, Account account,
57 String contactJid, int mode) {
58 this(java.util.UUID.randomUUID().toString(), name, null, account.getUuid(), contactJid, System
59 .currentTimeMillis(), STATUS_AVAILABLE,mode);
60 this.account = account;
61 }
62
63 public Conversation(String uuid, String name, String contactUuid,
64 String accountUuid, String contactJid, long created, int status, int mode) {
65 this.uuid = uuid;
66 this.name = name;
67 this.contactUuid = contactUuid;
68 this.accountUuid = accountUuid;
69 this.contactJid = contactJid;
70 this.created = created;
71 this.status = status;
72 this.mode = mode;
73 }
74
75 public List<Message> getMessages() {
76 if (messages == null) this.messages = new ArrayList<Message>(); //prevent null pointer
77
78 //populate with Conversation (this)
79
80 for(Message msg : messages) {
81 msg.setConversation(this);
82 }
83
84 return messages;
85 }
86
87 public boolean isRead() {
88 if ((this.messages == null)||(this.messages.size() == 0)) return true;
89 return this.messages.get(this.messages.size() - 1).isRead();
90 }
91
92 public void markRead() {
93 if (this.messages == null) return;
94 for(int i = this.messages.size() -1; i >= 0; --i) {
95 if (messages.get(i).isRead()) return;
96 this.messages.get(i).markRead();
97 }
98 }
99
100 public Message getLatestMessage() {
101 if ((this.messages == null)||(this.messages.size()==0)) {
102 Message message = new Message(this,"",Message.ENCRYPTION_NONE);
103 message.setTime(0);
104 return message;
105 } else {
106 return this.messages.get(this.messages.size() - 1);
107 }
108 }
109
110 public void setMessages(List<Message> msgs) {
111 this.messages = msgs;
112 }
113
114 public String getName() {
115 if (this.contact!=null) {
116 return this.contact.getDisplayName();
117 } else {
118 return this.name;
119 }
120 }
121
122 public String getProfilePhotoString() {
123 if (this.contact==null) {
124 return null;
125 } else {
126 return this.contact.getProfilePhoto();
127 }
128 }
129
130 public String getAccountUuid() {
131 return this.accountUuid;
132 }
133
134 public Account getAccount() {
135 return this.account;
136 }
137
138 public Contact getContact() {
139 return this.contact;
140 }
141
142 public void setContact(Contact contact) {
143 this.contact = contact;
144 if (contact!=null) {
145 this.contactUuid = contact.getUuid();
146 }
147 }
148
149 public void setAccount(Account account) {
150 this.account = account;
151 }
152
153 public String getContactJid() {
154 return this.contactJid;
155 }
156
157 public Uri getProfilePhotoUri() {
158 if (this.getProfilePhotoString() != null) {
159 return Uri.parse(this.getProfilePhotoString());
160 }
161 return null;
162 }
163
164 public int getStatus() {
165 return this.status;
166 }
167
168 public long getCreated() {
169 return this.created;
170 }
171
172 public ContentValues getContentValues() {
173 ContentValues values = new ContentValues();
174 values.put(UUID, uuid);
175 values.put(NAME, name);
176 values.put(CONTACT, contactUuid);
177 values.put(ACCOUNT, accountUuid);
178 values.put(CONTACTJID, contactJid);
179 values.put(CREATED, created);
180 values.put(STATUS, status);
181 values.put(MODE,mode);
182 return values;
183 }
184
185 public static Conversation fromCursor(Cursor cursor) {
186 return new Conversation(cursor.getString(cursor.getColumnIndex(UUID)),
187 cursor.getString(cursor.getColumnIndex(NAME)),
188 cursor.getString(cursor.getColumnIndex(CONTACT)),
189 cursor.getString(cursor.getColumnIndex(ACCOUNT)),
190 cursor.getString(cursor.getColumnIndex(CONTACTJID)),
191 cursor.getLong(cursor.getColumnIndex(CREATED)),
192 cursor.getInt(cursor.getColumnIndex(STATUS)),
193 cursor.getInt(cursor.getColumnIndex(MODE)));
194 }
195
196 public void setStatus(int status) {
197 this.status = status;
198 }
199
200 public int getMode() {
201 return this.mode;
202 }
203
204 public void setMode(int mode) {
205 this.mode = mode;
206 }
207
208 public void startOtrSession(Context context, String presence) {
209 Log.d("xmppService","starting otr session with "+presence);
210 SessionID sessionId = new SessionID(this.getContactJid(),presence,"xmpp");
211 this.otrSession = new SessionImpl(sessionId, getAccount().getOtrEngine(context));
212 }
213
214 public SessionImpl getOtrSession() {
215 return this.otrSession;
216 }
217
218 public void resetOtrSession() {
219 this.otrSession = null;
220 }
221
222 public void endOtrIfNeeded() throws OtrException {
223 if (this.otrSession!=null) {
224 if (this.otrSession.getSessionStatus() == SessionStatus.ENCRYPTED) {
225 this.otrSession.endSession();
226 }
227 }
228 }
229
230 public boolean hasOtrSession() {
231 return (this.otrSession!=null);
232 }
233}