| Index: remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
|
| diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
|
| index 02387025d555d4e876d57cc425a08ed6a422e8cc..92a1447292c53cf3f2f66786a1827845ccde0765 100644
|
| --- a/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
|
| +++ b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
|
| @@ -6,18 +6,12 @@ package org.chromium.chromoting.jni;
|
|
|
| import android.content.Context;
|
| import android.graphics.Bitmap;
|
| -import android.graphics.Point;
|
| -import android.os.Looper;
|
|
|
| import org.chromium.base.ContextUtils;
|
| -import org.chromium.base.Log;
|
| import org.chromium.base.annotations.CalledByNative;
|
| import org.chromium.base.annotations.JNINamespace;
|
| -import org.chromium.chromoting.CapabilityManager;
|
| -import org.chromium.chromoting.SessionAuthenticator;
|
|
|
| import java.nio.ByteBuffer;
|
| -import java.nio.ByteOrder;
|
|
|
| /**
|
| * Initializes the Chromium remoting library, and provides JNI calls into it.
|
| @@ -25,47 +19,12 @@ import java.nio.ByteOrder;
|
| */
|
| @JNINamespace("remoting")
|
| public class JniInterface {
|
| - private static final String TAG = "Chromoting";
|
| -
|
| /*
|
| * Library-loading state machine.
|
| */
|
| /** Whether the library has been loaded. Accessed on the UI thread. */
|
| private static boolean sLoaded = false;
|
|
|
| - /** Used for authentication-related UX during connection. Accessed on the UI thread. */
|
| - private static SessionAuthenticator sAuthenticator;
|
| -
|
| - /*
|
| - * Connection-initiating state machine.
|
| - */
|
| - /** Whether the native code is attempting a connection. Accessed on the UI thread. */
|
| - private static boolean sConnected = false;
|
| -
|
| - /** Notified upon successful connection or disconnection. Accessed on the UI thread. */
|
| - private static ConnectionListener sConnectionListener = null;
|
| -
|
| - /**
|
| - * Callback invoked on the graphics thread to repaint the desktop. Accessed on the UI and
|
| - * graphics threads.
|
| - */
|
| - private static Runnable sRedrawCallback = null;
|
| -
|
| - /** Bitmap holding a copy of the latest video frame. Accessed on the UI and graphics threads. */
|
| - private static Bitmap sFrameBitmap = null;
|
| -
|
| - /** Protects access to sFrameBitmap. */
|
| - private static final Object sFrameLock = new Object();
|
| -
|
| - /** Position of cursor hot-spot. Accessed on the graphics thread. */
|
| - private static Point sCursorHotspot = new Point();
|
| -
|
| - /** Bitmap holding the cursor shape. Accessed on the graphics thread. */
|
| - private static Bitmap sCursorBitmap = null;
|
| -
|
| - /** Capability Manager through which capabilities and extensions are handled. */
|
| - private static CapabilityManager sCapabilityManager = CapabilityManager.getInstance();
|
| -
|
| /**
|
| * To be called once from the main Activity. Loads and initializes the native code.
|
| * Called on the UI thread.
|
| @@ -90,203 +49,65 @@ public class JniInterface {
|
| public static native String nativeGetClientId();
|
| public static native String nativeGetClientSecret();
|
|
|
| - /** Returns whether the client is connected. */
|
| - public static boolean isConnected() {
|
| - return sConnected;
|
| - }
|
| -
|
| - /** Attempts to form a connection to the user-selected host. Called on the UI thread. */
|
| - public static void connectToHost(String username, String authToken, String hostJid,
|
| - String hostId, String hostPubkey, SessionAuthenticator authenticator, String flags,
|
| - ConnectionListener listener) {
|
| - disconnectFromHost();
|
| -
|
| - sConnectionListener = listener;
|
| - sAuthenticator = authenticator;
|
| - nativeConnect(username, authToken, hostJid, hostId, hostPubkey,
|
| - sAuthenticator.getPairingId(hostId), sAuthenticator.getPairingSecret(hostId),
|
| - sCapabilityManager.getLocalCapabilities(), flags);
|
| - sConnected = true;
|
| - }
|
| -
|
| /** Performs the native portion of the connection. */
|
| - private static native void nativeConnect(String username, String authToken, String hostJid,
|
| + static native void nativeConnect(String username, String authToken, String hostJid,
|
| String hostId, String hostPubkey, String pairId, String pairSecret,
|
| String capabilities, String flags);
|
|
|
| - /** Severs the connection and cleans up. Called on the UI thread. */
|
| - public static void disconnectFromHost() {
|
| - if (!sConnected) {
|
| - return;
|
| - }
|
| -
|
| - sConnectionListener.onConnectionState(
|
| - ConnectionListener.State.CLOSED, ConnectionListener.Error.OK);
|
| -
|
| - disconnectFromHostWithoutNotification();
|
| - }
|
| -
|
| - /** Same as disconnectFromHost() but without notifying the ConnectionListener. */
|
| - private static void disconnectFromHostWithoutNotification() {
|
| - if (!sConnected) {
|
| - return;
|
| - }
|
| -
|
| - nativeDisconnect();
|
| - sConnectionListener = null;
|
| - sConnected = false;
|
| - sCapabilityManager.onHostDisconnect();
|
| -
|
| - // Drop the reference to free the Bitmap for GC.
|
| - synchronized (sFrameLock) {
|
| - sFrameBitmap = null;
|
| - }
|
| - }
|
| -
|
| /** Performs the native portion of the cleanup. */
|
| - private static native void nativeDisconnect();
|
| + static native void nativeDisconnect();
|
|
|
| /** Called by native code whenever the connection status changes. Called on the UI thread. */
|
| @CalledByNative
|
| private static void onConnectionState(int stateCode, int errorCode) {
|
| - ConnectionListener.State state = ConnectionListener.State.fromValue(stateCode);
|
| - ConnectionListener.Error error = ConnectionListener.Error.fromValue(errorCode);
|
| - sConnectionListener.onConnectionState(state, error);
|
| - if (state == ConnectionListener.State.FAILED || state == ConnectionListener.State.CLOSED) {
|
| - // Disconnect from the host here, otherwise the next time connectToHost() is called,
|
| - // it will try to disconnect, triggering an incorrect status notification.
|
| - disconnectFromHostWithoutNotification();
|
| + if (Client.getInstance() != null) {
|
| + Client.getInstance().onConnectionState(stateCode, errorCode);
|
| }
|
| }
|
|
|
| /** Prompts the user to enter a PIN. Called on the UI thread. */
|
| @CalledByNative
|
| private static void displayAuthenticationPrompt(boolean pairingSupported) {
|
| - sAuthenticator.displayAuthenticationPrompt(pairingSupported);
|
| - }
|
| -
|
| - /**
|
| - * Performs the native response to the user's PIN.
|
| - * @param pin The entered PIN.
|
| - * @param createPair Whether to create a new pairing for this client.
|
| - * @param deviceName The device name to appear in the pairing registry. Only used if createPair
|
| - * is true.
|
| - */
|
| - public static void handleAuthenticationResponse(
|
| - String pin, boolean createPair, String deviceName) {
|
| - assert sConnected;
|
| - nativeAuthenticationResponse(pin, createPair, deviceName);
|
| + if (Client.getInstance() != null) {
|
| + Client.getInstance().displayAuthenticationPrompt(pairingSupported);
|
| + }
|
| }
|
|
|
| - /** Native implementation of handleAuthenticationResponse(). */
|
| - private static native void nativeAuthenticationResponse(
|
| + /** Native implementation of Client.handleAuthenticationResponse(). */
|
| + static native void nativeAuthenticationResponse(
|
| String pin, boolean createPair, String deviceName);
|
|
|
| /** Saves newly-received pairing credentials to permanent storage. Called on the UI thread. */
|
| @CalledByNative
|
| private static void commitPairingCredentials(String host, String id, String secret) {
|
| - sAuthenticator.commitPairingCredentials(host, id, secret);
|
| - }
|
| -
|
| - /**
|
| - * Moves the mouse cursor, possibly while clicking the specified (nonnegative) button. Called
|
| - * on the UI thread.
|
| - */
|
| - public static void sendMouseEvent(int x, int y, int whichButton, boolean buttonDown) {
|
| - if (!sConnected) {
|
| - return;
|
| + if (Client.getInstance() != null) {
|
| + Client.getInstance().commitPairingCredentials(host, id, secret);
|
| }
|
| -
|
| - nativeSendMouseEvent(x, y, whichButton, buttonDown);
|
| }
|
|
|
| /** Passes mouse information to the native handling code. */
|
| - private static native void nativeSendMouseEvent(
|
| + static native void nativeSendMouseEvent(
|
| int x, int y, int whichButton, boolean buttonDown);
|
|
|
| - /** Injects a mouse-wheel event with delta values. Called on the UI thread. */
|
| - public static void sendMouseWheelEvent(int deltaX, int deltaY) {
|
| - if (!sConnected) {
|
| - return;
|
| - }
|
| -
|
| - nativeSendMouseWheelEvent(deltaX, deltaY);
|
| - }
|
| -
|
| /** Passes mouse-wheel information to the native handling code. */
|
| - private static native void nativeSendMouseWheelEvent(int deltaX, int deltaY);
|
| -
|
| - /**
|
| - * Presses or releases the specified (nonnegative) key. Called on the UI thread. If scanCode
|
| - * is not zero then keyCode is ignored.
|
| - */
|
| - public static boolean sendKeyEvent(int scanCode, int keyCode, boolean keyDown) {
|
| - if (!sConnected) {
|
| - return false;
|
| - }
|
| -
|
| - return nativeSendKeyEvent(scanCode, keyCode, keyDown);
|
| - }
|
| + static native void nativeSendMouseWheelEvent(int deltaX, int deltaY);
|
|
|
| /**
|
| * Passes key press information to the native handling code.
|
| */
|
| - private static native boolean nativeSendKeyEvent(int scanCode, int keyCode, boolean keyDown);
|
| -
|
| - /** Sends TextEvent to the host. Called on the UI thread. */
|
| - public static void sendTextEvent(String text) {
|
| - if (!sConnected) {
|
| - return;
|
| - }
|
| -
|
| - nativeSendTextEvent(text);
|
| - }
|
| + static native boolean nativeSendKeyEvent(int scanCode, int keyCode, boolean keyDown);
|
|
|
| /** Passes text event information to the native handling code. */
|
| - private static native void nativeSendTextEvent(String text);
|
| -
|
| - /** Sends an array of TouchEvents to the host. Called on the UI thread. */
|
| - public static void sendTouchEvent(TouchEventData.EventType eventType, TouchEventData[] data) {
|
| - nativeSendTouchEvent(eventType.value(), data);
|
| - }
|
| + static native void nativeSendTextEvent(String text);
|
|
|
| /** Passes touch event information to the native handling code. */
|
| - private static native void nativeSendTouchEvent(int eventType, TouchEventData[] data);
|
| + static native void nativeSendTouchEvent(int eventType, TouchEventData[] data);
|
|
|
| - /**
|
| - * Enables or disables the video channel. Called on the UI thread in response to Activity
|
| - * lifecycle events.
|
| - */
|
| - public static void enableVideoChannel(boolean enable) {
|
| - if (!sConnected) {
|
| - return;
|
| - }
|
| -
|
| - nativeEnableVideoChannel(enable);
|
| - }
|
| -
|
| - /** Native implementation of enableVideoChannel() */
|
| - private static native void nativeEnableVideoChannel(boolean enable);
|
| -
|
| - /**
|
| - * Sets the redraw callback to the provided functor. Provide a value of null whenever the
|
| - * window is no longer visible so that we don't continue to draw onto it. Called on the UI
|
| - * thread.
|
| - */
|
| - public static void provideRedrawCallback(Runnable redrawCallback) {
|
| - sRedrawCallback = redrawCallback;
|
| - }
|
| -
|
| - /** Forces the native graphics thread to redraw to the canvas. Called on the UI thread. */
|
| - public static boolean redrawGraphics() {
|
| - if (!sConnected || sRedrawCallback == null) return false;
|
| -
|
| - nativeScheduleRedraw();
|
| - return true;
|
| - }
|
| + /** Native implementation of Client.enableVideoChannel() */
|
| + static native void nativeEnableVideoChannel(boolean enable);
|
|
|
| /** Schedules a redraw on the native graphics thread. */
|
| - private static native void nativeScheduleRedraw();
|
| + static native void nativeScheduleRedraw();
|
|
|
| /**
|
| * Performs the redrawing callback. This is a no-op if the window isn't visible. Called on the
|
| @@ -294,23 +115,9 @@ public class JniInterface {
|
| */
|
| @CalledByNative
|
| private static void redrawGraphicsInternal() {
|
| - Runnable callback = sRedrawCallback;
|
| - if (callback != null) {
|
| - callback.run();
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Returns a bitmap of the latest video frame. Called on the native graphics thread when
|
| - * DesktopView is repainted.
|
| - */
|
| - public static Bitmap getVideoFrame() {
|
| - if (Looper.myLooper() == Looper.getMainLooper()) {
|
| - Log.w(TAG, "Canvas being redrawn on UI thread");
|
| - }
|
| -
|
| - synchronized (sFrameLock) {
|
| - return sFrameBitmap;
|
| + Client client = Client.getInstance();
|
| + if (client != null) {
|
| + client.redrawGraphicsInternal();
|
| }
|
| }
|
|
|
| @@ -319,12 +126,9 @@ public class JniInterface {
|
| */
|
| @CalledByNative
|
| private static void setVideoFrame(Bitmap bitmap) {
|
| - if (Looper.myLooper() == Looper.getMainLooper()) {
|
| - Log.w(TAG, "Video frame updated on UI thread");
|
| - }
|
| -
|
| - synchronized (sFrameLock) {
|
| - sFrameBitmap = bitmap;
|
| + Client client = Client.getInstance();
|
| + if (client != null) {
|
| + client.setVideoFrame(bitmap);
|
| }
|
| }
|
|
|
| @@ -334,7 +138,7 @@ public class JniInterface {
|
| */
|
| @CalledByNative
|
| private static Bitmap newBitmap(int width, int height) {
|
| - return Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
| + return Client.newBitmap(width, height);
|
| }
|
|
|
| /**
|
| @@ -342,24 +146,12 @@ public class JniInterface {
|
| * shape from the host.
|
| */
|
| @CalledByNative
|
| - public static void updateCursorShape(
|
| + private static void updateCursorShape(
|
| int width, int height, int hotspotX, int hotspotY, ByteBuffer buffer) {
|
| - sCursorHotspot = new Point(hotspotX, hotspotY);
|
| -
|
| - int[] data = new int[width * height];
|
| - buffer.order(ByteOrder.LITTLE_ENDIAN);
|
| - buffer.asIntBuffer().get(data, 0, data.length);
|
| - sCursorBitmap = Bitmap.createBitmap(data, width, height, Bitmap.Config.ARGB_8888);
|
| - }
|
| -
|
| - /** Position of cursor hotspot within cursor image. Called on the graphics thread. */
|
| - public static Point getCursorHotspot() {
|
| - return sCursorHotspot;
|
| - }
|
| -
|
| - /** Returns the current cursor shape. Called on the graphics thread. */
|
| - public static Bitmap getCursorBitmap() {
|
| - return sCursorBitmap;
|
| + Client client = Client.getInstance();
|
| + if (client != null) {
|
| + client.updateCursorShape(width, height, hotspotX, hotspotY, buffer);
|
| + }
|
| }
|
|
|
| //
|
| @@ -368,23 +160,14 @@ public class JniInterface {
|
|
|
| /** Pops up a third party login page to fetch the token required for authentication. */
|
| @CalledByNative
|
| - public static void fetchThirdPartyToken(String tokenUrl, String clientId, String scope) {
|
| - sAuthenticator.fetchThirdPartyToken(tokenUrl, clientId, scope);
|
| - }
|
| -
|
| - /**
|
| - * Notify the native code to continue authentication with the |token| and the |sharedSecret|.
|
| - */
|
| - public static void onThirdPartyTokenFetched(String token, String sharedSecret) {
|
| - if (!sConnected) {
|
| - return;
|
| + private static void fetchThirdPartyToken(String tokenUrl, String clientId, String scope) {
|
| + if (Client.getInstance() != null) {
|
| + Client.getInstance().fetchThirdPartyToken(tokenUrl, clientId, scope);
|
| }
|
| -
|
| - nativeOnThirdPartyTokenFetched(token, sharedSecret);
|
| }
|
|
|
| /** Passes authentication data to the native handling code. */
|
| - private static native void nativeOnThirdPartyTokenFetched(String token, String sharedSecret);
|
| + static native void nativeOnThirdPartyTokenFetched(String token, String sharedSecret);
|
|
|
| //
|
| // Host and Client Capabilities
|
| @@ -392,8 +175,10 @@ public class JniInterface {
|
|
|
| /** Set the list of negotiated capabilities between host and client. Called on the UI thread. */
|
| @CalledByNative
|
| - public static void setCapabilities(String capabilities) {
|
| - sCapabilityManager.setNegotiatedCapabilities(capabilities);
|
| + private static void setCapabilities(String capabilities) {
|
| + if (Client.getInstance() != null) {
|
| + Client.getInstance().setCapabilities(capabilities);
|
| + }
|
| }
|
|
|
| //
|
| @@ -402,18 +187,12 @@ public class JniInterface {
|
|
|
| /** Passes on the deconstructed ExtensionMessage to the app. Called on the UI thread. */
|
| @CalledByNative
|
| - public static void handleExtensionMessage(String type, String data) {
|
| - sCapabilityManager.onExtensionMessage(type, data);
|
| - }
|
| -
|
| - /** Sends an extension message to the Chromoting host. Called on the UI thread. */
|
| - public static void sendExtensionMessage(String type, String data) {
|
| - if (!sConnected) {
|
| - return;
|
| + private static void handleExtensionMessage(String type, String data) {
|
| + if (Client.getInstance() != null) {
|
| + Client.getInstance().handleExtensionMessage(type, data);
|
| }
|
| -
|
| - nativeSendExtensionMessage(type, data);
|
| }
|
|
|
| - private static native void nativeSendExtensionMessage(String type, String data);
|
| + /** Passes extension message to the native code. */
|
| + static native void nativeSendExtensionMessage(String type, String data);
|
| }
|
|
|