Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b40d168b authored by Matthew Sedam's avatar Matthew Sedam Committed by Android (Google) Code Review
Browse files

Merge "Cleanup handleClientMessageCallback" into main

parents 270dc7d7 bd72db6f
Loading
Loading
Loading
Loading
+61 −39
Original line number Diff line number Diff line
@@ -317,9 +317,6 @@ public class ContextHubService extends IContextHubService.Stub {
         */
        private static final int MAX_PROBABILITY_PERCENT = 100;

        /**
         * Random number generator.
         */
        private Random mRandom = new Random();

        /**
@@ -998,17 +995,19 @@ public class ContextHubService extends IContextHubService.Stub {
            return;
        }

        if (message.isReliable()) {
        if (!message.isReliable()) {
            mClientManager.onMessageFromNanoApp(
                    contextHubId, hostEndpointId, message,
                    nanoappPermissions, messagePermissions);
            cleanupReliableMessageRecordQueue();
            return;
        }

        byte errorCode = ErrorCode.OK;
        synchronized (mReliableMessageRecordQueue) {
                Optional<ReliableMessageRecord> record = Optional.empty();
                for (ReliableMessageRecord r: mReliableMessageRecordQueue) {
                    if (r.getContextHubId() == contextHubId
                            && r.getMessageSequenceNumber() == message.getMessageSequenceNumber()) {
                        record = Optional.of(r);
                        break;
                    }
                }
            Optional<ReliableMessageRecord> record =
                    findReliableMessageRecord(contextHubId,
                            message.getMessageSequenceNumber());

            if (record.isPresent()) {
                errorCode = record.get().getErrorCode();
@@ -1034,14 +1033,37 @@ public class ContextHubService extends IContextHubService.Stub {
                                errorCode));
            }
        }

        sendMessageDeliveryStatusToContextHub(contextHubId,
                message.getMessageSequenceNumber(), errorCode);
        } else {
            mClientManager.onMessageFromNanoApp(
                    contextHubId, hostEndpointId, message,
                    nanoappPermissions, messagePermissions);
        cleanupReliableMessageRecordQueue();
    }

    /**
     * Finds a reliable message record in the queue that matches the given
     * context hub ID and message sequence number. This function assumes
     * the caller is synchronized on mReliableMessageRecordQueue.
     *
     * @param contextHubId the ID of the hub
     * @param messageSequenceNumber the message sequence number
     *
     * @return the record if found, or empty if not found
     */
    private Optional<ReliableMessageRecord> findReliableMessageRecord(
            int contextHubId, int messageSequenceNumber) {
        for (ReliableMessageRecord record: mReliableMessageRecordQueue) {
            if (record.getContextHubId() == contextHubId
                && record.getMessageSequenceNumber() == messageSequenceNumber) {
                return Optional.of(record);
            }
        }
        return Optional.empty();
    }

    /**
     * Removes old entries from the reliable message record queue.
     */
    private void cleanupReliableMessageRecordQueue() {
        synchronized (mReliableMessageRecordQueue) {
            while (mReliableMessageRecordQueue.peek() != null
                   && mReliableMessageRecordQueue.peek().isExpired()) {