/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . google . modern storage . sample . medi astore Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . modern storage . media . Media Resource Ċ import Ġcom . google . modern storage . media . Media Store Client Ċ import Ġcom . google . modern storage . media . Shared Primary Ċ import Ġcom . google . modern storage . media . can Write Own Entries In Media Store Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ Ċ class ĠMedia Store ViewModel ( ĊĠĠĠ Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠhttpClient Ġby Ġlazy Ġ{ ĠOk HttpClient () Ġ} ĊĠĠĠ Ġprivate Ġval Ġmedia Store : ĠMedia Store Client Ġby Ġlazy Ġ{ ĠMedia Store Client ( application ) Ġ} ĊĊĠĠĠ Ġval Ġcan Write In Media Store : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcan Write Own Entries In Media Store ( getApplication ()) ĊĊĠĠĠ Ġprivate Ġval Ġ_ isLoading Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval ĠisLoading : ĠLive Data < Boolean > Ġget () Ġ= Ġ_ isLoading ĊĊĠĠĠ Ġfun Ġset Loading Status ( isLoading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ isLoading . value Ġ= ĠisLoading ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ current Media : ĠMutable LiveData < Media Resource ?> Ġ= ĠMutable LiveData ( null ) ĊĠĠĠ Ġval Ġcurrent Media : ĠLive Data < Media Resource ?> Ġget () Ġ= Ġ_ current Media ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved State Handle . get < Uri >(" current Media Uri ") ?. let Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( can Write In Media Store ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ current Media . value Ġ= Ġmedia Store . getResource By Uri ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetCurrent Media ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Store . getResource By Uri ( uri )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Handle . set (" current Media Uri ", Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ current Media . value Ġ= Ġmedia Store . getResource By Uri ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtemporary Camera Image Uri : ĠUri ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsaved State Handle . get (" temporary Camera Image Uri ") ĊĊĠĠĠ Ġfun Ġsave Temporary Camera Image Uri ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved State Handle . set (" temporary Camera Image Uri ", Ġuri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Temporary Camera Image Uri () Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved State Handle . remove < Uri >(" temporary Camera Image Uri ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Random Image From Internet ( callback : Ġ( uri : ĠUri ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( Sample Data . image . random ()). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠhttpClient . new Call ( request ). execute () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ?. use Ġ{ Ġresponse Body Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġgenerate Filename ( Media Source . INTER NET , Ġ" jpg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri Ġ= Ġmedia Store . add Image From Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename Ġ= Ġfilename , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream Ġ= Ġresponse Body . byte Stream (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= ĠShared Primary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( image Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Random Video From Internet ( callback : Ġ( uri : ĠUri ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( Sample Data . video . random ()). build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠhttpClient . new Call ( request ). execute () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ?. use Ġ{ Ġresponse Body Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġgenerate Filename ( Media Source . INTER NET , Ġ" mp 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Uri Ġ= Ġmedia Store . add Video From Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename Ġ= Ġfilename , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream Ġ= Ġresponse Body . byte Stream (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= ĠShared Primary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( video Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Media Uri For Camera ( type : ĠMediaType , Ġcallback : Ġ( uri : ĠUri ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMediaType . IMAGE Ġ-> Ġmedia Store . create Image Uri ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Filename ( Media Source . CAMERA , Ġ" jpg "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShared Primary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMediaType . VIDEO Ġ-> Ġmedia Store . create Video Uri ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Filename ( Media Source . CAMERA , Ġ" mp 4 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShared Primary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġcallback ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠMediaType Ġ{ ĊĠĠĠ ĠIMAGE , ĠV IDE O Ċ } Ċ Ċ enum Ġclass ĠMedia Source Ġ{ ĊĠĠĠ ĠCAM ERA , ĠINTER NET Ċ } Ċ Ċ private Ġfun Ġgenerate Filename ( source : ĠMedia Source , Ġextension : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( source ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMedia Source . CAMERA Ġ-> Ġ" camera -${ System . currentTimeMillis ()}. $ extension " ĊĠĠĠĠĠĠĠ ĠMedia Source . INTER NET Ġ-> Ġ" internet -${ System . currentTimeMillis ()}. $ extension " ĊĠĠĠ Ġ} Ċ }