Search in sources :

Example 1 with MXEncryptEventContentResult

use of org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult in project matrix-android-sdk by matrix-org.

the class MXCrypto method encryptEventContent.

/**
 * Encrypt an event content according to the configuration of the room.
 *
 * @param eventContent the content of the event.
 * @param eventType    the type of the event.
 * @param room         the room the event will be sent.
 * @param callback     the asynchronous callback
 */
public void encryptEventContent(final JsonElement eventContent, final String eventType, final Room room, final ApiCallback<MXEncryptEventContentResult> callback) {
    // wait that the crypto is really started
    if (!isStarted()) {
        Log.d(LOG_TAG, "## encryptEventContent() : wait after e2e init");
        start(false, new ApiCallback<Void>() {

            @Override
            public void onSuccess(Void info) {
                encryptEventContent(eventContent, eventType, room, callback);
            }

            @Override
            public void onNetworkError(Exception e) {
                Log.e(LOG_TAG, "## encryptEventContent() : onNetworkError while waiting to start e2e : " + e.getMessage());
                if (null != callback) {
                    callback.onNetworkError(e);
                }
            }

            @Override
            public void onMatrixError(MatrixError e) {
                Log.e(LOG_TAG, "## encryptEventContent() : onMatrixError while waiting to start e2e : " + e.getMessage());
                if (null != callback) {
                    callback.onMatrixError(e);
                }
            }

            @Override
            public void onUnexpectedError(Exception e) {
                Log.e(LOG_TAG, "## encryptEventContent() : onUnexpectedError while waiting to start e2e : " + e.getMessage());
                if (null != callback) {
                    callback.onUnexpectedError(e);
                }
            }
        });
        return;
    }
    // just as you are sending a secret message?
    final ArrayList<String> userdIds = new ArrayList<>();
    Collection<RoomMember> joinedMembers = room.getJoinedMembers();
    for (RoomMember m : joinedMembers) {
        userdIds.add(m.getUserId());
    }
    getEncryptingThreadHandler().post(new Runnable() {

        @Override
        public void run() {
            IMXEncrypting alg;
            synchronized (mRoomEncryptors) {
                alg = mRoomEncryptors.get(room.getRoomId());
            }
            if (null == alg) {
                String algorithm = room.getLiveState().encryptionAlgorithm();
                if (null != algorithm) {
                    if (setEncryptionInRoom(room.getRoomId(), algorithm, false)) {
                        synchronized (mRoomEncryptors) {
                            alg = mRoomEncryptors.get(room.getRoomId());
                        }
                    }
                }
            }
            if (null != alg) {
                final long t0 = System.currentTimeMillis();
                Log.d(LOG_TAG, "## encryptEventContent() starts");
                alg.encryptEventContent(eventContent, eventType, userdIds, new ApiCallback<JsonElement>() {

                    @Override
                    public void onSuccess(final JsonElement encryptedContent) {
                        Log.d(LOG_TAG, "## encryptEventContent() : succeeds after " + (System.currentTimeMillis() - t0) + " ms");
                        if (null != callback) {
                            callback.onSuccess(new MXEncryptEventContentResult(encryptedContent, Event.EVENT_TYPE_MESSAGE_ENCRYPTED));
                        }
                    }

                    @Override
                    public void onNetworkError(final Exception e) {
                        Log.e(LOG_TAG, "## encryptEventContent() : onNetworkError " + e.getMessage());
                        if (null != callback) {
                            callback.onNetworkError(e);
                        }
                    }

                    @Override
                    public void onMatrixError(final MatrixError e) {
                        Log.e(LOG_TAG, "## encryptEventContent() : onMatrixError " + e.getMessage());
                        if (null != callback) {
                            callback.onMatrixError(e);
                        }
                    }

                    @Override
                    public void onUnexpectedError(final Exception e) {
                        Log.e(LOG_TAG, "## encryptEventContent() : onUnexpectedError " + e.getMessage());
                        if (null != callback) {
                            callback.onUnexpectedError(e);
                        }
                    }
                });
            } else {
                final String algorithm = room.getLiveState().encryptionAlgorithm();
                final String reason = String.format(MXCryptoError.UNABLE_TO_ENCRYPT_REASON, (null == algorithm) ? MXCryptoError.NO_MORE_ALGORITHM_REASON : algorithm);
                Log.e(LOG_TAG, "## encryptEventContent() : " + reason);
                if (null != callback) {
                    getUIHandler().post(new Runnable() {

                        @Override
                        public void run() {
                            callback.onMatrixError(new MXCryptoError(MXCryptoError.UNABLE_TO_ENCRYPT_ERROR_CODE, MXCryptoError.UNABLE_TO_ENCRYPT, reason));
                        }
                    });
                }
            }
        }
    });
}
Also used : IMXEncrypting(org.matrix.androidsdk.crypto.algorithms.IMXEncrypting) ApiCallback(org.matrix.androidsdk.rest.callback.ApiCallback) ArrayList(java.util.ArrayList) MXEncryptEventContentResult(org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult) RoomMember(org.matrix.androidsdk.rest.model.RoomMember) JsonElement(com.google.gson.JsonElement) MatrixError(org.matrix.androidsdk.rest.model.MatrixError)

Aggregations

JsonElement (com.google.gson.JsonElement)1 ArrayList (java.util.ArrayList)1 IMXEncrypting (org.matrix.androidsdk.crypto.algorithms.IMXEncrypting)1 MXEncryptEventContentResult (org.matrix.androidsdk.crypto.data.MXEncryptEventContentResult)1 ApiCallback (org.matrix.androidsdk.rest.callback.ApiCallback)1 MatrixError (org.matrix.androidsdk.rest.model.MatrixError)1 RoomMember (org.matrix.androidsdk.rest.model.RoomMember)1