From 647ebaf80963bfafc9c31a05c3fc0fdfebcffbc6 Mon Sep 17 00:00:00 2001 From: BlueRiverInteractive Date: Sun, 26 Apr 2015 02:02:19 +0200 Subject: [PATCH] Updated MessageComposer sample (#41). --- MessageComposer/Info.plist.xml | 35 +-- MessageComposer/build.gradle | 3 - MessageComposer/pom.xml | 32 --- .../resources/Base.lproj/Main.storyboard | 70 ++++++ .../resources/Default-667h@2x~iphone.png | Bin 10241 -> 0 bytes .../resources/Default-736h@3x~iphone.png | Bin 11761 -> 0 bytes MessageComposer/resources/Icon-72.png | Bin 20606 -> 0 bytes MessageComposer/resources/Icon-72@2x.png | Bin 22299 -> 0 bytes MessageComposer/resources/Icon.png | Bin 20352 -> 0 bytes .../AppIcon.appiconset/Contents.json | 80 ++++++ .../AppIcon.appiconset}/Icon-60@2x.png | Bin .../AppIcon.appiconset}/Icon-60@3x.png | Bin .../AppIcon.appiconset}/Icon-76.png | Bin .../AppIcon.appiconset}/Icon-76@2x.png | Bin .../AppIcon.appiconset}/Icon-Small-40.png | Bin .../Icon-Small-40@2x-1.png} | Bin .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 1265 bytes .../AppIcon.appiconset}/Icon-Small-40@3x.png | Bin .../AppIcon.appiconset}/Icon-Small.png | Bin .../AppIcon.appiconset/Icon-Small@2x-1.png} | Bin .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 942 bytes .../AppIcon.appiconset}/Icon-Small@3x.png | Bin .../LaunchImage.launchimage/Contents.json | 57 +++++ .../Default-568h@2x~iphone.png | Bin .../Default-Landscape@2x~ipad.png | Bin .../Default-Landscape~ipad.png | Bin .../Default-Portrait@2x~ipad.png | Bin .../Default-Portrait~ipad.png | Bin .../Default@2x~iphone.png | Bin MessageComposer/robovm.xml | 3 - .../messagecomposer/MessageComposer.java | 35 +-- .../ui/MessageComposerViewController.java | 193 +++++++++++++++ .../MessageComposerViewController.java | 228 ------------------ 33 files changed, 416 insertions(+), 320 deletions(-) delete mode 100644 MessageComposer/build.gradle delete mode 100644 MessageComposer/pom.xml create mode 100644 MessageComposer/resources/Base.lproj/Main.storyboard delete mode 100644 MessageComposer/resources/Default-667h@2x~iphone.png delete mode 100644 MessageComposer/resources/Default-736h@3x~iphone.png delete mode 100644 MessageComposer/resources/Icon-72.png delete mode 100644 MessageComposer/resources/Icon-72@2x.png delete mode 100644 MessageComposer/resources/Icon.png create mode 100644 MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Contents.json rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-60@2x.png (100%) rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-60@3x.png (100%) rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-76.png (100%) rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-76@2x.png (100%) rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-Small-40.png (100%) rename MessageComposer/resources/{Icon-Small-40@2x.png => Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png} (100%) create mode 100644 MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-Small-40@3x.png (100%) rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-Small.png (100%) rename MessageComposer/resources/{Icon-Small@2x.png => Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png} (100%) create mode 100644 MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png rename MessageComposer/resources/{ => Images.xcassets/AppIcon.appiconset}/Icon-Small@3x.png (100%) create mode 100644 MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Contents.json rename MessageComposer/resources/{ => Images.xcassets/LaunchImage.launchimage}/Default-568h@2x~iphone.png (100%) rename MessageComposer/resources/{ => Images.xcassets/LaunchImage.launchimage}/Default-Landscape@2x~ipad.png (100%) rename MessageComposer/resources/{ => Images.xcassets/LaunchImage.launchimage}/Default-Landscape~ipad.png (100%) rename MessageComposer/resources/{ => Images.xcassets/LaunchImage.launchimage}/Default-Portrait@2x~ipad.png (100%) rename MessageComposer/resources/{ => Images.xcassets/LaunchImage.launchimage}/Default-Portrait~ipad.png (100%) rename MessageComposer/resources/{ => Images.xcassets/LaunchImage.launchimage}/Default@2x~iphone.png (100%) create mode 100644 MessageComposer/src/main/java/org/robovm/samples/messagecomposer/ui/MessageComposerViewController.java delete mode 100644 MessageComposer/src/main/java/org/robovm/samples/messagecomposer/viewcontrollers/MessageComposerViewController.java diff --git a/MessageComposer/Info.plist.xml b/MessageComposer/Info.plist.xml index 18ec7ccf..8fad5307 100644 --- a/MessageComposer/Info.plist.xml +++ b/MessageComposer/Info.plist.xml @@ -24,6 +24,10 @@ ${app.build} LSRequiresIPhoneOS + UIMainStoryboardFile + Main + MinimumOSVersion + 8.0 UIDeviceFamily 1 @@ -36,38 +40,15 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - Icon-Small - Icon-Small-40 - Icon - Icon-60 - Icon-72 - - - - CFBundleIcons~ipad - - CFBundlePrimaryIcon - - CFBundleIconFiles - - Icon-Small - Icon-Small-40 - Icon-72 - Icon-76 - - - diff --git a/MessageComposer/build.gradle b/MessageComposer/build.gradle deleted file mode 100644 index e431d76b..00000000 --- a/MessageComposer/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -ext { - mainClassName = "org.robovm.samples.messagecomposer.MessageComposer" -} \ No newline at end of file diff --git a/MessageComposer/pom.xml b/MessageComposer/pom.xml deleted file mode 100644 index cc8696a1..00000000 --- a/MessageComposer/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - 4.0.0 - - - org.robovm - robovm-samples-parent - 1.0 - - - robovm-samples-messagecomposer - RoboVM port of Apple's MessageComposer sample - - jar - - - src/main/java - - - - - org.robovm - robovm-rt - - - org.robovm - robovm-cocoatouch - - - \ No newline at end of file diff --git a/MessageComposer/resources/Base.lproj/Main.storyboard b/MessageComposer/resources/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f1b169a4 --- /dev/null +++ b/MessageComposer/resources/Base.lproj/Main.storyboard @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MessageComposer/resources/Default-667h@2x~iphone.png b/MessageComposer/resources/Default-667h@2x~iphone.png deleted file mode 100644 index 54ead7d94747bbebd78617f032bcfdb81409bbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10241 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 FzW^~1$b$d? diff --git a/MessageComposer/resources/Icon-72@2x.png b/MessageComposer/resources/Icon-72@2x.png deleted file mode 100644 index 43a08526b6cb9ee21a6b0dabcd2526baa8f1dfdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22299 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 diff --git a/MessageComposer/resources/Icon.png b/MessageComposer/resources/Icon.png deleted file mode 100644 index af4733a5cb157318936596e1b1c514d924cc0976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20352 zcmeI42{_bi-^c%@>|3%FsX<8?voM%xtb?oxBcl>yW{k1TG&5NvOO{eevL6mPQnnVQ zgp!I>s3h4dBrQ}poQmGR)Z}zJ&pXfiJn!>f?{&>w#{As(@Atj`_vilI%imlx`?qY~ zBql5`3;=+bm8F>@_==u;3N8kJ^My)30AGX{maZ%S5LrI=Tm)qOvH}2v?P)mNmMz|N zHl5{7XF#lQI0%DD_oDex03f(4$BBw}8j&@a>YFgNNr*gVLwA%BggBZeMoK5Esw)Xe zS|=#wcgi?iTV`&)MB!Fm0^i}okq2cQG(`^xKNc8NI(|5&AmPC6k59u2d>_?JJ#U`9 z&|x@SI-XO}Do`gVnr5l(fQl47Wx9IVlbFUE4NnKPjH86tG5|@z3bGPwMr9E&9f8Ga zDAx&G0TuxCUYcg^SQNQ$Q5`#3-$pP}8ZZt$Ynl%nr4dFpL4}r2p*kb)!qXcZ%fg zo=WsOCt-X6$Q$W$8E4F~G0#6z)!8{TIQZE5hUs?VZI|#_YQ1}%%Z%S25!g>tlTWTZ zTN{ORi`ukg`bquW3ERR|tw)9SdGp0l@oe`n88@f_#zQ zF;82AK93pAY|2{)M0!~r-30(U&DLt+Z&w&K3Ic#xUX=P76NQOuD>Uo)S6y4$b4}!v zhweVpwKwWbB~69Nk*k;<8%m>1)#94ZD5`tF9vUm^)H!&^r7*;`>YXo%8!#k35CwCu zsntXYEit(zxSXiem9WV3072!jpj>9`w9+-pB~poNAx#O=4$3ykC`*Ln0X)RnQt`b3 zb1^!8hsEXOjkf?~^ryI*O^9Pr=Nt?kieA7~oz#=xXK`HQ9+{2EN|MdXzQ;T-Z*WjI zfB0UBw?tQxA+8Z#_hN;B_6O7Ev-+AsDWp4Rl}klS8syJxE#<4;KS^pm8?;0! z%DhfUcS(>bgt*$ol3+{N{Mhm&WYt=oWnDsgLVWui>enl$oU}QwdU@F&H&%Ee5%B~| zO_fJdNy}l9VF|b!dTXWjFn!3oo=LFEl zG$9(dVh3{uuMcVuDhw*U-!7cvX}s&VX{Tpuj<0C-d>k zP)XZN%knE7Pdmh)T&}Y_3*8(eYh_bdc09FB-doOligx-1`|`5h)YY5Q@3}m?&agePvMq6CBOb1Yc$G1nDUnHcCa71c?~zHq zEu3nds+y{x4#S@+K2h9PEaE)wdo-x8T9)PvJ9Rqs76}*0+8JOb z%e9Jq3l;LK&4R856pd!&UfCI$YfCTc3#lFcuqqrjgP-yLP&Bzol)zshx|Y9Nv}FbM zCTbTQs|aiCe&>L5yKamtB&HJ6pYBVpx{obrw>V@Wagf%qV_@xoe}jKRfhxbMlB$i} zOS{o5N4u&M8%}Jr-Dum`e7E^{^P@~uwgI98Ih;M5-I3jY(PLZiHqFYDm6s@1=LWZ( za2>6z35eZ>b}b}0Z*!}#D9b5Z_o%w8x@cKZ)#jAVCAp8N*U!AGY^pqUapjqz$Nb&p zmHw6CM5?D8_2SL)>!T^PDdCsH56u_|h{bn`mnd#ij9{H-N@KQS`m$Pn88r&OIgvI3 zqY_#rTOVr=R4%`>;RY?oDZ6bGRgPN4iWyHx+;0D_fzV_g3woHG6WG+tbho zlR4QH+4XNucAp;A9i@%N_xyTS=hqFnuG*}7*KgsTI1Jr468SY1?%Q7)VUM$qqFxwQ zfstUzE@d5OE*1tAPZ7uD41YId{yJbdfYs|m_PM&>)vLRB>*5{z>-1dr*nZqzmCxkQ zp`Y&qMUm?kQTg^qnM7@0{Bb&TkJ8n{Mwo8O@8>$-m>kTjGLbP!iY|*Dx>ly-ee3m+ zGNq~EjF#jUnt1G%h!>CU2@szX6R$^zu8)n6b%`@N%t#=}-$$gQg6{X=Sp8-n%+k#I zvZ)Ar^l7LyO5Lzn%Lm(~cUkAMQG=G3>)m!j4#CRLW))gXy<9iI?@IrtH{}XBVvA%?X-R2f(u{2rHtQdIYa*$BQug4w_sfIU9TpC$SFEQh!|vb)Cf|x9rAu9*!j+~cUf{Q>b*KxRqf%VF zt~T$#jZQ1c)o6Zmx8ip95xrl=e*OGLs$S~p(aOR&8yBb|;dyPT5BeN-S4g+;fXq^j zxUKx9*h>d0)&1M;OWwGomq*m9hT8c??Ywq7`r3s>zOO`_g@CE& zKg8uI7|QHFP%hmqmoBsSv06{?kU~8D_SMXuW9Ltm+^8bAdOh$OdEN)j-7cP1oc=sr zJV30o>%3V1*7I*Be>d-jr8lc}SI1Q1stT@RFV#?rnp&DS8sUG#PvAe`bw?lcULbZ% z2izZ32&?&B=XHDc_L`{~!=@|U&WoJw+P&H-AFV!COc|B$FCLjr`{?ghw%LEzn?}9| zd@}+n;*}j$58D+V7~ma~9%;PVB;L5@%52V95L8T8%=yqS4bM~>I0psm>~|+TmL@8d`fH%xh{yAy==ZccM1ro$TjF?YU@! z-rDg{`qa&-$$r`12opL!@Sj2Su ztB#iY8Ta$k->0Ws_1{xC^Rn*M%G2Eq^$n}9GzDuTc1~>l_~u$rPmtnRLBE9k;2y|c zwa?yvoSk&KSM)JuWlGBDC43pV1iLK|9GyvlptMj>5*&$u z=%KX`D3qQaQWJuNBXnSJ1Pq}KMW8V{Iv6+{^7Wx?C=6OyCfN()XlC)XIq)w7Wp6f{ zfq}t-f`YVyw6*9=Dhz=}qhW9)42gt-9#B?D0Gk*L4PdFvi+s~Dqp(O!8iP%v2SDa@ ziJtV`Yy)NGxrR88ul@38a2g6=ePstygas2BFoYHy_Ol=|i4()v&Gh?nX=DOAW}O!PUugY^Y{O0B#Uhx2=?GBk)KAg@F5He%#p&P?`D!H=7HdqsQm2W zS!_qjceq?gf$l#QVtl)m`T2Ems{a-vo96X57cy7#w_%iE+TVoD)y#)|$*K9F#)8x_ zI3|V2rZe$$x}V{Ex_-YA1MkD;(i5WQLJJ_%gIF7|updLdC(d^@iW!kjF$5z~P&g9& z!6WoB2sj3b(tsnt^j;t`@A-p<9XN@|L^km+DrgKGiP1(bRQZ$dk2-WR%`1c}mG7Pl zG{_{37oF)(WE;}_iBt-V5kSSlz85a={F1#Gs{j_87(k*}nHhowS~MCNqoeJmgCcn$ zpd@V&2H8^w3DqYfNKkz^kxW4$J<%kT?iU<(b_>J*B5g(|?Vg)Jp!ED&L#C5Jc}^l> zh)5kTT~BQ!l;{aZK@kXw4wQ&O>Ov`SG!mtUhI@J;iQgJpAoiDr?3pxhDJ1$W@R{oi z8EnkclcGx@qCjC!G!aVD(SbwJM1&3$p+_Xa$-4R!6lH#B!M^-N<}XcI(pX^Lg)GQN zFe|?-c21OCe=hx2;Ya(jXfcRP7G-Wu8z_I9)SOk0vxv>bd|4YXMAF=HXGoe$bP5>@ z`%~%n%i=_S4Ws>aIJrYGufHJt@7oCSrUd+>i83$s#p~}ySadIT5RpkSp@JF0%^aRr z{d3rl@>tm1_TWeRUl<4$G4Nj-1|%7c@I-@i$&-lIhw7koNKmvc0u4pN^>v9zeH4+b zkNP&u|FdEEVWs)M8;0*$O!6iMP$^_X*ted2EBFtN9ElzfNMZgnlL(xuMDS2VVX_Rp zm~?*#k-_kzk%)5>5*8Rh{(7q5tYZ*19kO7to#(zl<3HF}GKER|XYzExRdO&v{-5>v zU!IxV?RWFT%A1+c(n>i>RA1a~#?xQbao z{o5gh+vW6!@ITGPuj=5j-r6_v3jivFJzdEwo^YAHj?Uo{U*@Cp?ti*O(tGej4cd zcYzBkz6Q=u(FOO;Us7Ve6udJB|0w|D{8wN>ws20A|9<0pkN*AI97SFu92DFbJY3vR z;`s1zaZqq$@NjWMiQ~h=#X-T1!NbK3C5{gd7Y7A51`iiElsG;-TpSeK7(86uP~!OT zaB)y@WAJcsLy6tP2L(3<4;MF-I6gdF92DFbJY3vR;`s1zaZqq$@NjWM ziQ~h=#X-T1!NbK3C5{gd7Y7A5#y`X*{QYzGlmPI<^+DjL=po+D;1?DF5R#>%9RP%` z1AxdF0QloG_&NdryWs%v(gOf682}(hKk9zd0sxkZTbY^QgS%d5x~YW`S2ecQXrAyt zr&ORzFSr}$z4M%#Z3RQ+=2AVWASUj8T56A`RACRKe3`Fi_6e_@X@aa6V#-DB%!8e0 z0%zr{hxaxh0-vwD;?m8^9iH0L!pa^0v{M}TG-7{sOLB5@XJ@BT3`#|X6d0Ihn*T|3 zt6;RQp59(SBmR06L@+vUc6N5GMP5pZ86GZXa-?nKU{calgR~)GB{I9Yt*s3Jo-i)e z)YQMTKK0ZDs zhA+GM`RtLx!gYSe=E}7C-dX866$n>E<>v z85(oV1DR~B8bUp>2O5w$1DRMva%LMZJD;Jv8MYEAGY|7qMR(4BV$LS(e(86 z-mY)&?oNFA?m<_Vu-+&`pUGqzdM23Wi;9ZY`FHwNo;d>-b&ZLRHkRCH4}McatW;;s z%V&;`j{2*_m7OjSG~cE@dGaJKF0Q=1d}4wveWItQCpR~@t83fhD1d%(TUmN~`rEXJ z5Aj;*A4jvxi;FQBOmzQ5ON)37U#hhM7Q5%lHaEAK<2elt7MBDpp7>nYHZ7f$l;nAK zy7!g!S}CyQC(s1*H!ogzz*oH8*L@-5rUx9X(E3Zvzr>n^&H$@3ijsW z#fxv#5)(zH-ETAqi;HizwKZEoJWBxc^sTJfnj5Pb`m4aNiWu`ktq@I^8#~e2pxwJ= zcJ21{y@Of`UTuQ>;@g*_A=Am{58A3uO-|-tN~^1@EApvJv9`9}**(=7j#rlvpZaww zGb1C?9-*&qS=43}T&k98eW@%zUuj7Ig+gJmDqgk4YoO6pWo2bGHLK39St}*fbIH2! z{R=_O4I51KM~8+ets?co*qvJGDw-Yb?IGl2X3B0mc0dmH_4TEtr|*626%lcziOdvp zKYH{ic2Wz>1(=0}hK9xqtvY90Rj2$dHQsjlTRff!jj%7b`;9`7Moj90JS zuBxu4R=0$`XU`|?+jLQWTv1!d;;x4eCr+(<3}%BwjelZdqL7e~`xb<1N)tGm=J6xy zRXawBP{Ek7rTVKjLnIT-j+d5}Ub>_&wSRDUc$lH@r`rwAysoY+i-P1PGDI*UeGI;2 zanzlma|BKG)B}wJ;CzJ2Chk1l;d3DYGGo8@gUkm#Kte7~(=l57%Qu-=nQt~LH}#1A EFZr=c2><{9 diff --git a/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Contents.json b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..ffa15158 --- /dev/null +++ b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MessageComposer/resources/Icon-60@2x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png similarity index 100% rename from MessageComposer/resources/Icon-60@2x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png diff --git a/MessageComposer/resources/Icon-60@3x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png similarity index 100% rename from MessageComposer/resources/Icon-60@3x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png diff --git a/MessageComposer/resources/Icon-76.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-76.png similarity index 100% rename from MessageComposer/resources/Icon-76.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-76.png diff --git a/MessageComposer/resources/Icon-76@2x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png similarity index 100% rename from MessageComposer/resources/Icon-76@2x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png diff --git a/MessageComposer/resources/Icon-Small-40.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png similarity index 100% rename from MessageComposer/resources/Icon-Small-40.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png diff --git a/MessageComposer/resources/Icon-Small-40@2x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png similarity index 100% rename from MessageComposer/resources/Icon-Small-40@2x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png diff --git a/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8db82b0f3141a64b3bf46ed79f7b35b033f8a08b GIT binary patch literal 1265 zcmV>{{H^`{rv<41o`>-1qB5Z6cp|4?Fk794h|0I=jUu}Y_YMi+}zy1zrUuY zrk$OgTwGi|Jv|&89P;w=*Vos9fq^wOH6bA(%*@QVxVU9yWmZ;JCnqOFL`2lo)OmS% z;^N|zl$45!igR;wPft%uN=hy+F457^tE;QU#l^eS@R1VU83Kgw@3tP zL*2Lbh#<{~4r!YfzL7`$R(&`jLEARn_zn|??EyPZ55Q@gnG;Tl0>90$j6Is9t!B=; zMGM)D*I2i^oSm@633uE=v!%)v`f2Ki2Kqm~!#mn$_gi=3d6Vv~pKT-Ve$_gCO#&)O zaKC6=c?}n?rX)!Tp=2(9Tj&_{LPmaSGB0>@oK3ex zl!9Pm(`r?k9tk=*T00pUMWT`o_XYnzips#f6NXN&41`iQttUd`j)9*>F7)56<#WHF zemxMy)Q+>n_;OuZ7h2+|o`?+8l{_N6?`T6MGs_e~sYn~H_}Wx5A&L(G?mN6HB%7?+;OfN}lgKN6$c$4S)2NVF z3taV9>_Yv{X_Hh{!yyxw5y$bZw;z`kuKQKW6At^N*gtO74r=1O+hENZ*A*2^kK2K< zCPLTBnyq<95i}XW3Je6cDBOeBIv`PBzJNG!I=Orr<$6fy8p1+?i8!H~l$e0&PfBe=!rD4Ocpr{mm2Hd4|do0ltgdL9%GqJpZb zYq1csD73ugYSS^-=A-_Eh;hci(5aPZ07Z+GAPknrEIan69x<-bCTdN*0{G-G%x%j{ z>Uq5Ay(cFJq7rXlbFe1TAl8bK9v8v}qL=kVrQpC$88zhb>K`HiRXp-8 z%xjE1D-!Y<4)K^Ztc#w7)7CLJ6;vLi`dq$ b{6P5wwaqeBVo@5300000NkvXXu0mjfi;7)= literal 0 HcmV?d00001 diff --git a/MessageComposer/resources/Icon-Small-40@3x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png similarity index 100% rename from MessageComposer/resources/Icon-Small-40@3x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png diff --git a/MessageComposer/resources/Icon-Small.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small.png similarity index 100% rename from MessageComposer/resources/Icon-Small.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small.png diff --git a/MessageComposer/resources/Icon-Small@2x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png similarity index 100% rename from MessageComposer/resources/Icon-Small@2x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png diff --git a/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9e15654654729c281785c168030047cdad2484 GIT binary patch literal 942 zcmV;f15x~mP)B{{H*>`}z6#3JMDG@$ul`;Am)Q7Z(@x_4UWc$4W{{uCA`AsHi|d zKrAdQQc_Y!M@Q@H>(9^6wY9Z2Ha0OaG1S!5j*gCohK3Rn65HF`z`($}ySpVNB_19g z<>lp~qN13Xm~?b>eSLjiUS3&QSz=;h1hx)C0008zNklbBe42Eqm#_T(U z?0eGo{on8WG7T`p(v)*oX9ml*KFboa0{c77F#ZQ#itVChET|(-7qNg={OT{VD%hR# z9l9k}bIz-!@eO&oUl^y%34FGYt&eIMDFjmnI%9bf(&$&^Ji6i4J7&=7-z?9NN!xMuldV@9C{>Cj+YMZ91?Ml<)$)5ed3YHx>4C#jMB}wkC zu{i%O9WME+g<&g7?%*QLk!$B=2>q6^U2o{rbF6=8RS}#uV;O{&b^RHm370)pk1-Ej zcjlNGQ)EtxomKmG57714&nZ?^Kzl4jxJP1fBPNV~ev=kuf@~;Di;x@kgBcUm2$>^0 zL$>P%-4UdP8g2F0qm_L5MPXOG@v+YHmSgJ3tL~)9H|r z$vP~n0#i-g59R7ivu8MKHfb@8FT!wvLijCMLGR|8PP|ye>65gCFSdE_vCpG!|QZi_AZTt^_+aGLi&L-OruZ`BJO Q$^ZZW07*qoM6N<$f`wPa;Q#;t literal 0 HcmV?d00001 diff --git a/MessageComposer/resources/Icon-Small@3x.png b/MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png similarity index 100% rename from MessageComposer/resources/Icon-Small@3x.png rename to MessageComposer/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png diff --git a/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 00000000..5379aae6 --- /dev/null +++ b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,57 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default@2x~iphone.png", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "Default-568h@2x~iphone.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Portrait~ipad.png", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Landscape~ipad.png", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Portrait@2x~ipad.png", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Landscape@2x~ipad.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MessageComposer/resources/Default-568h@2x~iphone.png b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png similarity index 100% rename from MessageComposer/resources/Default-568h@2x~iphone.png rename to MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png diff --git a/MessageComposer/resources/Default-Landscape@2x~ipad.png b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png similarity index 100% rename from MessageComposer/resources/Default-Landscape@2x~ipad.png rename to MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png diff --git a/MessageComposer/resources/Default-Landscape~ipad.png b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png similarity index 100% rename from MessageComposer/resources/Default-Landscape~ipad.png rename to MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png diff --git a/MessageComposer/resources/Default-Portrait@2x~ipad.png b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png similarity index 100% rename from MessageComposer/resources/Default-Portrait@2x~ipad.png rename to MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png diff --git a/MessageComposer/resources/Default-Portrait~ipad.png b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png similarity index 100% rename from MessageComposer/resources/Default-Portrait~ipad.png rename to MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png diff --git a/MessageComposer/resources/Default@2x~iphone.png b/MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png similarity index 100% rename from MessageComposer/resources/Default@2x~iphone.png rename to MessageComposer/resources/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png diff --git a/MessageComposer/robovm.xml b/MessageComposer/robovm.xml index ff8de0ce..73876651 100644 --- a/MessageComposer/robovm.xml +++ b/MessageComposer/robovm.xml @@ -10,7 +10,4 @@ ios Info.plist.xml - - MessageUI - \ No newline at end of file diff --git a/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/MessageComposer.java b/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/MessageComposer.java index 68d09dbf..fe3fafc2 100644 --- a/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/MessageComposer.java +++ b/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/MessageComposer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 RoboVM AB + * Copyright (C) 2013-2015 RoboVM AB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,42 +16,23 @@ * Portions of this code is based on Apple Inc's MessageComposer sample (v1.2) * which is copyright (C) 2010-2013 Apple Inc. */ - package org.robovm.samples.messagecomposer; import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIApplicationDelegateAdapter; -import org.robovm.apple.uikit.UIScreen; -import org.robovm.apple.uikit.UIWindow; -import org.robovm.samples.messagecomposer.viewcontrollers.MessageComposerViewController; +import org.robovm.apple.uikit.UIApplicationLaunchOptions; public class MessageComposer extends UIApplicationDelegateAdapter { - private UIWindow window; - private MessageComposerViewController viewController; @Override - public void didFinishLaunching (UIApplication application) { - // Set up the view controller. - viewController = new MessageComposerViewController(); - - // Create a new window at screen size. - window = new UIWindow(UIScreen.getMainScreen().getBounds()); - // Set our viewcontroller as the root controller for the window. - window.setRootViewController(viewController); - // Make the window visible. - window.makeKeyAndVisible(); - - /* - * Retains the window object until the application is deallocated. Prevents Java GC from collecting the window object too - * early. - */ - addStrongRef(window); + public boolean didFinishLaunching(UIApplication application, UIApplicationLaunchOptions launchOptions) { + return true; } - public static void main (String[] args) { - NSAutoreleasePool pool = new NSAutoreleasePool(); - UIApplication.main(args, null, MessageComposer.class); - pool.close(); + public static void main(String[] args) { + try (NSAutoreleasePool pool = new NSAutoreleasePool()) { + UIApplication.main(args, null, MessageComposer.class); + } } } diff --git a/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/ui/MessageComposerViewController.java b/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/ui/MessageComposerViewController.java new file mode 100644 index 00000000..a7fee4cc --- /dev/null +++ b/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/ui/MessageComposerViewController.java @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2013-2015 RoboVM AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Portions of this code is based on Apple Inc's MessageComposer sample (v1.2) + * which is copyright (C) 2010-2013 Apple Inc. + */ +package org.robovm.samples.messagecomposer.ui; + +import java.io.File; +import java.util.Arrays; + +import org.robovm.apple.foundation.NSBundle; +import org.robovm.apple.foundation.NSData; +import org.robovm.apple.foundation.NSError; +import org.robovm.apple.messageui.MFMailComposeResult; +import org.robovm.apple.messageui.MFMailComposeViewController; +import org.robovm.apple.messageui.MFMailComposeViewControllerDelegate; +import org.robovm.apple.messageui.MFMessageComposeViewController; +import org.robovm.apple.messageui.MFMessageComposeViewControllerDelegate; +import org.robovm.apple.messageui.MessageComposeResult; +import org.robovm.apple.uikit.UILabel; +import org.robovm.apple.uikit.UIViewController; +import org.robovm.objc.annotation.CustomClass; +import org.robovm.objc.annotation.IBAction; +import org.robovm.objc.annotation.IBOutlet; + +@CustomClass("MessageComposerViewController") +public class MessageComposerViewController extends UIViewController implements MFMailComposeViewControllerDelegate, + MFMessageComposeViewControllerDelegate { + /* UILabel for displaying the result of sending the message. */ + private UILabel feedbackMsg; + + @IBAction + private void showMailPicker() { + /* + * You must check that the current device can send email messages before + * you attempt to create an instance of MFMailComposeViewController. + * Otherwise your app will crash when it creates a new + * MFMailComposeViewController. + */ + if (MFMailComposeViewController.canSendMail()) { + // The device can send email. + displayMailComposerSheet(); + } else { + // The device can not send email. + feedbackMsg.setHidden(false); + feedbackMsg.setText("Device not configured to send mail."); + } + } + + @IBAction + private void showSMSPicker() { + /* + * You must check that the current device can send SMS messages before + * you attempt to create an instance of MFMessageComposeViewController. + * Otherwise your app will crash when it creates a new + * MFMessageComposeViewController. + */ + if (MFMessageComposeViewController.canSendText()) { + // The device can send SMS. + displaySMSComposerSheet(); + } else { + // The device can not send email. + feedbackMsg.setHidden(false); + feedbackMsg.setText("Device not configured to send SMS."); + } + } + + /** + * Displays an email composition interface inside the application. Populates + * all the Mail fields. + */ + private void displayMailComposerSheet() { + MFMailComposeViewController picker = new MFMailComposeViewController(); + picker.setMailComposeDelegate(this); + picker.setSubject("Hello from California!"); + + // Set up recipients + picker.setToRecipients(Arrays.asList("first@example.com")); + picker.setCcRecipients(Arrays.asList("second@example.com", "third@example.com")); + picker.setBccRecipients(Arrays.asList("fourth@example.com")); + + // Attach an image to the email + String path = NSBundle.getMainBundle().findResourcePath("rainy", "jpg"); + NSData myData = NSData.read(new File(path)); + picker.addAttachmentData(myData, "image/jpeg", "rainy"); + + // Fill out the email body text + String emailBody = "It is raining in sunny California!"; + picker.setMessageBody(emailBody, false); + + presentViewController(picker, true, null); + } + + /** Displays an SMS composition interface inside the application. */ + private void displaySMSComposerSheet() { + MFMessageComposeViewController picker = new MFMessageComposeViewController(); + picker.setMessageComposeDelegate(this); + /* + * You can specify one or more preconfigured recipients. The user has + * the option to remove or add recipients from the message composer view + * controller. + */ + /* picker.setRecipients(NSArray.toNSArray("Phone number here")); */ + + /* + * You can specify the initial message text that will appear in the + * message composer view controller. + */ + picker.setBody("Hello from California!"); + + presentViewController(picker, true, null); + } + + @IBOutlet + private void setFeedbackMsg(UILabel feedbackMsg) { + this.feedbackMsg = feedbackMsg; + } + + /** + * Dismisses the email composition interface when users tap Cancel or Send. + * Proceeds to update the message field with the result of the operation. + */ + @Override + public void didFinish(MFMailComposeViewController controller, MFMailComposeResult result, NSError error) { + feedbackMsg.setHidden(false); + + // Notifies users about errors associated with the interface + String resultText; + switch (result) { + case Cancelled: + resultText = "Result: Mail sending canceled"; + break; + case Saved: + resultText = "Result: Mail saved"; + break; + case Sent: + resultText = "Result: Mail sent"; + break; + case Failed: + resultText = "Result: Mail sending failed"; + break; + default: + resultText = "Result: Mail not sent"; + break; + } + feedbackMsg.setText(resultText); + + dismissViewController(true, null); + } + + /** + * Dismisses the message composition interface when users tap Cancel or + * Send. Proceeds to update the feedback message field with the result of + * the operation. + */ + @Override + public void didFinish(MFMessageComposeViewController controller, MessageComposeResult result) { + feedbackMsg.setHidden(false); + + String resultText; + // Notifies users about errors associated with the interface + switch (result) { + case Cancelled: + resultText = "Result: SMS sending canceled"; + break; + case Sent: + resultText = "Result: SMS sent"; + break; + case Failed: + resultText = "Result: SMS sending failed"; + break; + default: + resultText = "Result: SMS not sent"; + break; + } + feedbackMsg.setText(resultText); + + dismissViewController(true, null); + } +} diff --git a/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/viewcontrollers/MessageComposerViewController.java b/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/viewcontrollers/MessageComposerViewController.java deleted file mode 100644 index b4850bab..00000000 --- a/MessageComposer/src/main/java/org/robovm/samples/messagecomposer/viewcontrollers/MessageComposerViewController.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2014 RoboVM AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Portions of this code is based on Apple Inc's MessageComposer sample (v1.2) - * which is copyright (C) 2010-2013 Apple Inc. - */ - -package org.robovm.samples.messagecomposer.viewcontrollers; - -import java.io.File; -import java.util.Arrays; - -import org.robovm.apple.coregraphics.CGRect; -import org.robovm.apple.foundation.NSBundle; -import org.robovm.apple.foundation.NSData; -import org.robovm.apple.foundation.NSError; -import org.robovm.apple.messageui.MFMailComposeResult; -import org.robovm.apple.messageui.MFMailComposeViewController; -import org.robovm.apple.messageui.MFMailComposeViewControllerDelegateAdapter; -import org.robovm.apple.messageui.MFMessageComposeViewController; -import org.robovm.apple.messageui.MFMessageComposeViewControllerDelegateAdapter; -import org.robovm.apple.messageui.MessageComposeResult; -import org.robovm.apple.uikit.NSLineBreakMode; -import org.robovm.apple.uikit.NSTextAlignment; -import org.robovm.apple.uikit.UIButton; -import org.robovm.apple.uikit.UIButtonType; -import org.robovm.apple.uikit.UIColor; -import org.robovm.apple.uikit.UIControl; -import org.robovm.apple.uikit.UIControlState; -import org.robovm.apple.uikit.UIEvent; -import org.robovm.apple.uikit.UIFont; -import org.robovm.apple.uikit.UIInterfaceOrientation; -import org.robovm.apple.uikit.UILabel; -import org.robovm.apple.uikit.UIView; -import org.robovm.apple.uikit.UIViewController; - -public class MessageComposerViewController extends UIViewController { - /* UILabel for displaying the result of sending the message. */ - private final UILabel feedbackMsg; - - public MessageComposerViewController () { - UIView view = getView(); - view.setBackgroundColor(UIColor.fromWhiteAlpha(0.75, 1)); - - UIButton mailButton = UIButton.create(UIButtonType.RoundedRect); - mailButton.setFrame(new CGRect(20, 197, 135, 37)); - mailButton.getTitleLabel().setFont(UIFont.getSystemFont(15)); - mailButton.setTitle("Compose Mail", UIControlState.Normal); - mailButton.setTitleColor(UIColor.fromRGBA(0.19, 0.30, 0.52, 1), UIControlState.Normal); - mailButton.setTitleShadowColor(UIColor.fromWhiteAlpha(0, 1), UIControlState.Normal); - mailButton.setTitleColor(UIColor.fromRGBA(1, 1, 1, 1), UIControlState.Highlighted); - mailButton.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() { - @Override - public void onTouchUpInside (UIControl control, UIEvent event) { - showMailPicker(); - } - }); - view.addSubview(mailButton); - - UIButton smsButton = UIButton.create(UIButtonType.RoundedRect); - smsButton.setFrame(new CGRect(163, 197, 137, 37)); - smsButton.getTitleLabel().setFont(UIFont.getSystemFont(15)); - smsButton.setTitle("Compose SMS", UIControlState.Normal); - smsButton.setTitleColor(UIColor.fromRGBA(0.19, 0.30, 0.52, 1), UIControlState.Normal); - smsButton.setTitleShadowColor(UIColor.fromWhiteAlpha(0, 1), UIControlState.Normal); - smsButton.setTitleColor(UIColor.fromRGBA(1, 1, 1, 1), UIControlState.Highlighted); - smsButton.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() { - @Override - public void onTouchUpInside (UIControl control, UIEvent event) { - showSMSPicker(); - } - }); - view.addSubview(smsButton); - - feedbackMsg = new UILabel(new CGRect(20, 269, 280, 117)); - feedbackMsg.setTextAlignment(NSTextAlignment.Center); - feedbackMsg.setLineBreakMode(NSLineBreakMode.TruncatingTail); - feedbackMsg.setNumberOfLines(7); - feedbackMsg.setFont(UIFont.getSystemFont(15)); - feedbackMsg.setTextColor(UIColor.darkText()); - view.addSubview(feedbackMsg); - } - - @Override - public boolean shouldAutorotate (UIInterfaceOrientation toInterfaceOrientation) { - return toInterfaceOrientation == UIInterfaceOrientation.Portrait; - } - - private void showMailPicker () { - /* - * You must check that the current device can send email messages before you attempt to create an instance of - * MFMailComposeViewController. Otherwise your app will crash when it creates a new MFMailComposeViewController. - */ - if (MFMailComposeViewController.canSendMail()) { - // The device can send email. - displayMailComposerSheet(); - } else { - // The device can not send email. - feedbackMsg.setHidden(false); - feedbackMsg.setText("Device not configured to send mail."); - } - } - - private void showSMSPicker () { - /* - * You must check that the current device can send SMS messages before you attempt to create an instance of - * MFMessageComposeViewController. Otherwise your app will crash when it creates a new MFMessageComposeViewController. - */ - if (MFMessageComposeViewController.canSendText()) { - // The device can send SMS. - displaySMSComposerSheet(); - } else { - // The device can not send email. - feedbackMsg.setHidden(false); - feedbackMsg.setText("Device not configured to send SMS."); - } - } - - /** Displays an email composition interface inside the application. Populates all the Mail fields. */ - private void displayMailComposerSheet () { - MFMailComposeViewController picker = new MFMailComposeViewController(); - picker.setMailComposeDelegate(new MFMailComposeViewControllerDelegateAdapter() { - /** Dismisses the email composition interface when users tap Cancel or Send. Proceeds to update the message field with - * the result of the operation. */ - @Override - public void didFinish (MFMailComposeViewController controller, MFMailComposeResult result, NSError error) { - feedbackMsg.setHidden(false); - - // Notifies users about errors associated with the interface - String resultText; - switch (result) { - case Cancelled: - resultText = "Result: Mail sending canceled"; - break; - case Saved: - resultText = "Result: Mail saved"; - break; - case Sent: - resultText = "Result: Mail sent"; - break; - case Failed: - resultText = "Result: Mail sending failed"; - break; - default: - resultText = "Result: Mail not sent"; - break; - } - feedbackMsg.setText(resultText); - - dismissViewController(true, null); - } - }); - picker.setSubject("Hello from California!"); - - // Set up recipients - picker.setToRecipients(Arrays.asList("first@example.com")); - picker.setCcRecipients(Arrays.asList("second@example.com", "third@example.com")); - picker.setBccRecipients(Arrays.asList("fourth@example.com")); - - // Attach an image to the email - String path = NSBundle.getMainBundle().findResourcePath("rainy", "jpg"); - NSData myData = NSData.read(new File(path)); - picker.addAttachmentData(myData, "image/jpeg", "rainy"); - - // Fill out the email body text - String emailBody = "It is raining in sunny California!"; - picker.setMessageBody(emailBody, false); - - presentViewController(picker, true, null); - } - - /** Displays an SMS composition interface inside the application. */ - private void displaySMSComposerSheet () { - MFMessageComposeViewController picker = new MFMessageComposeViewController(); - picker.setMessageComposeDelegate(new MFMessageComposeViewControllerDelegateAdapter() { - /** Dismisses the message composition interface when users tap Cancel or Send. Proceeds to update the feedback message - * field with the result of the operation. */ - @Override - public void didFinish (MFMessageComposeViewController controller, MessageComposeResult result) { - feedbackMsg.setHidden(false); - - String resultText; - // Notifies users about errors associated with the interface - switch (result) { - case Cancelled: - resultText = "Result: SMS sending canceled"; - break; - case Sent: - resultText = "Result: SMS sent"; - break; - case Failed: - resultText = "Result: SMS sending failed"; - break; - default: - resultText = "Result: SMS not sent"; - break; - } - feedbackMsg.setText(resultText); - - dismissViewController(true, null); - } - }); - /* - * You can specify one or more preconfigured recipients. The user has the option to remove or add recipients from the - * message composer view controller. - */ - /* picker.setRecipients(NSArray.toNSArray("Phone number here")); */ - - /* - * You can specify the initial message text that will appear in the message composer view controller. - */ - picker.setBody("Hello from California!"); - - presentViewController(picker, true, null); - } -}