OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chromoting.jni; | 5 package org.chromium.chromoting.jni; |
6 | 6 |
7 import android.app.Activity; | 7 import android.app.Activity; |
8 import android.app.AlertDialog; | 8 import android.app.AlertDialog; |
9 import android.content.Context; | 9 import android.content.Context; |
10 import android.content.DialogInterface; | 10 import android.content.DialogInterface; |
11 import android.content.SharedPreferences; | 11 import android.content.SharedPreferences; |
12 import android.graphics.Bitmap; | 12 import android.graphics.Bitmap; |
13 import android.graphics.Point; | 13 import android.graphics.Point; |
14 import android.os.Build; | 14 import android.os.Build; |
15 import android.os.Looper; | 15 import android.os.Looper; |
16 import android.util.Log; | 16 import android.util.Log; |
17 import android.view.KeyEvent; | 17 import android.view.KeyEvent; |
18 import android.view.View; | 18 import android.view.View; |
19 import android.widget.CheckBox; | 19 import android.widget.CheckBox; |
20 import android.widget.TextView; | 20 import android.widget.TextView; |
| 21 import android.widget.Toast; |
21 | 22 |
22 import org.chromium.base.CalledByNative; | 23 import org.chromium.base.CalledByNative; |
23 import org.chromium.base.JNINamespace; | 24 import org.chromium.base.JNINamespace; |
24 import org.chromium.chromoting.Chromoting; | 25 import org.chromium.chromoting.Chromoting; |
25 import org.chromium.chromoting.R; | 26 import org.chromium.chromoting.R; |
26 | 27 |
27 import java.nio.ByteBuffer; | 28 import java.nio.ByteBuffer; |
28 import java.nio.ByteOrder; | 29 import java.nio.ByteOrder; |
29 | 30 |
30 /** | 31 /** |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 prefs.getString(hostId + "_id", ""), prefs.getString(hostId + "_
secret", "")); | 180 prefs.getString(hostId + "_id", ""), prefs.getString(hostId + "_
secret", "")); |
180 sConnected = true; | 181 sConnected = true; |
181 } | 182 } |
182 | 183 |
183 /** Performs the native portion of the connection. */ | 184 /** Performs the native portion of the connection. */ |
184 private static native void nativeConnect(String username, String authToken,
String hostJid, | 185 private static native void nativeConnect(String username, String authToken,
String hostJid, |
185 String hostId, String hostPubkey, String pairId, String pairSecret); | 186 String hostId, String hostPubkey, String pairId, String pairSecret); |
186 | 187 |
187 /** Severs the connection and cleans up. Called on the UI thread. */ | 188 /** Severs the connection and cleans up. Called on the UI thread. */ |
188 public static void disconnectFromHost() { | 189 public static void disconnectFromHost() { |
189 if (!sConnected) return; | 190 if (!sConnected) { |
| 191 return; |
| 192 } |
190 | 193 |
191 sConnectionListener.onConnectionState(ConnectionListener.State.CLOSED, | 194 sConnectionListener.onConnectionState(ConnectionListener.State.CLOSED, |
192 ConnectionListener.Error.OK); | 195 ConnectionListener.Error.OK); |
193 | 196 |
| 197 disconnectFromHostWithoutNotification(); |
| 198 } |
| 199 |
| 200 /** Same as disconnectFromHost() but without notifying the ConnectionListene
r. */ |
| 201 private static void disconnectFromHostWithoutNotification() { |
| 202 if (!sConnected) { |
| 203 return; |
| 204 } |
| 205 |
194 nativeDisconnect(); | 206 nativeDisconnect(); |
195 sConnectionListener = null; | 207 sConnectionListener = null; |
196 sConnected = false; | 208 sConnected = false; |
197 | 209 |
198 // Drop the reference to free the Bitmap for GC. | 210 // Drop the reference to free the Bitmap for GC. |
199 synchronized (sFrameLock) { | 211 synchronized (sFrameLock) { |
200 sFrameBitmap = null; | 212 sFrameBitmap = null; |
201 } | 213 } |
202 } | 214 } |
203 | 215 |
204 /** Performs the native portion of the cleanup. */ | 216 /** Performs the native portion of the cleanup. */ |
205 private static native void nativeDisconnect(); | 217 private static native void nativeDisconnect(); |
206 | 218 |
207 /** Reports whenever the connection status changes. Called on the UI thread.
*/ | 219 /** Called by native code whenever the connection status changes. Called on
the UI thread. */ |
208 @CalledByNative | 220 @CalledByNative |
209 private static void reportConnectionStatus(int state, int error) { | 221 private static void onConnectionState(int stateCode, int errorCode) { |
210 sConnectionListener.onConnectionState(ConnectionListener.State.fromValue
(state), | 222 ConnectionListener.State state = ConnectionListener.State.fromValue(stat
eCode); |
211 ConnectionListener.Error.fromValue(error)); | 223 ConnectionListener.Error error = ConnectionListener.Error.fromValue(erro
rCode); |
| 224 sConnectionListener.onConnectionState(state, error); |
| 225 if (state == ConnectionListener.State.FAILED || state == ConnectionListe
ner.State.CLOSED) { |
| 226 // Disconnect from the host here, otherwise the next time connectToH
ost() is called, |
| 227 // it will try to disconnect, triggering an incorrect status notific
ation. |
| 228 disconnectFromHostWithoutNotification(); |
| 229 } |
212 } | 230 } |
213 | 231 |
214 /** Prompts the user to enter a PIN. Called on the UI thread. */ | 232 /** Prompts the user to enter a PIN. Called on the UI thread. */ |
215 @CalledByNative | 233 @CalledByNative |
216 private static void displayAuthenticationPrompt(boolean pairingSupported) { | 234 private static void displayAuthenticationPrompt(boolean pairingSupported) { |
217 AlertDialog.Builder pinPrompt = new AlertDialog.Builder(sContext); | 235 AlertDialog.Builder pinPrompt = new AlertDialog.Builder(sContext); |
218 pinPrompt.setTitle(sContext.getString(R.string.title_authenticate)); | 236 pinPrompt.setTitle(sContext.getString(R.string.title_authenticate)); |
219 pinPrompt.setMessage(sContext.getString(R.string.pin_message_android)); | 237 pinPrompt.setMessage(sContext.getString(R.string.pin_message_android)); |
220 pinPrompt.setIcon(android.R.drawable.ic_lock_lock); | 238 pinPrompt.setIcon(android.R.drawable.ic_lock_lock); |
221 | 239 |
222 final View pinEntry = sContext.getLayoutInflater().inflate(R.layout.pin_
dialog, null); | 240 final View pinEntry = sContext.getLayoutInflater().inflate(R.layout.pin_
dialog, null); |
223 pinPrompt.setView(pinEntry); | 241 pinPrompt.setView(pinEntry); |
224 | 242 |
225 final TextView pinTextView = (TextView)pinEntry.findViewById(R.id.pin_di
alog_text); | 243 final TextView pinTextView = (TextView)pinEntry.findViewById(R.id.pin_di
alog_text); |
226 final CheckBox pinCheckBox = (CheckBox)pinEntry.findViewById(R.id.pin_di
alog_check); | 244 final CheckBox pinCheckBox = (CheckBox)pinEntry.findViewById(R.id.pin_di
alog_check); |
227 | 245 |
228 if (!pairingSupported) { | 246 if (!pairingSupported) { |
229 pinCheckBox.setChecked(false); | 247 pinCheckBox.setChecked(false); |
230 pinCheckBox.setVisibility(View.GONE); | 248 pinCheckBox.setVisibility(View.GONE); |
231 } | 249 } |
232 | 250 |
233 pinPrompt.setPositiveButton( | 251 pinPrompt.setPositiveButton( |
234 R.string.connect_button, new DialogInterface.OnClickListener() { | 252 R.string.connect_button, new DialogInterface.OnClickListener() { |
235 @Override | 253 @Override |
236 public void onClick(DialogInterface dialog, int which) { | 254 public void onClick(DialogInterface dialog, int which) { |
237 Log.i("jniiface", "User provided a PIN code"); | 255 Log.i("jniiface", "User provided a PIN code"); |
238 nativeAuthenticationResponse(String.valueOf(pinTextView.
getText()), | 256 if (sConnected) { |
239 pinCheckBox.isChecked(), Build.MODEL); | 257 nativeAuthenticationResponse(String.valueOf(pinTextV
iew.getText()), |
| 258 pinCheckBox.isChecked(), Build.MODEL); |
| 259 } else { |
| 260 String message = sContext.getString(R.string.error_n
etwork_error); |
| 261 Toast.makeText(sContext, message, Toast.LENGTH_LONG)
.show(); |
| 262 } |
240 } | 263 } |
241 }); | 264 }); |
242 | 265 |
243 pinPrompt.setNegativeButton( | 266 pinPrompt.setNegativeButton( |
244 R.string.cancel, new DialogInterface.OnClickListener() { | 267 R.string.cancel, new DialogInterface.OnClickListener() { |
245 @Override | 268 @Override |
246 public void onClick(DialogInterface dialog, int which) { | 269 public void onClick(DialogInterface dialog, int which) { |
247 Log.i("jniiface", "User canceled pin entry prompt"); | 270 Log.i("jniiface", "User canceled pin entry prompt"); |
248 disconnectFromHost(); | 271 disconnectFromHost(); |
249 } | 272 } |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 /** Pops up a third party login page to fetch the token required for authent
ication. */ | 473 /** Pops up a third party login page to fetch the token required for authent
ication. */ |
451 @CalledByNative | 474 @CalledByNative |
452 public static void fetchThirdPartyToken(String tokenUrl, String clientId, St
ring scope) { | 475 public static void fetchThirdPartyToken(String tokenUrl, String clientId, St
ring scope) { |
453 Chromoting app = (Chromoting) sContext; | 476 Chromoting app = (Chromoting) sContext; |
454 app.fetchThirdPartyToken(tokenUrl, clientId, scope); | 477 app.fetchThirdPartyToken(tokenUrl, clientId, scope); |
455 } | 478 } |
456 | 479 |
457 /** | 480 /** |
458 * Notify the native code to continue authentication with the |token| and th
e |sharedSecret|. | 481 * Notify the native code to continue authentication with the |token| and th
e |sharedSecret|. |
459 */ | 482 */ |
460 public static native void nativeOnThirdPartyTokenFetched(String token, Strin
g sharedSecret); | 483 public static void onThirdPartyTokenFetched(String token, String sharedSecre
t) { |
| 484 if (!sConnected) { |
| 485 return; |
| 486 } |
| 487 |
| 488 nativeOnThirdPartyTokenFetched(token, sharedSecret); |
| 489 } |
| 490 |
| 491 /** Passes authentication data to the native handling code. */ |
| 492 private static native void nativeOnThirdPartyTokenFetched(String token, Stri
ng sharedSecret); |
461 } | 493 } |
OLD | NEW |