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