mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-27 12:05:22 +00:00
Split out Util functions.
This commit is contained in:
parent
0d102f76cc
commit
08ed90c5ec
@ -4,8 +4,8 @@ import android.test.AndroidTestCase;
|
|||||||
|
|
||||||
import junit.framework.AssertionFailedError;
|
import junit.framework.AssertionFailedError;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
|
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
|
||||||
import static org.fest.assertions.api.Assertions.assertThat;
|
import static org.fest.assertions.api.Assertions.assertThat;
|
||||||
|
|
||||||
public class PhoneNumberFormatterTest extends AndroidTestCase {
|
public class PhoneNumberFormatterTest extends AndroidTestCase {
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api;
|
package org.whispersystems.textsecure.api;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api;
|
package org.whispersystems.textsecure.api;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api;
|
package org.whispersystems.textsecure.api;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -28,7 +44,7 @@ import org.whispersystems.textsecure.push.UnregisteredUserException;
|
|||||||
import org.whispersystems.textsecure.push.exceptions.EncapsulatedExceptions;
|
import org.whispersystems.textsecure.push.exceptions.EncapsulatedExceptions;
|
||||||
import org.whispersystems.textsecure.push.exceptions.MismatchedDevicesException;
|
import org.whispersystems.textsecure.push.exceptions.MismatchedDevicesException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.StaleDevicesException;
|
import org.whispersystems.textsecure.push.exceptions.StaleDevicesException;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.whispersystems.textsecure.internal.util.Util;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright (C) 2013 Open Whisper Systems
|
* Copyright (C) 2013-2014 Open Whisper Systems
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -20,7 +20,7 @@ import android.util.Log;
|
|||||||
|
|
||||||
import org.whispersystems.libaxolotl.InvalidMacException;
|
import org.whispersystems.libaxolotl.InvalidMacException;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.whispersystems.textsecure.internal.util.Util;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
@ -1,6 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api.crypto;
|
package org.whispersystems.textsecure.api.crypto;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.whispersystems.textsecure.internal.util.Util;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
@ -1,7 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api.crypto;
|
package org.whispersystems.textsecure.api.crypto;
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api.crypto;
|
package org.whispersystems.textsecure.api.crypto;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package org.whispersystems.textsecure.api.messages;
|
package org.whispersystems.textsecure.api.messages;
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
public abstract class TextSecureAttachment {
|
public abstract class TextSecureAttachment {
|
||||||
|
|
||||||
private final String contentType;
|
private final String contentType;
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api.messages;
|
package org.whispersystems.textsecure.api.messages;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -6,8 +22,8 @@ import com.google.protobuf.ByteString;
|
|||||||
|
|
||||||
import org.whispersystems.libaxolotl.InvalidVersionException;
|
import org.whispersystems.libaxolotl.InvalidVersionException;
|
||||||
import org.whispersystems.textsecure.push.PushMessageProtos.IncomingPushMessageSignal;
|
import org.whispersystems.textsecure.push.PushMessageProtos.IncomingPushMessageSignal;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.whispersystems.textsecure.internal.util.Base64;
|
||||||
import org.whispersystems.textsecure.util.Hex;
|
import org.whispersystems.textsecure.internal.util.Hex;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.InvalidAlgorithmParameterException;
|
import java.security.InvalidAlgorithmParameterException;
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api.messages;
|
package org.whispersystems.textsecure.api.messages;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
|
@ -1,3 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
package org.whispersystems.textsecure.api.messages;
|
package org.whispersystems.textsecure.api.messages;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package org.whispersystems.textsecure.util;
|
package org.whispersystems.textsecure.api.util;
|
||||||
|
|
||||||
public class InvalidNumberException extends Throwable {
|
public class InvalidNumberException extends Throwable {
|
||||||
public InvalidNumberException(String s) {
|
public InvalidNumberException(String s) {
|
@ -1,4 +1,20 @@
|
|||||||
package org.whispersystems.textsecure.util;
|
/**
|
||||||
|
* Copyright (C) 2014 Open Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.whispersystems.textsecure.api.util;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
@ -17,6 +33,8 @@ import java.util.Locale;
|
|||||||
*/
|
*/
|
||||||
public class PhoneNumberFormatter {
|
public class PhoneNumberFormatter {
|
||||||
|
|
||||||
|
private static final String TAG = PhoneNumberFormatter.class.getSimpleName();
|
||||||
|
|
||||||
public static boolean isValidNumber(String number) {
|
public static boolean isValidNumber(String number) {
|
||||||
return number.matches("^\\+[0-9]{10,}");
|
return number.matches("^\\+[0-9]{10,}");
|
||||||
}
|
}
|
||||||
@ -46,7 +64,7 @@ public class PhoneNumberFormatter {
|
|||||||
PhoneNumber parsedNumber = util.parse(number, null);
|
PhoneNumber parsedNumber = util.parse(number, null);
|
||||||
return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
|
return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
|
||||||
} catch (NumberParseException e) {
|
} catch (NumberParseException e) {
|
||||||
Log.w("PhoneNumberFormatter", e);
|
Log.w(TAG, e);
|
||||||
return number;
|
return number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,12 +90,12 @@ public class PhoneNumberFormatter {
|
|||||||
PhoneNumber localNumberObject = util.parse(localNumber, null);
|
PhoneNumber localNumberObject = util.parse(localNumber, null);
|
||||||
|
|
||||||
String localCountryCode = util.getRegionCodeForNumber(localNumberObject);
|
String localCountryCode = util.getRegionCodeForNumber(localNumberObject);
|
||||||
Log.w("PhoneNumberFormatter", "Got local CC: " + localCountryCode);
|
Log.w(TAG, "Got local CC: " + localCountryCode);
|
||||||
|
|
||||||
PhoneNumber numberObject = util.parse(number, localCountryCode);
|
PhoneNumber numberObject = util.parse(number, localCountryCode);
|
||||||
return util.format(numberObject, PhoneNumberFormat.E164);
|
return util.format(numberObject, PhoneNumberFormat.E164);
|
||||||
} catch (NumberParseException e) {
|
} catch (NumberParseException e) {
|
||||||
Log.w("PhoneNumberFormatter", e);
|
Log.w(TAG, e);
|
||||||
return impreciseFormatNumber(number, localNumber);
|
return impreciseFormatNumber(number, localNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -95,10 +113,8 @@ public class PhoneNumberFormatter {
|
|||||||
util.getRegionCodeForCountryCode(parsedCountryCode));
|
util.getRegionCodeForCountryCode(parsedCountryCode));
|
||||||
|
|
||||||
return util.format(parsedNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
|
return util.format(parsedNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
|
||||||
} catch (NumberParseException npe) {
|
} catch (NumberParseException | NumberFormatException npe) {
|
||||||
Log.w("CreateAccountActivity", npe);
|
Log.w(TAG, npe);
|
||||||
} catch (NumberFormatException nfe) {
|
|
||||||
Log.w("CreateAccountActivity", nfe);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "+" +
|
return "+" +
|
||||||
@ -112,7 +128,7 @@ public class PhoneNumberFormatter {
|
|||||||
PhoneNumber parsedNumber = util.parse(e164number, null);
|
PhoneNumber parsedNumber = util.parse(e164number, null);
|
||||||
return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
|
return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
|
||||||
} catch (NumberParseException e) {
|
} catch (NumberParseException e) {
|
||||||
Log.w("PhoneNumberFormatter", e);
|
Log.w(TAG, e);
|
||||||
return e164number;
|
return e164number;
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package org.whispersystems.textsecure.util;
|
package org.whispersystems.textsecure.internal.util;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
@ -0,0 +1,138 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2011 Whisper Systems
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package org.whispersystems.textsecure.internal.util;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility for generating hex dumps.
|
||||||
|
*/
|
||||||
|
public class Hex {
|
||||||
|
|
||||||
|
private final static int HEX_DIGITS_START = 10;
|
||||||
|
private final static int ASCII_TEXT_START = HEX_DIGITS_START + (16*2 + (16/2));
|
||||||
|
|
||||||
|
final static String EOL = System.getProperty("line.separator");
|
||||||
|
|
||||||
|
private final static char[] HEX_DIGITS = {
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
|
||||||
|
};
|
||||||
|
|
||||||
|
public static String toString(byte[] bytes) {
|
||||||
|
return toString(bytes, 0, bytes.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(byte[] bytes, int offset, int length) {
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
appendHexChar(buf, bytes[offset + i]);
|
||||||
|
buf.append(' ');
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toStringCondensed(byte[] bytes) {
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int i=0;i<bytes.length;i++) {
|
||||||
|
appendHexChar(buf, bytes[i]);
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] fromStringCondensed(String encoded) throws IOException {
|
||||||
|
final char[] data = encoded.toCharArray();
|
||||||
|
final int len = data.length;
|
||||||
|
|
||||||
|
if ((len & 0x01) != 0) {
|
||||||
|
throw new IOException("Odd number of characters.");
|
||||||
|
}
|
||||||
|
|
||||||
|
final byte[] out = new byte[len >> 1];
|
||||||
|
|
||||||
|
// two characters form the hex value.
|
||||||
|
for (int i = 0, j = 0; j < len; i++) {
|
||||||
|
int f = Character.digit(data[j], 16) << 4;
|
||||||
|
j++;
|
||||||
|
f = f | Character.digit(data[j], 16);
|
||||||
|
j++;
|
||||||
|
out[i] = (byte) (f & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String dump(byte[] bytes) {
|
||||||
|
return dump(bytes, 0, bytes.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String dump(byte[] bytes, int offset, int length) {
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
int lines = ((length - 1) / 16) + 1;
|
||||||
|
int lineOffset;
|
||||||
|
int lineLength;
|
||||||
|
|
||||||
|
for (int i = 0; i < lines; i++) {
|
||||||
|
lineOffset = (i * 16) + offset;
|
||||||
|
lineLength = Math.min(16, (length - (i * 16)));
|
||||||
|
appendDumpLine(buf, i, bytes, lineOffset, lineLength);
|
||||||
|
buf.append(EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void appendDumpLine(StringBuffer buf, int line, byte[] bytes, int lineOffset, int lineLength) {
|
||||||
|
buf.append(HEX_DIGITS[(line >> 28) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line >> 24) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line >> 20) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line >> 16) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line >> 12) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line >> 8) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line >> 4) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[(line ) & 0xf]);
|
||||||
|
buf.append(": ");
|
||||||
|
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
int idx = i + lineOffset;
|
||||||
|
if (i < lineLength) {
|
||||||
|
int b = bytes[idx];
|
||||||
|
appendHexChar(buf, b);
|
||||||
|
} else {
|
||||||
|
buf.append(" ");
|
||||||
|
}
|
||||||
|
if ((i % 2) == 1) {
|
||||||
|
buf.append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 16 && i < lineLength; i++) {
|
||||||
|
int idx = i + lineOffset;
|
||||||
|
int b = bytes[idx];
|
||||||
|
if (b >= 0x20 && b <= 0x7e) {
|
||||||
|
buf.append((char)b);
|
||||||
|
} else {
|
||||||
|
buf.append('.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void appendHexChar(StringBuffer buf, int b) {
|
||||||
|
buf.append(HEX_DIGITS[(b >> 4) & 0xf]);
|
||||||
|
buf.append(HEX_DIGITS[b & 0xf]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package org.whispersystems.textsecure.internal.util;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
|
public class Util {
|
||||||
|
|
||||||
|
public static byte[][] split(byte[] input, int firstLength, int secondLength) {
|
||||||
|
byte[][] parts = new byte[2][];
|
||||||
|
|
||||||
|
parts[0] = new byte[firstLength];
|
||||||
|
System.arraycopy(input, 0, parts[0], 0, firstLength);
|
||||||
|
|
||||||
|
parts[1] = new byte[secondLength];
|
||||||
|
System.arraycopy(input, firstLength, parts[1], 0, secondLength);
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEmpty(String value) {
|
||||||
|
return value == null || value.trim().length() == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] getSecretBytes(int size) {
|
||||||
|
try {
|
||||||
|
byte[] secret = new byte[size];
|
||||||
|
SecureRandom.getInstance("SHA1PRNG").nextBytes(secret);
|
||||||
|
return secret;
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new AssertionError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String readFully(InputStream in) throws IOException {
|
||||||
|
ByteArrayOutputStream bout = new ByteArrayOutputStream();
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int read;
|
||||||
|
|
||||||
|
while ((read = in.read(buffer)) != -1) {
|
||||||
|
bout.write(buffer, 0, read);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
|
||||||
|
return new String(bout.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void readFully(InputStream in, byte[] buffer) throws IOException {
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
int read = in.read(buffer, offset, buffer.length - offset);
|
||||||
|
|
||||||
|
if (read + offset < buffer.length) offset += read;
|
||||||
|
else return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void copy(InputStream in, OutputStream out) throws IOException {
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int read;
|
||||||
|
|
||||||
|
while ((read = in.read(buffer)) != -1) {
|
||||||
|
out.write(buffer, 0, read);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -16,7 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.whispersystems.textsecure.push;
|
package org.whispersystems.textsecure.push;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
import org.whispersystems.textsecure.internal.util.Base64;
|
||||||
|
|
||||||
public class OutgoingPushMessage {
|
public class OutgoingPushMessage {
|
||||||
|
|
||||||
|
@ -9,11 +9,10 @@ import com.google.thoughtcrimegson.JsonPrimitive;
|
|||||||
import com.google.thoughtcrimegson.JsonSerializationContext;
|
import com.google.thoughtcrimegson.JsonSerializationContext;
|
||||||
import com.google.thoughtcrimegson.JsonSerializer;
|
import com.google.thoughtcrimegson.JsonSerializer;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.whispersystems.textsecure.internal.util.Base64;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
@ -11,7 +11,7 @@ import com.google.thoughtcrimegson.JsonSerializer;
|
|||||||
|
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.whispersystems.textsecure.internal.util.Base64;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
@ -28,6 +28,8 @@ import org.whispersystems.libaxolotl.state.PreKeyBundle;
|
|||||||
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
||||||
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
|
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
|
||||||
import org.whispersystems.textsecure.api.crypto.AttachmentCipherOutputStream;
|
import org.whispersystems.textsecure.api.crypto.AttachmentCipherOutputStream;
|
||||||
|
import org.whispersystems.textsecure.internal.util.Base64;
|
||||||
|
import org.whispersystems.textsecure.internal.util.Util;
|
||||||
import org.whispersystems.textsecure.push.exceptions.AuthorizationFailedException;
|
import org.whispersystems.textsecure.push.exceptions.AuthorizationFailedException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.ExpectationFailedException;
|
import org.whispersystems.textsecure.push.exceptions.ExpectationFailedException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.MismatchedDevicesException;
|
import org.whispersystems.textsecure.push.exceptions.MismatchedDevicesException;
|
||||||
@ -36,9 +38,7 @@ import org.whispersystems.textsecure.push.exceptions.NotFoundException;
|
|||||||
import org.whispersystems.textsecure.push.exceptions.PushNetworkException;
|
import org.whispersystems.textsecure.push.exceptions.PushNetworkException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.RateLimitException;
|
import org.whispersystems.textsecure.push.exceptions.RateLimitException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.StaleDevicesException;
|
import org.whispersystems.textsecure.push.exceptions.StaleDevicesException;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.whispersystems.textsecure.internal.util.BlacklistingTrustManager;
|
||||||
import org.whispersystems.textsecure.util.BlacklistingTrustManager;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
@ -10,7 +10,7 @@ import com.google.thoughtcrimegson.JsonSerializationContext;
|
|||||||
import com.google.thoughtcrimegson.JsonSerializer;
|
import com.google.thoughtcrimegson.JsonSerializer;
|
||||||
|
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.whispersystems.textsecure.internal.util.Base64;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
@ -1,219 +0,0 @@
|
|||||||
package org.whispersystems.textsecure.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Shader;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.graphics.drawable.DrawableContainer;
|
|
||||||
import android.graphics.drawable.StateListDrawable;
|
|
||||||
import android.telephony.TelephonyManager;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.EditText;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class Util {
|
|
||||||
|
|
||||||
public static byte[] combine(byte[]... elements) {
|
|
||||||
try {
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
||||||
|
|
||||||
for (byte[] element : elements) {
|
|
||||||
baos.write(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
return baos.toByteArray();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[][] split(byte[] input, int firstLength, int secondLength) {
|
|
||||||
byte[][] parts = new byte[2][];
|
|
||||||
|
|
||||||
parts[0] = new byte[firstLength];
|
|
||||||
System.arraycopy(input, 0, parts[0], 0, firstLength);
|
|
||||||
|
|
||||||
parts[1] = new byte[secondLength];
|
|
||||||
System.arraycopy(input, firstLength, parts[1], 0, secondLength);
|
|
||||||
|
|
||||||
return parts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[][] split(byte[] input, int firstLength, int secondLength, int thirdLength)
|
|
||||||
throws ParseException
|
|
||||||
{
|
|
||||||
if (input == null || firstLength < 0 || secondLength < 0 || thirdLength < 0 ||
|
|
||||||
input.length < firstLength + secondLength + thirdLength)
|
|
||||||
{
|
|
||||||
throw new ParseException("Input too small: " + (input == null ? null : Hex.toString(input)), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[][] parts = new byte[3][];
|
|
||||||
|
|
||||||
parts[0] = new byte[firstLength];
|
|
||||||
System.arraycopy(input, 0, parts[0], 0, firstLength);
|
|
||||||
|
|
||||||
parts[1] = new byte[secondLength];
|
|
||||||
System.arraycopy(input, firstLength, parts[1], 0, secondLength);
|
|
||||||
|
|
||||||
parts[2] = new byte[thirdLength];
|
|
||||||
System.arraycopy(input, firstLength + secondLength, parts[2], 0, thirdLength);
|
|
||||||
|
|
||||||
return parts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] trim(byte[] input, int length) {
|
|
||||||
byte[] result = new byte[length];
|
|
||||||
System.arraycopy(input, 0, result, 0, result.length);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isEmpty(String value) {
|
|
||||||
return value == null || value.trim().length() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isEmpty(EditText value) {
|
|
||||||
return value == null || value.getText() == null || isEmpty(value.getText().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isEmpty(CharSequence value) {
|
|
||||||
return value == null || value.length() == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getSecret(int size) {
|
|
||||||
byte[] secret = getSecretBytes(size);
|
|
||||||
return Base64.encodeBytes(secret);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] getSecretBytes(int size) {
|
|
||||||
try {
|
|
||||||
byte[] secret = new byte[size];
|
|
||||||
SecureRandom.getInstance("SHA1PRNG").nextBytes(secret);
|
|
||||||
return secret;
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String readFully(File file) throws IOException {
|
|
||||||
return readFully(new FileInputStream(file));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String readFully(InputStream in) throws IOException {
|
|
||||||
ByteArrayOutputStream bout = new ByteArrayOutputStream();
|
|
||||||
byte[] buffer = new byte[4096];
|
|
||||||
int read;
|
|
||||||
|
|
||||||
while ((read = in.read(buffer)) != -1) {
|
|
||||||
bout.write(buffer, 0, read);
|
|
||||||
}
|
|
||||||
|
|
||||||
in.close();
|
|
||||||
|
|
||||||
return new String(bout.toByteArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void readFully(InputStream in, byte[] buffer) throws IOException {
|
|
||||||
int offset = 0;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
int read = in.read(buffer, offset, buffer.length - offset);
|
|
||||||
|
|
||||||
if (read + offset < buffer.length) offset += read;
|
|
||||||
else return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void copy(InputStream in, OutputStream out) throws IOException {
|
|
||||||
byte[] buffer = new byte[4096];
|
|
||||||
int read;
|
|
||||||
|
|
||||||
while ((read = in.read(buffer)) != -1) {
|
|
||||||
out.write(buffer, 0, read);
|
|
||||||
}
|
|
||||||
|
|
||||||
in.close();
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String join(Collection<String> list, String delimiter) {
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
int i=0;
|
|
||||||
|
|
||||||
for (String item : list) {
|
|
||||||
result.append(item);
|
|
||||||
|
|
||||||
if (++i < list.size())
|
|
||||||
result.append(delimiter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<String> split(String source, String delimiter) {
|
|
||||||
List<String> results = new LinkedList<String>();
|
|
||||||
|
|
||||||
if (isEmpty(source)) {
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] elements = source.split(delimiter);
|
|
||||||
|
|
||||||
for (String element : elements) {
|
|
||||||
results.add(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getDeviceE164Number(Context context) {
|
|
||||||
String localNumber = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE))
|
|
||||||
.getLine1Number();
|
|
||||||
|
|
||||||
if (!org.whispersystems.textsecure.util.Util.isEmpty(localNumber) &&
|
|
||||||
!localNumber.startsWith("+"))
|
|
||||||
{
|
|
||||||
if (localNumber.length() == 10) localNumber = "+1" + localNumber;
|
|
||||||
else localNumber = "+" + localNumber;
|
|
||||||
|
|
||||||
return localNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SecureRandom getSecureRandom() {
|
|
||||||
try {
|
|
||||||
return SecureRandom.getInstance("SHA1PRNG");
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* source: http://stackoverflow.com/a/9500334
|
|
||||||
*/
|
|
||||||
public static void fixBackgroundRepeat(Drawable bg) {
|
|
||||||
if (bg != null) {
|
|
||||||
if (bg instanceof BitmapDrawable) {
|
|
||||||
BitmapDrawable bmp = (BitmapDrawable) bg;
|
|
||||||
bmp.mutate();
|
|
||||||
bmp.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -105,10 +105,10 @@ import org.thoughtcrime.securesms.util.EncryptedCharacterCalculator;
|
|||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.whispersystems.libaxolotl.state.SessionStore;
|
import org.whispersystems.libaxolotl.state.SessionStore;
|
||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@ -621,7 +621,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
this.getSupportActionBar().setTitle(title);
|
this.getSupportActionBar().setTitle(title);
|
||||||
getWindow().getDecorView().setContentDescription(getString(R.string.conversation_activity__window_description, title));
|
getWindow().getDecorView().setContentDescription(getString(R.string.conversation_activity__window_description, title));
|
||||||
|
|
||||||
if (subtitle != null && !Util.isEmpty(subtitle))
|
if (subtitle != null && !TextUtils.isEmpty(subtitle))
|
||||||
this.getSupportActionBar().setSubtitle(PhoneNumberUtils.formatNumber(subtitle));
|
this.getSupportActionBar().setSubtitle(PhoneNumberUtils.formatNumber(subtitle));
|
||||||
|
|
||||||
this.supportInvalidateOptionsMenu();
|
this.supportInvalidateOptionsMenu();
|
||||||
|
@ -12,6 +12,7 @@ import android.os.Handler;
|
|||||||
import android.support.v4.app.ListFragment;
|
import android.support.v4.app.ListFragment;
|
||||||
import android.support.v4.app.LoaderManager;
|
import android.support.v4.app.LoaderManager;
|
||||||
import android.support.v4.content.Loader;
|
import android.support.v4.content.Loader;
|
||||||
|
import android.support.v4.widget.CursorAdapter;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v7.app.ActionBarActivity;
|
||||||
import android.support.v7.view.ActionMode;
|
import android.support.v7.view.ActionMode;
|
||||||
import android.text.ClipboardManager;
|
import android.text.ClipboardManager;
|
||||||
@ -22,11 +23,11 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.support.v4.widget.CursorAdapter;
|
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.loaders.ConversationLoader;
|
import org.thoughtcrime.securesms.database.loaders.ConversationLoader;
|
||||||
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
||||||
@ -37,19 +38,10 @@ import org.thoughtcrime.securesms.recipients.Recipients;
|
|||||||
import org.thoughtcrime.securesms.sms.MessageSender;
|
import org.thoughtcrime.securesms.sms.MessageSender;
|
||||||
import org.thoughtcrime.securesms.util.Dialogs;
|
import org.thoughtcrime.securesms.util.Dialogs;
|
||||||
import org.thoughtcrime.securesms.util.DirectoryHelper;
|
import org.thoughtcrime.securesms.util.DirectoryHelper;
|
||||||
|
import org.thoughtcrime.securesms.util.FutureTaskListener;
|
||||||
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
|
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
|
||||||
import org.thoughtcrime.securesms.util.SaveAttachmentTask.Attachment;
|
import org.thoughtcrime.securesms.util.SaveAttachmentTask.Attachment;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
|
||||||
import org.whispersystems.textsecure.util.FutureTaskListener;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
import java.sql.Date;
|
import java.sql.Date;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ import org.thoughtcrime.securesms.util.Util;
|
|||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.thoughtcrime.securesms.database.TextSecureDirectory;
|
import org.thoughtcrime.securesms.database.TextSecureDirectory;
|
||||||
import org.thoughtcrime.securesms.database.NotInDirectoryException;
|
import org.thoughtcrime.securesms.database.NotInDirectoryException;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
@ -23,8 +23,8 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
import org.thoughtcrime.securesms.util.Dialogs;
|
import org.thoughtcrime.securesms.util.Dialogs;
|
||||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@ import org.thoughtcrime.securesms.crypto.MasterSecret;
|
|||||||
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
||||||
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.thoughtcrime.securesms.util.VersionTracker;
|
import org.thoughtcrime.securesms.util.VersionTracker;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activity for creating a user's local encryption passphrase.
|
* Activity for creating a user's local encryption passphrase.
|
||||||
|
@ -43,7 +43,7 @@ import org.thoughtcrime.securesms.crypto.InvalidPassphraseException;
|
|||||||
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
||||||
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activity that prompts for a user's passphrase.
|
* Activity that prompts for a user's passphrase.
|
||||||
|
@ -43,6 +43,7 @@ import org.thoughtcrime.securesms.sms.IncomingIdentityUpdateMessage;
|
|||||||
import org.thoughtcrime.securesms.sms.IncomingKeyExchangeMessage;
|
import org.thoughtcrime.securesms.sms.IncomingKeyExchangeMessage;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingPreKeyBundleMessage;
|
import org.thoughtcrime.securesms.sms.IncomingPreKeyBundleMessage;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
import org.thoughtcrime.securesms.util.MemoryCleaner;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
@ -54,7 +55,6 @@ import org.whispersystems.libaxolotl.protocol.PreKeyWhisperMessage;
|
|||||||
import org.whispersystems.libaxolotl.state.IdentityKeyStore;
|
import org.whispersystems.libaxolotl.state.IdentityKeyStore;
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import android.os.Bundle;
|
|||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v7.app.ActionBarActivity;
|
||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
@ -28,8 +29,8 @@ import com.google.i18n.phonenumbers.Phonenumber;
|
|||||||
import org.thoughtcrime.securesms.util.Dialogs;
|
import org.thoughtcrime.securesms.util.Dialogs;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The register account activity. Prompts ths user for their registration information
|
* The register account activity. Prompts ths user for their registration information
|
||||||
@ -88,7 +89,7 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initializeSpinner() {
|
private void initializeSpinner() {
|
||||||
this.countrySpinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
|
this.countrySpinnerAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item);
|
||||||
this.countrySpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
this.countrySpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||||
|
|
||||||
setCountryDisplay(getString(R.string.RegistrationActivity_select_your_country));
|
setCountryDisplay(getString(R.string.RegistrationActivity_select_your_country));
|
||||||
@ -108,10 +109,10 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
|
|
||||||
private void initializeNumber() {
|
private void initializeNumber() {
|
||||||
PhoneNumberUtil numberUtil = PhoneNumberUtil.getInstance();
|
PhoneNumberUtil numberUtil = PhoneNumberUtil.getInstance();
|
||||||
String localNumber = org.whispersystems.textsecure.util.Util.getDeviceE164Number(this);
|
String localNumber = Util.getDeviceE164Number(this);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!Util.isEmpty(localNumber)) {
|
if (!TextUtils.isEmpty(localNumber)) {
|
||||||
Phonenumber.PhoneNumber localNumberObject = numberUtil.parse(localNumber, null);
|
Phonenumber.PhoneNumber localNumberObject = numberUtil.parse(localNumber, null);
|
||||||
|
|
||||||
if (localNumberObject != null) {
|
if (localNumberObject != null) {
|
||||||
@ -121,7 +122,7 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
} else {
|
} else {
|
||||||
String simCountryIso = ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).getSimCountryIso();
|
String simCountryIso = ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).getSimCountryIso();
|
||||||
|
|
||||||
if (!Util.isEmpty(simCountryIso)) {
|
if (!TextUtils.isEmpty(simCountryIso)) {
|
||||||
this.countryCode.setText(numberUtil.getCountryCodeForRegion(simCountryIso.toUpperCase())+"");
|
this.countryCode.setText(numberUtil.getCountryCodeForRegion(simCountryIso.toUpperCase())+"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,14 +156,14 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
|
|
||||||
TextSecurePreferences.setPromptedPushRegistration(self, true);
|
TextSecurePreferences.setPromptedPushRegistration(self, true);
|
||||||
|
|
||||||
if (Util.isEmpty(countryCode.getText())) {
|
if (TextUtils.isEmpty(countryCode.getText())) {
|
||||||
Toast.makeText(self,
|
Toast.makeText(self,
|
||||||
getString(R.string.RegistrationActivity_you_must_specify_your_country_code),
|
getString(R.string.RegistrationActivity_you_must_specify_your_country_code),
|
||||||
Toast.LENGTH_LONG).show();
|
Toast.LENGTH_LONG).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Util.isEmpty(number.getText())) {
|
if (TextUtils.isEmpty(number.getText())) {
|
||||||
Toast.makeText(self,
|
Toast.makeText(self,
|
||||||
getString(R.string.RegistrationActivity_you_must_specify_your_phone_number),
|
getString(R.string.RegistrationActivity_you_must_specify_your_phone_number),
|
||||||
Toast.LENGTH_LONG).show();
|
Toast.LENGTH_LONG).show();
|
||||||
@ -213,7 +214,7 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
private class CountryCodeChangedListener implements TextWatcher {
|
private class CountryCodeChangedListener implements TextWatcher {
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable s) {
|
public void afterTextChanged(Editable s) {
|
||||||
if (Util.isEmpty(s)) {
|
if (TextUtils.isEmpty(s)) {
|
||||||
setCountryDisplay(getString(R.string.RegistrationActivity_select_your_country));
|
setCountryDisplay(getString(R.string.RegistrationActivity_select_your_country));
|
||||||
countryFormatter = null;
|
countryFormatter = null;
|
||||||
return;
|
return;
|
||||||
@ -225,7 +226,7 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
setCountryFormatter(countryCode);
|
setCountryFormatter(countryCode);
|
||||||
setCountryDisplay(PhoneNumberFormatter.getRegionDisplayName(regionCode));
|
setCountryDisplay(PhoneNumberFormatter.getRegionDisplayName(regionCode));
|
||||||
|
|
||||||
if (!Util.isEmpty(regionCode) && !regionCode.equals("ZZ")) {
|
if (!TextUtils.isEmpty(regionCode) && !regionCode.equals("ZZ")) {
|
||||||
number.requestFocus();
|
number.requestFocus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -246,7 +247,7 @@ public class RegistrationActivity extends ActionBarActivity {
|
|||||||
if (countryFormatter == null)
|
if (countryFormatter == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (Util.isEmpty(s))
|
if (TextUtils.isEmpty(s))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
countryFormatter.clear();
|
countryFormatter.clear();
|
||||||
|
@ -16,6 +16,7 @@ import android.os.Message;
|
|||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v7.app.ActionBarActivity;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.method.LinkMovementMethod;
|
import android.text.method.LinkMovementMethod;
|
||||||
import android.text.style.ClickableSpan;
|
import android.text.style.ClickableSpan;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@ -35,11 +36,11 @@ import org.thoughtcrime.securesms.push.TextSecureCommunicationFactory;
|
|||||||
import org.thoughtcrime.securesms.service.RegistrationService;
|
import org.thoughtcrime.securesms.service.RegistrationService;
|
||||||
import org.thoughtcrime.securesms.util.Dialogs;
|
import org.thoughtcrime.securesms.util.Dialogs;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
||||||
import org.whispersystems.textsecure.push.exceptions.ExpectationFailedException;
|
import org.whispersystems.textsecure.push.exceptions.ExpectationFailedException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.RateLimitException;
|
import org.whispersystems.textsecure.push.exceptions.RateLimitException;
|
||||||
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
|
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -461,7 +462,7 @@ public class RegistrationProgressActivity extends ActionBarActivity {
|
|||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
final String code = codeEditText.getText().toString();
|
final String code = codeEditText.getText().toString();
|
||||||
|
|
||||||
if (Util.isEmpty(code)) {
|
if (TextUtils.isEmpty(code)) {
|
||||||
Toast.makeText(context,
|
Toast.makeText(context,
|
||||||
getString(R.string.RegistrationProgressActivity_you_must_enter_the_code_you_received_first),
|
getString(R.string.RegistrationProgressActivity_you_must_enter_the_code_you_received_first),
|
||||||
Toast.LENGTH_LONG).show();
|
Toast.LENGTH_LONG).show();
|
||||||
|
@ -26,12 +26,12 @@ import android.database.sqlite.SQLiteDatabase;
|
|||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.util.NumberUtil;
|
import org.thoughtcrime.securesms.util.NumberUtil;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -108,7 +108,7 @@ public class ContactsDatabase {
|
|||||||
androidCursor = null;
|
androidCursor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (includeAndroidContacts && !Util.isEmpty(filter) && NumberUtil.isValidSmsOrEmail(filter)) {
|
if (includeAndroidContacts && !TextUtils.isEmpty(filter) && NumberUtil.isValidSmsOrEmail(filter)) {
|
||||||
newNumberCursor = new MatrixCursor(CONTACTS_PROJECTION, 1);
|
newNumberCursor = new MatrixCursor(CONTACTS_PROJECTION, 1);
|
||||||
newNumberCursor.addRow(new Object[]{-1L, context.getString(R.string.contact_selection_list__unknown_contact),
|
newNumberCursor.addRow(new Object[]{-1L, context.getString(R.string.contact_selection_list__unknown_contact),
|
||||||
ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM, "\u21e2", filter, NORMAL_TYPE});
|
ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM, "\u21e2", filter, NORMAL_TYPE});
|
||||||
@ -130,7 +130,7 @@ public class ContactsDatabase {
|
|||||||
|
|
||||||
private Cursor queryAndroidDb(String filter) {
|
private Cursor queryAndroidDb(String filter) {
|
||||||
final Uri baseUri;
|
final Uri baseUri;
|
||||||
if (!Util.isEmpty(filter)) {
|
if (!TextUtils.isEmpty(filter)) {
|
||||||
baseUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI,
|
baseUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI,
|
||||||
Uri.encode(filter));
|
Uri.encode(filter));
|
||||||
} else {
|
} else {
|
||||||
@ -144,7 +144,7 @@ public class ContactsDatabase {
|
|||||||
final String selection;
|
final String selection;
|
||||||
final String[] selectionArgs;
|
final String[] selectionArgs;
|
||||||
final String fuzzyFilter = "%" + filter + "%";
|
final String fuzzyFilter = "%" + filter + "%";
|
||||||
if (!Util.isEmpty(filter)) {
|
if (!TextUtils.isEmpty(filter)) {
|
||||||
selection = FILTER_SELECTION;
|
selection = FILTER_SELECTION;
|
||||||
selectionArgs = new String[]{fuzzyFilter, fuzzyFilter};
|
selectionArgs = new String[]{fuzzyFilter, fuzzyFilter};
|
||||||
} else {
|
} else {
|
||||||
|
@ -17,15 +17,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.thoughtcrime.securesms.crypto;
|
package org.thoughtcrime.securesms.crypto;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
import org.thoughtcrime.securesms.util.Conversions;
|
import org.thoughtcrime.securesms.util.Conversions;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
@ -73,11 +73,9 @@ public class AsymmetricMasterCipher {
|
|||||||
byte[] decryptedBody = masterCipher.decryptBytes(parts[1]);
|
byte[] decryptedBody = masterCipher.decryptBytes(parts[1]);
|
||||||
|
|
||||||
return new String(decryptedBody);
|
return new String(decryptedBody);
|
||||||
} catch (InvalidKeyException ike) {
|
} catch (InvalidKeyException | InvalidMessageException ike) {
|
||||||
throw new InvalidMessageException(ike);
|
throw new InvalidMessageException(ike);
|
||||||
} catch (InvalidMessageException e) {
|
}
|
||||||
throw new InvalidMessageException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String encryptBody(String body) {
|
public String encryptBody(String body) {
|
||||||
@ -127,9 +125,7 @@ public class AsymmetricMasterCipher {
|
|||||||
Mac mac = Mac.getInstance("HmacSHA256");
|
Mac mac = Mac.getInstance("HmacSHA256");
|
||||||
mac.init(new SecretKeySpec(secretBytes, "HmacSHA256"));
|
mac.init(new SecretKeySpec(secretBytes, "HmacSHA256"));
|
||||||
return mac.doFinal(Conversions.intToByteArray(iteration));
|
return mac.doFinal(Conversions.intToByteArray(iteration));
|
||||||
} catch (NoSuchAlgorithmException e) {
|
} catch (NoSuchAlgorithmException | java.security.InvalidKeyException e) {
|
||||||
throw new AssertionError(e);
|
|
||||||
} catch (java.security.InvalidKeyException e) {
|
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,13 +22,13 @@ import android.content.SharedPreferences;
|
|||||||
import android.content.SharedPreferences.Editor;
|
import android.content.SharedPreferences.Editor;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -78,9 +78,7 @@ public class IdentityKeyUtil {
|
|||||||
ECPrivateKey privateKey = masterCipher.decryptKey(Base64.decode(retrieve(context, IDENTITY_PRIVATE_KEY_DJB_PREF)));
|
ECPrivateKey privateKey = masterCipher.decryptKey(Base64.decode(retrieve(context, IDENTITY_PRIVATE_KEY_DJB_PREF)));
|
||||||
|
|
||||||
return new IdentityKeyPair(publicKey, privateKey);
|
return new IdentityKeyPair(publicKey, privateKey);
|
||||||
} catch (IOException e) {
|
} catch (IOException | InvalidKeyException e) {
|
||||||
throw new AssertionError(e);
|
|
||||||
} catch (InvalidKeyException e) {
|
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore;
|
|||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.sms.MessageSender;
|
import org.thoughtcrime.securesms.sms.MessageSender;
|
||||||
import org.thoughtcrime.securesms.sms.OutgoingKeyExchangeMessage;
|
import org.thoughtcrime.securesms.sms.OutgoingKeyExchangeMessage;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.Dialogs;
|
import org.thoughtcrime.securesms.util.Dialogs;
|
||||||
import org.whispersystems.libaxolotl.SessionBuilder;
|
import org.whispersystems.libaxolotl.SessionBuilder;
|
||||||
import org.whispersystems.libaxolotl.protocol.KeyExchangeMessage;
|
import org.whispersystems.libaxolotl.protocol.KeyExchangeMessage;
|
||||||
@ -37,7 +38,6 @@ import org.whispersystems.libaxolotl.state.SessionRecord;
|
|||||||
import org.whispersystems.libaxolotl.state.SessionStore;
|
import org.whispersystems.libaxolotl.state.SessionStore;
|
||||||
import org.whispersystems.libaxolotl.state.SignedPreKeyStore;
|
import org.whispersystems.libaxolotl.state.SignedPreKeyStore;
|
||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
public class KeyExchangeInitiator {
|
public class KeyExchangeInitiator {
|
||||||
|
|
||||||
|
@ -19,11 +19,11 @@ package org.thoughtcrime.securesms.crypto;
|
|||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
import org.thoughtcrime.securesms.util.Hex;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
import org.whispersystems.textsecure.util.Hex;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.GeneralSecurityException;
|
||||||
@ -65,10 +65,8 @@ public class MasterCipher {
|
|||||||
this.encryptingCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
this.encryptingCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
this.decryptingCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
this.decryptingCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
this.hmac = Mac.getInstance("HmacSHA1");
|
this.hmac = Mac.getInstance("HmacSHA1");
|
||||||
} catch (NoSuchPaddingException nspe) {
|
} catch (NoSuchPaddingException | NoSuchAlgorithmException nspe) {
|
||||||
throw new AssertionError(nspe);
|
throw new AssertionError(nspe);
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,15 +19,16 @@ package org.thoughtcrime.securesms.crypto;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
import org.whispersystems.libaxolotl.ecc.ECPrivateKey;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.GeneralSecurityException;
|
||||||
@ -143,10 +144,8 @@ public class MasterSecretUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new AsymmetricMasterSecret(djbPublicKey, djbPrivateKey);
|
return new AsymmetricMasterSecret(djbPublicKey, djbPrivateKey);
|
||||||
} catch (InvalidKeyException ike) {
|
} catch (InvalidKeyException | IOException ike) {
|
||||||
throw new AssertionError(ike);
|
throw new AssertionError(ike);
|
||||||
} catch (IOException e) {
|
|
||||||
throw new AssertionError(e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,8 +230,8 @@ public class MasterSecretUtil {
|
|||||||
SharedPreferences settings = context.getSharedPreferences(PREFERENCES_NAME, 0);
|
SharedPreferences settings = context.getSharedPreferences(PREFERENCES_NAME, 0);
|
||||||
String encodedValue = settings.getString(key, "");
|
String encodedValue = settings.getString(key, "");
|
||||||
|
|
||||||
if (Util.isEmpty(encodedValue)) return null;
|
if (TextUtils.isEmpty(encodedValue)) return null;
|
||||||
else return Base64.decode(encodedValue);
|
else return Base64.decode(encodedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int retrieve(Context context, String key, int defaultValue) throws IOException {
|
private static int retrieve(Context context, String key, int defaultValue) throws IOException {
|
||||||
|
@ -8,6 +8,7 @@ import org.thoughtcrime.securesms.protocol.WirePrefix;
|
|||||||
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.whispersystems.libaxolotl.LegacyMessageException;
|
import org.whispersystems.libaxolotl.LegacyMessageException;
|
||||||
@ -18,7 +19,6 @@ import org.whispersystems.libaxolotl.protocol.WhisperMessage;
|
|||||||
import org.whispersystems.libaxolotl.state.AxolotlStore;
|
import org.whispersystems.libaxolotl.state.AxolotlStore;
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import android.util.Log;
|
|||||||
import com.google.thoughtcrimegson.Gson;
|
import com.google.thoughtcrimegson.Gson;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.crypto.storage.TextSecurePreKeyStore;
|
import org.thoughtcrime.securesms.crypto.storage.TextSecurePreKeyStore;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyIdException;
|
import org.whispersystems.libaxolotl.InvalidKeyIdException;
|
||||||
@ -34,7 +35,6 @@ import org.whispersystems.libaxolotl.state.SignedPreKeyStore;
|
|||||||
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
||||||
import org.whispersystems.libaxolotl.state.PreKeyStore;
|
import org.whispersystems.libaxolotl.state.PreKeyStore;
|
||||||
import org.whispersystems.libaxolotl.util.Medium;
|
import org.whispersystems.libaxolotl.util.Medium;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
@ -19,12 +19,12 @@ package org.thoughtcrime.securesms.crypto;
|
|||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Hex;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||||
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
|
||||||
import org.thoughtcrime.securesms.util.Conversions;
|
import org.thoughtcrime.securesms.util.Conversions;
|
||||||
import org.whispersystems.textsecure.util.Hex;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
@ -26,7 +26,7 @@ import android.util.Log;
|
|||||||
import org.thoughtcrime.securesms.mms.ApnUnavailableException;
|
import org.thoughtcrime.securesms.mms.ApnUnavailableException;
|
||||||
import org.thoughtcrime.securesms.mms.MmsConnection.Apn;
|
import org.thoughtcrime.securesms.mms.MmsConnection.Apn;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
@ -23,11 +23,11 @@ import android.database.sqlite.SQLiteDatabase;
|
|||||||
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.telephony.PhoneNumberUtils;
|
import android.telephony.PhoneNumberUtils;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.VisibleForTesting;
|
import org.thoughtcrime.securesms.util.VisibleForTesting;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -201,7 +201,7 @@ public class CanonicalAddressDatabase {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
final String networkNumber = PhoneNumberUtils.extractNetworkPortion(number);
|
final String networkNumber = PhoneNumberUtils.extractNetworkPortion(number);
|
||||||
if (Util.isEmpty(networkNumber))
|
if (TextUtils.isEmpty(networkNumber))
|
||||||
return false;
|
return false;
|
||||||
if (networkNumber.length() < 3)
|
if (networkNumber.length() < 3)
|
||||||
return false;
|
return false;
|
||||||
|
@ -22,6 +22,7 @@ import android.database.Cursor;
|
|||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.DatabaseUpgradeActivity;
|
import org.thoughtcrime.securesms.DatabaseUpgradeActivity;
|
||||||
@ -30,10 +31,10 @@ import org.thoughtcrime.securesms.crypto.MasterCipher;
|
|||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
||||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
@ -290,7 +291,7 @@ public class DatabaseFactory {
|
|||||||
long snippetType = threadCursor.getLong(threadCursor.getColumnIndexOrThrow("snippet_type"));
|
long snippetType = threadCursor.getLong(threadCursor.getColumnIndexOrThrow("snippet_type"));
|
||||||
long id = threadCursor.getLong(threadCursor.getColumnIndexOrThrow("_id"));
|
long id = threadCursor.getLong(threadCursor.getColumnIndexOrThrow("_id"));
|
||||||
|
|
||||||
if (!Util.isEmpty(snippet)) {
|
if (!TextUtils.isEmpty(snippet)) {
|
||||||
snippet = masterCipher.decryptBody(snippet);
|
snippet = masterCipher.decryptBody(snippet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,7 +380,7 @@ public class DatabaseFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Util.isEmpty(body)) {
|
if (!TextUtils.isEmpty(body)) {
|
||||||
body = masterCipher.encryptBody(body);
|
body = masterCipher.encryptBody(body);
|
||||||
db.execSQL("UPDATE mms SET body = ?, part_count = ? WHERE _id = ?",
|
db.execSQL("UPDATE mms SET body = ?, part_count = ? WHERE _id = ?",
|
||||||
new String[] {body, partCount+"", mmsId+""});
|
new String[] {body, partCount+"", mmsId+""});
|
||||||
@ -666,7 +667,7 @@ public class DatabaseFactory {
|
|||||||
long mmsId = cursor.getLong(cursor.getColumnIndexOrThrow("mms_id"));
|
long mmsId = cursor.getLong(cursor.getColumnIndexOrThrow("mms_id"));
|
||||||
String address = cursor.getString(cursor.getColumnIndexOrThrow("address"));
|
String address = cursor.getString(cursor.getColumnIndexOrThrow("address"));
|
||||||
|
|
||||||
if (!Util.isEmpty(address)) {
|
if (!TextUtils.isEmpty(address)) {
|
||||||
db.execSQL("UPDATE mms SET address = ? WHERE _id = ?", new String[]{address, mmsId+""});
|
db.execSQL("UPDATE mms SET address = ? WHERE _id = ?", new String[]{address, mmsId+""});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,8 @@ import org.thoughtcrime.securesms.recipients.Recipients;
|
|||||||
import org.thoughtcrime.securesms.util.BitmapUtil;
|
import org.thoughtcrime.securesms.util.BitmapUtil;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentPointer;
|
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentPointer;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
@ -200,7 +200,7 @@ public class GroupDatabase extends Database {
|
|||||||
return Util.split(cursor.getString(cursor.getColumnIndexOrThrow(MEMBERS)), ",");
|
return Util.split(cursor.getString(cursor.getColumnIndexOrThrow(MEMBERS)), ",");
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LinkedList<String>();
|
return new LinkedList<>();
|
||||||
} finally {
|
} finally {
|
||||||
if (cursor != null)
|
if (cursor != null)
|
||||||
cursor.close();
|
cursor.close();
|
||||||
|
@ -26,11 +26,11 @@ import android.util.Log;
|
|||||||
|
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -23,17 +23,13 @@ import android.database.sqlite.SQLiteDatabase;
|
|||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage;
|
|
||||||
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
|
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
|
||||||
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
import org.thoughtcrime.securesms.database.model.DisplayRecord;
|
import org.thoughtcrime.securesms.database.model.DisplayRecord;
|
||||||
@ -41,6 +37,8 @@ import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
|||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord;
|
import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord;
|
||||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||||
|
import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage;
|
||||||
|
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
|
||||||
import org.thoughtcrime.securesms.mms.PartParser;
|
import org.thoughtcrime.securesms.mms.PartParser;
|
||||||
import org.thoughtcrime.securesms.mms.SlideDeck;
|
import org.thoughtcrime.securesms.mms.SlideDeck;
|
||||||
import org.thoughtcrime.securesms.mms.TextSlide;
|
import org.thoughtcrime.securesms.mms.TextSlide;
|
||||||
@ -48,12 +46,15 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
|||||||
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.LRUCache;
|
import org.thoughtcrime.securesms.util.LRUCache;
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
|
||||||
import org.thoughtcrime.securesms.util.ListenableFutureTask;
|
import org.thoughtcrime.securesms.util.ListenableFutureTask;
|
||||||
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.thoughtcrime.securesms.util.Trimmer;
|
import org.thoughtcrime.securesms.util.Trimmer;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.lang.ref.SoftReference;
|
import java.lang.ref.SoftReference;
|
||||||
@ -481,9 +482,9 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
PduBody body = getPartsAsBody(partDatabase.getParts(messageId, true));
|
PduBody body = getPartsAsBody(partDatabase.getParts(messageId, true));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!Util.isEmpty(messageText) && Types.isSymmetricEncryption(outboxType)) {
|
if (!TextUtils.isEmpty(messageText) && Types.isSymmetricEncryption(outboxType)) {
|
||||||
body.addPart(new TextSlide(context, masterCipher.decryptBody(messageText)).getPart());
|
body.addPart(new TextSlide(context, masterCipher.decryptBody(messageText)).getPart());
|
||||||
} else if (!Util.isEmpty(messageText)) {
|
} else if (!TextUtils.isEmpty(messageText)) {
|
||||||
body.addPart(new TextSlide(context, messageText).getPart());
|
body.addPart(new TextSlide(context, messageText).getPart());
|
||||||
}
|
}
|
||||||
} catch (InvalidMessageException e) {
|
} catch (InvalidMessageException e) {
|
||||||
@ -708,7 +709,7 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
String messageText = PartParser.getMessageText(body);
|
String messageText = PartParser.getMessageText(body);
|
||||||
body = PartParser.getNonTextParts(body);
|
body = PartParser.getNonTextParts(body);
|
||||||
|
|
||||||
if (!Util.isEmpty(messageText)) {
|
if (!TextUtils.isEmpty(messageText)) {
|
||||||
contentValues.put(BODY, new MasterCipher(masterSecret).encryptBody(messageText));
|
contentValues.put(BODY, new MasterCipher(masterSecret).encryptBody(messageText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -808,8 +809,8 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
|
|
||||||
public Cursor getCarrierMmsInformation(String apn) {
|
public Cursor getCarrierMmsInformation(String apn) {
|
||||||
Uri uri = Uri.withAppendedPath(Uri.parse("content://telephony/carriers"), "current");
|
Uri uri = Uri.withAppendedPath(Uri.parse("content://telephony/carriers"), "current");
|
||||||
String selection = Util.isEmpty(apn) ? null : "apn = ?";
|
String selection = TextUtils.isEmpty(apn) ? null : "apn = ?";
|
||||||
String[] selectionArgs = Util.isEmpty(apn) ? null : new String[] {apn.trim()};
|
String[] selectionArgs = TextUtils.isEmpty(apn) ? null : new String[] {apn.trim()};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return context.getContentResolver().query(uri, null, selection, selectionArgs, null);
|
return context.getContentResolver().query(uri, null, selection, selectionArgs, null);
|
||||||
@ -981,10 +982,10 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
byte[]contentLocationBytes = null;
|
byte[]contentLocationBytes = null;
|
||||||
byte[]transactionIdBytes = null;
|
byte[]transactionIdBytes = null;
|
||||||
|
|
||||||
if (!Util.isEmpty(contentLocation))
|
if (!TextUtils.isEmpty(contentLocation))
|
||||||
contentLocationBytes = org.thoughtcrime.securesms.util.Util.toIsoBytes(contentLocation);
|
contentLocationBytes = org.thoughtcrime.securesms.util.Util.toIsoBytes(contentLocation);
|
||||||
|
|
||||||
if (!Util.isEmpty(transactionId))
|
if (!TextUtils.isEmpty(transactionId))
|
||||||
transactionIdBytes = org.thoughtcrime.securesms.util.Util.toIsoBytes(transactionId);
|
transactionIdBytes = org.thoughtcrime.securesms.util.Util.toIsoBytes(transactionId);
|
||||||
|
|
||||||
|
|
||||||
@ -1016,7 +1017,7 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
|
|
||||||
private Recipients getRecipientsFor(String address) {
|
private Recipients getRecipientsFor(String address) {
|
||||||
try {
|
try {
|
||||||
if (Util.isEmpty(address) || address.equals("insert-address-token")) {
|
if (TextUtils.isEmpty(address) || address.equals("insert-address-token")) {
|
||||||
return new Recipients(Recipient.getUnknownRecipient(context));
|
return new Recipients(Recipient.getUnknownRecipient(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1038,9 +1039,9 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.BODY));
|
String body = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.BODY));
|
||||||
long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX));
|
long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX));
|
||||||
|
|
||||||
if (!Util.isEmpty(body) && masterCipher != null && Types.isSymmetricEncryption(box)) {
|
if (!TextUtils.isEmpty(body) && masterCipher != null && Types.isSymmetricEncryption(box)) {
|
||||||
return new DisplayRecord.Body(masterCipher.decryptBody(body), true);
|
return new DisplayRecord.Body(masterCipher.decryptBody(body), true);
|
||||||
} else if (!Util.isEmpty(body) && masterCipher == null && Types.isSymmetricEncryption(box)) {
|
} else if (!TextUtils.isEmpty(body) && masterCipher == null && Types.isSymmetricEncryption(box)) {
|
||||||
return new DisplayRecord.Body(body, false);
|
return new DisplayRecord.Body(body, false);
|
||||||
} else {
|
} else {
|
||||||
return new DisplayRecord.Body(body == null ? "" : body, true);
|
return new DisplayRecord.Body(body == null ? "" : body, true);
|
||||||
|
@ -6,8 +6,8 @@ import android.database.Cursor;
|
|||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import android.database.sqlite.SQLiteDatabase;
|
|||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.database.sqlite.SQLiteStatement;
|
import android.database.sqlite.SQLiteStatement;
|
||||||
import android.telephony.PhoneNumberUtils;
|
import android.telephony.PhoneNumberUtils;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
@ -37,11 +38,8 @@ import org.thoughtcrime.securesms.sms.IncomingKeyExchangeMessage;
|
|||||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
||||||
import org.thoughtcrime.securesms.util.Trimmer;
|
import org.thoughtcrime.securesms.util.Trimmer;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.thoughtcrime.securesms.util.Util.canonicalizeNumber;
|
import static org.thoughtcrime.securesms.util.Util.canonicalizeNumber;
|
||||||
@ -401,7 +399,7 @@ public class SmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
values.put(PROTOCOL, message.getProtocol());
|
values.put(PROTOCOL, message.getProtocol());
|
||||||
values.put(READ, unread ? 0 : 1);
|
values.put(READ, unread ? 0 : 1);
|
||||||
|
|
||||||
if (!Util.isEmpty(message.getPseudoSubject()))
|
if (!TextUtils.isEmpty(message.getPseudoSubject()))
|
||||||
values.put(SUBJECT, message.getPseudoSubject());
|
values.put(SUBJECT, message.getPseudoSubject());
|
||||||
|
|
||||||
values.put(REPLY_PATH_PRESENT, message.isReplyPathPresent());
|
values.put(REPLY_PATH_PRESENT, message.isReplyPathPresent());
|
||||||
|
@ -10,8 +10,8 @@ import android.provider.ContactsContract.CommonDataKinds.Phone;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
|
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -21,8 +21,10 @@ import android.content.Context;
|
|||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
||||||
import org.thoughtcrime.securesms.database.model.DisplayRecord;
|
import org.thoughtcrime.securesms.database.model.DisplayRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.ThreadRecord;
|
import org.thoughtcrime.securesms.database.model.ThreadRecord;
|
||||||
@ -30,8 +32,6 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
|||||||
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -451,9 +451,9 @@ public class ThreadDatabase extends Database {
|
|||||||
long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE));
|
long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE));
|
||||||
String body = cursor.getString(cursor.getColumnIndexOrThrow(SNIPPET));
|
String body = cursor.getString(cursor.getColumnIndexOrThrow(SNIPPET));
|
||||||
|
|
||||||
if (!Util.isEmpty(body) && masterCipher != null && MmsSmsColumns.Types.isSymmetricEncryption(type)) {
|
if (!TextUtils.isEmpty(body) && masterCipher != null && MmsSmsColumns.Types.isSymmetricEncryption(type)) {
|
||||||
return new DisplayRecord.Body(masterCipher.decryptBody(body), true);
|
return new DisplayRecord.Body(masterCipher.decryptBody(body), true);
|
||||||
} else if (!Util.isEmpty(body) && masterCipher == null && MmsSmsColumns.Types.isSymmetricEncryption(type)) {
|
} else if (!TextUtils.isEmpty(body) && masterCipher == null && MmsSmsColumns.Types.isSymmetricEncryption(type)) {
|
||||||
return new DisplayRecord.Body(body, false);
|
return new DisplayRecord.Body(body, false);
|
||||||
} else {
|
} else {
|
||||||
return new DisplayRecord.Body(body, true);
|
return new DisplayRecord.Body(body, true);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.thoughtcrime.securesms.database;
|
package org.thoughtcrime.securesms.database;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
import org.xmlpull.v1.XmlPullParserFactory;
|
import org.xmlpull.v1.XmlPullParserFactory;
|
||||||
@ -198,7 +199,7 @@ public class XmlBackup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String escapeXML(String s) {
|
private String escapeXML(String s) {
|
||||||
if (Util.isEmpty(s)) return s;
|
if (TextUtils.isEmpty(s)) return s;
|
||||||
|
|
||||||
Matcher matcher = PATTERN.matcher( s.replace("&", "&")
|
Matcher matcher = PATTERN.matcher( s.replace("&", "&")
|
||||||
.replace("<", "<")
|
.replace("<", "<")
|
||||||
|
@ -13,7 +13,7 @@ import android.support.v4.content.AsyncTaskLoader;
|
|||||||
|
|
||||||
|
|
||||||
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
||||||
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
|
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
|
||||||
|
|
||||||
public class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, String>>> {
|
public class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, String>>> {
|
||||||
|
|
||||||
|
@ -26,8 +26,6 @@ import org.thoughtcrime.securesms.database.SmsDatabase;
|
|||||||
import org.thoughtcrime.securesms.protocol.Tag;
|
import org.thoughtcrime.securesms.protocol.Tag;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The message record model which represents standard SMS messages.
|
* The message record model which represents standard SMS messages.
|
||||||
|
@ -19,6 +19,7 @@ package org.thoughtcrime.securesms.database.model;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.style.StyleSpan;
|
import android.text.style.StyleSpan;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
@ -26,7 +27,6 @@ import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
|||||||
import org.thoughtcrime.securesms.database.SmsDatabase;
|
import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The message record model which represents thread heading messages.
|
* The message record model which represents thread heading messages.
|
||||||
@ -73,7 +73,7 @@ public class ThreadRecord extends DisplayRecord {
|
|||||||
} else if (MmsSmsColumns.Types.isLegacyType(type)) {
|
} else if (MmsSmsColumns.Types.isLegacyType(type)) {
|
||||||
return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported));
|
return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported));
|
||||||
} else {
|
} else {
|
||||||
if (Util.isEmpty(getBody().getBody())) {
|
if (TextUtils.isEmpty(getBody().getBody())) {
|
||||||
return new SpannableString(context.getString(R.string.MessageNotifier_no_subject));
|
return new SpannableString(context.getString(R.string.MessageNotifier_no_subject));
|
||||||
} else {
|
} else {
|
||||||
return new SpannableString(getBody().getBody());
|
return new SpannableString(getBody().getBody());
|
||||||
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.gcm;
|
|||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.google.android.gms.gcm.GoogleCloudMessaging;
|
import com.google.android.gms.gcm.GoogleCloudMessaging;
|
||||||
@ -10,7 +11,6 @@ import com.google.android.gms.gcm.GoogleCloudMessaging;
|
|||||||
import org.thoughtcrime.securesms.ApplicationContext;
|
import org.thoughtcrime.securesms.ApplicationContext;
|
||||||
import org.thoughtcrime.securesms.jobs.PushReceiveJob;
|
import org.thoughtcrime.securesms.jobs.PushReceiveJob;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
public class GcmBroadcastReceiver extends BroadcastReceiver {
|
public class GcmBroadcastReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
@ -32,8 +32,8 @@ public class GcmBroadcastReceiver extends BroadcastReceiver {
|
|||||||
String messageData = intent.getStringExtra("message");
|
String messageData = intent.getStringExtra("message");
|
||||||
String receiptData = intent.getStringExtra("receipt");
|
String receiptData = intent.getStringExtra("receipt");
|
||||||
|
|
||||||
if (!Util.isEmpty(messageData)) handleReceivedMessage(context, messageData);
|
if (!TextUtils.isEmpty(messageData)) handleReceivedMessage(context, messageData);
|
||||||
else if (!Util.isEmpty(receiptData)) handleReceivedMessage(context, receiptData);
|
else if (!TextUtils.isEmpty(receiptData)) handleReceivedMessage(context, receiptData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ import org.thoughtcrime.securesms.jobs.AvatarDownloadJob;
|
|||||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingGroupMessage;
|
import org.thoughtcrime.securesms.sms.IncomingGroupMessage;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureAttachment;
|
import org.whispersystems.textsecure.api.messages.TextSecureAttachment;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.database.EncryptingPartDatabase;
|
|||||||
import org.thoughtcrime.securesms.database.PartDatabase;
|
import org.thoughtcrime.securesms.database.PartDatabase;
|
||||||
import org.thoughtcrime.securesms.dependencies.InjectableType;
|
import org.thoughtcrime.securesms.dependencies.InjectableType;
|
||||||
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
|
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.jobqueue.JobParameters;
|
import org.whispersystems.jobqueue.JobParameters;
|
||||||
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
||||||
@ -19,7 +20,6 @@ import org.whispersystems.textsecure.api.TextSecureMessageReceiver;
|
|||||||
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentPointer;
|
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentPointer;
|
||||||
import org.whispersystems.textsecure.push.exceptions.NonSuccessfulResponseCodeException;
|
import org.whispersystems.textsecure.push.exceptions.NonSuccessfulResponseCodeException;
|
||||||
import org.whispersystems.textsecure.push.exceptions.PushNetworkException;
|
import org.whispersystems.textsecure.push.exceptions.PushNetworkException;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -21,11 +21,11 @@ import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
|||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.thoughtcrime.securesms.transport.InsecureFallbackApprovalException;
|
import org.thoughtcrime.securesms.transport.InsecureFallbackApprovalException;
|
||||||
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
|
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
|
||||||
|
import org.thoughtcrime.securesms.util.Hex;
|
||||||
import org.thoughtcrime.securesms.util.NumberUtil;
|
import org.thoughtcrime.securesms.util.NumberUtil;
|
||||||
import org.whispersystems.jobqueue.JobParameters;
|
import org.whispersystems.jobqueue.JobParameters;
|
||||||
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
||||||
import org.whispersystems.libaxolotl.NoSessionException;
|
import org.whispersystems.libaxolotl.NoSessionException;
|
||||||
import org.whispersystems.textsecure.util.Hex;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.sms.IncomingEncryptedMessage;
|
|||||||
import org.thoughtcrime.securesms.sms.IncomingEndSessionMessage;
|
import org.thoughtcrime.securesms.sms.IncomingEndSessionMessage;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingPreKeyBundleMessage;
|
import org.thoughtcrime.securesms.sms.IncomingPreKeyBundleMessage;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.whispersystems.jobqueue.JobParameters;
|
import org.whispersystems.jobqueue.JobParameters;
|
||||||
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
||||||
@ -43,7 +44,6 @@ import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
|||||||
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
||||||
import org.whispersystems.textsecure.api.crypto.TextSecureCipher;
|
import org.whispersystems.textsecure.api.crypto.TextSecureCipher;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import ws.com.google.android.mms.MmsException;
|
import ws.com.google.android.mms.MmsException;
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
|||||||
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingIdentityUpdateMessage;
|
import org.thoughtcrime.securesms.sms.IncomingIdentityUpdateMessage;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.whispersystems.jobqueue.JobParameters;
|
import org.whispersystems.jobqueue.JobParameters;
|
||||||
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
import org.whispersystems.jobqueue.requirements.NetworkRequirement;
|
||||||
@ -26,8 +27,7 @@ import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
|||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.push.PushMessageProtos;
|
import org.whispersystems.textsecure.push.PushMessageProtos;
|
||||||
import org.whispersystems.textsecure.push.exceptions.EncapsulatedExceptions;
|
import org.whispersystems.textsecure.push.exceptions.EncapsulatedExceptions;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -26,7 +26,7 @@ import org.whispersystems.textsecure.api.messages.TextSecureAttachment;
|
|||||||
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.push.UnregisteredUserException;
|
import org.whispersystems.textsecure.push.UnregisteredUserException;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -17,7 +17,7 @@ import org.whispersystems.textsecure.api.messages.TextSecureAttachment;
|
|||||||
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentStream;
|
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentStream;
|
||||||
import org.thoughtcrime.securesms.database.TextSecureDirectory;
|
import org.thoughtcrime.securesms.database.TextSecureDirectory;
|
||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -24,7 +24,7 @@ import org.whispersystems.textsecure.api.crypto.UntrustedIdentityException;
|
|||||||
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
||||||
import org.whispersystems.textsecure.push.PushAddress;
|
import org.whispersystems.textsecure.push.PushAddress;
|
||||||
import org.whispersystems.textsecure.push.UnregisteredUserException;
|
import org.whispersystems.textsecure.push.UnregisteredUserException;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
package org.thoughtcrime.securesms.mms;
|
package org.thoughtcrime.securesms.mms;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
import org.thoughtcrime.securesms.crypto.MasterCipher;
|
||||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureAttachment;
|
import org.whispersystems.textsecure.api.messages.TextSecureAttachment;
|
||||||
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -56,7 +58,7 @@ public class IncomingMediaMessage {
|
|||||||
this.headers.setLongInteger(sentTimeMillis / 1000, PduHeaders.DATE);
|
this.headers.setLongInteger(sentTimeMillis / 1000, PduHeaders.DATE);
|
||||||
|
|
||||||
|
|
||||||
if (body.isPresent() && !org.whispersystems.textsecure.util.Util.isEmpty(body.get())) {
|
if (body.isPresent() && !TextUtils.isEmpty(body.get())) {
|
||||||
PduPart text = new PduPart();
|
PduPart text = new PduPart();
|
||||||
text.setData(Util.toUtf8Bytes(body.get()));
|
text.setData(Util.toUtf8Bytes(body.get()));
|
||||||
text.setContentType(Util.toIsoBytes("text/plain"));
|
text.setContentType(Util.toIsoBytes("text/plain"));
|
||||||
|
@ -32,7 +32,7 @@ import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
|
|||||||
import org.thoughtcrime.securesms.database.ApnDatabase;
|
import org.thoughtcrime.securesms.database.ApnDatabase;
|
||||||
import org.thoughtcrime.securesms.util.TelephonyUtil;
|
import org.thoughtcrime.securesms.util.TelephonyUtil;
|
||||||
import org.thoughtcrime.securesms.util.Conversions;
|
import org.thoughtcrime.securesms.util.Conversions;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
@ -4,7 +4,7 @@ import android.content.Context;
|
|||||||
|
|
||||||
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
|
||||||
import ws.com.google.android.mms.ContentType;
|
import ws.com.google.android.mms.ContentType;
|
||||||
import ws.com.google.android.mms.pdu.PduBody;
|
import ws.com.google.android.mms.pdu.PduBody;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package org.thoughtcrime.securesms.mms;
|
package org.thoughtcrime.securesms.mms;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import ws.com.google.android.mms.pdu.PduBody;
|
import ws.com.google.android.mms.pdu.PduBody;
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ public class OutgoingMediaMessage {
|
|||||||
this.body = body;
|
this.body = body;
|
||||||
this.distributionType = distributionType;
|
this.distributionType = distributionType;
|
||||||
|
|
||||||
if (!Util.isEmpty(message)) {
|
if (!TextUtils.isEmpty(message)) {
|
||||||
this.body.addPart(new TextSlide(context, message).getPart());
|
this.body.addPart(new TextSlide(context, message).getPart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.thoughtcrime.securesms.mms;
|
package org.thoughtcrime.securesms.mms;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
public class TextTransport {
|
public class TextTransport {
|
||||||
|
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.thoughtcrime.securesms.protocol;
|
package org.thoughtcrime.securesms.protocol;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
@ -17,11 +17,11 @@
|
|||||||
package org.thoughtcrime.securesms.recipients;
|
package org.thoughtcrime.securesms.recipients;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.contacts.ContactPhotoFactory;
|
import org.thoughtcrime.securesms.contacts.ContactPhotoFactory;
|
||||||
import org.thoughtcrime.securesms.database.CanonicalAddressDatabase;
|
import org.thoughtcrime.securesms.database.CanonicalAddressDatabase;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -32,7 +32,7 @@ public class RecipientFactory {
|
|||||||
private static final RecipientProvider provider = new RecipientProvider();
|
private static final RecipientProvider provider = new RecipientProvider();
|
||||||
|
|
||||||
public static Recipients getRecipientsForIds(Context context, String recipientIds, boolean asynchronous) {
|
public static Recipients getRecipientsForIds(Context context, String recipientIds, boolean asynchronous) {
|
||||||
if (Util.isEmpty(recipientIds))
|
if (TextUtils.isEmpty(recipientIds))
|
||||||
return new Recipients(new LinkedList<Recipient>());
|
return new Recipients(new LinkedList<Recipient>());
|
||||||
|
|
||||||
List<Recipient> results = new LinkedList<Recipient>();
|
List<Recipient> results = new LinkedList<Recipient>();
|
||||||
|
@ -23,7 +23,7 @@ import android.util.Patterns;
|
|||||||
import org.thoughtcrime.securesms.recipients.Recipient.RecipientModifiedListener;
|
import org.thoughtcrime.securesms.recipients.Recipient.RecipientModifiedListener;
|
||||||
import org.thoughtcrime.securesms.util.GroupUtil;
|
import org.thoughtcrime.securesms.util.GroupUtil;
|
||||||
import org.thoughtcrime.securesms.util.NumberUtil;
|
import org.thoughtcrime.securesms.util.NumberUtil;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.crypto.PreKeyUtil;
|
|||||||
import org.thoughtcrime.securesms.push.TextSecureCommunicationFactory;
|
import org.thoughtcrime.securesms.push.TextSecureCommunicationFactory;
|
||||||
import org.thoughtcrime.securesms.util.DirectoryHelper;
|
import org.thoughtcrime.securesms.util.DirectoryHelper;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
||||||
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
||||||
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
|
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
|
||||||
@ -26,7 +27,6 @@ import org.whispersystems.libaxolotl.util.KeyHelper;
|
|||||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
||||||
import org.whispersystems.textsecure.push.exceptions.ExpectationFailedException;
|
import org.whispersystems.textsecure.push.exceptions.ExpectationFailedException;
|
||||||
import org.whispersystems.textsecure.util.Util;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package org.thoughtcrime.securesms.sms;
|
package org.thoughtcrime.securesms.sms;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
public class IncomingIdentityUpdateMessage extends IncomingKeyExchangeMessage {
|
public class IncomingIdentityUpdateMessage extends IncomingKeyExchangeMessage {
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ import org.whispersystems.libaxolotl.util.guava.Optional;
|
|||||||
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
||||||
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
||||||
import org.thoughtcrime.securesms.util.DirectoryUtil;
|
import org.thoughtcrime.securesms.util.DirectoryUtil;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ package org.thoughtcrime.securesms.sms;
|
|||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -7,7 +7,7 @@ import org.thoughtcrime.securesms.protocol.KeyExchangeWirePrefix;
|
|||||||
import org.thoughtcrime.securesms.protocol.PrekeyBundleWirePrefix;
|
import org.thoughtcrime.securesms.protocol.PrekeyBundleWirePrefix;
|
||||||
import org.thoughtcrime.securesms.protocol.SecureMessageWirePrefix;
|
import org.thoughtcrime.securesms.protocol.SecureMessageWirePrefix;
|
||||||
import org.thoughtcrime.securesms.protocol.WirePrefix;
|
import org.thoughtcrime.securesms.protocol.WirePrefix;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.thoughtcrime.securesms.util.Conversions;
|
import org.thoughtcrime.securesms.util.Conversions;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -20,8 +20,8 @@ package org.thoughtcrime.securesms.sms;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.protocol.WirePrefix;
|
import org.thoughtcrime.securesms.protocol.WirePrefix;
|
||||||
|
import org.thoughtcrime.securesms.util.Base64;
|
||||||
import org.whispersystems.libaxolotl.protocol.CiphertextMessage;
|
import org.whispersystems.libaxolotl.protocol.CiphertextMessage;
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package org.whispersystems.textsecure.util;
|
package org.thoughtcrime.securesms.util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Encodes and decodes to and from Base64 notation.</p>
|
* <p>Encodes and decodes to and from Base64 notation.</p>
|
@ -11,7 +11,7 @@ import org.thoughtcrime.securesms.push.TextSecureCommunicationFactory;
|
|||||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
import org.whispersystems.textsecure.api.TextSecureAccountManager;
|
||||||
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
package org.thoughtcrime.securesms.util;
|
package org.thoughtcrime.securesms.util;
|
||||||
|
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
@ -30,7 +29,7 @@ public class DirectoryUtil {
|
|||||||
public static String getDirectoryServerToken(String e164number) {
|
public static String getDirectoryServerToken(String e164number) {
|
||||||
try {
|
try {
|
||||||
MessageDigest digest = MessageDigest.getInstance("SHA1");
|
MessageDigest digest = MessageDigest.getInstance("SHA1");
|
||||||
byte[] token = org.whispersystems.textsecure.util.Util.trim(digest.digest(e164number.getBytes()), 10);
|
byte[] token = Util.trim(digest.digest(e164number.getBytes()), 10);
|
||||||
return Base64.encodeBytesWithoutPadding(token);
|
return Base64.encodeBytesWithoutPadding(token);
|
||||||
} catch (NoSuchAlgorithmException e) {
|
} catch (NoSuchAlgorithmException e) {
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
|
@ -2,14 +2,9 @@ package org.thoughtcrime.securesms.util;
|
|||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.Base64;
|
|
||||||
import org.whispersystems.textsecure.util.Hex;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.whispersystems.textsecure.push.PushMessageProtos.PushMessageContent.GroupContext;
|
import static org.whispersystems.textsecure.push.PushMessageProtos.PushMessageContent.GroupContext;
|
||||||
@ -46,7 +41,7 @@ public class GroupUtil {
|
|||||||
String title = context.getName();
|
String title = context.getName();
|
||||||
|
|
||||||
if (!members.isEmpty()) {
|
if (!members.isEmpty()) {
|
||||||
description += org.whispersystems.textsecure.util.Util.join(members, ", ") + " joined the group.";
|
description += Util.join(members, ", ") + " joined the group.";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (title != null && !title.trim().isEmpty()) {
|
if (title != null && !title.trim().isEmpty()) {
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package org.whispersystems.textsecure.util;
|
package org.thoughtcrime.securesms.util;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
@ -63,7 +63,7 @@ public class SaveAttachmentTask extends ProgressDialogAsyncTask<SaveAttachmentTa
|
|||||||
InputStream inputStream = DatabaseFactory.getEncryptingPartDatabase(context, masterSecret).getPartStream(ContentUris.parseId(attachment.uri));
|
InputStream inputStream = DatabaseFactory.getEncryptingPartDatabase(context, masterSecret).getPartStream(ContentUris.parseId(attachment.uri));
|
||||||
OutputStream outputStream = new FileOutputStream(mediaFile);
|
OutputStream outputStream = new FileOutputStream(mediaFile);
|
||||||
|
|
||||||
org.whispersystems.textsecure.util.Util.copy(inputStream, outputStream);
|
Util.copy(inputStream, outputStream);
|
||||||
|
|
||||||
MediaScannerConnection.scanFile(context, new String[]{mediaFile.getAbsolutePath()},
|
MediaScannerConnection.scanFile(context, new String[]{mediaFile.getAbsolutePath()},
|
||||||
new String[]{attachment.contentType}, null);
|
new String[]{attachment.contentType}, null);
|
||||||
|
@ -19,21 +19,33 @@ package org.thoughtcrime.securesms.util;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.graphics.Shader;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.provider.Telephony;
|
import android.provider.Telephony;
|
||||||
|
import android.telephony.TelephonyManager;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.style.StyleSpan;
|
import android.text.style.StyleSpan;
|
||||||
import android.util.Log;
|
import android.widget.EditText;
|
||||||
|
|
||||||
import org.whispersystems.textsecure.util.InvalidNumberException;
|
import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
|
||||||
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
|
import org.whispersystems.textsecure.api.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -43,20 +55,18 @@ import ws.com.google.android.mms.pdu.EncodedStringValue;
|
|||||||
|
|
||||||
public class Util {
|
public class Util {
|
||||||
|
|
||||||
public static String[] splitString(String string, int maxLength) {
|
public static String join(Collection<String> list, String delimiter) {
|
||||||
int count = string.length() / maxLength;
|
StringBuilder result = new StringBuilder();
|
||||||
|
int i=0;
|
||||||
|
|
||||||
if (string.length() % maxLength > 0)
|
for (String item : list) {
|
||||||
count++;
|
result.append(item);
|
||||||
|
|
||||||
String[] splitString = new String[count];
|
if (++i < list.size())
|
||||||
|
result.append(delimiter);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i=0;i<count-1;i++)
|
return result.toString();
|
||||||
splitString[i] = string.substring(i*maxLength, (i*maxLength) + maxLength);
|
|
||||||
|
|
||||||
splitString[count-1] = string.substring((count-1) * maxLength);
|
|
||||||
|
|
||||||
return splitString;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ExecutorService newSingleThreadedLifoExecutor() {
|
public static ExecutorService newSingleThreadedLifoExecutor() {
|
||||||
@ -77,6 +87,10 @@ public class Util {
|
|||||||
return value == null || value.length == 0;
|
return value == null || value.length == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isEmpty(EditText value) {
|
||||||
|
return value == null || value.getText() == null || TextUtils.isEmpty(value.getText().toString());
|
||||||
|
}
|
||||||
|
|
||||||
public static CharSequence getBoldedString(String value) {
|
public static CharSequence getBoldedString(String value) {
|
||||||
SpannableString spanned = new SpannableString(value);
|
SpannableString spanned = new SpannableString(value);
|
||||||
spanned.setSpan(new StyleSpan(Typeface.BOLD), 0,
|
spanned.setSpan(new StyleSpan(Typeface.BOLD), 0,
|
||||||
@ -86,15 +100,6 @@ public class Util {
|
|||||||
return spanned;
|
return spanned;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CharSequence getItalicizedString(String value) {
|
|
||||||
SpannableString spanned = new SpannableString(value);
|
|
||||||
spanned.setSpan(new StyleSpan(Typeface.ITALIC), 0,
|
|
||||||
spanned.length(),
|
|
||||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
||||||
|
|
||||||
return spanned;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String toIsoString(byte[] bytes) {
|
public static String toIsoString(byte[] bytes) {
|
||||||
try {
|
try {
|
||||||
return new String(bytes, CharacterSets.MIMENAME_ISO_8859_1);
|
return new String(bytes, CharacterSets.MIMENAME_ISO_8859_1);
|
||||||
@ -141,18 +146,91 @@ public class Util {
|
|||||||
else return canonicalizeNumber(context, number);
|
else return canonicalizeNumber(context, number);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] readFully(InputStream in) throws IOException {
|
public static String readFully(InputStream in) throws IOException {
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream bout = new ByteArrayOutputStream();
|
||||||
byte[] buffer = new byte[4069];
|
byte[] buffer = new byte[4096];
|
||||||
|
|
||||||
int read;
|
int read;
|
||||||
|
|
||||||
while ((read = in.read(buffer)) != -1) {
|
while ((read = in.read(buffer)) != -1) {
|
||||||
baos.write(buffer, 0, read);
|
bout.write(buffer, 0, read);
|
||||||
}
|
}
|
||||||
|
|
||||||
in.close();
|
in.close();
|
||||||
return baos.toByteArray();
|
|
||||||
|
return new String(bout.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void copy(InputStream in, OutputStream out) throws IOException {
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int read;
|
||||||
|
|
||||||
|
while ((read = in.read(buffer)) != -1) {
|
||||||
|
out.write(buffer, 0, read);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDeviceE164Number(Context context) {
|
||||||
|
String localNumber = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE))
|
||||||
|
.getLine1Number();
|
||||||
|
|
||||||
|
if (!TextUtils.isEmpty(localNumber) && !localNumber.startsWith("+"))
|
||||||
|
{
|
||||||
|
if (localNumber.length() == 10) localNumber = "+1" + localNumber;
|
||||||
|
else localNumber = "+" + localNumber;
|
||||||
|
|
||||||
|
return localNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<String> split(String source, String delimiter) {
|
||||||
|
List<String> results = new LinkedList<>();
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(source)) {
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] elements = source.split(delimiter);
|
||||||
|
Collections.addAll(results, elements);
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[][] split(byte[] input, int firstLength, int secondLength) {
|
||||||
|
byte[][] parts = new byte[2][];
|
||||||
|
|
||||||
|
parts[0] = new byte[firstLength];
|
||||||
|
System.arraycopy(input, 0, parts[0], 0, firstLength);
|
||||||
|
|
||||||
|
parts[1] = new byte[secondLength];
|
||||||
|
System.arraycopy(input, firstLength, parts[1], 0, secondLength);
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] combine(byte[]... elements) {
|
||||||
|
try {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
for (byte[] element : elements) {
|
||||||
|
baos.write(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
return baos.toByteArray();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new AssertionError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] trim(byte[] input, int length) {
|
||||||
|
byte[] result = new byte[length];
|
||||||
|
System.arraycopy(input, 0, result, 0, result.length);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@ -168,4 +246,40 @@ public class Util {
|
|||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getSecret(int size) {
|
||||||
|
byte[] secret = getSecretBytes(size);
|
||||||
|
return Base64.encodeBytes(secret);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] getSecretBytes(int size) {
|
||||||
|
byte[] secret = new byte[size];
|
||||||
|
getSecureRandom().nextBytes(secret);
|
||||||
|
return secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SecureRandom getSecureRandom() {
|
||||||
|
try {
|
||||||
|
return SecureRandom.getInstance("SHA1PRNG");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new AssertionError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* source: http://stackoverflow.com/a/9500334
|
||||||
|
*/
|
||||||
|
public static void fixBackgroundRepeat(Drawable bg) {
|
||||||
|
if (bg != null) {
|
||||||
|
if (bg instanceof BitmapDrawable) {
|
||||||
|
BitmapDrawable bmp = (BitmapDrawable) bg;
|
||||||
|
bmp.mutate();
|
||||||
|
bmp.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user