/* ĠCopyright ĠÂ© Ġ 2 0 1 7 - 2 0 2 0 ĠA BB YY ĠProduction ĠLLC Ċ Ċ 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 . Ċ ------------------------------------------------------------------------------------------------ -------------- */ Ċ Ċ package Ġcom . ne om l . classifier . main Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat . request Permissions Ċ import Ġandroidx . core . app . Activity Compat . should Show Request Permission R ationale Ċ import Ġandroidx . core . content . Context Compat . check Self Permission Ċ import Ġandroidx . core . content . File Provider Ċ import Ġcom . ne om l . classifier . R Ċ import Ġcom . ne om l . classifier . grid . Grid Fragment Ċ import Ġcom . ne om l . classifier . model . ImageData Ċ import Ġcom . ne om l . classifier . model . Main Model Ċ import Ġcom . ne om l . classifier . provider . Provider Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠActivity Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCAM ERA _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠG ALL ERY _ REQUEST _ CODE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ PERMISSION S _ CAMERA Ġ= Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmodel : ĠMain Model Ġby Ġlazy Ġ{ ĠMain Model () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcamera Permission Ġ= ĠManifest . permission . CAMERA ĊĊĠĠĠ Ġprivate Ġval Ġtake Picture From Gallery Action : Ġ( view : ĠView ) Ġ-> ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ P ICK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . INTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĠG ALL ERY _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpicture Uri From Camera : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġtake Picture From Camera Action : Ġ( view : ĠView ) Ġ-> ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheck Self Permission Ġ= Ġcheck Self Permission ( this , Ġcamera Permission ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale ( this , Ġcamera Permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Photo From Camera () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( this , ĠarrayOf ( camera Permission ), ĠREQUEST _ PERMISSION S _ CAMERA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Photo From Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Grid Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgallery _ button . setOnClickListener ( take Picture From Gallery Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera _ button . setOnClickListener ( take Picture From Camera Action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġtake Photo From Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Stamp : ĠString Ġ= ĠSimpleDateFormat (" yy MM dd _ HH mm ss "). format ( Date ()) ĊĠĠĠĠĠĠĠ Ġval Ġstorage Dir : ĠFile ? Ġ= Ġget External Files Dir ( Environment . DIRECTORY _ PI CTURE S ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile . create TempFile (" JPEG _${ time Stamp }_ ", Ġ". jpg ", Ġstorage Dir ) ĊĠĠĠĠĠĠĠ Ġpicture Uri From Camera Ġ= ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProvider . get Authority ( this @ MainActivity ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtake Picture Intent Ġ= ĠIntent ( Media Store . ACTION _ IMAGE _ CAPTURE ) ĊĠĠĠĠĠĠĠ Ġtake Picture Intent . putExtra ( Media Store . EXTRA _ OUTPUT , Ġpicture Uri From Camera ) ĊĠĠĠĠĠĠĠ Ġtake Picture Intent . resolve Activity ( package Manager )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( take Picture Intent , ĠCAM ERA _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Grid Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . support FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . fragment _ container , ĠGrid Fragment . create Instance (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode Ġ== ĠRESULT _ OK Ġ&& Ġrequest Code Ġ== ĠG ALL ERY _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . add Image From Gallery ( data ?. data . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . request Non Handled Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode Ġ== ĠRESULT _ OK Ġ&& Ġrequest Code Ġ== ĠCAM ERA _ REQUEST _ CODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . add Image From Gallery ( picture Uri From Camera . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . request Non Handled Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ PERMISSION S _ CAMERA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtake Photo From Camera () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchange Bottom Buttons ( is Detail : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġif Ġ( is Detail ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġcamera _ button . visibility Ġ= Ġvisibility ĊĠĠĠĠĠĠĠ Ġgallery _ button . visibility Ġ= Ġvisibility ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind Run Action ( image Data : ĠImage Data ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . classify All Images () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . classify ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Path Ġ= Ġimage Data . image Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Single Request Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġmodel . destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . request Non Handled Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Observer ( observer : ĠObserver ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . add Observer ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Observer ( observer : ĠObserver ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . delete Observer ( observer ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ