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 |
3 | // found in the LICENSE file. |
4 | |
5 | package org.chromium.chromoting; |
6 | |
7 | import android.app.Activity; |
8 | import android.content.res.Configuration; |
9 | import android.os.Bundle; |
10 | import android.util.Log; |
11 | import android.view.KeyEvent; |
12 | import android.view.Menu; |
13 | import android.view.MenuItem; |
14 | import android.view.WindowManager; |
15 | import android.view.inputmethod.InputMethodManager; |
16 | |
17 | import org.chromium.chromoting.jni.JniInterface; |
18 | |
19 | /** |
20 | * A simple screen that does nothing except display a DesktopView and notify it of rotations. |
21 | */ |
22 | public class Desktop extends Activity { |
23 | /** The surface that displays the remote host's desktop feed. */ |
24 | private DesktopView remoteHostDesktop; |
25 | |
26 | /** Called when the activity is first created. */ |
27 | @Override |
28 | public void onCreate(Bundle savedInstanceState) { |
29 | super.onCreate(savedInstanceState); |
30 | remoteHostDesktop = new DesktopView(this); |
31 | setContentView(remoteHostDesktop); |
32 | } |
33 | |
34 | /** Called when the activity is finally finished. */ |
35 | @Override |
36 | public void onDestroy() { |
37 | super.onDestroy(); |
38 | JniInterface.disconnectFromHost(); |
39 | } |
40 | |
41 | /** Called when the display is rotated (as registered in the manifest). */ |
42 | @Override |
43 | public void onConfigurationChanged(Configuration newConfig) { |
44 | super.onConfigurationChanged(newConfig); |
45 | remoteHostDesktop.requestRecheckConstrainingDimension(); |
46 | } |
47 | |
48 | /** Called to initialize the action bar. */ |
49 | @Override |
50 | public boolean onCreateOptionsMenu(Menu menu) { |
51 | getMenuInflater().inflate(R.menu.desktop_actionbar, menu); |
52 | return super.onCreateOptionsMenu(menu); |
53 | } |
54 | |
55 | /** Called whenever an action bar button is pressed. */ |
56 | @Override |
57 | public boolean onOptionsItemSelected(MenuItem item) { |
58 | switch (item.getItemId()) { |
59 | case R.id.actionbar_keyboard: |
60 | ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0, 0); |
61 | return true; |
62 | case R.id.actionbar_hide: |
63 | getActionBar().hide(); |
64 | return true; |
65 | default: |
66 | return super.onOptionsItemSelected(item); |
67 | } |
68 | } |
69 | |
70 | /** |
71 | * Called once when a keyboard key is pressed, then again when that same key is released. This |
72 | * is not guaranteed to be notified of all soft keyboard events: certian keyboards might not |
73 | * call it at all, while others might skip it in certain situations (e.g. swipe input). |
74 | */ |
75 | @Override |
76 | public boolean dispatchKeyEvent(KeyEvent event) { |
77 | boolean depressed = event.getAction() == KeyEvent.ACTION_DOWN; |
78 | |
79 | switch (event.getKeyCode()) { |
80 | case KeyEvent.KEYCODE_AT: |
81 | JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed); |
82 | JniInterface.keyboardAction(KeyEvent.KEYCODE_2, depressed); |
83 | break; |
84 | case KeyEvent.KEYCODE_POUND: |
85 | JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed); |
86 | JniInterface.keyboardAction(KeyEvent.KEYCODE_3, depressed); |
87 | break; |
88 | case KeyEvent.KEYCODE_STAR: |
89 | JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed); |
90 | JniInterface.keyboardAction(KeyEvent.KEYCODE_8, depressed); |
91 | break; |
92 | case KeyEvent.KEYCODE_PLUS: |
93 | JniInterface.keyboardAction(KeyEvent.KEYCODE_SHIFT_LEFT, depressed); |
94 | JniInterface.keyboardAction(KeyEvent.KEYCODE_EQUALS, depressed); |
95 | break; |
96 | default: |
97 | // We try to send all other key codes to the host directly. |
98 | JniInterface.keyboardAction(event.getKeyCode(), depressed); |
99 | } |
100 | |
101 | return super.dispatchKeyEvent(event); |
102 | } |
103 | } |