Skip to content

Commit

Permalink
Handle SMS fallback preferences correctly, and fix directory sync.
Browse files Browse the repository at this point in the history
  • Loading branch information
moxie0 committed Feb 17, 2014
1 parent 94b54a6 commit 9bb327d
Show file tree
Hide file tree
Showing 16 changed files with 147 additions and 150 deletions.
30 changes: 23 additions & 7 deletions library/src/org/whispersystems/textsecure/directory/Directory.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,16 @@
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.telephony.TelephonyManager;
import android.util.Log;

import org.whispersystems.textsecure.push.ContactNumberDetails;
import org.whispersystems.textsecure.util.DirectoryUtil;
import org.whispersystems.textsecure.push.ContactTokenDetails;
import org.whispersystems.textsecure.util.InvalidNumberException;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Directory {
Expand Down Expand Up @@ -66,6 +63,25 @@ private Directory(Context context) {
this.databaseHelper = new DatabaseHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public boolean isSmsFallbackSupported(String e164number) {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = null;

try {
cursor = db.query(TABLE_NAME, new String[] {SUPPORTS_SMS}, NUMBER + " = ?",
new String[]{e164number}, null, null, null);

if (cursor != null && cursor.moveToFirst()) {
return cursor.getInt(0) == 1;
} else {
return false;
}
} finally {
if (cursor != null)
cursor.close();
}
}

public boolean isActiveNumber(String e164number) throws NotInDirectoryException {
if (e164number == null || e164number.length() == 0) {
return false;
Expand Down Expand Up @@ -109,7 +125,7 @@ public String getRelay(String e164number) {
}
}

public void setNumber(ContactNumberDetails token, boolean active) {
public void setNumber(ContactTokenDetails token, boolean active) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(NUMBER, token.getNumber());
Expand All @@ -120,13 +136,13 @@ public void setNumber(ContactNumberDetails token, boolean active) {
db.replace(TABLE_NAME, null, values);
}

public void setNumbers(List<ContactNumberDetails> activeTokens, Collection<String> inactiveTokens) {
public void setNumbers(List<ContactTokenDetails> activeTokens, Collection<String> inactiveTokens) {
long timestamp = System.currentTimeMillis();
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.beginTransaction();

try {
for (ContactNumberDetails token : activeTokens) {
for (ContactTokenDetails token : activeTokens) {
Log.w("Directory", "Adding active token: " + token);
ContentValues values = new ContentValues();
values.put(NUMBER, token.getNumber());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.whispersystems.textsecure.push;

public class AccountAttributes {

private String signalingKey;
private boolean supportsSms;

public AccountAttributes(String signalingKey, boolean supportsSms) {
this.signalingKey = signalingKey;
this.supportsSms = supportsSms;
}

public AccountAttributes() {}

public String getSignalingKey() {
return signalingKey;
}

public boolean isSupportsSms() {
return supportsSms;
}
}
31 changes: 0 additions & 31 deletions library/src/org/whispersystems/textsecure/push/ContactDetails.java

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,32 @@

import com.google.thoughtcrimegson.Gson;

public class ContactTokenDetails extends ContactDetails {
public class ContactTokenDetails {

private String token;
private String relay;
private String number;
private boolean supportsSms;

public ContactTokenDetails() { super(); }
public ContactTokenDetails() {}

public ContactTokenDetails(String token) {
super();
this.token = token;
public String getToken() {
return token;
}

public ContactTokenDetails(String token, String relay) {
super(relay);
this.token = token;
public String getRelay() {
return relay;
}

public String getToken() {
return token;
public boolean isSupportsSms() {
return supportsSms;
}

public void setNumber(String number) {
this.number = number;
}

public String getNumber() {
return number;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,10 @@ public void createAccount(boolean voice) throws IOException {
makeRequest(String.format(path, localNumber), "GET", null);
}

public void verifyAccount(String verificationCode, String signalingKey) throws IOException {
SignalingKey signalingKeyEntity = new SignalingKey(signalingKey);
public void verifyAccount(String verificationCode, String signalingKey, boolean supportsSms)
throws IOException
{
AccountAttributes signalingKeyEntity = new AccountAttributes(signalingKey, supportsSms);
makeRequest(String.format(VERIFY_ACCOUNT_PATH, verificationCode),
"PUT", new Gson().toJson(signalingKeyEntity));
}
Expand Down
16 changes: 0 additions & 16 deletions library/src/org/whispersystems/textsecure/push/SignalingKey.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ protected void onPostExecute(Integer result) {
protected Integer doInBackground(Void... params) {
try {
PushServiceSocket socket = PushServiceSocketFactory.create(context, e164number, password);
socket.verifyAccount(code, signalingKey);
socket.verifyAccount(code, signalingKey, true);
return SUCCESS;
} catch (RateLimitException e) {
Log.w("RegistrationProgressActivity", e);
Expand Down
9 changes: 4 additions & 5 deletions src/org/thoughtcrime/securesms/gcm/GcmIntentService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,13 @@

import com.google.android.gcm.GCMBaseIntentService;

import org.thoughtcrime.securesms.Release;
import org.thoughtcrime.securesms.push.PushServiceSocketFactory;
import org.thoughtcrime.securesms.service.RegistrationService;
import org.thoughtcrime.securesms.service.SendReceiveService;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.textsecure.crypto.InvalidVersionException;
import org.whispersystems.textsecure.directory.Directory;
import org.whispersystems.textsecure.directory.NotInDirectoryException;
import org.whispersystems.textsecure.push.ContactNumberDetails;
import org.whispersystems.textsecure.push.ContactTokenDetails;
import org.whispersystems.textsecure.push.IncomingEncryptedPushMessage;
import org.whispersystems.textsecure.push.IncomingPushMessage;
Expand Down Expand Up @@ -69,9 +67,10 @@ protected void onMessage(Context context, Intent intent) {

if (!isActiveNumber(context, message.getSource())) {
Directory directory = Directory.getInstance(context);
String contactNumber = message.getSource();
ContactNumberDetails contactNumberDetails = new ContactNumberDetails(contactNumber, message.getRelay());
directory.setNumber(contactNumberDetails, true);
ContactTokenDetails contactTokenDetails = new ContactTokenDetails();
contactTokenDetails.setNumber(message.getSource());

directory.setNumber(contactTokenDetails, true);
}

Intent service = new Intent(context, SendReceiveService.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ private void handleSmsRegistrationIntent(Intent intent) {

setState(new RegistrationState(RegistrationState.STATE_VERIFYING, number));
String challenge = waitForChallenge();
socket.verifyAccount(challenge, signalingKey);
socket.verifyAccount(challenge, signalingKey, true);

handleCommonRegistration(masterSecret, socket, number);
markAsVerified(number, password, signalingKey);
Expand Down
21 changes: 18 additions & 3 deletions src/org/thoughtcrime/securesms/service/SmsSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package org.thoughtcrime.securesms.service;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
Expand All @@ -31,12 +33,11 @@
import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.service.SendReceiveService.ToastHandler;
import org.thoughtcrime.securesms.sms.IncomingIdentityUpdateMessage;
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
import org.thoughtcrime.securesms.transport.UniversalTransport;
import org.thoughtcrime.securesms.transport.UntrustedIdentityException;
import org.whispersystems.textsecure.crypto.MasterSecret;
import org.whispersystems.textsecure.util.Base64;

public class SmsSender {

Expand Down Expand Up @@ -87,6 +88,10 @@ private void handleSendMessage(MasterSecret masterSecret, Intent intent) {
} catch (UndeliverableMessageException ude) {
Log.w("SmsSender", ude);
DatabaseFactory.getSmsDatabase(context).markAsSentFailed(messageId);
} catch (RetryLaterException rle) {
Log.w("SmsSender", rle);
if (systemStateListener.isConnected()) scheduleQuickRetryAlarm();
else systemStateListener.registerForConnectivityChange();
}
}
} finally {
Expand Down Expand Up @@ -140,10 +145,20 @@ private void handleDeliveredMessage(Intent intent) {
}

private void registerForRadioChanges() {
systemStateListener.registerForConnectivityChange();
if (systemStateListener.isConnected()) systemStateListener.registerForRadioChange();
else systemStateListener.registerForConnectivityChange();
}

private void unregisterForRadioChanges() {
systemStateListener.unregisterForConnectivityChange();
}

private void scheduleQuickRetryAlarm() {
((AlarmManager)context.getSystemService(Context.ALARM_SERVICE))
.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (30 * 1000),
PendingIntent.getService(context, 0,
new Intent(SendReceiveService.SEND_SMS_ACTION,
null, context, SendReceiveService.class),
PendingIntent.FLAG_UPDATE_CURRENT));
}
}
10 changes: 10 additions & 0 deletions src/org/thoughtcrime/securesms/service/SystemStateListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,15 @@ public SystemStateListener(Context context) {
this.connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
}

public void registerForRadioChange() {
Log.w("SystemStateListener", "Registering for radio changes...");
unregisterForConnectivityChange();

telephonyManager.listen(telephonyListener, PhoneStateListener.LISTEN_SERVICE_STATE);
}

public void registerForConnectivityChange() {
Log.w("SystemStateListener", "Registering for any connectivity changes...");
unregisterForConnectivityChange();

telephonyManager.listen(telephonyListener, PhoneStateListener.LISTEN_SERVICE_STATE);
Expand Down Expand Up @@ -63,6 +71,7 @@ private class TelephonyListener extends PhoneStateListener {
@Override
public void onServiceStateChanged(ServiceState state) {
if (state.getState() == ServiceState.STATE_IN_SERVICE) {
Log.w("SystemStateListener", "In service, sending sms/mms outboxes...");
sendSmsOutbox(context);
sendMmsOutbox(context);
}
Expand All @@ -76,6 +85,7 @@ public void onReceive(Context context, Intent intent) {
if (connectivityManager.getActiveNetworkInfo() != null &&
connectivityManager.getActiveNetworkInfo().isConnected())
{
Log.w("SystemStateListener", "Got connectivity action: " + intent.toString());
sendSmsOutbox(context);
sendMmsOutbox(context);
}
Expand Down
5 changes: 0 additions & 5 deletions src/org/thoughtcrime/securesms/transport/PushTransport.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,6 @@ public void deliver(SmsMessageRecord message)

context.sendBroadcast(constructSentIntent(context, message.getId(), message.getType(), true));

} catch (UnregisteredUserException e) {
Log.w("PushTransport", e);
//TODO We should probably remove the user from the directory?
// destroySessions(message.getIndividualRecipient());
throw new IOException("Not push registered after all.");
} catch (InvalidNumberException e) {
Log.w("PushTransport", e);
throw new IOException("Badly formatted number.");
Expand Down
2 changes: 0 additions & 2 deletions src/org/thoughtcrime/securesms/transport/SmsTransport.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@

import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.service.SendReceiveService;
import org.thoughtcrime.securesms.service.SmsDeliveryListener;
import org.thoughtcrime.securesms.sms.MultipartSmsMessageHandler;
import org.thoughtcrime.securesms.sms.OutgoingPrekeyBundleMessage;
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
Expand Down

0 comments on commit 9bb327d

Please sign in to comment.