/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 Ġ- Ġpresent ĠIn structure , ĠInc . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* ĠĠĠĠ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* ĠĠĠĠ Ġthe ĠFree ĠSoftware ĠFoundation , Ġversion Ġ 3 Ġof Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* ĠĠĠĠ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠĠĠĠ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠĠĠĠ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* ĠĠĠĠ Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ* Ċ Ġ*/ Ċ package Ġcom . in structure . student . mob ius . assignment Details . submission . picker Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . core . content . File Provider Ċ import Ġcom . in structure . canvas api 2 . models . post models . File Submit Object Ċ import Ġcom . in structure . canvas api 2 . utils . exhaustive Ċ import Ġcom . in structure . p anda utils . utils . Const Ċ import Ġcom . in structure . p anda utils . utils . File Prefs Ċ import Ġcom . in structure . p anda utils . utils . FileUpload Utils Ċ import Ġcom . in structure . p anda utils . utils . On Activity Results Ċ import Ġcom . in structure . p anda utils . utils . Permission Utils Ċ import Ġcom . in structure . p anda utils . utils . remove Ċ import Ġcom . in structure . p anda utils . utils . request Permissions Ċ import Ġcom . in structure . student . R Ċ import Ġcom . in structure . student . mob ius . assignment Details . submission . picker . Picker Submission Mode . Comment Attachment Ċ import Ġcom . in structure . student . mob ius . assignment Details . submission . picker . Picker Submission Mode . File Submission Ċ import Ġcom . in structure . student . mob ius . assignment Details . submission . picker . Picker Submission Mode . Media Submission Ċ import Ġcom . in structure . student . mob ius . assignment Details . submission . picker . ui . Picker Submission Upload View Ċ import Ġcom . in structure . student . mob ius . common . ui . Effect Handler Ċ import Ġcom . in structure . student . mob ius . common . ui . Submission Service Ċ import Ġcom . spotify . mob ius . Connection Ċ import Ġcom . spotify . mob ius . functions . Consumer Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġorg . green robot . event bus . Subscribe Ċ import Ġjava . io . File Ċ Ċ // ĠWe Ġneed Ġa Ġcontext Ġin Ġthis Ġclass Ġto Ġregister Ġreceiv ers Ġand Ġto Ġaccess Ġthe Ġdatabase Ċ class ĠP icker Submission Upload Effect Handler Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠEffect Handler < Picker Submission Upload View , ĠP icker Submission Upload Event , ĠP icker Submission Upload Effect >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġconnect ( output : ĠConsumer < Picker Submission Upload Event >): ĠConnection < Picker Submission Upload Effect > Ġ{ ĊĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). register ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . connect ( output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). unregister ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsub Id Ġ= ĠP icker Submission Upload Effect Handler :: class . java . name ĊĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġ@ Subscribe ( sticky Ġ= Ġtrue ) ĊĠĠĠ Ġfun Ġon Activity Results ( event : ĠOn Activity Results ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent . once ( sub Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . request Code Ġ== ĠREQUEST _ CAMERA _ PIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . remove () Ġ// Remove Ġthe Ġevent Ġso Ġit Ġdoesn 't Ġshow Ġup Ġagain Ġsomewhere Ġelse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAttempt Ġto Ġrestore ĠURI Ġin Ġcase Ġwere Ġwere Ġboot ed Ġfrom Ġmemory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Image Uri Ġ= ĠUri . parse ( File Prefs . temp Capture Uri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit 's Ġstill Ġnull , Ġtell Ġthe Ġuser Ġthere Ġis Ġan Ġerror Ġand Ġreturn . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( camera Image Uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. show ErrorMessage ( R . string . utils _ error Getting Photo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ once ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . accept ( Picker Submission Upload Event . On File Selected ( camera Image Uri )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . request Code Ġin ĠlistOf ( REQUEST _ P ICK _ IMAGE _ G ALL ERY , ĠREQUEST _ P ICK _ FILE _ FROM _ DEVICE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . remove () Ġ// Remove Ġthe Ġevent Ġso Ġit Ġdoesn 't Ġshow Ġup Ġagain Ġsomewhere Ġelse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . data Ġ!= Ġnull Ġ&& Ġit . data ?. data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . accept ( Picker Submission Upload Event . On File Selected ( it . data !!. data !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. show ErrorMessage ( R . string . unexpected Error Opening File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġaccept ( effect : ĠP icker Submission Upload Effect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP icker Submission Upload Effect . Launch Camera Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP icker Submission Upload Effect . Launch Gallery Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Gallery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP icker Submission Upload Effect . Launch Select File Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Select File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠP icker Submission Upload Effect . Load File Contents Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload File ( effect . allowed Extensions , Ġeffect . uri , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠP icker Submission Upload Effect . Handle Submit Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Submit ( effect . model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Submit ( model : ĠP icker Submission Upload Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( model . mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Submission Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubmission Service . start Media Submission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Context Ġ= Ġmodel . canvas Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Id Ġ= Ġmodel . assignment Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Name Ġ= Ġmodel . assignment Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Group CategoryId Ġ= Ġmodel . assignment Group CategoryId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia FilePath Ġ= Ġmodel . files . first (). fullPath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Submission Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubmission Service . start File Submission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Context Ġ= Ġmodel . canvas Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Id Ġ= Ġmodel . assignment Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Name Ġ= Ġmodel . assignment Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Group CategoryId Ġ= Ġmodel . assignment Group CategoryId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Ġ= ĠArrayList ( model . files ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComment Attachment Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSubmission Service . start Comment Upload ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Context Ġ= Ġmodel . canvas Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Id Ġ= Ġmodel . assignment Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassignment Name Ġ= Ġmodel . assignment Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachments Ġ= Ġmodel . files , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Group Message Ġ= Ġmodel . assignment Group CategoryId Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview ?. close Submission View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// region ĠMedia ĠFetch ing ĊĊĠĠĠ Ġprivate Ġfun Ġload File ( allowed Extensions : ĠList < String >, Ġuri : ĠUri , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubmit Object Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Upload Utils . getFile ( context , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Object ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile To Submit : ĠFile Submit Object ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . errorMessage . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Extension Allowed ( it , Ġallowed Extensions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile To Submit Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. show Bad Extension Dialog ( allowed Extensions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. show File ErrorMessage ( it . errorMessage . or Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . accept ( Picker Submission Upload Event . On File Added ( file To Submit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlaunch Gallery () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( context . files Dir , Ġ"/ submission /* ") ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . packageName Ġ+ ĠConst . FILE _ PROVIDER _ AUTH ORITY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġview ?. get Gallery Intent ( uri )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠActivity ). startActivity For Result ( it , ĠREQUEST _ P ICK _ IMAGE _ G ALL ERY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlaunch Select File () Ġ{ ĊĠĠĠĠĠĠĠ Ġview ?. get Select File Intent ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠActivity ). startActivity For Result ( it , ĠREQUEST _ P ICK _ FILE _ FROM _ DEVICE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlaunch Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġcamera Ġpermission Ġif Ġwe Ġneed Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( needs Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP icker Submission Upload Event . Camera Clicked , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPermission Utils . CAMERA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġthe Ġuri Ġthat Ġwe 're Ġsaving Ġthe Ġfile Ġto ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ" pic _${ System . currentTimeMillis ()}. jpg " ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( FileUpload Utils . get External Cache Dir ( context ), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . packageName Ġ+ ĠConst . FILE _ PROVIDER _ AUTH ORITY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Prefs . temp Capture Uri Ġ= Ġuri . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġnew ĠIntent Ġand Ġlaunch ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġview ?. get Camera Intent ( uri ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull Ġ&& Ġis Intent Available ( intent . action )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context Ġas ĠActivity ). startActivity For Result ( intent , ĠREQUEST _ CAMERA _ PIC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠHelper Ġfunctions Ġfor Ġhandling Ġmedia ĊĊĠĠĠ Ġprivate Ġfun Ġneeds Permissions ( ĊĠĠĠĠĠĠĠ Ġsuccess Event : ĠP icker Submission Upload Event , ĊĠĠĠĠĠĠĠ Ġvar arg Ġpermissions : ĠString ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Permission Utils . has Permissions ( context Ġas ĠActivity , Ġ* permissions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext . request Permissions ( set Of (* permissions )) Ġ{ Ġresults Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( results . isNotEmpty () Ġ&& Ġresults . all Ġ{ Ġit . value Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġpermissions Ġlist Ġis Ġnot Ġempty Ġand Ġall Ġare Ġgranted , Ġsend Ġthe Ġsuccess Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer . accept ( success Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. show ErrorMessage ( R . string . permission Denied ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Intent Available ( action : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . package Manager . query Intent Activities ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( action ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . MATCH _ DEFAULT _ ONLY ĊĠĠĠĠĠĠĠ Ġ). size Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Extension Allowed ( ĊĠĠĠĠĠĠĠ Ġfile : ĠFile Submit Object , ĊĠĠĠĠĠĠĠ Ġallowed Extensions : ĠList < String > ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( allowed Extensions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// ĠNo Ġrestrictions Ġif Ġempty ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġextension Ġand Ġcompare Ġit Ġto Ġthe Ġlist Ġof Ġallowed Ġextensions ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġfile . fullPath . lastIndexOf (".") ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġext Ġ= Ġfile . fullPath . substring ( index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ( allowed Extensions . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( allowed Extensions [ i ]. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. equals ( ext , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ CAMERA _ PIC Ġ= Ġ 5 1 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ P ICK _ IMAGE _ G ALL ERY Ġ= Ġ 5 1 0 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ P ICK _ FILE _ FROM _ DEVICE Ġ= Ġ 5 1 0 2 ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Picker Request ( code : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcode Ġin ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CAMERA _ PIC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ P ICK _ IMAGE _ G ALL ERY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ P ICK _ FILE _ FROM _ DEVICE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ