package Ġcom . th ank sm ister . iot . mqtt . alar mp anel . ui . modules Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . arch . lifecycle . Lifecycle Ċ import Ġandroid . arch . lifecycle . Lifecycle Observer Ċ import Ġandroid . arch . lifecycle . On Lifecycle Event Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Image Format Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . hardware . camera 2 .* Ċ import Ġandroid . hardware . camera 2 . Camera AccessException . CAMERA _ ERROR Ċ import Ġandroid . media . Image Reader Ċ import Ġandroid . os . Handler Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . Surface View Ċ import Ġcom . th ank sm ister . iot . mqtt . alar mp anel . R Ċ import Ġtim ber . log . Tim ber Ċ import Ġandroid . hardware . camera 2 . Camera Character istics Ċ import Ġandroid . hardware . camera 2 . Camera Manager Ċ import Ġandroid . util . Rational ĊĊ Ċ /** Ċ Ġ* ĠModule Ġto Ġtake Ġphoto Ġand Ġemail Ġwhen Ġalarm Ġis Ġdisabled Ġif Ġcamera Ġavailable . Ċ Ġ*/ Ċ class ĠCamera Module ( base : ĠContext ?, Ġprivate Ġvar Ġbackground Handler : ĠHandler , Ġprivate Ġvar Ġcallback : ĠCallback Listener ?) Ġ: ĠContext Wrapper ( base ), ĠLifecycle Observer Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Image Reader : ĠImage Reader ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Camera Device : ĠCamera Device ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Capture Session : ĠCamera Capture Session ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġhas Camera : Boolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġrotation : Float Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġcamera Id : String ? Ġ= Ġnull ĊĊĠĠĠ Ġinterface ĠCallback Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Camera Complete ( bitmap : ĠBitmap ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Camera Exception ( message : ĠString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// TODO ( we Ġneed Ġto Ġimplement Ġpermission Ġdialog Ġfor ĠAndroid ) ĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ START ) ĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġget System Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠĠĠĠĠ Ġval Ġcam Ids : ĠArray < String > ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcam Ids Ġ= Ġmanager . camera IdList ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Cam Ġaccess Ġexception Ġgetting Ġids : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Camera Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( cam Ids . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" No Ġcameras Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Camera Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcamera Id Ġ= Ġcam Ids [ 0 ] ĊĠĠĠĠĠĠĠ Ġm Image Reader Ġ= ĠImage Reader . newInstance ( IMAGE _ WIDTH , ĠIMAGE _ HEIGHT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Format . JPEG , ĠMAX _ I MAGES ) ĊĊĠĠĠĠĠĠĠ Ġm Image Reader ?. setOn Image Available Listener ( image Available Listener , Ġbackground Handler ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . open Camera ( camera Id , Ġm State Callback , Ġbackground Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Camera Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cae : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Camera Ġaccess Ġexception " Ġ Ġ+ Ġc ae ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. on Camera Exception (" Camera Ġaccess Ġexception " Ġ+ Ġc ae ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Camera Ġ= Ġfalse ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġimage Available Listener Ġ= ĠImage Reader . On Image Available Listener Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġreader . acquire Latest Image () ĊĠĠĠĠĠĠĠ Ġval Ġimage Buffer Ġ= Ġimage . planes [ 0 ]. buffer ĊĠĠĠĠĠĠĠ Ġval Ġimage Bytes Ġ= ĠByteArray ( image Buffer . remaining ()) ĊĠĠĠĠĠĠĠ Ġimage Buffer . get ( image Bytes ) ĊĠĠĠĠĠĠĠ Ġimage . close () ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġget Bitmap From ByteArray ( image Bytes ) ĊĠĠĠĠĠĠĠ Ġcallback ?. on Camera Complete ( bitmap ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtake Picture ( rotation : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . rotation Ġ= Ġrotation ; ĊĠĠĠĠĠĠĠ ĠTim ber . d (" take Picture Ġm Camera Device " Ġ+ Ġm Camera Device ) ĊĠĠĠĠĠĠĠ Ġif ( has Camera ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Device ?. create Capture Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray ListOf ( m Image Reader ?. surface ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Session Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġthis Ġhad Ġto Ġbe Ġmoved Ġto Ġbackground Ġthread ĊĠĠĠ Ġprivate Ġfun Ġget Bitmap From ByteArray ( image Bytes : ĠByteArray ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap Factory . decode ByteArray ( image Bytes , Ġ 0 , Ġimage Bytes . size ) ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotation ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Bitmap ( bitmap , Ġ 0 , Ġ 0 , Ġbitmap . width , Ġbitmap . height , Ġmatrix , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrigger Image Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( has Camera ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapture Builder Ġ= Ġm Camera Device ?. create Capture Request ( Camera Device . TEMPLATE _ ST ILL _ CAPTURE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Builder ?. add Target ( m Image Reader !!. surface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Builder ?. set ( Capture Request . CONTROL _ AE _ MODE , ĠCapture Request . CONTROL _ AE _ MODE _ ON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Builder ?. set ( Capture Request . CONTROL _ AW B _ MODE , ĠCapture Request . CONTROL _ AW B _ MODE _ AUTO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Session ?. capture ( capture Builder ?. build (), Ġm Capture Callback , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Capture Callback Ġ= Ġobject Ġ: ĠCamera Capture Session . Capture Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Prog ressed ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġpartial Result : ĠCapture Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Partial Ġresult ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Failed ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġfailure : ĠCapture Failure ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Capture Ġsession Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. on Camera Exception ( getString ( R . string . text _ camera _ failed _ session )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Completed ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġresult : ĠTotal Capture Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Session Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Capture Ġsession Ġclosed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Session Callback Ġ= Ġobject Ġ: ĠCamera Capture Session . State Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configure Failed ( camera Capture Session : ĠCamera Capture Session ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Failed Ġto Ġconfigure Ġcamera ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. on Camera Exception ( getString ( R . string . text _ camera _ failed _ configuration )); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configured ( camera Capture Session : ĠCamera Capture Session ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Camera Device Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Session Ġ= Ġcamera Capture Session ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrigger Image Capture () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm State Callback Ġ= Ġobject Ġ: ĠCamera Device . State Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( camera Device : ĠCamera Device , Ġcode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Camera Ġdevice Ġerror , Ġclosing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Device . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback !!. on Camera Exception ( getString ( R . string . text _ error _ camera _ device )); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Opened ( camera Device : ĠCamera Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Opened Ġcamera .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Device Ġ= Ġcamera Device ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Disconnected ( camera Device : ĠCamera Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Camera Ġdisconnected , Ġclosing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Device . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed ( camera : ĠCamera Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Closed Ġcamera , Ġreleasing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Device Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Camera Device ?. close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠInstance Holder Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠIMAGE _ WIDTH Ġ= Ġ 6 4 0 ĊĠĠĠĠĠĠĠ Ġval ĠIMAGE _ HEIGHT Ġ= Ġ 4 8 0 ĊĠĠĠĠĠĠĠ Ġval ĠMAX _ I MAGES Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ }