package Ġcom . k ale vet . pix a get app . ui . image List Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġandroidx . paging .* Ċ import Ġcom . k ale vet . pix a get . Pix a get Ċ import Ġcom . k ale vet . pix a get . data . repositories . remote . requests . Image Search Request Ċ import Ġcom . k ale vet . pix a get app . data . models . image . Image Item Cash Ċ import Ġcom . k ale vet . pix a get app . data . repositories . local . room . Pix ab ay Cash Database Provider Ċ import Ġcom . k ale vet . pix a get app . data . repositories . paging . Pix ab ay Images Remote Mediator Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . as State Flow Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject ĊĊ Ċ @ Experimental Cor outines Api Ċ @ Experimental Paging Api Ċ @ H ilt ViewModel Ċ class ĠImage List ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġpix a get : ĠP ixa get Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdatabase Ġ= ĠP ix ab ay Cash Database Provider . get Pix ab ay Cash Database ( application ) ĊĠĠĠ Ġprivate Ġval Ġimage Cash Dao Ġ= Ġdatabase . image Cash Dao () ĊĠĠĠ Ġprivate Ġval Ġimage Search Request Ġ= ĠImage Search Request ( query Ġ= Ġ" dog ") ĊĊĠĠĠ Ġprivate Ġval Ġ_ images Flow Ġ= ĊĠĠĠĠĠĠĠ ĠMutable State Flow < Paging Data < Image Item Cash >>( Paging Data . empty ()) ĊĠĠĠ Ġval Ġimages Flow : ĠFlow < Paging Data < Image Item Cash >> Ġ= Ġ_ images Flow . as State Flow () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// image Search Request . apiKey Ġ= Ġ" 2 3 5 7 0 1 9 1 - 4 b 9 d 1 2 3 9 4 7 a 3 c 7 0 a 1 1 4 1 9 df be " ĊĠĠĠĠĠĠĠ Ġinit No Query Images Flow ( image Search Request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit No Query Images Flow ( image Search Request : ĠImage Search Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĠP ix ab ay Images Remote Mediator ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Service Ġ= Ġpix a get , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ġ= Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Search Request ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Pager ( remote Mediator , Ġimage Search Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Images ( image Search Request : ĠImage Search Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Images Flow By Query ( image Search Request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Images Flow By Query ( image Search Request : ĠImage Search Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Mediator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ix ab ay Images Remote Mediator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Service Ġ= Ġpix a get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ġ= Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Search Request Ġ= Ġimage Search Request , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Pager ( remote Mediator , Ġimage Search Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinit Pager ( ĊĠĠĠĠĠĠĠ Ġremote Mediator : ĠRemote Mediator < Int , ĠImage Item Cash >, ĊĠĠĠĠĠĠĠ Ġimage Search Request : ĠImage Search Request ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpager Ġ= ĠP ager ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= ĠP aging Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġ 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Place holders Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Load Size Ġ= Ġ 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefetch Distance Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Mediator Ġ= Ġremote Mediator ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Cash Dao . paging Source By Request ( image Search Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpager . flow . cached In ( viewModel Scope ). collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ images Flow . value Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }