From f17e9d7018a5b4e6e9c7c236af486780fbbdc5f7 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Mon, 27 Jan 2014 17:50:34 +0000 Subject: [PATCH] Add example android project. --- examples/android/.cvsignore | 3 + examples/android/AndroidManifest.xml | 27 ++++ examples/android/assets/activity.lua | 152 ++++++++++++++++++ examples/android/assets/logo.gif | Bin 0 -> 2694 bytes examples/android/build.xml | 26 +++ .../android/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 4381 bytes .../android/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2581 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 6299 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 10979 bytes examples/android/res/menu/luaj.xml | 9 ++ examples/android/res/values/dimens.xml | 7 + examples/android/res/values/strings.xml | 8 + examples/android/res/values/styles.xml | 20 +++ .../android/src/android/LuajActivity.java | 30 ++++ examples/android/src/android/LuajView.java | 122 ++++++++++++++ 15 files changed, 404 insertions(+) create mode 100644 examples/android/.cvsignore create mode 100644 examples/android/AndroidManifest.xml create mode 100644 examples/android/assets/activity.lua create mode 100644 examples/android/assets/logo.gif create mode 100644 examples/android/build.xml create mode 100644 examples/android/res/drawable-hdpi/ic_launcher.png create mode 100644 examples/android/res/drawable-mdpi/ic_launcher.png create mode 100644 examples/android/res/drawable-xhdpi/ic_launcher.png create mode 100644 examples/android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 examples/android/res/menu/luaj.xml create mode 100644 examples/android/res/values/dimens.xml create mode 100644 examples/android/res/values/strings.xml create mode 100644 examples/android/res/values/styles.xml create mode 100644 examples/android/src/android/LuajActivity.java create mode 100644 examples/android/src/android/LuajView.java diff --git a/examples/android/.cvsignore b/examples/android/.cvsignore new file mode 100644 index 00000000..6a4fdcdf --- /dev/null +++ b/examples/android/.cvsignore @@ -0,0 +1,3 @@ +bin +gen +libs diff --git a/examples/android/AndroidManifest.xml b/examples/android/AndroidManifest.xml new file mode 100644 index 00000000..e6e4448f --- /dev/null +++ b/examples/android/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + diff --git a/examples/android/assets/activity.lua b/examples/android/assets/activity.lua new file mode 100644 index 00000000..e5e893b3 --- /dev/null +++ b/examples/android/assets/activity.lua @@ -0,0 +1,152 @@ +-- Simple lua script that is executed when the activity start. +-- +-- Arguments are the activity and the view. +local activity, view = ... +print('activity', activity, 'view', view) + +-- forward declarations of local functions and variables +local animate,render +local chars = {} +local W, H = 600, 800 + +-- called on key down event +function onKeyDown(keyCode, event) + print('onKeyDown', keyCode, event) +end + +-- called on key up event +function onKeyUp(keyCode, event) + print('onKeyUp', keyCode, event) +end + +-- called on touch event +function onTouchEvent(event) + -- print('onTouchEvent', event) + local x1, y1 = event:getX(), event:getY() + local i,j = math.floor(x1*256/W), math.floor(y1*256/H) + local u = i + j * 256 + local c = u < 0x80 and string.char(u) or + u < 0x800 and string.char(0xc0 + math.floor(u/0x80) % 0x20, + u % 0x80 ) or + string.char(0xe0 + math.floor(u/0x2000) % 0x8, + 0x80 + math.floor(u/0x80) % 0x80, + u % 0x80) + while #chars > 4 do table.remove(chars, 1) end + table.insert(chars, { + n=255, + x=-4+12*math.random(), + y=-8+12*math.random(), + text=c}) + return true +end + +-- called on trackball event +function onTrackballEvent(event) + print('onTrackballEvent', event) + return true +end + +function onWindowFocusChanged(hasWindowFocus) + print('onWindowFocusChanged', hasWindowFocus) +end + +function onWindowSystemUiVisibilityChanged(visible) + print('onWindowSystemUiVisibilityChanged', visible) +end + +-- called to draw the lua view +local prev, interval = os.time(), 1/60 +local Thread = luajava.bindClass('java.lang.Thread') +function draw(canvas) + view:invalidate() + local curr = os.time() + local diff = curr - prev + if diff >= interval then + pcall(animate, canvas) + local wait = math.floor(1000 * (prev + interval - os.time())) + if wait > 0 then pcall(Thread.sleep, Thread, wait) end + prev = os.time() + end + pcall(render, canvas) +end + +-- the animation step moves the line endpoints +local x1,y1,x2,y2,xi,yi = 160,240,480,240,0,0 +local vx1,vy1,vx2,vy2,vxi,vyi = -5,-6,7,8,3,1 +local w, h = W, H +local advance = function(x,vx,max,rnd) + x = x + vx + if x < 0 then + return 0, math.random(2,10) + elseif x > max then + return max, math.random(-10,-2) + end + return x, vx +end +animate = function(canvas) + x1,y1,x2,y2 = x1+1,y1+1,x2-1,y2-1 + x1,vx1 = advance(x1,vx1,w) + y1,vy1 = advance(y1,vy1,h) + x2,vx2 = advance(x2,vx2,w) + y2,vy2 = advance(y2,vy2,h) + xi,vxi = advance(xi,vxi,w-100) + yi,vyi = advance(yi,vyi,h-100) + while #chars > 0 and chars[1].n <= 1 do + table.remove(chars, 1) + end + for i,c in pairs(chars) do + c.n = c.n - 1 + end +end + +-- classes that we need for rendering +local Color = luajava.bindClass('android.graphics.Color') +local Paint = luajava.bindClass('android.graphics.Paint') +local Style = luajava.bindClass('android.graphics.Paint$Style') +print('Color, Paint, Style', Color, Paint, Style) + +-- colors that we use +local text_color, line_color = Paint.new(), Paint.new() +text_color:setColor(0xffffff33) +text_color:setTextSize(8.0) +line_color:setColor(0xffffaa33) +line_color:setStrokeWidth(1.5) +line_color:setStyle(Style.STROKE) +print('text_color, line_color', text_color, line_color) + +-- load the logo image +local istream = view:findResource('logo.gif') +print('istream', istream) +local BitmapFactory = luajava.bindClass('android.graphics.BitmapFactory') +local logo = BitmapFactory:decodeStream(istream) +print('logo', logo) + +-- the render step draws the scene +render = function(canvas) + -- scale the drawing to approximagely 600 x 800 + W, H = canvas:getWidth(), canvas:getHeight(); + local scale = (W + H) / (600 + 800) + canvas:scale(scale, scale) + w, h = W / scale, H / scale + + -- redraw the canvas + canvas:drawColor(0xff112244) + + -- line + canvas:drawLine(x1, y1, x2, y2, line_color) + + -- text + canvas:translate(w/2,h/2) + for i,c in pairs(chars) do + local s = 200 / (256-c.n) + canvas:scale(s, s) + canvas:drawText(c.text, c.x-4, c.y+6, text_color) + canvas:scale(1/s, 1/s) + end + canvas:translate(-w/2,-h/2) + + -- image + canvas:drawBitmap(logo,xi,yi) +end + + diff --git a/examples/android/assets/logo.gif b/examples/android/assets/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..193e69208494ed9272f4f0f10f275f3a65373d51 GIT binary patch literal 2694 zcmV;13VHQMNk%w1VSoUD0K@;M3G?CkaA0;@PYLMYA*0%^fGD=K2B20?&8 z$e&1|B9Y+pT67U38W02se=igb4*&xl0{{;O4F_>35DbP0HyU+kYA^v09;K$I0~rmM z8YFx@dIc~C1^}nGrX3prR00JG5K0TOD;EwM1Gu*U7Ohaf3JY*aYzhU5CkY(3%BC3? zPzwvrOA!PN3nU2!1`Y`&7Z%*z85EaDeIpkbxepw?BMxlq=D|P`Ph2i>P}TuM19AcQ zF?4XmjDm!5k`Z)BNS?9>mWZ5NfUSx~f*msdyc01>83!VTIN1_P@ytE&7FaG-$!42=dn>HsOy0}PZ7Y;|EE z>Ma9ADO^2e&<6oxG4L3}U~7V3zsmjs9)Q6CxEBrF-l``;?x_cM8Q_gU!NG$LfIX1i zOjdI#&Yk~uc;JBO2b>plDmFl7pD6%6&dGE^=0Ju4fH`aK;Mp_p-=BB$_M0lCin)qS zSs0N3Y6l(&7|ecg00ZXTr#kxv4&3+l;T|v;KM~+$@&Q>tG)VS*hk$8{GF;cq-MjbS z^?82=|1AabDWPfGqzBGbhKeGfp$%X`DAvOVUP#~1~}=~20BQPh6@^a*kG7B zj)@Cq4-8U*0~QiAz)CkDKvD~Fei>Yji0%YH1`Y&p0ZkVK;6Mi4{5HW*CM0lMa?2ed zfSlMRTIVtuI67lx&f$6F2mw$U6$Yji;bnKCis``s8$1Mq1|Dg4VhR^{6&56tSTNoY zVPx=St+kedfr~P<@XM+*Q~`t%0rB*ib1rzYpux*TG@z}~GaCREE(1KU0S65Pu#_`M9S}eR92{)keiOWlf*(Z` zO*M(P_EyRy4IBnTuvRmDsT5Mb-DG#THel`w2PlY{k3a~3z|bXt+HteL?Xp7vOg9}w z1q{H4LINfFogZ)B4(`JLLLg$+^9co1{KCa7DBGat3u@-m4iq@&+XU3k$np#jq@#ic z>~;S5%mW;Y1H@2vHbAT=)FFcgT&mDF)5F*KF%R+X2V&YQn8A1ozUaB{2d*1l{mi${ zeuKE#-OeUX5k$`ezZ}oWpv<1Riv#9T_V zc)$e7{Gz3PNu)cbpl=RZqX^olOqLweo2Hmj0LB@s|3LGH+d~`*wy-*Dq9Bi-W92s8 zvdnINAesd^K(9>kfR#|-F&Xj+J{cs)6%H^=nCL9H~iJ>QDdy zM5PerDMtU70yj-32eUd9Z*;oShnC`^xF{Jrx<(YBKJ}!u`ql3UaKxE>AW3S>Vk@Hp z)u!TtG|VG`RSQy5QyK)7UQHy3m>N{4vQ?e$|W^Z%~0jsi0_cB`iS`n*D9j*2NbDE>k#v)7C&f4{& z06D;rdUgh@E6;$9NLMUHngt&rasxJXv zJLlZgF;(UPl{ZigB%7QzgagEk!+0#kpHNV+l6L9@1`w@T+gA$c8X*iDSeAQP5X}~q zpgMOQC|pXAJsls{e=8n>1Uh=;u;vT^j^w5?2;)c}?wCxI?Ll+^Jc2NQwSc6wQ>Vt8 z+ZE6hu7vd6?{3P(GzV!V%JmhdR$#^(Y{|DJn4X=56ILMpMXVz5657;uf(ZDR29GxX zLHX?SHk`^Wo5DHESu8*l7dHrZWmEv1cWW;CO>l+mlIH#7rm_!EU>=wOfC)EBga$09wLGpC4q)cOCrv*XyA1y(7^_%D*J~B z4I15OJwl{`X$%~G51TheSjiBK;01Flx|wFw!R$NHNwC8PSioQy0LxhzW`PDIU{yiC z#4x-n1De#}>r>d0Wi9FXPu?U40w@xosc>Nh%)1H}dHom`AbTl9J@bm+5a@GX0FVFJ z+_^WwmaKvM8TbMi!GD1{G@*oxu?+ahH$eny9|QsrVAj!RK^^wsLhEN=%tdO$>M>X( zP<;Of_QFF2>_Exs(18Hdg^vL4vitLQpSrsn!Nu5LfBXCY{{R?(0yuyJmk + + + + + + + + + + sdk.dir: ${sdk.dir} + + + + + + + + + + + + + + diff --git a/examples/android/res/drawable-hdpi/ic_launcher.png b/examples/android/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2711c476b3a76a4fdb7edfaca69cc172b943fe55 GIT binary patch literal 4381 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 Xrmr{uGM|nZ00000NkvXXu0mjf4a!tX literal 0 HcmV?d00001 diff --git a/examples/android/res/drawable-mdpi/ic_launcher.png b/examples/android/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2c092f0b09a7a72628d1d3b0ccd8b264e7cd3b GIT binary patch literal 2581 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 R#25eo002ovPDHLkV1i*W(w+bS literal 0 HcmV?d00001 diff --git a/examples/android/res/drawable-xxhdpi/ic_launcher.png b/examples/android/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..449575c252a1e0c99abb374b37fb9d159fa03647 GIT binary patch literal 10979 zcmaKyRZv__w1sET!QCMc+}+*XA-D}X1b26L2*Eu_a1ZY8ZXpDB`5By`m-~L}o~k1c zU0waqefHXGeKG2)a%jlJ$N&HUO+j8-^W&ZTzc&cs<9Q^z+XetIRw_tKXnU_;7$X{e zzk5G==UQxJR@#7l&{^8BI-E%>)o)jvFVlQSY6GW_#W`M9)^ff*!6-X?028*kD80?b-4^2&#=rp2oj;9 zqFNsxub3Gd138}@9|yO$3k(epf0m5(*0r?UceAjtm|I?^x#U5Bg$*P2^Lzdg8X5{2 zCJP)dZ)_Y9U}Iyunn+`csjaPzu`Irnk(SoRrl7vAjg6)I)zHuYB5VtI<}E2L)j+?! zJ<;0!`R$wL*u+HW(2#VS=LNA*mp2xuys)vcGW{WQdD$c8XvT*wU&N0$g;eNjXE5rq zqo}&Bp}F}qwbP57CSNe^dz*ch#qPesVa!CBJC5JIu9Cl!K9h!3v&L?&z)Fl^ORmb& zQoQ2r-L(AF7=409p%m)%)m2PWQxmM6ogD=rw69OR&ErgmNu8U!ivmzy5?oPLMfKx^ zXlZpdjAGzHH0X`=>({Tx&rFPr(QAInrbnfxrv@<9O53};FmP?+{G{H#zM>!`B#!ju zI~nN>W4Yi|=-zA~`yQ3jv6unk=BFRP?(e^$y>H6LzYE}<&^4pH=Jl^lJiqAEK?JQ|EWmFXea}`S|##=ekz` zadvhF{5TT#qUl2S^77*Mx!xzDyuSb2?q);o;}eDnwWnZ8fBts@LjGtwqU0J?opDnG^`d^>RTSe?# zs?X0|q4%m`TR|8hNxHuW=VB1%{F1Zv#EHcw;ohG3;{D&d^?u~C`4IJUMOFJLC@4t( zjHY-RCaaw5K@AtB8SvTOXm@iyU1I3!@xE?kd|1D^DVVx?nCjfin7FFpW?2*PO(MV-2+M2&+MIIQbi~mJr~cd(lH*O9;2@GU&}ZT*3?Q-p9fVfY*Dhk=* zt42rtwH6(}FEgsqh9frF8NVW9EvH3`-K~VbI;nVf9s+qliLiF%8{)(A|gaE`&uK(kl&q={WZxR(Dj z;o#zy*jQL-1-v}Ee9fa!dQW;LWB^d}2Ahx%MT!pcfbVR6#-wG#J^beqA5XycR!ljw z%14%7=N>95DNXEJ{xAv&OH_4#0IGjk)>?!@qg~0#$tjG=2Xh1ehFDJv1G|T~Cw+7a zz^Cj!=>q3l1ON?>|dG72Jfp~8Kl^%g#}Gw z&0}UsHdiYv77h8T3eD^S)A>g~p7yI>H3Rr$5>+~agE>-5GzgdnvT)vmBSd{=Y$AQ5 zbP3KLGu<`S)nQe-H{h+hH+KKn5OLPq6-=~a^lc8Bs%k1exM51c?OIbd>M}QC4MLpl z$1A2jbCd9}C>Zbq#%BF%r(6BWA1>%`Uau!N#DCAvB1aW6#UqJuQiDupb~zwXX;Nxh zd@PwSfwH@7y>ODf8U~s`kS@j#!d^a2lJr_P07eon<47{j^3sx&zyD{_7b=i;84>b} zz3#Hd69OXQ+33i~Db9iFe}_KC#v=O%U&JjfS@{Jw0RgX*(7`&g3IHV#*#7%qB$;Vc*Ns)g`afttRuSsW zb~p{8caxB7%RN}n3j^SbD}AtUT_;NT9U<9yyDX;W7pQAnd@t4#yWM#QP# zG@f0rX9Wu(VVRCEjK*wFe<^4{|E0Iddvg#TOKI$R4F)h03dTts%$`+))!KvcE>H_w zT8h&4msdR2-)vb%dBWmYG6A>{8}ZIKr=(NWUaxS)y)TTp?i8Y5V54fxorUE34G?^MApqoE<}!{?mK&W4Ed${RUGk z&`3%71y!%92YS-6DBNcTb)XMZ z!)@^4M+|dX^pWU0eD0-(vcm;e96a=LNGIgm$a~}C;tCh#(4i-P`xa|<;Y;9cS06bA zSkl$UNqoaYu(hQb>e$bfa&f_1Zr2_m_9O$O+?>j+Tpklja~bpc@V?K}Ay|lz@U~xv zgiN}%1$z81La)jupJ^Ntdbu9(X_Hn>!)_b2%gFq>a2pZp-5SM@ zTngk37otKqM+lt(u<(1+gB<@d+TLVyaZQ@delk54la#Xt4E*v;MKOw>+8IZO1b_c- zuGcb!)dAye&;FpG)7KAbDznB_&b6IDLTyD$8#EUFe;}*CmU1BRo7qaJXQ>bC$MV z^MI=LQE=?Pjo}qs_O2%ygZMmzLMRmKuFR*RppX_*;V8F%`{PRsx8{aaVJPE-xp|E3 zmxlHFw*7`|iMZ9fH;9AYzjmB9zY^qbg7V_Ewc)`oniWo=q}E8=0Z((9A5|e4f=o`o z=f}p5V_IAJRA_^)B%dC!CM=XyGJED=e9?3Wc4o2eQW=2J;jc-bkCtEl5-OP1Pa!a~ z)SFkxB?}r!W-6QO)L1Bk@V!4b1foc}S54 zYJC1zW^=br+TbU&#mI5;%>HjY=+J+>e2wlwN2y;N$%?@Ntq&Dt2+6UI~O$@}BR z`3l(&mEB8Kl^dqKyd1Q^~=dboa|MH!)% zS7^HcuN6H+ap5bQNRSDJt?e*(n)|$5%Mj-R#AQ0wIyQNTozR6j$wVOhz~jF-PVef?7blr2xX zIy$TnQwMF>Tvz4L-{g6iJ80=cHdH8b<~M$}#sa|E)4LhH25~K!eVMj@dK7KeH7FjO z*ZF61Oy}EOYQ#XpPA)1rFud|lzwDUhUpP6eV5RT(nD_$$jWZG@t2!^3A@p?|hLsQZ zB!y^E7>H6jI-}HT=E-;02g1aveWdx;y#zQtYlrB%wPVy2A`Oec{gadS)SN9UmeQXY z1C0r)P%$ff(-I?W^r3V^dW!{WxB3Q!Lh$!QW^4)8u>RewN}U8`j-w5zXuxYXou!S^ zEd2c1=XBQqBcqLlnSIgckG62KzG?NN#VG9|B&H})P;SKH+l>>Pzr2_q^I?A{NgHV&Cnenya&dn!;P{~PE%rtl=piG&X!7kbu3{Zb@Bjgw))E*n?bz#xp6^{cx zT-+ei-oShr3JYz7D4&j}cF?Mp)R0YU>5U1re%`y?xwOF2+;U^a;$vqQ#}r{^W7}F{ z0DQ=H(Z~c~eZHYV0mkNS40+~&-Gn_6W7oy60sgm4(ZObjJu+|r<&*n1_&z^Eh7=PX zcO~c$SqndVkls8EEvrP$ZvMFfGG7^K0=u@IMvG>Onq7!E_>(Nk zg*>xwL#=uz$4Pi+D~K&PZc+t$r4XgIDzM0oP9QBZ?sDYsk3Ey$O|u*@+Q@Lb`tRvU zQdxOwW~RO)kQ&gDu-)(Jw1BCj%4%SR;WP)s_x3`h4wxYkd~-#3I4F&IgM;8-wpc-ebIiWCeSV% zzxvOv;;ZrkX3NoFbpJ2AhL|s3cya`Z#mQ;u=n8rR$pUa_G>!YVg5<=vQVcXB>GsbM zeS@0O@oL%xK$HkO2zGpVkw{I-w%ZMR10=bKr+GyNOSa<$*+TA(z+>zNhP+R=!7bxR zC@56sTsL}hu*X`IEdvFjXp6l$70IAac*v>lU~CnM}fsj2nWOL zbt?!6J<^$UuWfb6UD=n4>d~tjTHP%ernycpC1!beBNbHx#g&5V9r9`%U=A3?UXEcW z`2+{1Flx+(ETv%Zc|vR(os#B)#okd<7mU>>tpKBf*uvz=coccI>i~v|VQvClZyKp1 zHwtavEzK1OxV>ms$gG-GIo}Dv&@&e((oM+kc8H(gm6o|1S+I^J^w$U^;Hm3GOOf7Rm*u-VYqet@R%^M7PG!079 zQ(Uw$9GDe*oKHxt|J1h>?6Mx=DG%M~nkaB`|Ms!ob{nLC4y_MDS91$*F8cJmxOT>3tm)fJj zVNY&Djci1cXG9Ud`*Uq8tAl4(cub9!-TD?Ldiv{v~GY{nZ4YvQXfV=c8VD5x{vVo|_FbS=vaOiVZFOu?aHVSCQ$aEC7+ zlDFp7Jgzesn{-og{(iJ(9Yb+uG6Nt!CxwZyFoZ{rjK8&4Z6!oyWv`fsQksi)oJTN`IU{h0X?HJ8oF z_x!_mrlh%2hU%l4zv-PsNu#5dF9i?(2FDa4DF+CdKd(^1ZjzP3&(w}%!+t77MvwHl zKlfRMnfu$Bw7ps!QZu0w9!DgbVaShUb3%;B4-UwSB=eR-84G1!Px|Cw(NtCMTg(Mt zbIhN4{5(3>Hn+5?i+pMT7{G5L>Gi~!^OMuFpp(ro#<9uj&+qQpKJ-jIrO#!IN2rj& zy9Y^buklm&tqRQ!Kx0OSSw(Tr1GmfJg@X9ys-!zmgQNdziiVuh=v~rO{9IhT!Jqo+ zv7wCh>)bd8_NtaI+JxJxOu+v+j888&o+e%M(?KKTpII<&XA-#6tV^wJu0+-))CeJU zp4~e(=ZxSxkXSHdd-3ikxR1~niG&l>5i|`j=vWWAk2>cB3?TU*LnKj@7hJ7wE#e(C zz!R8-(oLQ4-Ucx({io~>k?Hm27CfR#)F0s`8C-g|}|A59YxkQgu=$tKjZ z?3XA9(T646Y$qo%3Y{Jb>{7f5KINkYL{=&Fg=BAy&ULK)@W|s2N8@1E%|36n2jXI5 z!}$98V#9*=I6LnP2ZrCkZn`VHHpcS2jqE>AWt}mEa4vx6OXTfVB9MpXDpX>8LlN zRD?E$@8Nn+Ng@5nB=s!{g(!b6I0*?JZz)`e?OXuON5O3Kw$v!LW(H9o*Ex{7MkLye z%9;5WggiME)@8M`xY_Jl_-4ckVb3}XN`$o=Zo>~)Zy1f^)l254jig{?WIQDX3;^j0 z99`3cVY}A>-Cu}#TIoDA6%~x}#N*LnldlPlGX-Zub$n+`{9#7QiCh0#+P2X; zR74eIHSJSR=|O&Xd_FKkBjg#5ehV75NrW!fazS51ZlH)p=Ow`Q??m7?%NJk&XJWwMTl{6yvs0A0$deHMUxs%}$h$$av3H5?mejq2xKel<5iYEozP_lYq$2ppVRX%o zkv^jADiC0q8B_ecEEV(2)}J8g583#V@w+kl)3Y-x6bdypwfe@!Z)@>MNxf=_jlV>O z!slxM;S2NZKwO8D#cY<5gDKEj#Ic3jj;Kkl4XTX&gN2h)_K|0za^$6 ziB8Rb@?T#H0NGLDRa}pa%}wq{a}nxBTS4HBg9X3B!>)MPms_8*Pc8F)SzT&cdzy=P zW~q!_pTL&|f?K(#b_+t-IhRKo*7OIy-(WyOwPV8HLjdLtde|7TRh5-t7VqIVa9a9g z_$a9a!EdW=Ljs8Y{)bu26oq83`BX*&Oviem%&)H((T1el6R zZzje=x#3r`|q-!`U;l7rkr8XNyJBZQrpBp=5YzfiCpM(QW8YYeiL z)?1W^#dCOsWRbnx+hFo{&|nR7<)pLGY%!OSA`asRvRN}w67Eli7?d^F8XYZ}N9VRJ z!2IPN9>%y7_R;KanFN5GPSf*jh7@ft&;h5VQ<3mW4&q8;v7rct@3Dq_v_gOwPs+E) zIH%OL^LvH6)$C;$kZyspZMZLe2kZe7~{O?DZ`k z;j8pyhy`cA+GjsyP|v`B6AA|TF%8)YfAcM#uW_<xEGI3E#)Sc;51LoL_G91Q-vg`oA388#2+ag$BVZHPb(3&+r{8gapkV)Z2~UOs&O zZeJPTi8@R;;Bicw&qzL=M_OIy}Qdv zYtA`|fmmD_hC&GmIONt1+k8Suui!`YMO%CBP?O)Pv#m|92k_zBW#7K|1e9-8?6F-zSb{wc`3sVg8?IM`3TxumOho#~NIyJKHG~ z#6PfTS)rY(SXciJTDa;j`GN!luzx3T9sb@ATnFXZ($ap`(pv)Wp;uN_vCN%>D``q< zfSn5H3p?>~HpwdBC;9k!(P&bvFV>IHUULwdUBtO=Ftqkn=iv6p#LsV}kK~*{5+Xj#A+Wp8g{&zC{r^)4DA}8;BT~aSEe!%%ztX z>T~H7c$*ni5z+qxuZ0uUs=jCoLgp*>M}bVpzO=Bg59TNwtR|vR_2r5|LSN)&Ff~ES zDvNBv40%+xQkgq6tw4aM<|D8uoK^RzNR+d&!DO=g&-@I3bm%hK-CD?NTF+8p&wdvO zirTgPhB%|JTU)*HLOyjfu;WICUU++ZOa6Cb!?E~;&NiJg`@vv-!_8zv$3#A z-Y-ZR3)+Y)Fnj~;PgnCjY(vozfG3l4mDK33W=Y5UvG7p(v?W_gfXB<45+Y)hMW$FB zlKg_66%WrZ=$)=jjCtiUT8?sz$*#^HR(5aOuk@XD-EhjM-9f|*Pg!_bV z`jypCewF9Vb4b|X8lVCLR4~ukA>N_``UTH5THpC+rCiJ;aPr9UuX;Z_jKne znnTf}{e3fo;d@nBb$$KcstQy$p~rn8;@(beyrvz9Qf9*;+bZAh>hU7yMpSmmQ^npp z|7AiZ+@xr045xY2-{*&7tYMz1%tK(}h=9L-d1!7qoy!M(g#4tdJ<1haCo_3M-NeMi zJrK6w`p5tN{M~FOceBIvc&W!bu}S;T%6gQ*@D<$beJ&eAo=7JHR|@8&r&oDU!k_{d zLG|x26BK^#`ktO1H{jB-o_}05+653Z{XG&V0P;736{byb6vHrOnggCJ?&i76hqthl z3{7@K_hex?A@cPZW_#}do!x!H`1?#OL)<_ zV?*~QSfVLM0gGnKN2)NK1XcoU)iq!yWuh1v3Cj4J_SQ&9|Cntg`$vkbKXU7Jz~TFm zoFi=c@RGY-94=yFd&=o>32o|}DoU#!=bfIO7En@B0)%`h{Jzf!mWMQ%v~H*VLWdcO zsV=*7UxK4h=uM(2ga+TN$D$=}9~DSgcrQdG6SuXWdj~s>pH?g_kFBmgIFK4xJ2|O| z=Jn_MeuoT*cFU_nvmBJGy69VF>ozv8 zYHmiAlp34^KhjfCNvTy-r4|&Jmd3;&m6Vk&c*iw|i(A(3ALdV)I2rDu&cH{ z(VU(4&$1O8BXftkBu zIc^<(n1{sNks@oFGZ{9m^XFOyTi9CB#Z5I9yw5(qXqsU~dw1YxRkoN(*Ki)CHs3p9 z9Ru+XN+?{@i^>%ZNT`iKgk{b36(Zdq{<|#U>N6O9v_;ubp^tWkBf?{ofM=rXcW3-? zgttf~N)1Fx)i$(v0Ct6Ew!rn82j+VR71)a)nFD;btzzmM%>k6potJNnu4|AolP?1one%O{oR5DxR>}?d|1uP zn>*i6TK>Fa^e*2^L=C6BV zRWvj-^qToS%h+L+SZ+u}tR%v|*V#al7Km^AyNjxVX6fwYQvD?S(EMY)ItW+nbrCWjJ0k=fN`l zN_`88N}$JIdA(noNRf#gg=FjoIg1U4nWtx36DM#fD%$mEAUC0q569_#6ofguKxG0|F#W!fPC`vCzqoetf|Pk-oWr8Yz?~ zDIRc9(a?b8GgDK_o{omPM~ppUelbDZs`7Jut~n@d^kgxjHz^AYmwK2PavGJ+9u$H0N;(7l-MW>; zYXybMmkvi-E&cGF$I6HRo;7|T8a9-TxoIXcln;HdS|QG|u#qCkG+wx1#pBm!wPSI@ zea$u9-vgA1IwL;@HB~OKNd>SK3EmPZ8k##)e?Gz?STD?i;lCRHZ9*5aQBK_%ckTNT zgi@-TH>ToDm;M{4c_G>xRzE__gjdqkKvfl8*k3R7q?*u@`-`T!R!nkJUY>DHMFqnh z9vIg&+n^~UC3%m+W(1cgzS6YAz2fO)kyr%&tAU{{zJ!E?v_E7nl+S-17p}R2p=@+J zpx?ajqqtijH-qr4>Xuhm-{WvB)N{K}0RxpNxrsxToc-hDG54j^f^&}7b)PnCwGlPQUWcBE2(&W6+p&?AW{T(GBDXtdbs3b;!IpxKTTWa+|tZ@d% z@bGYe6mv2vTb-LbGnKDt3YCZM2cb}shOIXqiUA)PHy_a)}g7Ys;QjY{~M3NA^-MUrt}Yiqu93hC;}kdF^j!hLi4>FTb=Ks`9F+ zy47?jYMFFvmv&Px4i02w;AE==A`;2=GMO0|idaGRK4A{p_3xZmy%=prQA!OK#+mh$ z;m0^JBO@a*9UUDsnL**`if@^C8B*JkdusbSgshm_=?VDQyt<=0ybyRwx&DXM)z-x3 z;-<^}@zf + + + + diff --git a/examples/android/res/values/dimens.xml b/examples/android/res/values/dimens.xml new file mode 100644 index 00000000..55c1e590 --- /dev/null +++ b/examples/android/res/values/dimens.xml @@ -0,0 +1,7 @@ + + + + 16dp + 16dp + + diff --git a/examples/android/res/values/strings.xml b/examples/android/res/values/strings.xml new file mode 100644 index 00000000..68c087d4 --- /dev/null +++ b/examples/android/res/values/strings.xml @@ -0,0 +1,8 @@ + + + + Luaj + Settings + Hello world! + + diff --git a/examples/android/res/values/styles.xml b/examples/android/res/values/styles.xml new file mode 100644 index 00000000..6ce89c7b --- /dev/null +++ b/examples/android/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/examples/android/src/android/LuajActivity.java b/examples/android/src/android/LuajActivity.java new file mode 100644 index 00000000..0a6380e8 --- /dev/null +++ b/examples/android/src/android/LuajActivity.java @@ -0,0 +1,30 @@ +package org.luaj.vm2.android; + +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.jse.CoerceJavaToLua; + +import android.app.Activity; +import android.os.Bundle; +import android.view.Menu; + +public class LuajActivity extends Activity { + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + LuajView view = new LuajView(this); + setContentView(view); + try { + LuaValue activity = CoerceJavaToLua.coerce(this); + LuaValue viewobj = CoerceJavaToLua.coerce(view); + view.globals.loadfile("activity.lua").call(activity, viewobj); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.luaj, menu); + return true; + } + +} diff --git a/examples/android/src/android/LuajView.java b/examples/android/src/android/LuajView.java new file mode 100644 index 00000000..ea5af0c0 --- /dev/null +++ b/examples/android/src/android/LuajView.java @@ -0,0 +1,122 @@ +package org.luaj.vm2.android; + +import java.io.InputStream; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.ResourceFinder; +import org.luaj.vm2.lib.jse.CoerceJavaToLua; +import org.luaj.vm2.lib.jse.JsePlatform; + +import android.content.Context; +import android.graphics.Canvas; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; + +public class LuajView extends View implements ResourceFinder { + + public final Globals globals; + + public LuajView(Context context) { + super(context); + this.globals = JsePlatform.standardGlobals(); + this.globals.FINDER = this; + } + + // Implement a finder that loads from the assets directory. + public InputStream findResource(String name) { + try { + return getContext().getAssets().open(name); + } catch (java.io.IOException ioe) { + return null; + } + } + + + public void draw(Canvas canvas) { + LuaValue f = globals.get("draw"); + if (!f.isnil()) + try { + f.call(CoerceJavaToLua.coerce(canvas)); + } catch (Exception e) { + e.printStackTrace(); + } + else + super.draw(canvas); + } + + public boolean f(int keyCode, KeyEvent event) { + LuaValue f = globals.get("onKeyDown"); + if (!f.isnil()) + try { + return f.call(CoerceJavaToLua.coerce(keyCode), + CoerceJavaToLua.coerce(event)).toboolean(); + } catch (Exception e) { + e.printStackTrace(); + return true; + } + else + return super.onKeyDown(keyCode, event); + } + + public boolean onKeyUp(int keyCode, KeyEvent event) { + LuaValue f = globals.get("onKeyUp"); + if (!f.isnil()) + try { + return f.call(CoerceJavaToLua.coerce(keyCode), + CoerceJavaToLua.coerce(event)).toboolean(); + } catch (Exception e) { + e.printStackTrace(); + return true; + } + else + return super.onKeyUp(keyCode, event); + } + + public boolean onTouchEvent(MotionEvent event) { + LuaValue f = globals.get("onTouchEvent"); + if (!f.isnil()) + try { + return f.call(CoerceJavaToLua.coerce(event)).toboolean(); + } catch (Exception e) { + e.printStackTrace(); + return true; + } + else + return super.onTouchEvent(event); + } + + public boolean onTrackballEvent(MotionEvent event) { + LuaValue f = globals.get("onTrackballEvent"); + if (!f.isnil()) + try { + return f.call(CoerceJavaToLua.coerce(event)).toboolean(); + } catch (Exception e) { + e.printStackTrace(); + return true; + } + else + return super.onTrackballEvent(event); + } + + public void onWindowFocusChanged(boolean hasWindowFocus) { + LuaValue f = globals.get("onWindowFocusChanged"); + if (!f.isnil()) + try { + f.call(CoerceJavaToLua.coerce(hasWindowFocus)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void onWindowSystemUiVisibilityChanged(int visible) { + LuaValue f = globals.get("onWindowSystemUiVisibilityChanged"); + if (!f.isnil()) + try { + f.call(CoerceJavaToLua.coerce(visible)); + } catch (Exception e) { + e.printStackTrace(); + } + } +}