package Ġcom . m ith un . simple bible . view models Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . m ith un . simple bible . Bible Application Ċ import Ġcom . m ith un . simple bible . R Ċ import Ġcom . m ith un . simple bible . data . database . model . Ver se Entity Ċ import Ġcom . m ith un . simple bible . data . repository . Resource Ċ import Ġcom . m ith un . simple bible . data . repository . Ver ses Repository Ċ import Ġcom . m ith un . simple bible . utilities . Resources Util Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Coroutine ExceptionHandler Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠImage Edit ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġver ses Repository : ĠVer ses Repository , ĊĠĠĠ Ġprivate Ġval Ġresources Util : ĠResources Util , ĊĠĠĠ Ġapplication : ĠApplication Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ verse Ġ= ĠMutable State Flow < Resource < Ver se Entity >>( Resource . Loading ()) ĊĠĠĠ Ġval Ġver se : ĠState Flow < Resource < Ver se Entity >> Ġ= Ġ_ verse ĊĊĠĠĠ Ġprivate Ġval Ġ_ filePath Ġ= ĠMutable State Flow ( Pair ( File Copy Status . INITIAL I SED , Ġ"")) ĊĠĠĠ Ġval ĠfilePath : ĠState Flow < Pair < File Copy Status , ĠString >> Ġ= Ġ_ filePath ĊĊĠĠĠ Ġprivate Ġval Ġver ses ExceptionHandler Ġ= ĠCor outine ExceptionHandler Ġ{ Ġcoroutine Context , Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ Ġ_ verse . value Ġ= ĠResource . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . message Ġ?: Ġresources Util . getString ( R . string . error Generic String ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Ver se ( verse Id : ĠString , Ġb ible Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( ver ses ExceptionHandler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ verse . value Ġ= ĠResource . Success ( ver ses Repository . get Ver se ById ( bible Id , Ġver se Id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSave Ġimage Ġinto Ġthe ĠP ictures Ġdirectory Ġwhich Ġis Ġaccessible Ġpublicly ĊĠĠĠ Ġfun Ġsave Image ( verse Id : ĠString , Ġbitmap : ĠBitmap ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ_ filePath . value Ġ= ĠPair ( File Copy Status . STARTED , Ġ"") ĊĠĠĠĠĠĠĠ Ġwith ( getApplication < Bible Application >(). application Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget External Files Dir ( Environment . DIRECTORY _ PI CTURE S )?. let Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ" sb _${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġver se Id . replace (" Ġ", Ġ"_ "). replace (" :", Ġ"_ "). replace (".", Ġ"_ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. jpg " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpath : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Values Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values . put ( Media Store . Media Columns . DISPLAY _ NAME , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values . put ( Media Store . Media Columns . MIME _ TYPE , Ġ" image / jpg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Values . put ( Media Store . Media Columns . REL ATIVE _ PATH , ĠEnvironment . DIRECTORY _ PI CTURE S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri : ĠUri ? Ġ= Ġcontent Resolver . insert ( Media Store . Images . Media . EXTERNAL _ CONTENT _ URI , Ġcontent Values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Uri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . open OutputStream ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimages Dir Ġ= Ġget External Files Dir ( Environment . DIRECTORY _ PI CTURE S ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠFile ( images Dir , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġimage . to URI (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 0 , Ġf os ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĠfilePath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ filePath . value Ġ= ĠPair ( File Copy Status . SUCCESS , ĠfilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog ĠMessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ filePath . value Ġ= ĠPair ( File Copy Status . FAIL , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠFile Copy Status Ġ{ ĊĠĠĠĠĠĠĠ ĠINITIAL I SED , ĠSTART ED , ĠSUCCESS , ĠFAIL ĊĠĠĠ Ġ} Ċ } Ċ