Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Unified Diff: remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java

Issue 19506004: Add the beginnings of a Chromoting Android app (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minimize monitor use, concatenate using StringBuilder, tune host list spacing, make build target re… Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
new file mode 100644
index 0000000000000000000000000000000000000000..0814993137ddb848cbfd01445e556acd69241932
--- /dev/null
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/JniInterface.java
@@ -0,0 +1,182 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chromoting.jni;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Bitmap;
+import android.text.InputType;
+import android.util.Log;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import org.chromium.chromoting.R;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Initializes the Chromium remoting library, and provides JNI calls into it.
+ * All interaction with the native code is centralized in this class.
+ */
+public class JniInterface {
+ /** The status code indicating successful connection. */
+ private static final int SUCCESSFUL_CONNECTION = 3;
+
+ /** The application context. */
+ private static Activity sContext = null;
+
+ /*
+ * Library-loading state machine.
+ */
+ /** Whether we've already loaded the library. */
+ private static boolean sLoaded = false;
+
+ /** To be called once from the main Activity. */
+ public static void loadLibrary(Activity context) {
+ synchronized(JniInterface.class) {
+ if (sLoaded) return;
+ }
+
+ System.loadLibrary("remoting_client_jni");
+ loadNative(context);
+ sContext = context;
+ sLoaded = true;
+ }
+
+ /** Performs the native portion of the initialization. */
+ private static native void loadNative(Context context);
+
+ /*
+ * API/OAuth2 keys access.
+ */
+ public static native String getApiKey();
+ public static native String getClientId();
+ public static native String getClientSecret();
+
+ /*
+ * Connection-initiating state machine.
+ */
+ /** Whether the native code is attempting a connection. */
+ private static boolean sConnected = false;
+
+ /** The callback to signal upon successful connection. */
+ private static Runnable sSuccessCallback = null;
+
+ /** Attempts to form a connection to the user-selected host. */
+ public static void connectToHost(String username, String authToken,
+ String hostJid, String hostId, String hostPubkey, Runnable successCallback) {
+ synchronized(JniInterface.class) {
+ if (!sLoaded) return;
+ if (sConnected) {
+ disconnectFromHost();
+ }
+ }
+
+ sSuccessCallback = successCallback;
+ connectNative(username, authToken, hostJid, hostId, hostPubkey);
+ sConnected = true;
+ }
+
+ /** Severs the connection and cleans up. */
+ public static void disconnectFromHost() {
+ synchronized(JniInterface.class) {
+ if (!sLoaded || !sConnected) return;
+ }
+
+ disconnectNative();
+ sSuccessCallback = null;
+ sConnected = false;
+ }
+
+ /** Performs the native portion of the connection. */
+ private static native void connectNative(
+ String username, String authToken, String hostJid, String hostId, String hostPubkey);
+
+ /** Performs the native portion of the cleanup. */
+ private static native void disconnectNative();
+
+ /*
+ * Entry points *from* the native code.
+ */
+ /** Screen width of the video feed. */
+ private static int sWidth = 0;
+
+ /** Screen height of the video feed. */
+ private static int sHeight = 0;
+
+ /** Buffer holding the video feed. */
+ private static ByteBuffer sBuffer = null;
+
+ /** Reports whenever the connection status changes. */
+ private static void reportConnectionStatus(int state, int error) {
+ if (state==SUCCESSFUL_CONNECTION) {
+ sSuccessCallback.run();
+ }
+
+ Toast.makeText(sContext, sContext.getResources().getStringArray(
+ R.array.protoc_states)[state] + (error!=0 ? ": " +
+ sContext.getResources().getStringArray(R.array.protoc_errors)[error] : ""),
+ Toast.LENGTH_SHORT).show();
+ }
+
+ /** Prompts the user to enter a PIN. */
+ private static void displayAuthenticationPrompt() {
+ AlertDialog.Builder pinPrompt = new AlertDialog.Builder(sContext);
+ pinPrompt.setTitle(sContext.getString(R.string.pin_entry_title));
+ pinPrompt.setMessage(sContext.getString(R.string.pin_entry_message));
+
+ final EditText pinEntry = new EditText(sContext);
+ pinEntry.setInputType(
+ InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
+ pinPrompt.setView(pinEntry);
+
+ pinPrompt.setPositiveButton(
+ R.string.pin_entry_connect, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Log.i("jniiface", "User provided a PIN code");
+ authenticationResponse(String.valueOf(pinEntry.getText()));
+ }
+ });
+
+ pinPrompt.setNegativeButton(
+ R.string.pin_entry_cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Log.i("jniiface", "User canceled pin entry prompt");
+ Toast.makeText(sContext,
+ sContext.getString(R.string.msg_pin_canceled),
+ Toast.LENGTH_LONG).show();
+ disconnectFromHost();
+ }
+ });
+
+ pinPrompt.show();
+ }
+
+ /** Forces the native graphics thread to redraw to the canvas. */
+ public static boolean redrawGraphics() {
+ synchronized(JniInterface.class) {
+ if (!sConnected) return false;
+ }
+
+ scheduleRedrawNative();
+ return true;
+ }
+
+ /** Performs the redrawing callback. */
+ private static void redrawGraphicsInternal() {
+ // TODO(solb) Actually draw the image onto some canvas.
+ }
+
+ /** Performs the native response to the user's PIN. */
+ private static native void authenticationResponse(String pin);
+
+ /** Schedules a redraw on the native graphics thread. */
+ private static native void scheduleRedrawNative();
+}
« no previous file with comments | « remoting/android/java/src/org/chromium/chromoting/Chromoting.java ('k') | remoting/protocol/connection_to_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698