package Ġcom . kan aw ish . dd . robot controller Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . os . Bundle Ċ import Ġcom . kan aw ish . camera . Camera Helper Ċ import Ġcom . kan aw ish . permission . Permission Manager Ċ import Ġcom . kan aw ish . robot . Command Ċ import Ġcom . kan aw ish . robot . Telemetry Ċ import Ġcom . kan aw ish . socket .* Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx kotlin . plus Assign Ċ import Ġkotlinx . android . synt hetic . main . test _ ui .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠLoop back Test Activity Ġ: ĠActivity () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOCAL HOST Ġ= Ġ" 1 2 7 . 0 . 0 . 1 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġcamera Helper : ĠCamera Helper ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġpermission Manager : ĠPermission Manager ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġserver : ĠNetwork Server ĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar Ġclient : ĠNetwork Client ĊĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . test _ ui ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Permissions Ġ= Ġpermission Manager . has Permissions ( Manifest . permission . CAMERA ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Permissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Camera () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Manager . request Permissions ( Manifest . permission . CAMERA ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog Ip Addresses () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDi agnostics ĊĠĠĠĠĠĠĠ Ġcamera Helper . dump Format Info () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠConvert Ġto Ġa Ġreactive Ġstream Ġsetup . ĊĠĠĠĠĠĠĠ Ġ// ĠP ictures Ġtaken Ġwill Ġbe Ġhandled Ġby Ġon Picture Taken ĊĊĠĠĠĠĠĠĠ Ġcamera Helper . open Camera (:: on Picture Taken ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receive Command ( Inet SocketAddress ( LOCAL HOST , ĠPORT _ CMD )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĠTim ber . d (" Received ĠCommand : Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġcmd Ġ-> Ġline 1 TextView . text Ġ= Ġcmd . toString () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receive Telemetry ( Inet SocketAddress ( LOCAL HOST , ĠPORT _ TM )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĠTim ber . d (" server Ġprocessed Ġimage ?") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline 2 TextView . text Ġ= Ġ"${ tm . distance . toInt ()} Ġcm " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setImage Bitmap ( Bitmap Factory . decode ByteArray ( tm . image , Ġ 0 , Ġtm . image . size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġmock Ġcommand ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠObservable . interval ( 2 0 0 0 , ĠTimeUnit . MILLISECONDS ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĠTim ber . d (" sending Ġcommand Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġclient . send Command ( LOCAL HOST , ĠCommand ( it , Ġ( it Ġ* Ġ 1 0 Ġ% Ġ 2 5 6 ). toInt (), Ġ( it Ġ* Ġ- 1 0 Ġ% Ġ 2 5 6 ). toInt ())) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġmock Ġtelemetry ĊĠĠĠĠĠĠĠ Ġdis pos ables Ġ+= ĠObservable . interval ( 2 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Calling Ġcamera Helper . take Picture () Ġ(# $ it )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Helper . take Picture () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġevery Ġpicture Ġtaken , Ġsend Ġmock Ġtelemetry Ġto Ġloop back . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Picture Taken ( image Bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on Picture Taken () Ġcalled Ġwith Ġ${ image Bytes . size }") ĊĠĠĠĠĠĠĠ ĠBitmap Factory . decode ByteArray ( image Bytes , Ġ 0 , Ġimage Bytes . size ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Scaled Bitmap ( it , Ġ 1 6 0 , Ġ 1 2 0 , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , ĠoutputStream ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġmock Ġtelemetry Ġdata Ġvia Ġnetwork Ġsocket . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . send Telemetry ( LOCAL HOST , ĠTe lemetry ( 0 . 1 , ĠoutputStream . toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . close () Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠByteArrayInputStream ( output Stream . toByteArray ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission Manager . handle Request Permission Result ( request Code , Ġpermissions , Ġgrant Results , Ġthis :: init Camera ) ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ