/** Changes the bridge mode. */ public void setBridgeMode(int value) { if (value < 0 || value >= registeredListeners.length) { Log.d(LOG_TAG, "Invalid NativeToJsBridgeMode: " + value); } else { if (value != activeListenerIndex) { Log.d(LOG_TAG, "Set native->JS mode to " + value); synchronized (this) { activeListenerIndex = value; BridgeMode activeListener = registeredListeners[value]; if (!paused && !queue.isEmpty() && activeListener != null) { activeListener.onNativeToJsMessageAvailable(); } } } } }
private void enqueueMessage(JsMessage message) { synchronized (this) { if (activeBridgeMode == null) { Log.d(LOG_TAG, "Dropping Native->JS message due to disabled bridge"); return; } queue.add(message); if (!paused) { activeBridgeMode.onNativeToJsMessageAvailable(); } } }
/** Changes the bridge mode. */ public void setBridgeMode(int value) { if (value < -1 || value >= registeredListeners.length) { Log.d(LOG_TAG, "Invalid NativeToJsBridgeMode: " + value); } else { BridgeMode newMode = value < 0 ? null : registeredListeners[value]; if (newMode != activeBridgeMode) { Log.d( LOG_TAG, "Set native->JS mode to " + (newMode == null ? "null" : newMode.getClass().getSimpleName())); synchronized (this) { activeBridgeMode = newMode; if (newMode != null) { newMode.reset(); if (!paused && !queue.isEmpty()) { newMode.onNativeToJsMessageAvailable(); } } } } } }
public void setPaused(boolean value) { if (paused && value) { // This should never happen. If a use-case for it comes up, we should // change pause to be a counter. Log.e(LOG_TAG, "nested call to setPaused detected.", new Throwable()); } paused = value; if (!value) { synchronized (this) { if (!queue.isEmpty() && activeBridgeMode != null) { activeBridgeMode.onNativeToJsMessageAvailable(); } } } }
/** * Combines and returns queued messages combined into a single string. Combines as many messages * as possible, while staying under MAX_PAYLOAD_SIZE. Returns null if the queue is empty. */ public String popAndEncode(boolean fromOnlineEvent) { synchronized (this) { if (activeBridgeMode == null) { return null; } activeBridgeMode.notifyOfFlush(fromOnlineEvent); if (queue.isEmpty()) { return null; } int totalPayloadLen = 0; int numMessagesToSend = 0; for (JsMessage message : queue) { int messageSize = calculatePackedMessageLength(message); if (numMessagesToSend > 0 && totalPayloadLen + messageSize > MAX_PAYLOAD_SIZE && MAX_PAYLOAD_SIZE > 0) { break; } totalPayloadLen += messageSize; numMessagesToSend += 1; } StringBuilder sb = new StringBuilder(totalPayloadLen); for (int i = 0; i < numMessagesToSend; ++i) { JsMessage message = queue.removeFirst(); packMessage(message, sb); } if (!queue.isEmpty()) { // Attach a char to indicate that there are more messages pending. sb.append('*'); } String ret = sb.toString(); return ret; } }