Mercurial > 510Connectbot
annotate src/com/five_ten_sg/connectbot/service/TerminalKeyListener.java @ 54:a7e660661e08 tn5250
start tn5250 integration
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Wed, 11 Jun 2014 14:01:43 -0700 |
parents | e872762ec105 |
children | 17fd0e489165 |
rev | line source |
---|---|
0 | 1 /* |
2 * ConnectBot: simple, powerful, open-source SSH client for Android | |
3 * Copyright 2010 Kenny Root, Jeffrey Sharkey | |
4 * | |
5 * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 * you may not use this file except in compliance with the License. | |
7 * You may obtain a copy of the License at | |
8 * | |
9 * http://www.apache.org/licenses/LICENSE-2.0 | |
10 * | |
11 * Unless required by applicable law or agreed to in writing, software | |
12 * distributed under the License is distributed on an "AS IS" BASIS, | |
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 * See the License for the specific language governing permissions and | |
15 * limitations under the License. | |
16 */ | |
17 package com.five_ten_sg.connectbot.service; | |
18 | |
19 import java.io.IOException; | |
54
a7e660661e08
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
53
diff
changeset
|
20 import java.io.UnsupportedEncodingException; |
48
1e931ef5f776
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
45
diff
changeset
|
21 import java.nio.charset.Charset; |
0 | 22 import java.lang.ref.WeakReference; |
23 import java.util.List; | |
24 | |
25 import com.five_ten_sg.connectbot.R; | |
26 import com.five_ten_sg.connectbot.TerminalView; | |
27 import com.five_ten_sg.connectbot.bean.SelectionArea; | |
28 import com.five_ten_sg.connectbot.util.PreferenceConstants; | |
29 import android.app.Dialog; | |
30 import android.content.Context; | |
31 import android.content.Intent; | |
32 import android.content.SharedPreferences; | |
33 import android.content.SharedPreferences.OnSharedPreferenceChangeListener; | |
34 import android.content.res.Configuration; | |
35 import android.net.Uri; | |
36 import android.preference.PreferenceManager; | |
37 import android.text.ClipboardManager; | |
38 import android.util.Log; | |
39 import android.view.Gravity; | |
40 import android.view.KeyCharacterMap; | |
41 import android.view.KeyEvent; | |
42 import android.view.View; | |
43 import android.view.View.OnKeyListener; | |
44 import android.widget.AdapterView; | |
45 import android.widget.AdapterView.OnItemClickListener; | |
46 import android.widget.ArrayAdapter; | |
47 import android.widget.ListView; | |
48 import android.widget.TextView; | |
49 import de.mud.terminal.VDUBuffer; | |
50 import de.mud.terminal.vt320; | |
51 | |
52 /** | |
53 * @author kenny | |
54 * | |
55 */ | |
56 @SuppressWarnings("deprecation") // for ClipboardManager | |
57 public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceChangeListener { | |
58 private static final String TAG = "ConnectBot.OnKeyListener"; | |
59 | |
60 public final static int META_CTRL_ON = 0x01; | |
61 public final static int META_CTRL_LOCK = 0x02; | |
62 public final static int META_ALT_ON = 0x04; | |
63 public final static int META_ALT_LOCK = 0x08; | |
64 public final static int META_SHIFT_ON = 0x10; | |
65 public final static int META_SHIFT_LOCK = 0x20; | |
66 public final static int META_SLASH = 0x40; | |
67 public final static int META_TAB = 0x80; | |
68 | |
69 // The bit mask of momentary and lock states for each | |
70 public final static int META_CTRL_MASK = META_CTRL_ON | META_CTRL_LOCK; | |
71 public final static int META_ALT_MASK = META_ALT_ON | META_ALT_LOCK; | |
72 public final static int META_SHIFT_MASK = META_SHIFT_ON | META_SHIFT_LOCK; | |
73 | |
74 // backport constants from api level 11 | |
75 public final static int KEYCODE_ESCAPE = 111; | |
76 public final static int HC_META_CTRL_ON = 4096; | |
77 public final static int KEYCODE_PAGE_UP = 92; | |
78 public final static int KEYCODE_PAGE_DOWN = 93; | |
79 | |
80 // All the transient key codes | |
81 public final static int META_TRANSIENT = META_CTRL_ON | META_ALT_ON | |
82 | META_SHIFT_ON; | |
83 | |
51
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
84 protected final TerminalManager manager; |
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
85 protected final TerminalBridge bridge; |
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
86 protected final vt320 buffer; |
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
87 protected String encoding; |
0 | 88 |
51
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
89 protected String keymode = null; |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
90 protected boolean hardKeyboard = false; |
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
91 protected boolean hardKeyboardHidden; |
51
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
92 protected String customKeyboard = null; |
0 | 93 |
51
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
94 protected int metaState = 0; |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
95 protected int mDeadKey = 0; |
0 | 96 |
97 // TODO add support for the new API. | |
98 private ClipboardManager clipboard = null; | |
99 private boolean selectingForCopy = false; | |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
100 private final SelectionArea selectionArea; |
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
101 protected final SharedPreferences prefs; |
0 | 102 |
103 | |
104 public TerminalKeyListener(TerminalManager manager, | |
105 TerminalBridge bridge, | |
106 vt320 buffer, | |
107 String encoding) { | |
108 this.manager = manager; | |
109 this.bridge = bridge; | |
110 this.buffer = buffer; | |
111 this.encoding = encoding; | |
112 selectionArea = new SelectionArea(); | |
113 prefs = PreferenceManager.getDefaultSharedPreferences(manager); | |
114 prefs.registerOnSharedPreferenceChangeListener(this); | |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
115 hardKeyboard = (manager.res.getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY); |
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
116 hardKeyboardHidden = manager.hardKeyboardHidden; |
0 | 117 updateKeymode(); |
118 updateCustomKeymap(); | |
119 } | |
120 | |
121 public void sendEscape() { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
122 buffer.keyPressed(vt320.KEY_ESCAPE, ' ', getStateForBuffer()); |
0 | 123 } |
124 | |
52
0e3fc85d0586
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
51
diff
changeset
|
125 protected void sendEncoded(String s) { |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
126 byte [] b = null; |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
127 try { |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
128 b = s.getBytes(encoding); |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
129 } |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
130 catch (UnsupportedEncodingException e){ |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
131 } |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
132 if (b != null) buffer.write(b); |
52
0e3fc85d0586
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
51
diff
changeset
|
133 } |
0e3fc85d0586
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
51
diff
changeset
|
134 |
0 | 135 /** |
136 * Handle onKey() events coming down from a {@link com.five_ten_sg.connectbot.TerminalView} above us. | |
137 * Modify the keys to make more sense to a host then pass it to the vt320. | |
138 */ | |
139 public boolean onKey(View v, int keyCode, KeyEvent event) { | |
140 try { | |
141 // skip keys if we aren't connected yet or have been disconnected | |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
142 if (bridge.isDisconnected()) return false; |
0 | 143 |
144 // Ignore all key-up events except for the special keys | |
145 if (event.getAction() == KeyEvent.ACTION_UP) { | |
146 // There's nothing here for virtual keyboard users. | |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
147 if (!hardKeyboard || hardKeyboardHidden) return false; |
0 | 148 |
149 // if keycode debugging enabled, log and print the pressed key | |
150 if (prefs.getBoolean(PreferenceConstants.DEBUG_KEYCODES, false)) { | |
151 String keyCodeString = String.format(": %d", keyCode); | |
152 String toastText = v.getContext().getString(R.string.keycode_pressed) + keyCodeString; | |
49
8887bff45dee
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
48
diff
changeset
|
153 Log.d(TAG, toastText); |
0 | 154 } |
155 | |
156 if (fullKeyboard()) { | |
157 switch (keyCode) { | |
158 case KeyEvent.KEYCODE_CTRL_LEFT: | |
159 case KeyEvent.KEYCODE_CTRL_RIGHT: | |
160 metaKeyUp(META_CTRL_ON); | |
161 return true; | |
162 | |
163 case KeyEvent.KEYCODE_ALT_LEFT: | |
164 case KeyEvent.KEYCODE_ALT_RIGHT: | |
165 metaKeyUp(META_ALT_ON); | |
166 return true; | |
167 | |
168 case KeyEvent.KEYCODE_SHIFT_LEFT: | |
169 case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
170 metaKeyUp(META_SHIFT_ON); | |
171 return true; | |
172 | |
173 default: | |
174 } | |
175 } | |
176 else if (PreferenceConstants.KEYMODE_RIGHT.equals(keymode)) { | |
177 if (keyCode == KeyEvent.KEYCODE_ALT_RIGHT | |
178 && (metaState & META_SLASH) != 0) { | |
179 metaState &= ~(META_SLASH | META_TRANSIENT); | |
180 buffer.write('/'); | |
181 return true; | |
182 } | |
183 else if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT | |
184 && (metaState & META_TAB) != 0) { | |
185 metaState &= ~(META_TAB | META_TRANSIENT); | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
186 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer()); |
0 | 187 return true; |
188 } | |
189 } | |
190 else if (PreferenceConstants.KEYMODE_LEFT.equals(keymode)) { | |
191 if (keyCode == KeyEvent.KEYCODE_ALT_LEFT | |
192 && (metaState & META_SLASH) != 0) { | |
193 metaState &= ~(META_SLASH | META_TRANSIENT); | |
194 buffer.write('/'); | |
195 return true; | |
196 } | |
197 else if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT | |
198 && (metaState & META_TAB) != 0) { | |
199 metaState &= ~(META_TAB | META_TRANSIENT); | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
200 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer()); |
0 | 201 return true; |
202 } | |
203 } | |
204 | |
205 return false; | |
206 } | |
207 | |
208 bridge.resetScrollPosition(); | |
209 | |
210 if (keyCode == KeyEvent.KEYCODE_UNKNOWN && | |
211 event.getAction() == KeyEvent.ACTION_MULTIPLE) { | |
52
0e3fc85d0586
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
51
diff
changeset
|
212 sendEncoded(event.getCharacters()); |
0 | 213 return true; |
214 } | |
215 | |
216 int curMetaState = event.getMetaState(); | |
217 final int orgMetaState = curMetaState; | |
218 | |
219 if ((metaState & META_SHIFT_MASK) != 0) { | |
220 curMetaState |= KeyEvent.META_SHIFT_ON; | |
221 } | |
222 | |
223 if ((metaState & META_ALT_MASK) != 0) { | |
224 curMetaState |= KeyEvent.META_ALT_ON; | |
225 } | |
226 | |
227 int uchar = event.getUnicodeChar(curMetaState); | |
228 | |
229 // no hard keyboard? ALT-k should pass through to below | |
230 if ((orgMetaState & KeyEvent.META_ALT_ON) != 0 && | |
231 (!hardKeyboard || hardKeyboardHidden)) { | |
232 uchar = 0; | |
233 } | |
234 | |
235 if ((uchar & KeyCharacterMap.COMBINING_ACCENT) != 0) { | |
236 mDeadKey = uchar & KeyCharacterMap.COMBINING_ACCENT_MASK; | |
237 return true; | |
238 } | |
239 | |
240 if (mDeadKey != 0 && uchar != 0) { | |
241 uchar = KeyCharacterMap.getDeadChar(mDeadKey, uchar); | |
242 mDeadKey = 0; | |
243 } | |
244 | |
245 // handle customized keymaps | |
246 if (customKeymapAction(v, keyCode, event)) | |
247 return true; | |
248 | |
249 if (v != null) { | |
250 //Show up the CharacterPickerDialog when the SYM key is pressed | |
251 if ((isSymKey(keyCode) || uchar == KeyCharacterMap.PICKER_DIALOG_INPUT)) { | |
252 bridge.showCharPickerDialog(); | |
253 | |
254 if (metaState == 4) { // reset fn-key state | |
255 metaState = 0; | |
256 bridge.redraw(); | |
257 } | |
258 | |
259 return true; | |
260 } | |
261 else if (keyCode == KeyEvent.KEYCODE_SEARCH) { | |
262 //Show up the URL scan dialog when the search key is pressed | |
263 urlScan(v); | |
264 return true; | |
265 } | |
266 } | |
267 | |
268 // otherwise pass through to existing session | |
269 // print normal keys | |
270 if (uchar > 0x00 && keyCode != KeyEvent.KEYCODE_ENTER) { | |
271 metaState &= ~(META_SLASH | META_TAB); | |
272 // Remove shift and alt modifiers | |
273 final int lastMetaState = metaState; | |
274 metaState &= ~(META_SHIFT_ON | META_ALT_ON); | |
275 | |
276 if (metaState != lastMetaState) { | |
277 bridge.redraw(); | |
278 } | |
279 | |
280 if ((metaState & META_CTRL_MASK) != 0) { | |
281 metaState &= ~META_CTRL_ON; | |
282 bridge.redraw(); | |
283 | |
284 // If there is no hard keyboard or there is a hard keyboard currently hidden, | |
285 // CTRL-1 through CTRL-9 will send F1 through F9 | |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
286 if ((!hardKeyboard || hardKeyboardHidden) && sendFunctionKey(keyCode)) |
0 | 287 return true; |
288 | |
289 uchar = keyAsControl(uchar); | |
290 } | |
291 | |
292 // handle pressing f-keys | |
293 if ((hardKeyboard && !hardKeyboardHidden) | |
294 && (curMetaState & KeyEvent.META_ALT_ON) != 0 | |
295 && (curMetaState & KeyEvent.META_SHIFT_ON) != 0 | |
296 && sendFunctionKey(keyCode)) | |
297 return true; | |
298 | |
299 if (uchar < 0x80) | |
300 buffer.write(uchar); | |
301 else | |
52
0e3fc85d0586
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
51
diff
changeset
|
302 sendEncoded(new String(Character.toChars(uchar))); |
0 | 303 |
304 return true; | |
305 } | |
306 | |
307 // send ctrl and meta-keys as appropriate | |
308 if (!hardKeyboard || hardKeyboardHidden) { | |
309 int k = event.getUnicodeChar(0); | |
310 int k0 = k; | |
311 boolean sendCtrl = false; | |
312 boolean sendMeta = false; | |
313 | |
314 if (k != 0) { | |
315 if ((orgMetaState & HC_META_CTRL_ON) != 0) { | |
316 k = keyAsControl(k); | |
317 | |
318 if (k != k0) | |
319 sendCtrl = true; | |
320 | |
321 // send F1-F10 via CTRL-1 through CTRL-0 | |
322 if (!sendCtrl && sendFunctionKey(keyCode)) | |
323 return true; | |
324 } | |
325 else if ((orgMetaState & KeyEvent.META_ALT_ON) != 0) { | |
326 sendMeta = true; | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
327 sendEscape(); |
0 | 328 } |
329 | |
330 if (sendMeta || sendCtrl) { | |
331 buffer.write(k); | |
332 return true; | |
333 } | |
334 } | |
335 } | |
336 | |
337 // handle meta and f-keys for full hardware keyboard | |
338 if (hardKeyboard && !hardKeyboardHidden && fullKeyboard()) { | |
339 int k = event.getUnicodeChar(orgMetaState & KeyEvent.META_SHIFT_ON); | |
340 int k0 = k; | |
341 | |
342 if (k != 0) { | |
343 if ((orgMetaState & HC_META_CTRL_ON) != 0) { | |
344 k = keyAsControl(k); | |
345 | |
346 if (k != k0) | |
347 buffer.write(k); | |
348 | |
349 return true; | |
350 } | |
351 else if ((orgMetaState & KeyEvent.META_ALT_ON) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
352 sendEscape(); |
0 | 353 buffer.write(k); |
354 return true; | |
355 } | |
356 } | |
357 | |
358 if (sendFullSpecialKey(keyCode)) | |
359 return true; | |
360 } | |
361 | |
362 // try handling keymode shortcuts | |
363 if (hardKeyboard && !hardKeyboardHidden && | |
364 event.getRepeatCount() == 0) { | |
365 if (PreferenceConstants.KEYMODE_RIGHT.equals(keymode)) { | |
366 switch (keyCode) { | |
367 case KeyEvent.KEYCODE_ALT_RIGHT: | |
368 metaState |= META_SLASH; | |
369 return true; | |
370 | |
371 case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
372 metaState |= META_TAB; | |
373 return true; | |
374 | |
375 case KeyEvent.KEYCODE_SHIFT_LEFT: | |
376 metaPress(META_SHIFT_ON); | |
377 return true; | |
378 | |
379 case KeyEvent.KEYCODE_ALT_LEFT: | |
380 metaPress(META_ALT_ON); | |
381 return true; | |
382 } | |
383 } | |
384 else if (PreferenceConstants.KEYMODE_LEFT.equals(keymode)) { | |
385 switch (keyCode) { | |
386 case KeyEvent.KEYCODE_ALT_LEFT: | |
387 metaState |= META_SLASH; | |
388 return true; | |
389 | |
390 case KeyEvent.KEYCODE_SHIFT_LEFT: | |
391 metaState |= META_TAB; | |
392 return true; | |
393 | |
394 case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
395 metaPress(META_SHIFT_ON); | |
396 return true; | |
397 | |
398 case KeyEvent.KEYCODE_ALT_RIGHT: | |
399 metaPress(META_ALT_ON); | |
400 return true; | |
401 } | |
402 } | |
403 else { | |
404 switch (keyCode) { | |
405 case KeyEvent.KEYCODE_ALT_RIGHT: | |
406 case KeyEvent.KEYCODE_ALT_LEFT: | |
407 metaPress(META_ALT_ON); | |
408 return true; | |
409 | |
410 case KeyEvent.KEYCODE_SHIFT_LEFT: | |
411 case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
412 metaPress(META_SHIFT_ON); | |
413 return true; | |
414 } | |
415 } | |
416 | |
417 // Handle hardware CTRL keys | |
418 if (keyCode == KeyEvent.KEYCODE_CTRL_LEFT || | |
419 keyCode == KeyEvent.KEYCODE_CTRL_RIGHT) { | |
420 ctrlKeySpecial(); | |
421 return true; | |
422 } | |
423 } | |
424 | |
425 // look for special chars | |
426 switch (keyCode) { | |
427 case KEYCODE_ESCAPE: | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
428 sendEscape(); |
0 | 429 return true; |
430 | |
431 case KeyEvent.KEYCODE_TAB: | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
432 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer()); |
0 | 433 return true; |
434 | |
435 case KEYCODE_PAGE_DOWN: | |
436 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', getStateForBuffer()); | |
437 metaState &= ~META_TRANSIENT; | |
438 bridge.tryKeyVibrate(); | |
439 return true; | |
440 | |
441 case KEYCODE_PAGE_UP: | |
442 buffer.keyPressed(vt320.KEY_PAGE_UP, ' ', getStateForBuffer()); | |
443 metaState &= ~META_TRANSIENT; | |
444 bridge.tryKeyVibrate(); | |
445 return true; | |
446 | |
447 case KeyEvent.KEYCODE_MOVE_HOME: | |
448 buffer.keyPressed(vt320.KEY_HOME, ' ', getStateForBuffer()); | |
449 metaState &= ~META_TRANSIENT; | |
450 bridge.tryKeyVibrate(); | |
451 return true; | |
452 | |
453 case KeyEvent.KEYCODE_MOVE_END: | |
454 buffer.keyPressed(vt320.KEY_END, ' ', getStateForBuffer()); | |
455 metaState &= ~META_TRANSIENT; | |
456 bridge.tryKeyVibrate(); | |
457 return true; | |
458 | |
459 case KeyEvent.KEYCODE_CAMERA: | |
460 // check to see which shortcut the camera button triggers | |
461 String hwbuttonShortcut = manager.prefs.getString( | |
462 PreferenceConstants.CAMERA, | |
463 PreferenceConstants.HWBUTTON_SCREEN_CAPTURE); | |
464 return (handleShortcut(v, hwbuttonShortcut)); | |
465 | |
466 case KeyEvent.KEYCODE_VOLUME_UP: | |
42
7ac846a07ed4
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
467 // check to see which shortcut the volume button triggers |
0 | 468 hwbuttonShortcut = manager.prefs.getString( |
469 PreferenceConstants.VOLUP, | |
470 PreferenceConstants.HWBUTTON_CTRL); | |
471 return (handleShortcut(v, hwbuttonShortcut)); | |
472 | |
473 case KeyEvent.KEYCODE_VOLUME_DOWN: | |
474 // check to see which shortcut the camera button triggers | |
475 hwbuttonShortcut = manager.prefs.getString( | |
476 PreferenceConstants.VOLDN, | |
477 PreferenceConstants.HWBUTTON_TAB); | |
478 return (handleShortcut(v, hwbuttonShortcut)); | |
479 | |
480 case KeyEvent.KEYCODE_SEARCH: | |
42
7ac846a07ed4
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
481 // check to see which shortcut the search button triggers |
0 | 482 hwbuttonShortcut = manager.prefs.getString( |
483 PreferenceConstants.SEARCH, | |
484 PreferenceConstants.HWBUTTON_ESC); | |
485 return (handleShortcut(v, hwbuttonShortcut)); | |
486 | |
487 case KeyEvent.KEYCODE_DEL: | |
488 if ((metaState & META_ALT_MASK) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
489 buffer.keyPressed(vt320.KEY_INSERT, ' ', getStateForBuffer()); |
0 | 490 } |
491 else { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
492 buffer.keyPressed(vt320.KEY_BACK_SPACE, ' ', getStateForBuffer()); |
0 | 493 } |
494 | |
495 metaState &= ~META_TRANSIENT; | |
496 return true; | |
497 | |
498 case KeyEvent.KEYCODE_ENTER: | |
499 buffer.write('\r'); | |
500 metaState &= ~META_TRANSIENT; | |
501 return true; | |
502 | |
503 case KeyEvent.KEYCODE_DPAD_LEFT: | |
504 if (selectingForCopy) { | |
505 selectionArea.decrementColumn(); | |
506 bridge.redraw(); | |
507 } | |
508 else { | |
509 if ((metaState & META_ALT_MASK) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
510 buffer.keyPressed(vt320.KEY_HOME, ' ', getStateForBuffer()); |
0 | 511 } |
512 else { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
513 buffer.keyPressed(vt320.KEY_LEFT, ' ', getStateForBuffer()); |
0 | 514 } |
515 | |
516 metaState &= ~META_TRANSIENT; | |
517 bridge.tryKeyVibrate(); | |
518 } | |
519 | |
520 return true; | |
521 | |
522 case KeyEvent.KEYCODE_DPAD_UP: | |
523 if (selectingForCopy) { | |
524 selectionArea.decrementRow(); | |
525 bridge.redraw(); | |
526 } | |
527 else { | |
528 if ((metaState & META_ALT_MASK) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
529 buffer.keyPressed(vt320.KEY_PAGE_UP, ' ', getStateForBuffer()); |
0 | 530 } |
531 else { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
532 buffer.keyPressed(vt320.KEY_UP, ' ', getStateForBuffer()); |
0 | 533 } |
534 | |
535 metaState &= ~META_TRANSIENT; | |
536 bridge.tryKeyVibrate(); | |
537 } | |
538 | |
539 return true; | |
540 | |
541 case KeyEvent.KEYCODE_DPAD_DOWN: | |
542 if (selectingForCopy) { | |
543 selectionArea.incrementRow(); | |
544 bridge.redraw(); | |
545 } | |
546 else { | |
547 if ((metaState & META_ALT_MASK) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
548 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', getStateForBuffer()); |
0 | 549 } |
550 else { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
551 buffer.keyPressed(vt320.KEY_DOWN, ' ', getStateForBuffer()); |
0 | 552 } |
553 | |
554 metaState &= ~META_TRANSIENT; | |
555 bridge.tryKeyVibrate(); | |
556 } | |
557 | |
558 return true; | |
559 | |
560 case KeyEvent.KEYCODE_DPAD_RIGHT: | |
561 if (selectingForCopy) { | |
562 selectionArea.incrementColumn(); | |
563 bridge.redraw(); | |
564 } | |
565 else { | |
566 if ((metaState & META_ALT_MASK) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
567 buffer.keyPressed(vt320.KEY_END, ' ', getStateForBuffer()); |
0 | 568 } |
569 else { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
570 buffer.keyPressed(vt320.KEY_RIGHT, ' ', getStateForBuffer()); |
0 | 571 } |
572 | |
573 metaState &= ~META_TRANSIENT; | |
574 bridge.tryKeyVibrate(); | |
575 } | |
576 | |
577 return true; | |
578 | |
579 case KeyEvent.KEYCODE_DPAD_CENTER: | |
580 ctrlKeySpecial(); | |
581 return true; | |
582 } | |
583 } | |
584 catch (IOException e) { | |
585 Log.e(TAG, "Problem while trying to handle an onKey() event", e); | |
586 | |
587 try { | |
588 bridge.transport.flush(); | |
589 } | |
590 catch (IOException ioe) { | |
591 Log.d(TAG, "Our transport was closed, dispatching disconnect event"); | |
592 bridge.dispatchDisconnect(false); | |
593 } | |
594 } | |
595 catch (NullPointerException npe) { | |
596 Log.d(TAG, "Input before connection established ignored."); | |
597 return true; | |
598 } | |
599 | |
600 return false; | |
601 } | |
602 | |
603 private boolean handleShortcut(View v, String shortcut) { | |
604 if (PreferenceConstants.HWBUTTON_SCREEN_CAPTURE.equals(shortcut)) { | |
605 bridge.captureScreen(); | |
606 } | |
607 else if (PreferenceConstants.HWBUTTON_CTRL.equals(shortcut)) { | |
608 showMetakeyToast(v, PreferenceConstants.HWBUTTON_CTRL); | |
609 metaPress(META_CTRL_ON); | |
610 } | |
611 else if (PreferenceConstants.HWBUTTON_TAB.equals(shortcut)) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
612 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer()); |
0 | 613 } |
614 else if (PreferenceConstants.HWBUTTON_CTRLA_SPACE.equals(shortcut)) { | |
615 buffer.write(0x01); | |
616 buffer.write(' '); | |
617 } | |
618 else if (PreferenceConstants.HWBUTTON_CTRLA.equals(shortcut)) { | |
619 buffer.write(0x01); | |
620 } | |
621 else if (PreferenceConstants.HWBUTTON_ESC.equals(shortcut)) { | |
622 showMetakeyToast(v, PreferenceConstants.HWBUTTON_ESC); | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
623 sendEscape(); |
0 | 624 } |
625 else if (PreferenceConstants.HWBUTTON_ESC_A.equals(shortcut)) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
626 sendEscape(); |
0 | 627 buffer.write('a'); |
628 } | |
629 else { | |
630 return (false); | |
631 } | |
632 | |
633 return (true); | |
634 } | |
635 | |
636 private void showMetakeyToast(View v, String keyname) { | |
49
8887bff45dee
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
48
diff
changeset
|
637 Log.d(TAG, keyname); |
0 | 638 } |
639 | |
640 public int keyAsControl(int key) { | |
641 // Support CTRL-a through CTRL-z | |
642 if (key >= 0x60 && key <= 0x7A) | |
643 key -= 0x60; | |
644 // Support CTRL-A through CTRL-_ | |
645 else if (key >= 0x40 && key <= 0x5F) | |
646 key -= 0x40; | |
647 // CTRL-space sends NULL | |
648 else if (key == 0x20) | |
649 key = 0x00; | |
650 // CTRL-? sends DEL | |
651 else if (key == 0x3F) | |
652 key = 0x7F; | |
653 | |
654 return key; | |
655 } | |
656 | |
657 /** | |
658 * @param key | |
659 * @return successful | |
660 */ | |
661 private boolean sendFunctionKey(int keyCode) { | |
662 switch (keyCode) { | |
663 case KeyEvent.KEYCODE_1: | |
664 buffer.keyPressed(vt320.KEY_F1, ' ', 0); | |
665 return true; | |
666 | |
667 case KeyEvent.KEYCODE_2: | |
668 buffer.keyPressed(vt320.KEY_F2, ' ', 0); | |
669 return true; | |
670 | |
671 case KeyEvent.KEYCODE_3: | |
672 buffer.keyPressed(vt320.KEY_F3, ' ', 0); | |
673 return true; | |
674 | |
675 case KeyEvent.KEYCODE_4: | |
676 buffer.keyPressed(vt320.KEY_F4, ' ', 0); | |
677 return true; | |
678 | |
679 case KeyEvent.KEYCODE_5: | |
680 buffer.keyPressed(vt320.KEY_F5, ' ', 0); | |
681 return true; | |
682 | |
683 case KeyEvent.KEYCODE_6: | |
684 buffer.keyPressed(vt320.KEY_F6, ' ', 0); | |
685 return true; | |
686 | |
687 case KeyEvent.KEYCODE_7: | |
688 buffer.keyPressed(vt320.KEY_F7, ' ', 0); | |
689 return true; | |
690 | |
691 case KeyEvent.KEYCODE_8: | |
692 buffer.keyPressed(vt320.KEY_F8, ' ', 0); | |
693 return true; | |
694 | |
695 case KeyEvent.KEYCODE_9: | |
696 buffer.keyPressed(vt320.KEY_F9, ' ', 0); | |
697 return true; | |
698 | |
699 case KeyEvent.KEYCODE_0: | |
700 buffer.keyPressed(vt320.KEY_F10, ' ', 0); | |
701 return true; | |
702 | |
703 default: | |
704 return false; | |
705 } | |
706 } | |
707 | |
708 private boolean sendFullSpecialKey(int keyCode) { | |
709 switch (keyCode) { | |
710 case KeyEvent.KEYCODE_F1: | |
711 buffer.keyPressed(vt320.KEY_F1, ' ', 0); | |
712 return true; | |
713 | |
714 case KeyEvent.KEYCODE_F2: | |
715 buffer.keyPressed(vt320.KEY_F2, ' ', 0); | |
716 return true; | |
717 | |
718 case KeyEvent.KEYCODE_F3: | |
719 buffer.keyPressed(vt320.KEY_F3, ' ', 0); | |
720 return true; | |
721 | |
722 case KeyEvent.KEYCODE_F4: | |
723 buffer.keyPressed(vt320.KEY_F4, ' ', 0); | |
724 return true; | |
725 | |
726 case KeyEvent.KEYCODE_F5: | |
727 buffer.keyPressed(vt320.KEY_F5, ' ', 0); | |
728 return true; | |
729 | |
730 case KeyEvent.KEYCODE_F6: | |
731 buffer.keyPressed(vt320.KEY_F6, ' ', 0); | |
732 return true; | |
733 | |
734 case KeyEvent.KEYCODE_F7: | |
735 buffer.keyPressed(vt320.KEY_F7, ' ', 0); | |
736 return true; | |
737 | |
738 case KeyEvent.KEYCODE_F8: | |
739 buffer.keyPressed(vt320.KEY_F8, ' ', 0); | |
740 return true; | |
741 | |
742 case KeyEvent.KEYCODE_F9: | |
743 buffer.keyPressed(vt320.KEY_F9, ' ', 0); | |
744 return true; | |
745 | |
746 case KeyEvent.KEYCODE_F10: | |
747 buffer.keyPressed(vt320.KEY_F10, ' ', 0); | |
748 return true; | |
749 | |
750 case KeyEvent.KEYCODE_F11: | |
751 buffer.keyPressed(vt320.KEY_F10, ' ', 0); | |
752 return true; | |
753 | |
754 case KeyEvent.KEYCODE_F12: | |
755 buffer.keyPressed(vt320.KEY_F10, ' ', 0); | |
756 return true; | |
757 | |
758 case KeyEvent.KEYCODE_INSERT: | |
759 buffer.keyPressed(vt320.KEY_INSERT, ' ', 0); | |
760 return true; | |
761 | |
762 case KeyEvent.KEYCODE_FORWARD_DEL: | |
763 buffer.keyPressed(vt320.KEY_DELETE, ' ', 0); | |
764 return true; | |
765 | |
766 /* | |
767 case KeyEvent.KEYCODE_PAGE_UP: | |
768 buffer.keyPressed(vt320.KEY_PAGE_UP, ' ', 0); | |
769 return true; | |
770 case KeyEvent.KEYCODE_PAGE_DOWN: | |
771 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', 0); | |
772 return true; | |
773 case KeyEvent.KEYCODE_MOVE_HOME: | |
774 buffer.keyPressed(vt320.KEY_HOME, ' ', getStateForBuffer()); | |
775 return true; | |
776 case KeyEvent.KEYCODE_MOVE_END: | |
777 buffer.keyPressed(vt320.KEY_END, ' ', getStateForBuffer()); | |
778 return true; | |
779 */ | |
780 default: | |
781 return false; | |
782 } | |
783 } | |
784 | |
785 /** | |
786 * Handle meta key presses for full hardware keyboard | |
787 */ | |
788 private void metaKeyDown(int code) { | |
789 if ((metaState & code) == 0) { | |
790 metaState |= code; | |
791 bridge.redraw(); | |
792 } | |
793 } | |
794 | |
52
0e3fc85d0586
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
51
diff
changeset
|
795 protected void metaKeyUp(int code) { |
0 | 796 if ((metaState & code) != 0) { |
797 metaState &= ~code; | |
798 bridge.redraw(); | |
799 } | |
800 } | |
801 | |
802 /** | |
803 * Handle meta key presses where the key can be locked on. | |
804 * <p> | |
805 * 1st press: next key to have meta state<br /> | |
806 * 2nd press: meta state is locked on<br /> | |
807 * 3rd press: disable meta state | |
808 * | |
809 * @param code | |
810 */ | |
811 public void metaPress(int code) { | |
812 if ((metaState & (code << 1)) != 0) { | |
813 metaState &= ~(code << 1); | |
814 } | |
815 else if ((metaState & code) != 0) { | |
816 metaState &= ~code; | |
817 | |
818 if (!fullKeyboard()) | |
819 metaState |= code << 1; | |
820 } | |
821 else | |
822 metaState |= code; | |
823 | |
824 bridge.redraw(); | |
825 } | |
826 | |
827 public void setTerminalKeyMode(String keymode) { | |
828 this.keymode = keymode; | |
829 } | |
830 | |
831 private int getStateForBuffer() { | |
832 int bufferState = 0; | |
833 | |
834 if ((metaState & META_CTRL_MASK) != 0) | |
835 bufferState |= vt320.KEY_CONTROL; | |
836 | |
837 if ((metaState & META_SHIFT_MASK) != 0) | |
838 bufferState |= vt320.KEY_SHIFT; | |
839 | |
840 if ((metaState & META_ALT_MASK) != 0) | |
841 bufferState |= vt320.KEY_ALT; | |
842 | |
843 return bufferState; | |
844 } | |
845 | |
846 public int getMetaState() { | |
847 return metaState; | |
848 } | |
849 | |
850 public int getDeadKey() { | |
851 return mDeadKey; | |
852 } | |
853 | |
854 public void setClipboardManager(ClipboardManager clipboard) { | |
855 this.clipboard = clipboard; | |
856 } | |
857 | |
858 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, | |
859 String key) { | |
860 if (PreferenceConstants.KEYMODE.equals(key)) { | |
861 updateKeymode(); | |
862 } | |
863 else if (PreferenceConstants.CUSTOM_KEYMAP.equals(key)) { | |
864 updateCustomKeymap(); | |
865 } | |
866 } | |
867 | |
868 private void updateKeymode() { | |
869 keymode = prefs.getString(PreferenceConstants.KEYMODE, PreferenceConstants.KEYMODE_RIGHT); | |
870 } | |
871 | |
872 private void updateCustomKeymap() { | |
873 customKeyboard = prefs.getString(PreferenceConstants.CUSTOM_KEYMAP, | |
874 PreferenceConstants.CUSTOM_KEYMAP_DISABLED); | |
875 } | |
876 | |
877 public void setCharset(String encoding) { | |
878 this.encoding = encoding; | |
879 } | |
880 | |
48
1e931ef5f776
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
45
diff
changeset
|
881 public Charset getCharset() { |
1e931ef5f776
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
45
diff
changeset
|
882 return Charset.forName(encoding); |
45
80dcebe51af2
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
42
diff
changeset
|
883 } |
0 | 884 |
51
8c6de858bb73
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
50
diff
changeset
|
885 protected void ctrlKeySpecial() { |
0 | 886 if (selectingForCopy) { |
887 if (selectionArea.isSelectingOrigin()) | |
888 selectionArea.finishSelectingOrigin(); | |
889 else { | |
890 if (clipboard != null) { | |
891 // copy selected area to clipboard | |
892 String copiedText = selectionArea.copyFrom(buffer); | |
893 clipboard.setText(copiedText); | |
894 selectingForCopy = false; | |
895 selectionArea.reset(); | |
896 } | |
897 } | |
898 } | |
899 else { | |
900 if ((metaState & META_CTRL_ON) != 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
901 sendEscape(); |
0 | 902 metaState &= ~META_CTRL_ON; |
903 } | |
904 else | |
905 metaPress(META_CTRL_ON); | |
906 } | |
907 | |
908 bridge.redraw(); | |
909 } | |
910 | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
911 protected boolean customKeymapAction(View v, int keyCode, KeyEvent event) { |
0 | 912 if (bridge == null || customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_DISABLED)) |
913 return false; | |
914 | |
915 byte c = 0x00; | |
916 int termKey = 0; | |
917 | |
918 if (fullKeyboard()) { | |
919 switch (keyCode) { | |
920 case KeyEvent.KEYCODE_CTRL_LEFT: | |
921 case KeyEvent.KEYCODE_CTRL_RIGHT: | |
922 metaKeyDown(META_CTRL_ON); | |
923 return true; | |
924 | |
925 case KeyEvent.KEYCODE_ALT_LEFT: | |
926 case KeyEvent.KEYCODE_ALT_RIGHT: | |
927 metaKeyDown(META_ALT_ON); | |
928 return true; | |
929 | |
930 case KeyEvent.KEYCODE_SHIFT_LEFT: | |
931 case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
932 metaKeyDown(META_SHIFT_ON); | |
933 return true; | |
934 | |
935 case KeyEvent.KEYCODE_BACK: | |
936 if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_ASUS_TF)) { | |
937 // Check to see whether this is the back button on the | |
938 // screen (-1) or the Asus Transformer Keyboard Dock. | |
939 // Treat the HW button as ESC. | |
940 if (event.getDeviceId() > 0) { | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
941 sendEscape(); |
0 | 942 return true; |
943 } | |
944 } | |
945 | |
946 default: | |
947 } | |
948 } | |
949 | |
950 if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_ASUS_TF)) { | |
951 if ((metaState & META_ALT_MASK) != 0 | |
952 && (metaState & META_SHIFT_MASK) != 0 | |
953 && sendFunctionKey(keyCode)) | |
954 return true; | |
955 } | |
956 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SE_XPPRO)) { | |
957 // Sony Ericsson Xperia pro (MK16i) and Xperia mini Pro (SK17i) | |
958 // Language key acts as CTRL | |
959 if (keyCode == KeyEvent.KEYCODE_SWITCH_CHARSET) { | |
960 ctrlKeySpecial(); | |
961 return true; | |
962 } | |
963 | |
964 if ((metaState & META_ALT_MASK) != 0) { | |
965 if ((metaState & META_SHIFT_MASK) != 0) { | |
966 // ALT + shift + key | |
967 switch (keyCode) { | |
968 case KeyEvent.KEYCODE_U: | |
969 c = 0x5B; | |
970 break; | |
971 | |
972 case KeyEvent.KEYCODE_I: | |
973 c = 0x5D; | |
974 break; | |
975 | |
976 case KeyEvent.KEYCODE_O: | |
977 c = 0x7B; | |
978 break; | |
979 | |
980 case KeyEvent.KEYCODE_P: | |
981 c = 0x7D; | |
982 break; | |
983 } | |
984 } | |
985 else { | |
986 // ALT + key | |
987 switch (keyCode) { | |
988 case KeyEvent.KEYCODE_S: | |
989 c = 0x7c; | |
990 break; | |
991 | |
992 case KeyEvent.KEYCODE_Z: | |
993 c = 0x5c; | |
994 break; | |
995 | |
996 case KeyEvent.KEYCODE_DEL: | |
997 termKey = vt320.KEY_DELETE; | |
998 break; | |
999 } | |
1000 } | |
1001 } | |
1002 else if ((metaState & META_SHIFT_MASK) != 0) { | |
1003 // shift + key | |
1004 switch (keyCode) { | |
1005 case KeyEvent.KEYCODE_AT: | |
1006 c = 0x3c; | |
1007 break; | |
1008 | |
1009 case KeyEvent.KEYCODE_COMMA: | |
1010 c = 0x3e; | |
1011 break; | |
1012 | |
1013 case KeyEvent.KEYCODE_PERIOD: | |
1014 c = 0x5e; | |
1015 break; | |
1016 | |
1017 case KeyEvent.KEYCODE_GRAVE: | |
1018 c = 0x60; | |
1019 break; | |
1020 | |
1021 case KeyEvent.KEYCODE_APOSTROPHE: | |
1022 c = 0x7e; | |
1023 break; | |
1024 | |
1025 case KeyEvent.KEYCODE_DEL: | |
1026 termKey = vt320.KEY_BACK_SPACE; | |
1027 break; | |
1028 } | |
1029 } | |
1030 } | |
1031 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927)) { | |
1032 // Samsung Captivate Glide (SGH-i927) | |
1033 if (keyCode == 115) { | |
1034 // .com key = ESC | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1035 c = 0x00; |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1036 termKey = vt320.KEY_ESCAPE; |
0 | 1037 return true; |
1038 } | |
1039 else if (keyCode == 116) { | |
1040 // Microphone key = TAB | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1041 c = 0x00; |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1042 termKey = vt320.KEY_TAB; |
0 | 1043 } |
1044 else if ((metaState & META_ALT_MASK) != 0 && (metaState & META_SHIFT_MASK) != 0) { | |
1045 switch (keyCode) { | |
1046 case KeyEvent.KEYCODE_O: | |
1047 c = 0x5B; | |
1048 break; | |
1049 | |
1050 case KeyEvent.KEYCODE_P: | |
1051 c = 0x5D; | |
1052 break; | |
1053 | |
1054 case KeyEvent.KEYCODE_A: | |
1055 c = 0x3C; | |
1056 break; | |
1057 | |
1058 case KeyEvent.KEYCODE_D: | |
1059 c = 0x3E; | |
1060 break; | |
1061 } | |
1062 } | |
1063 } | |
1064 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927_ICS)) { | |
1065 // Samsung Captivate Glide (SGH-i927) Ice Cream Sandwich (4.0.x) | |
1066 if (keyCode == 226) { | |
1067 // .com key = ESC | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1068 c = 0x00; |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1069 termKey = vt320.KEY_ESCAPE; |
0 | 1070 } |
1071 else if (keyCode == 220) { | |
1072 // Microphone key = TAB | |
53
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1073 c = 0x00; |
e872762ec105
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
1074 termKey = vt320.KEY_TAB; |
0 | 1075 } |
1076 else if ((metaState & META_ALT_MASK) != 0 && (metaState & META_SHIFT_MASK) != 0) { | |
1077 switch (keyCode) { | |
1078 case KeyEvent.KEYCODE_O: | |
1079 c = 0x5B; | |
1080 break; | |
1081 | |
1082 case KeyEvent.KEYCODE_P: | |
1083 c = 0x5D; | |
1084 break; | |
1085 | |
1086 case KeyEvent.KEYCODE_A: | |
1087 c = 0x3C; | |
1088 break; | |
1089 | |
1090 case KeyEvent.KEYCODE_D: | |
1091 c = 0x3E; | |
1092 break; | |
1093 } | |
1094 } | |
1095 } | |
1096 | |
1097 if ((c != 0x00) || termKey != 0) { | |
1098 if (c != 0x00) | |
1099 buffer.write(c); | |
1100 else | |
1101 buffer.keyPressed(termKey, ' ', 0); | |
1102 | |
1103 metaState &= ~(META_SHIFT_ON | META_ALT_ON); | |
1104 bridge.redraw(); | |
1105 return true; | |
1106 } | |
1107 | |
1108 return false; | |
1109 } | |
1110 | |
1111 public void urlScan(View v) { | |
1112 //final TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip); | |
1113 List<String> urls = bridge.scanForURLs(); | |
1114 Dialog urlDialog = new Dialog(v.getContext()); | |
1115 urlDialog.setTitle(R.string.console_menu_urlscan); | |
1116 ListView urlListView = new ListView(v.getContext()); | |
1117 URLItemListener urlListener = new URLItemListener(v.getContext()); | |
1118 urlListView.setOnItemClickListener(urlListener); | |
1119 urlListView.setAdapter(new ArrayAdapter<String> (v.getContext(), android.R.layout.simple_list_item_1, urls)); | |
1120 urlDialog.setContentView(urlListView); | |
1121 urlDialog.show(); | |
1122 } | |
1123 | |
1124 public boolean isSymKey(int keyCode) { | |
1125 if (keyCode == KeyEvent.KEYCODE_SYM || | |
1126 keyCode == KeyEvent.KEYCODE_PICTSYMBOLS) | |
1127 return true; | |
1128 | |
1129 if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927_ICS) && | |
1130 keyCode == 227) | |
1131 return true; | |
1132 | |
1133 return false; | |
1134 } | |
1135 | |
50
2cd3d8091e37
start tn5250 integration
Carl Byington <carl@five-ten-sg.com>
parents:
49
diff
changeset
|
1136 protected boolean fullKeyboard() { |
0 | 1137 if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_FULL) || |
1138 (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_ASUS_TF))) | |
1139 return true; | |
1140 | |
1141 return false; | |
1142 } | |
1143 | |
1144 private class URLItemListener implements OnItemClickListener { | |
1145 private WeakReference<Context> contextRef; | |
1146 | |
1147 URLItemListener(Context context) { | |
1148 this.contextRef = new WeakReference<Context> (context); | |
1149 } | |
1150 | |
1151 public void onItemClick(AdapterView<?> arg0, View view, int position, | |
1152 long id) { | |
1153 Context context = contextRef.get(); | |
1154 | |
1155 if (context == null) | |
1156 return; | |
1157 | |
1158 try { | |
1159 TextView urlView = (TextView) view; | |
1160 String url = urlView.getText().toString(); | |
1161 | |
1162 if (url.indexOf("://") < 0) | |
1163 url = "http://" + url; | |
1164 | |
1165 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); | |
1166 context.startActivity(intent); | |
1167 } | |
1168 catch (Exception e) { | |
1169 Log.e(TAG, "couldn't open URL", e); | |
1170 // We should probably tell the user that we couldn't find a | |
1171 // handler... | |
1172 } | |
1173 } | |
1174 } | |
1175 } | |
1176 |