Libraryless. Click here for Pure Java version (1210L/8K/33K).
1 | import java.util.*; |
2 | import java.util.zip.*; |
3 | import java.util.List; |
4 | import java.util.regex.*; |
5 | import java.util.concurrent.*; |
6 | import java.util.concurrent.atomic.*; |
7 | import java.util.concurrent.locks.*; |
8 | import javax.swing.*; |
9 | import javax.swing.event.*; |
10 | import javax.swing.text.*; |
11 | import javax.swing.table.*; |
12 | import java.io.*; |
13 | import java.net.*; |
14 | import java.lang.reflect.*; |
15 | import java.lang.ref.*; |
16 | import java.lang.management.*; |
17 | import java.security.*; |
18 | import java.security.spec.*; |
19 | import java.awt.*; |
20 | import java.awt.event.*; |
21 | import java.awt.image.*; |
22 | import javax.imageio.*; |
23 | import java.math.*; |
24 | |
25 | |
26 | import android.app.*; |
27 | import android.view.KeyEvent; |
28 | import android.view.inputmethod.*; |
29 | import android.text.*; |
30 | import android.view.View; |
31 | import android.content.Context; |
32 | import android.app.Activity; |
33 | import android.widget.*; |
34 | import android.graphics.*; |
35 | import android.hardware.Camera; |
36 | import android.view.*; |
37 | class main {
|
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | public static void main(final String[] args) throws Exception {
|
45 | print("Listing cameras...");
|
46 | |
47 | runOnUiThread(new Runnable() { public void run() { try {
|
48 | int n = Camera.getNumberOfCameras(); |
49 | System.out.println("Cameras: " + n);
|
50 | |
51 | final Camera cam = Camera.open(0/*n-1*/); |
52 | |
53 | Camera.Parameters p = cam.getParameters(); |
54 | p.setPreviewSize(100, 100); |
55 | cam.setParameters(p); |
56 | |
57 | SurfaceView surfaceView = new SurfaceView(androidContext()); |
58 | SurfaceHolder surfaceHolder = surfaceView.getHolder(); |
59 | surfaceHolder.addCallback(new CamCallback()); |
60 | surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); |
61 | |
62 | androidShow(surfaceView); |
63 | |
64 | cam.setPreviewDisplay(surfaceHolder); |
65 | cam.startPreview(); |
66 | |
67 | print("Preview started.");
|
68 | |
69 | surfaceView.post(new Runnable() { public void run() { try {
|
70 | cam.takePicture(null, null, null, new JpegCallback()); |
71 | |
72 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "cam.takePicture(null, null, null, new JpegCallback());"; }});
|
73 | |
74 | print("Waiting for callback");
|
75 | |
76 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "int n = Camera.getNumberOfCameras();\n System.out.println(\"Cameras: \" + n);..."; }});
|
77 | } |
78 | |
79 | static class CamCallback implements SurfaceHolder.Callback {
|
80 | public void surfaceChanged (SurfaceHolder holder, int format, int width, int height) {
|
81 | print("surfaceChanged");
|
82 | } |
83 | public void surfaceCreated (SurfaceHolder holder) {
|
84 | print("surfaceCreated");
|
85 | } |
86 | public void surfaceDestroyed (SurfaceHolder holder) {
|
87 | print("surfaceDestroyed");
|
88 | } |
89 | } |
90 | |
91 | static class ShutterCallback implements Camera.ShutterCallback {
|
92 | public void onShutter() {
|
93 | print "Shutter!" |
94 | } |
95 | } |
96 | |
97 | static class JpegCallback implements Camera.PictureCallback {
|
98 | public void onPictureTaken (byte[] data, Camera cam) {
|
99 | TextView tv = aTextView(); |
100 | tv.setText("Picture data: " + data.length);
|
101 | androidShow(tv); |
102 | |
103 | System.out.println("Picture data: " + data.length);
|
104 | cam.release(); |
105 | print "Camera released." |
106 | } |
107 | } |
108 | static void runOnUiThread(final Runnable r) {
|
109 | androidActivity().runOnUiThread(r); |
110 | } |
111 | static RuntimeException rethrow(Throwable t) {
|
112 | |
113 | if (t instanceof Error) |
114 | _handleError((Error) t); |
115 | |
116 | throw t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t); |
117 | } |
118 | static Context androidContext() {
|
119 | return getAndroidContext(); |
120 | } |
121 | static volatile StringBuffer local_log = new StringBuffer(); // not redirected |
122 | static volatile StringBuffer print_log = local_log; // might be redirected, e.g. to main bot |
123 | |
124 | // in bytes - will cut to half that |
125 | static volatile int print_log_max = 1024*1024; |
126 | static volatile int local_log_max = 100*1024; |
127 | //static int print_maxLineLength = 0; // 0 = unset |
128 | |
129 | static boolean print_silent; // total mute if set |
130 | |
131 | static Object print_byThread_lock = new Object(); |
132 | static volatile ThreadLocal<Object> print_byThread; // special handling by thread - prefers F1<S, Bool> |
133 | static volatile Object print_allThreads; |
134 | |
135 | static void print() {
|
136 | print("");
|
137 | } |
138 | |
139 | static <A> A print(String s, A o) {
|
140 | print(s + o); |
141 | return o; |
142 | } |
143 | |
144 | // slightly overblown signature to return original object... |
145 | static <A> A print(A o) {
|
146 | ping(); |
147 | if (print_silent) return o; |
148 | String s = String.valueOf(o) + "\n"; |
149 | print_noNewLine(s); |
150 | return o; |
151 | } |
152 | |
153 | static void print_noNewLine(String s) {
|
154 | |
155 | Object f = print_byThread == null ? null : print_byThread.get(); |
156 | if (f == null) f = print_allThreads; |
157 | if (f != null) |
158 | if (isFalse(f instanceof F1 ? ((F1) f).get(s) : callF(f, s))) return; |
159 | |
160 | |
161 | print_raw(s); |
162 | } |
163 | |
164 | static void print_raw(String s) {
|
165 | s = fixNewLines(s); |
166 | // TODO if (print_maxLineLength != 0) |
167 | StringBuffer loc = local_log; |
168 | StringBuffer buf = print_log; |
169 | int loc_max = print_log_max; |
170 | if (buf != loc && buf != null) {
|
171 | print_append(buf, s, print_log_max); |
172 | loc_max = local_log_max; |
173 | } |
174 | if (loc != null) |
175 | print_append(loc, s, loc_max); |
176 | System.out.print(s); |
177 | } |
178 | |
179 | static void print(long l) {
|
180 | print(String.valueOf(l)); |
181 | } |
182 | |
183 | static void print(char c) {
|
184 | print(String.valueOf(c)); |
185 | } |
186 | |
187 | static void print_append(StringBuffer buf, String s, int max) {
|
188 | synchronized(buf) {
|
189 | buf.append(s); |
190 | max /= 2; |
191 | if (buf.length() > max) try {
|
192 | int newLength = max/2; |
193 | int ofs = buf.length()-newLength; |
194 | String newString = buf.substring(ofs); |
195 | buf.setLength(0); |
196 | buf.append("[...] ").append(newString);
|
197 | } catch (Exception e) {
|
198 | buf.setLength(0); |
199 | } |
200 | } |
201 | } |
202 | |
203 | |
204 | |
205 | |
206 | |
207 | |
208 | |
209 | static TextView aTextView(String text) {
|
210 | TextView tv = aTextView(); |
211 | tv.setText(text); |
212 | return tv; |
213 | } |
214 | |
215 | static TextView aTextView() {
|
216 | return androidUI(new F0<TextView>() { TextView get() { try { return
|
217 | new TextView(androidActivity()) |
218 | ; } catch (Exception __e) { throw rethrow(__e); } }
|
219 | public String toString() { return "new TextView(androidActivity())"; }});
|
220 | } |
221 | static Map<Thread, Boolean> _registerThread_threads = newWeakHashMap(); |
222 | |
223 | static Thread _registerThread(Thread t) {
|
224 | _registerThread_threads.put(t, true); |
225 | return t; |
226 | } |
227 | |
228 | static void _registerThread() { _registerThread(Thread.currentThread()); }
|
229 | |
230 | |
231 | static View androidShow_view; |
232 | |
233 | static void androidShow(final View view) {
|
234 | androidUI(new Runnable() { public void run() { try {
|
235 | androidShow_view = view; |
236 | androidActivity().setContentView(aRemoveFromParent(view)); |
237 | |
238 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "androidShow_view = view;\r\n androidActivity().setContentView(aRemoveFromPar..."; }});
|
239 | } |
240 | |
241 | |
242 | static String fixNewLines(String s) {
|
243 | return s.replace("\r\n", "\n").replace("\r", "\n");
|
244 | } |
245 | // TODO: send hard errors to core |
246 | |
247 | static AtomicLong _handleError_nonVMErrors = new AtomicLong(); |
248 | static AtomicLong _handleError_vmErrors = new AtomicLong(); |
249 | static AtomicLong _handleError_outOfMemoryErrors = new AtomicLong(); |
250 | static volatile long _handleError_lastOutOfMemoryError; |
251 | static volatile Error _handleError_lastHardError; |
252 | |
253 | static void _handleError(Error e) {
|
254 | if (!(e instanceof VirtualMachineError)) {
|
255 | incAtomicLong(_handleError_nonVMErrors); |
256 | return; |
257 | } |
258 | |
259 | print("\nHARD ERROR\n");
|
260 | printStackTrace2(e); |
261 | print("\nHARD ERROR\n");
|
262 | _handleError_lastHardError = e; |
263 | |
264 | incAtomicLong(_handleError_vmErrors); |
265 | if (e instanceof OutOfMemoryError) {
|
266 | incAtomicLong(_handleError_outOfMemoryErrors); |
267 | _handleError_lastOutOfMemoryError = sysNow(); |
268 | } |
269 | } |
270 | static volatile boolean ping_pauseAll; |
271 | static int ping_sleep = 100; // poll pauseAll flag every 100 |
272 | |
273 | static volatile boolean ping_anyActions; |
274 | static Map<Thread, Object> ping_actions = newWeakHashMap(); |
275 | |
276 | |
277 | // always returns true |
278 | static boolean ping() {
|
279 | if (ping_pauseAll || ping_anyActions ) ping_impl(); |
280 | return true; |
281 | } |
282 | |
283 | // returns true when it slept |
284 | static boolean ping_impl() { try {
|
285 | if (ping_pauseAll && !isAWTThread()) {
|
286 | do |
287 | Thread.sleep(ping_sleep); |
288 | while (ping_pauseAll); |
289 | return true; |
290 | } |
291 | |
292 | |
293 | if (ping_anyActions) {
|
294 | Object action; |
295 | synchronized(ping_actions) {
|
296 | action = ping_actions.get(currentThread()); |
297 | if (action instanceof Runnable) |
298 | ping_actions.remove(currentThread()); |
299 | if (ping_actions.isEmpty()) ping_anyActions = false; |
300 | } |
301 | |
302 | if (action instanceof Runnable) |
303 | ((Runnable) action).run(); |
304 | else if (eq(action, "cancelled")) |
305 | throw fail("Thread cancelled.");
|
306 | } |
307 | |
308 | |
309 | return false; |
310 | } catch (Exception __e) { throw rethrow(__e); } }
|
311 | static WeakHashMap<Class, ArrayList<Method>> callF_cache = new WeakHashMap(); |
312 | |
313 | |
314 | static <A> A callF(F0<A> f) {
|
315 | return f == null ? null : f.get(); |
316 | } |
317 | |
318 | |
319 | |
320 | static <A, B> B callF(F1<A, B> f, A a) {
|
321 | return f == null ? null : f.get(a); |
322 | } |
323 | |
324 | |
325 | static Object callF(Object f, Object... args) { try {
|
326 | if (f instanceof String) |
327 | return callMC((String) f, args); |
328 | if (f instanceof Runnable) {
|
329 | ((Runnable) f).run(); |
330 | return null; |
331 | } |
332 | if (f == null) return null; |
333 | |
334 | Class c = f.getClass(); |
335 | ArrayList<Method> methods; |
336 | synchronized(callF_cache) {
|
337 | methods = callF_cache.get(c); |
338 | if (methods == null) |
339 | methods = callF_makeCache(c); |
340 | } |
341 | |
342 | int n = l(methods); |
343 | if (n == 0) throw fail("No get method in " + getClassName(c));
|
344 | if (n == 1) return invokeMethod(methods.get(0), f, args); |
345 | for (int i = 0; i < n; i++) {
|
346 | Method m = methods.get(i); |
347 | if (call_checkArgs(m, args, false)) |
348 | return invokeMethod(m, f, args); |
349 | } |
350 | throw fail("No matching get method in " + getClassName(c));
|
351 | } catch (Exception __e) { throw rethrow(__e); } }
|
352 | |
353 | // used internally |
354 | static ArrayList<Method> callF_makeCache(Class c) {
|
355 | ArrayList<Method> l = new ArrayList(); |
356 | Class _c = c; |
357 | do {
|
358 | for (Method m : _c.getDeclaredMethods()) |
359 | if (m.getName().equals("get")) {
|
360 | m.setAccessible(true); |
361 | l.add(m); |
362 | } |
363 | if (!l.isEmpty()) break; |
364 | _c = _c.getSuperclass(); |
365 | } while (_c != null); |
366 | callF_cache.put(c, l); |
367 | return l; |
368 | } |
369 | static boolean isFalse(Object o) {
|
370 | return eq(false, o); |
371 | } |
372 | static <A, B> Map<A, B> newWeakHashMap() {
|
373 | return _registerWeakMap(synchroMap(new WeakHashMap())); |
374 | } |
375 | |
376 | |
377 | static Context getAndroidContext() {
|
378 | return (Context) getAndroidContext_gen(); |
379 | } |
380 | static <A extends View> A aRemoveFromParent(final A view) {
|
381 | androidUI(new Runnable() { public void run() { try {
|
382 | ViewParent group = view.getParent(); |
383 | if (group instanceof ViewGroup) |
384 | ((ViewGroup) group).removeView(view); |
385 | |
386 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "ViewParent group = view.getParent();\r\n if (group instanceof ViewGroup)\r\n ..."; }});
|
387 | return view; |
388 | } |
389 | |
390 | static void androidUI(final Object r) {
|
391 | androidUI_wait(r); |
392 | } |
393 | |
394 | static <A> A androidUI(F0<A> f) {
|
395 | return androidUI_wait(f); |
396 | } |
397 | // get purpose 1: access a list/array/map (safer version of x.get(y)) |
398 | |
399 | static <A> A get(List<A> l, int idx) {
|
400 | return l != null && idx >= 0 && idx < l(l) ? l.get(idx) : null; |
401 | } |
402 | |
403 | // seems to conflict with other signatures |
404 | /*static <A, B> B get(Map<A, B> map, A key) {
|
405 | ret map != null ? map.get(key) : null; |
406 | }*/ |
407 | |
408 | static <A> A get(A[] l, int idx) {
|
409 | return idx >= 0 && idx < l(l) ? l[idx] : null; |
410 | } |
411 | |
412 | // default to false |
413 | static boolean get(boolean[] l, int idx) {
|
414 | return idx >= 0 && idx < l(l) ? l[idx] : false; |
415 | } |
416 | |
417 | // get purpose 2: access a field by reflection or a map |
418 | |
419 | static Object get(Object o, String field) {
|
420 | try {
|
421 | if (o instanceof Class) return get((Class) o, field); |
422 | |
423 | if (o instanceof Map) |
424 | return ((Map) o).get(field); |
425 | |
426 | Field f = getOpt_findField(o.getClass(), field); |
427 | if (f != null) {
|
428 | f.setAccessible(true); |
429 | return f.get(o); |
430 | } |
431 | |
432 | |
433 | } catch (Exception e) {
|
434 | throw asRuntimeException(e); |
435 | } |
436 | throw new RuntimeException("Field '" + field + "' not found in " + o.getClass().getName());
|
437 | } |
438 | |
439 | static Object get_raw(Object o, String field) {
|
440 | try {
|
441 | Field f = get_findField(o.getClass(), field); |
442 | f.setAccessible(true); |
443 | return f.get(o); |
444 | } catch (Exception e) {
|
445 | throw new RuntimeException(e); |
446 | } |
447 | } |
448 | |
449 | static Object get(Class c, String field) {
|
450 | try {
|
451 | Field f = get_findStaticField(c, field); |
452 | f.setAccessible(true); |
453 | return f.get(null); |
454 | } catch (Exception e) {
|
455 | throw new RuntimeException(e); |
456 | } |
457 | } |
458 | |
459 | static Field get_findStaticField(Class<?> c, String field) {
|
460 | Class _c = c; |
461 | do {
|
462 | for (Field f : _c.getDeclaredFields()) |
463 | if (f.getName().equals(field) && (f.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) |
464 | return f; |
465 | _c = _c.getSuperclass(); |
466 | } while (_c != null); |
467 | throw new RuntimeException("Static field '" + field + "' not found in " + c.getName());
|
468 | } |
469 | |
470 | static Field get_findField(Class<?> c, String field) {
|
471 | Class _c = c; |
472 | do {
|
473 | for (Field f : _c.getDeclaredFields()) |
474 | if (f.getName().equals(field)) |
475 | return f; |
476 | _c = _c.getSuperclass(); |
477 | } while (_c != null); |
478 | throw new RuntimeException("Field '" + field + "' not found in " + c.getName());
|
479 | } |
480 | |
481 | |
482 | |
483 | static Activity androidActivity() {
|
484 | return (Activity) androidContext_gen(); |
485 | } |
486 | |
487 | |
488 | static Map synchroMap() {
|
489 | return synchroHashMap(); |
490 | } |
491 | |
492 | static <A, B> Map<A, B> synchroMap(Map<A, B> map) {
|
493 | return Collections.synchronizedMap(map); |
494 | } |
495 | static HashMap<String, List<Method>> callMC_cache = new HashMap(); |
496 | static String callMC_key; |
497 | static Method callMC_value; |
498 | |
499 | // varargs assignment fixer for a single string array argument |
500 | static Object callMC(String method, String[] arg) {
|
501 | return callMC(method, new Object[] {arg});
|
502 | } |
503 | |
504 | static Object callMC(String method, Object... args) { try {
|
505 | Method me; |
506 | if (callMC_cache == null) callMC_cache = new HashMap(); // initializer time workaround |
507 | synchronized(callMC_cache) {
|
508 | me = method == callMC_key ? callMC_value : null; |
509 | } |
510 | if (me != null) try {
|
511 | return invokeMethod(me, null, args); |
512 | } catch (IllegalArgumentException e) {
|
513 | throw new RuntimeException("Can't call " + me + " with arguments " + classNames(args), e);
|
514 | } |
515 | |
516 | List<Method> m; |
517 | synchronized(callMC_cache) {
|
518 | m = callMC_cache.get(method); |
519 | } |
520 | if (m == null) {
|
521 | if (callMC_cache.isEmpty()) {
|
522 | callMC_makeCache(); |
523 | m = callMC_cache.get(method); |
524 | } |
525 | if (m == null) throw fail("Method named " + method + " not found in main");
|
526 | } |
527 | int n = m.size(); |
528 | if (n == 1) {
|
529 | me = m.get(0); |
530 | synchronized(callMC_cache) {
|
531 | callMC_key = method; |
532 | callMC_value = me; |
533 | } |
534 | try {
|
535 | return invokeMethod(me, null, args); |
536 | } catch (IllegalArgumentException e) {
|
537 | throw new RuntimeException("Can't call " + me + " with arguments " + classNames(args), e);
|
538 | } |
539 | } |
540 | for (int i = 0; i < n; i++) {
|
541 | me = m.get(i); |
542 | if (call_checkArgs(me, args, false)) |
543 | return invokeMethod(me, null, args); |
544 | } |
545 | throw fail("No method called " + method + " with matching arguments found in main");
|
546 | } catch (Exception __e) { throw rethrow(__e); } }
|
547 | |
548 | static void callMC_makeCache() {
|
549 | synchronized(callMC_cache) {
|
550 | callMC_cache.clear(); |
551 | Class _c = (Class) mc(), c = _c; |
552 | while (c != null) {
|
553 | for (Method m : c.getDeclaredMethods()) |
554 | if ((m.getModifiers() & java.lang.reflect.Modifier.STATIC) != 0) {
|
555 | m.setAccessible(true); |
556 | multiMapPut(callMC_cache, m.getName(), m); |
557 | } |
558 | c = c.getSuperclass(); |
559 | } |
560 | } |
561 | } |
562 | static long sysNow() {
|
563 | return System.nanoTime()/1000000; |
564 | } |
565 | static RuntimeException asRuntimeException(Throwable t) {
|
566 | |
567 | if (t instanceof Error) |
568 | _handleError((Error) t); |
569 | |
570 | return t instanceof RuntimeException ? (RuntimeException) t : new RuntimeException(t); |
571 | } |
572 | static void androidUI_wait(final Object r) {
|
573 | final Flag done = new Flag(); |
574 | androidUI_noWait(new Runnable() { public void run() { try {
|
575 | try {
|
576 | callF(r); |
577 | } finally {
|
578 | done.raise(); |
579 | } |
580 | |
581 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "try {\r\n callF(r);\r\n } finally {\r\n done.raise();\r\n }"; }});
|
582 | done.waitUntilUp(); |
583 | } |
584 | |
585 | static <A> A androidUI_wait(F0<A> f) {
|
586 | return androidEvalInUIThread(f); |
587 | } |
588 | static void incAtomicLong(AtomicLong l) {
|
589 | l.incrementAndGet(); |
590 | } |
591 | // TODO: test if android complains about this |
592 | static boolean isAWTThread() {
|
593 | if (isAndroid()) return false; |
594 | if (isHeadless()) return false; |
595 | return isAWTThread_awt(); |
596 | } |
597 | |
598 | static boolean isAWTThread_awt() {
|
599 | return SwingUtilities.isEventDispatchThread(); |
600 | } |
601 | static Object androidContext_gen() {
|
602 | return getAndroidContext_gen(); |
603 | } |
604 | static Thread currentThread() {
|
605 | return Thread.currentThread(); |
606 | } |
607 | static boolean eq(Object a, Object b) {
|
608 | return a == null ? b == null : a == b || a.equals(b); |
609 | } |
610 | |
611 | |
612 | static int l(Object[] a) { return a == null ? 0 : a.length; }
|
613 | static int l(boolean[] a) { return a == null ? 0 : a.length; }
|
614 | static int l(byte[] a) { return a == null ? 0 : a.length; }
|
615 | static int l(int[] a) { return a == null ? 0 : a.length; }
|
616 | static int l(float[] a) { return a == null ? 0 : a.length; }
|
617 | static int l(char[] a) { return a == null ? 0 : a.length; }
|
618 | static int l(Collection c) { return c == null ? 0 : c.size(); }
|
619 | static int l(Map m) { return m == null ? 0 : m.size(); }
|
620 | static int l(CharSequence s) { return s == null ? 0 : s.length(); } static long l(File f) { return f == null ? 0 : f.length(); }
|
621 | |
622 | static int l(Object o) {
|
623 | return o == null ? 0 |
624 | : o instanceof String ? l((String) o) |
625 | : o instanceof Map ? l((Map) o) |
626 | : o instanceof Collection ? l((Collection) o) |
627 | : (Integer) call(o, "size"); |
628 | } |
629 | |
630 | |
631 | |
632 | |
633 | static Object androidContext; |
634 | |
635 | static Object getAndroidContext_gen() {
|
636 | return androidContext; |
637 | } |
638 | static RuntimeException fail() { throw new RuntimeException("fail"); }
|
639 | static RuntimeException fail(Throwable e) { throw asRuntimeException(e); }
|
640 | static RuntimeException fail(Object msg) { throw new RuntimeException(String.valueOf(msg)); }
|
641 | static RuntimeException fail(String msg) { throw new RuntimeException(msg == null ? "" : msg); }
|
642 | static RuntimeException fail(String msg, Throwable innerException) { throw new RuntimeException(msg, innerException); }
|
643 | |
644 | static Object call(Object o) {
|
645 | return callFunction(o); |
646 | } |
647 | |
648 | // varargs assignment fixer for a single string array argument |
649 | static Object call(Object o, String method, String[] arg) {
|
650 | return call(o, method, new Object[] {arg});
|
651 | } |
652 | |
653 | static Object call(Object o, String method, Object... args) {
|
654 | try {
|
655 | if (o instanceof Class) {
|
656 | Method m = call_findStaticMethod((Class) o, method, args, false); |
657 | m.setAccessible(true); |
658 | return invokeMethod(m, null, args); |
659 | } else {
|
660 | Method m = call_findMethod(o, method, args, false); |
661 | m.setAccessible(true); |
662 | return invokeMethod(m, o, args); |
663 | } |
664 | } catch (Exception e) {
|
665 | throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e); |
666 | } |
667 | } |
668 | |
669 | static Method call_findStaticMethod(Class c, String method, Object[] args, boolean debug) {
|
670 | Class _c = c; |
671 | while (c != null) {
|
672 | for (Method m : c.getDeclaredMethods()) {
|
673 | if (debug) |
674 | System.out.println("Checking method " + m.getName() + " with " + m.getParameterTypes().length + " parameters");;
|
675 | if (!m.getName().equals(method)) {
|
676 | if (debug) System.out.println("Method name mismatch: " + method);
|
677 | continue; |
678 | } |
679 | |
680 | if ((m.getModifiers() & java.lang.reflect.Modifier.STATIC) == 0 || !call_checkArgs(m, args, debug)) |
681 | continue; |
682 | |
683 | return m; |
684 | } |
685 | c = c.getSuperclass(); |
686 | } |
687 | throw new RuntimeException("Method '" + method + "' (static) with " + args.length + " parameter(s) not found in " + _c.getName());
|
688 | } |
689 | |
690 | static Method call_findMethod(Object o, String method, Object[] args, boolean debug) {
|
691 | Class c = o.getClass(); |
692 | while (c != null) {
|
693 | for (Method m : c.getDeclaredMethods()) {
|
694 | if (debug) |
695 | System.out.println("Checking method " + m.getName() + " with " + m.getParameterTypes().length + " parameters");;
|
696 | if (m.getName().equals(method) && call_checkArgs(m, args, debug)) |
697 | return m; |
698 | } |
699 | c = c.getSuperclass(); |
700 | } |
701 | throw new RuntimeException("Method '" + method + "' (non-static) with " + args.length + " parameter(s) not found in " + o.getClass().getName());
|
702 | } |
703 | |
704 | private static boolean call_checkArgs(Method m, Object[] args, boolean debug) {
|
705 | Class<?>[] types = m.getParameterTypes(); |
706 | if (types.length != args.length) {
|
707 | if (debug) |
708 | System.out.println("Bad parameter length: " + args.length + " vs " + types.length);
|
709 | return false; |
710 | } |
711 | for (int i = 0; i < types.length; i++) |
712 | if (!(args[i] == null || isInstanceX(types[i], args[i]))) {
|
713 | if (debug) |
714 | System.out.println("Bad parameter " + i + ": " + args[i] + " vs " + types[i]);
|
715 | return false; |
716 | } |
717 | return true; |
718 | } |
719 | static Throwable printStackTrace2(Throwable e) {
|
720 | // we go to system.out now - system.err is nonsense |
721 | print(getStackTrace2(e)); |
722 | return e; |
723 | } |
724 | |
725 | static void printStackTrace2() {
|
726 | printStackTrace2(new Throwable()); |
727 | } |
728 | |
729 | static void printStackTrace2(String msg) {
|
730 | printStackTrace2(new Throwable(msg)); |
731 | } |
732 | |
733 | /*static void printStackTrace2(S indent, Throwable e) {
|
734 | if (endsWithLetter(indent)) indent += " "; |
735 | printIndent(indent, getStackTrace2(e)); |
736 | }*/ |
737 | static List _registerWeakMap_preList; |
738 | |
739 | static <A> A _registerWeakMap(A map) {
|
740 | if (javax() == null) {
|
741 | // We're in class init |
742 | if (_registerWeakMap_preList == null) _registerWeakMap_preList = synchroList(); |
743 | _registerWeakMap_preList.add(map); |
744 | return map; |
745 | } |
746 | |
747 | try {
|
748 | call(javax(), "_registerWeakMap", map); |
749 | } catch (Throwable e) {
|
750 | printException(e); |
751 | print("Upgrade JavaX!!");
|
752 | } |
753 | return map; |
754 | } |
755 | |
756 | static void _onLoad_registerWeakMap() {
|
757 | assertNotNull(javax()); |
758 | if (_registerWeakMap_preList == null) return; |
759 | for (Object o : _registerWeakMap_preList) |
760 | _registerWeakMap(o); |
761 | _registerWeakMap_preList = null; |
762 | } |
763 | static Field getOpt_findField(Class<?> c, String field) {
|
764 | Class _c = c; |
765 | do {
|
766 | for (Field f : _c.getDeclaredFields()) |
767 | if (f.getName().equals(field)) |
768 | return f; |
769 | _c = _c.getSuperclass(); |
770 | } while (_c != null); |
771 | return null; |
772 | } |
773 | static String getClassName(Object o) {
|
774 | return o == null ? "null" : o instanceof Class ? ((Class) o).getName() : o.getClass().getName(); |
775 | } |
776 | static Object invokeMethod(Method m, Object o, Object... args) { try {
|
777 | try {
|
778 | return m.invoke(o, args); |
779 | } catch (InvocationTargetException e) {
|
780 | throw rethrow(getExceptionCause(e)); |
781 | } catch (IllegalArgumentException e) {
|
782 | throw new IllegalArgumentException(e.getMessage() + " - was calling: " + m + ", args: " + joinWithSpace(classNames(args))); |
783 | } |
784 | } catch (Exception __e) { throw rethrow(__e); } }
|
785 | |
786 | |
787 | static Boolean isHeadless_cache; |
788 | |
789 | static boolean isHeadless() {
|
790 | if (isHeadless_cache != null) return isHeadless_cache; |
791 | if (isAndroid()) return isHeadless_cache = true; |
792 | if (GraphicsEnvironment.isHeadless()) return isHeadless_cache = true; |
793 | |
794 | // Also check if AWT actually works. |
795 | // If DISPLAY variable is set but no X server up, this will notice. |
796 | |
797 | try {
|
798 | SwingUtilities.isEventDispatchThread(); |
799 | return isHeadless_cache = false; |
800 | } catch (Throwable e) { return isHeadless_cache = true; }
|
801 | } |
802 | static Throwable getExceptionCause(Throwable e) {
|
803 | Throwable c = e.getCause(); |
804 | return c != null ? c : e; |
805 | } |
806 | static String joinWithSpace(Collection<String> c) {
|
807 | return join(" ", c);
|
808 | } |
809 | |
810 | static String joinWithSpace(String... c) {
|
811 | return join(" ", c);
|
812 | } |
813 | |
814 | static Object callFunction(Object f, Object... args) {
|
815 | return callF(f, args); |
816 | } |
817 | static List<String> classNames(Collection l) {
|
818 | return getClassNames(l); |
819 | } |
820 | |
821 | static List<String> classNames(Object[] l) {
|
822 | return getClassNames(Arrays.asList(l)); |
823 | } |
824 | static Class javax() {
|
825 | return getJavaX(); |
826 | } |
827 | static Class mc() {
|
828 | return main.class; |
829 | } |
830 | static <A> A assertNotNull(A a) {
|
831 | assertTrue(a != null); |
832 | return a; |
833 | } |
834 | |
835 | static <A> A assertNotNull(String msg, A a) {
|
836 | assertTrue(msg, a != null); |
837 | return a; |
838 | } |
839 | static <A, B> void multiMapPut(Map<A, List<B>> map, A a, B b) {
|
840 | List<B> l = map.get(a); |
841 | if (l == null) |
842 | map.put(a, l = new ArrayList()); |
843 | l.add(b); |
844 | } |
845 | static String getStackTrace2(Throwable throwable) {
|
846 | return hideCredentials(getStackTrace(throwable) + replacePrefix("java.lang.RuntimeException: ", "FAIL: ",
|
847 | hideCredentials(str(getInnerException(throwable)))) + "\n"); |
848 | } |
849 | // extended over Class.isInstance() to handle primitive types |
850 | static boolean isInstanceX(Class type, Object arg) {
|
851 | if (type == boolean.class) return arg instanceof Boolean; |
852 | if (type == int.class) return arg instanceof Integer; |
853 | if (type == long.class) return arg instanceof Long; |
854 | if (type == float.class) return arg instanceof Float; |
855 | if (type == short.class) return arg instanceof Short; |
856 | if (type == char.class) return arg instanceof Character; |
857 | if (type == byte.class) return arg instanceof Byte; |
858 | if (type == double.class) return arg instanceof Double; |
859 | return type.isInstance(arg); |
860 | } |
861 | static void printException(Throwable e) {
|
862 | printStackTrace(e); |
863 | } |
864 | static String str(Object o) {
|
865 | return o == null ? "null" : o.toString(); |
866 | } |
867 | |
868 | static String str(char[] c) {
|
869 | return new String(c); |
870 | } |
871 | static void androidUI_noWait(final Object r) {
|
872 | androidActivity().runOnUiThread(toRunnable(r)); |
873 | } |
874 | static <A> List<A> synchroList() {
|
875 | return Collections.synchronizedList(new ArrayList<A>()); |
876 | } |
877 | |
878 | static <A> List<A> synchroList(List<A> l) {
|
879 | return Collections.synchronizedList(l); |
880 | } |
881 | |
882 | static <A> A androidEvalInUIThread(final F0<A> f) {
|
883 | final Var<A> v = new Var(); |
884 | final Var<Throwable> error = new Var(); |
885 | androidUI_wait(new Runnable() { public void run() { try {
|
886 | try {
|
887 | v.set(callF(f)); |
888 | } catch (Throwable e) {
|
889 | error.set(e); |
890 | } |
891 | |
892 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "try {\r\n v.set(callF(f));\r\n } catch (Throwable e) {\r\n error.set(e..."; }});
|
893 | if (error.has()) throw rethrow(error.get()); else return v.get(); |
894 | } |
895 | static Map synchroHashMap() {
|
896 | return Collections.synchronizedMap(new HashMap()); |
897 | } |
898 | |
899 | static int isAndroid_flag; |
900 | |
901 | static boolean isAndroid() {
|
902 | if (isAndroid_flag == 0) |
903 | isAndroid_flag = System.getProperty("java.vendor").toLowerCase().indexOf("android") >= 0 ? 1 : -1;
|
904 | return isAndroid_flag > 0; |
905 | } |
906 | |
907 | |
908 | |
909 | static Runnable toRunnable(final Object o) {
|
910 | if (o instanceof Runnable) return (Runnable) o; |
911 | return new Runnable() { public void run() { try { callF(o) ;
|
912 | } catch (Exception __e) { throw rethrow(__e); } } public String toString() { return "callF(o)"; }};
|
913 | } |
914 | static String getStackTrace(Throwable throwable) {
|
915 | lastException(throwable); |
916 | return getStackTrace_noRecord(throwable); |
917 | } |
918 | |
919 | static String getStackTrace_noRecord(Throwable throwable) {
|
920 | StringWriter writer = new StringWriter(); |
921 | throwable.printStackTrace(new PrintWriter(writer)); |
922 | return hideCredentials(writer.toString()); |
923 | } |
924 | |
925 | static String getStackTrace() {
|
926 | return getStackTrace_noRecord(new Throwable()); |
927 | } |
928 | public static String join(String glue, Iterable<String> strings) {
|
929 | if (strings == null) return ""; |
930 | StringBuilder buf = new StringBuilder(); |
931 | Iterator<String> i = strings.iterator(); |
932 | if (i.hasNext()) {
|
933 | buf.append(i.next()); |
934 | while (i.hasNext()) |
935 | buf.append(glue).append(i.next()); |
936 | } |
937 | return buf.toString(); |
938 | } |
939 | |
940 | public static String join(String glue, String... strings) {
|
941 | return join(glue, Arrays.asList(strings)); |
942 | } |
943 | |
944 | static String join(Iterable<String> strings) {
|
945 | return join("", strings);
|
946 | } |
947 | |
948 | static String join(Iterable<String> strings, String glue) {
|
949 | return join(glue, strings); |
950 | } |
951 | |
952 | public static String join(String[] strings) {
|
953 | return join("", strings);
|
954 | } |
955 | |
956 | |
957 | static Throwable printStackTrace(Throwable e) {
|
958 | // we go to system.out now - system.err is nonsense |
959 | print(getStackTrace(e)); |
960 | return e; |
961 | } |
962 | |
963 | static void printStackTrace() {
|
964 | printStackTrace(new Throwable()); |
965 | } |
966 | |
967 | static void printStackTrace(String msg) {
|
968 | printStackTrace(new Throwable(msg)); |
969 | } |
970 | |
971 | /*static void printStackTrace(S indent, Throwable e) {
|
972 | if (endsWithLetter(indent)) indent += " "; |
973 | printIndent(indent, getStackTrace(e)); |
974 | }*/ |
975 | static String replacePrefix(String prefix, String replacement, String s) {
|
976 | if (!startsWith(s, prefix)) return s; |
977 | return replacement + substring(s, l(prefix)); |
978 | } |
979 | static void assertTrue(Object o) {
|
980 | if (!(eq(o, true) /*|| isTrue(pcallF(o))*/)) |
981 | throw fail(str(o)); |
982 | } |
983 | |
984 | static boolean assertTrue(String msg, boolean b) {
|
985 | if (!b) |
986 | throw fail(msg); |
987 | return b; |
988 | } |
989 | |
990 | static boolean assertTrue(boolean b) {
|
991 | if (!b) |
992 | throw fail("oops");
|
993 | return b; |
994 | } |
995 | static String hideCredentials(URL url) { return url == null ? null : hideCredentials(str(url)); }
|
996 | |
997 | static String hideCredentials(String url) {
|
998 | return url.replaceAll("([&?])_pass=[^&\\s\"]*", "$1_pass=<hidden>");
|
999 | } |
1000 | |
1001 | static String hideCredentials(Object o) {
|
1002 | return hideCredentials(str(o)); |
1003 | } |
1004 | static List<String> getClassNames(Collection l) {
|
1005 | List<String> out = new ArrayList(); |
1006 | if (l != null) for (Object o : l) |
1007 | out.add(o == null ? null : getClassName(o)); |
1008 | return out; |
1009 | } |
1010 | static Class __javax; |
1011 | |
1012 | static Class getJavaX() {
|
1013 | return __javax; |
1014 | } |
1015 | static Throwable getInnerException(Throwable e) {
|
1016 | while (e.getCause() != null) |
1017 | e = e.getCause(); |
1018 | return e; |
1019 | } |
1020 | |
1021 | |
1022 | static volatile Throwable lastException_lastException; |
1023 | |
1024 | static Throwable lastException() {
|
1025 | return lastException_lastException; |
1026 | } |
1027 | |
1028 | static void lastException(Throwable e) {
|
1029 | lastException_lastException = e; |
1030 | } |
1031 | static String substring(String s, int x) {
|
1032 | return substring(s, x, l(s)); |
1033 | } |
1034 | |
1035 | static String substring(String s, int x, int y) {
|
1036 | if (s == null) return null; |
1037 | if (x < 0) x = 0; |
1038 | if (x >= s.length()) return ""; |
1039 | if (y < x) y = x; |
1040 | if (y > s.length()) y = s.length(); |
1041 | return s.substring(x, y); |
1042 | } |
1043 | |
1044 | |
1045 | static boolean startsWith(String a, String b) {
|
1046 | return a != null && a.startsWith(b); |
1047 | } |
1048 | |
1049 | static boolean startsWith(String a, char c) {
|
1050 | return nempty(a) && a.charAt(0) == c; |
1051 | } |
1052 | |
1053 | |
1054 | |
1055 | static boolean startsWith(List a, List b) {
|
1056 | if (a == null || l(b) > l(a)) return false; |
1057 | for (int i = 0; i < l(b); i++) |
1058 | if (neq(a.get(i), b.get(i))) |
1059 | return false; |
1060 | return true; |
1061 | } |
1062 | |
1063 | |
1064 | |
1065 | |
1066 | static boolean neq(Object a, Object b) {
|
1067 | return !eq(a, b); |
1068 | } |
1069 | static boolean nempty(Collection c) {
|
1070 | return !isEmpty(c); |
1071 | } |
1072 | |
1073 | static boolean nempty(CharSequence s) {
|
1074 | return !isEmpty(s); |
1075 | } |
1076 | |
1077 | static boolean nempty(Object[] o) {
|
1078 | return !isEmpty(o); |
1079 | } |
1080 | |
1081 | static boolean nempty(Map m) {
|
1082 | return !isEmpty(m); |
1083 | } |
1084 | |
1085 | static boolean nempty(Iterator i) {
|
1086 | return i != null && i.hasNext(); |
1087 | } |
1088 | |
1089 | static boolean nempty(Object o) { return !empty(o); }
|
1090 | |
1091 | |
1092 | static boolean empty(Collection c) { return c == null || c.isEmpty(); }
|
1093 | static boolean empty(String s) { return s == null || s.length() == 0; }
|
1094 | static boolean empty(Map map) { return map == null || map.isEmpty(); }
|
1095 | static boolean empty(Object[] o) { return o == null || o.length == 0; }
|
1096 | static boolean empty(Object o) {
|
1097 | if (o instanceof Collection) return empty((Collection) o); |
1098 | if (o instanceof String) return empty((String) o); |
1099 | if (o instanceof Map) return empty((Map) o); |
1100 | if (o instanceof Object[]) return empty((Object[]) o); |
1101 | if (o == null) return true; |
1102 | throw fail("unknown type for 'empty': " + getType(o));
|
1103 | } |
1104 | |
1105 | static boolean empty(float[] a) { return a == null || a.length == 0; }
|
1106 | static boolean empty(int[] a) { return a == null || a.length == 0; }
|
1107 | static boolean empty(long[] a) { return a == null || a.length == 0; }
|
1108 | |
1109 | |
1110 | static boolean isEmpty(Collection c) {
|
1111 | return c == null || c.isEmpty(); |
1112 | } |
1113 | |
1114 | static boolean isEmpty(CharSequence s) {
|
1115 | return s == null || s.length() == 0; |
1116 | } |
1117 | |
1118 | static boolean isEmpty(Object[] a) {
|
1119 | return a == null || a.length == 0; |
1120 | } |
1121 | |
1122 | static boolean isEmpty(Map map) {
|
1123 | return map == null || map.isEmpty(); |
1124 | } |
1125 | |
1126 | |
1127 | static String getType(Object o) {
|
1128 | return getClassName(o); |
1129 | } |
1130 | |
1131 | |
1132 | static class Var<A> implements IVar<A> {
|
1133 | A v; // you can access this directly if you use one thread |
1134 | |
1135 | Var() {}
|
1136 | Var(A v) {
|
1137 | this.v = v;} |
1138 | |
1139 | public synchronized void set(A a) {
|
1140 | if (v != a) {
|
1141 | v = a; |
1142 | notifyAll(); |
1143 | } |
1144 | } |
1145 | |
1146 | public synchronized A get() { return v; }
|
1147 | public synchronized boolean has() { return v != null; }
|
1148 | public synchronized void clear() { v = null; }
|
1149 | |
1150 | public String toString() { return str(get()); }
|
1151 | }static abstract class F0<A> {
|
1152 | abstract A get(); |
1153 | }static abstract class F1<A, B> {
|
1154 | abstract B get(A a); |
1155 | }/** this class is fully thread-safe */ |
1156 | static class Flag {
|
1157 | private boolean up; |
1158 | |
1159 | /** returns true if flag was down before */ |
1160 | public synchronized boolean raise() {
|
1161 | if (!up) {
|
1162 | up = true; |
1163 | notifyAll(); |
1164 | return true; |
1165 | } else |
1166 | return false; |
1167 | } |
1168 | |
1169 | public synchronized void waitUntilUp() {
|
1170 | while (!up) {
|
1171 | try {
|
1172 | wait(); |
1173 | } catch (InterruptedException e) {
|
1174 | e.printStackTrace(); |
1175 | } |
1176 | } |
1177 | } |
1178 | |
1179 | public synchronized void waitUntilUp(long timeout) {
|
1180 | if (!up) {
|
1181 | try {
|
1182 | wait(timeout); |
1183 | } catch (InterruptedException e) {
|
1184 | e.printStackTrace(); |
1185 | } |
1186 | } |
1187 | } |
1188 | |
1189 | public synchronized boolean isUp() {
|
1190 | return up; |
1191 | } |
1192 | |
1193 | public String toString() {
|
1194 | return isUp() ? "up" : "down"; |
1195 | } |
1196 | |
1197 | // currently does a semi-active wait with latency = 50 ms |
1198 | public void waitForThisOr(Flag otherFlag) { try {
|
1199 | while (!isUp() && !otherFlag.isUp()) |
1200 | Thread.sleep(50); |
1201 | } catch (Exception __e) { throw rethrow(__e); } }
|
1202 | } |
1203 | |
1204 | static interface IVar<A> {
|
1205 | void set(A a); |
1206 | A get(); |
1207 | boolean has(); |
1208 | void clear(); |
1209 | } |
1210 | } |
Began life as a copy of #1015069
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, nbgitpuheiab, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1015070 |
| Snippet name: | Android Take Picture, old transpilation 2 |
| Eternal ID of this version: | #1015070/3 |
| Text MD5: | 28874e30ab8c1f7152e4d244a470eb66 |
| Transpilation MD5: | 8138765c035e521076d3b9b81844a720 |
| Author: | stefan |
| Category: | javax android |
| Type: | JavaX source code (Android) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-05-07 18:29:52 |
| Source code size: | 34352 bytes / 1210 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 484 / 619 |
| Version history: | 2 change(s) |
| Referenced in: | [show references] |