private void confirmMessagePart(String number, int pos) { Log.i(TAG, number + " " + pos); MessageConfirmation confirmation = partialConfs.get(number).get(pos); if (confirmation.getMessageParts() > 0) confirmation.setMessageParts(confirmation.getMessageParts() - 1); if (confirmation.getMessageParts() == 0) { String time = DateUtils.buildDate(); if (!confirmTimes.containsKey(number)) confirmTimes.put(number, new TreeMap<Integer, String>()); confirmTimes.get(number).put(pos, time); dbUtils.confirmMessageSent(time, confirmation.getMessageId()); Log.i(TAG, "confirmMessagePart Processing status " + processingStatus); partialConfs.get(number).remove(pos); processingStatus--; Log.i(TAG, "confirmMessagePart Processing status " + processingStatus); if (ConversationActivity.isActive() && ConversationActivity.currentNumber().equals(number)) { Intent in = new Intent(this, ConversationActivity.class); in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); in.putExtra(EncrypText.THREAD_POSITION, pos); in.putExtra(EncrypText.TIME, time); startActivity(in); } else if (!ConversationActivity.isActive() && ConversationActivity.currentNumber().equals(number)) ConversationActivity.markNewConfs(); } }
public synchronized void sendMessage(ConversationEntry item, int place, Key key) { String address = item.getNumber(); if (!currentConv.equals(address)) { sequenceNo = 0; currentConv = address; } byte[] encryptedMessage; try { encryptedMessage = cryptor.encryptMessage(item.getMessage().getBytes(), (SecretKey) key, sequenceNo); } catch (InvalidKeyException | BadPaddingException | IllegalBlockSizeException | InvalidAlgorithmParameterException e) { Log.e(TAG, "While encrypting message", e); Toast.makeText(this, "Encryption error while sending message", Toast.LENGTH_SHORT).show(); return; } double packets = encryptedMessage.length / (double) (MAX_DATA_BYTES - HEADER_SIZE); if (packets % 1 != 0) // making sure to round up to next whole packet packets = (int) packets + 1; byte[][] message = new byte[(int) packets][MAX_DATA_BYTES]; int k = 0; for (int pdu = 0; pdu < packets; pdu++) { // 2 for AES message[pdu][0] = 2; // message sequence number - session based - can only send 127 messages per session if (sequenceNo > 127) return; else { message[pdu][1] = (byte) sequenceNo; } message[pdu][2] = (byte) packets; message[pdu][3] = (byte) pdu; for (int j = 4; j < MAX_DATA_BYTES && k < encryptedMessage.length; j++) { message[pdu][j] = encryptedMessage[k]; k++; } } long messageId = dbUtils.storeMessage(item); // long pos = manager.writeSMS(address, item, -1, this); setupMessageConfirmation(address, place, messageId, message.length); for (byte[] pdu : message) { Intent in = new Intent(SENT_INTENT); in.putExtra(EncrypText.THREAD_POSITION, place); in.putExtra(EncrypText.ADDRESS, address); PendingIntent sent = PendingIntent.getBroadcast(this, 0, in, PendingIntent.FLAG_UPDATE_CURRENT); mgr.sendDataMessage(address, null, APPLICATION_PORT, pdu, sent, null); } sequenceNo++; // next sequence number }