/* ĊĠĠ ĠCopyright Ġ 2 0 2 0 ĠV asy a ĠD rob ush kov ĊĊĠĠ Ġ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 . k ross ov och kin . fiber yun official . entity picker . presentation Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġandroidx . paging . Paging Data Ċ import Ġcom . k ross ov och kin . core . presentation . list . ListItem Ċ import Ġcom . k ross ov och kin . core . presentation . paging . Pag inated List ViewModel Delegate Ċ import Ġcom . k ross ov och kin . core . presentation . resources . Native Color Ċ import Ġcom . k ross ov och kin . core . presentation . resources . Native Text Ċ import Ġcom . k ross ov och kin . core . presentation . ui . toolbar . Toolbar ViewState Ċ import Ġcom . k ross ov och kin . fiber yun official . domain . Fi ber y Entity Data Ċ import Ġcom . k ross ov och kin . fiber yun official . entity created omain . Entity Create Interactor Ċ import Ġcom . k ross ov och kin . fiber yun official . entity picker . R Ċ import Ġcom . k ross ov och kin . fiber yun official . entity picker . domain . Get Entity List Interactor Ċ import Ġcom . k ross ov och kin . fiber yun official . entity picker . domain . Get EntityType Schema Interactor Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . receive As Flow Ċ import Ġkotlinx . coroutines . launch Ċ Ċ abstract Ġclass ĠEntity Picker ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġerror : ĠFlow < Exception > ĊĊĠĠĠ Ġabstract Ġval Ġnavigation : ĠFlow < Entity Picker Nav Event > ĊĊĠĠĠ Ġabstract Ġval Ġentity Create Enabled : ĠFlow < Boolean > ĊĊĠĠĠ Ġabstract Ġval Ġentity Items : ĠFlow < Paging Data < ListItem >> ĊĊĠĠĠ Ġabstract Ġval Ġtoolbar ViewState : ĠFlow < Toolbar ViewState > ĊĊĠĠĠ Ġabstract Ġfun Ġselect ( item : ĠListItem ) ĊĊĠĠĠ Ġabstract Ġfun Ġon Back Pressed () ĊĊĠĠĠ Ġabstract Ġfun Ġon Search Query Changed ( query : ĠString ) ĊĊĠĠĠ Ġabstract Ġfun Ġcreate Entity () ĊĊĠĠĠ Ġabstract Ġfun ĠonError ( error : ĠException ) Ċ } Ċ Ċ internal Ġclass ĠEntity Picker ViewModel Impl ( ĊĠĠĠ Ġprivate Ġval Ġget EntityType Schema Interactor : ĠGet EntityType Schema Interactor , ĊĠĠĠ Ġget Entity List Interactor : ĠGet Entity List Interactor , ĊĠĠĠ Ġprivate Ġval Ġentity Create Interactor : ĠEntity Create Interactor , ĊĠĠĠ Ġprivate Ġval Ġentity Picker Args : ĠEntity Picker Fragment . Args Ċ ) Ġ: ĠEntity Picker ViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpag inated List Delegate Ġ= ĠPag inated List ViewModel Delegate ( ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġthis , ĊĠĠĠĠĠĠĠ Ġload Page Ġ= Ġ{ Ġoffset : ĠInt , ĠpageSize : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Entity List Interactor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Picker Args . parent Entity Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Search Query . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġmapper Ġ= Ġ{ Ġentity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntity Picker Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġentity . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Data Ġ= Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġerror Channel Ġ= ĠChannel < Exception >( Channel . BUFFER ED ) ĊĠĠĠ Ġoverride Ġval Ġerror : ĠFlow < Exception > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġerror Channel . receive As Flow () ĊĊĠĠĠ Ġprivate Ġval Ġnavigation Channel Ġ= ĠChannel < Entity Picker Nav Event >( Channel . BUFFER ED ) ĊĠĠĠ Ġoverride Ġval Ġnavigation : ĠFlow < Entity Picker Nav Event > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnavigation Channel . receive As Flow () ĊĊĠĠĠ Ġprivate Ġval Ġmutable Search Query Ġ= ĠMutable State Flow ("") ĊĊĠĠĠ Ġoverride Ġval Ġentity Create Enabled Ġ= ĠMutable State Flow ( false ) ĊĊĠĠĠ Ġoverride Ġval Ġentity Items : ĠFlow < Paging Data < ListItem >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpag inated List Delegate . items ĊĊĠĠĠ Ġoverride Ġval Ġtoolbar ViewState Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentity Type Ġ= Ġget EntityType Schema Interactor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute ( entity Picker Args . parent Entity Data . field Schema ) ĊĠĠĠĠĠĠĠ Ġemit ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToolbar ViewState ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠNative Text . Simple ( entity Type . displayName ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbg Color Ġ= ĠNative Color . Hex ( entity Type . meta . ui Color Hex ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Back Button Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Res Id Ġ= ĠR . menu . picker _ entity _ menu , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Action ItemId Ġ= ĠR . id . action _ search ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġselect ( item : ĠListItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġis ĠEntity Picker Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Entity Pick ed ( item . entity Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Channel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity Picker Nav Event . Back Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Search Query Changed ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable Search Query . value Ġ= Ġquery ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Create Enabled . emit ( query . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpag inated List Delegate . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Entity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġmutable Search Query . value ĊĠĠĠĠĠĠĠ Ġrequire ( name . isNotEmpty ()) Ġ{ Ġ" search Ġquery Ġis Ġempty " Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Type Ġ= Ġget EntityType Schema Interactor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute ( entity Picker Args . parent Entity Data . field Schema ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentity Create Interactor . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Type Schema Ġ= Ġentity Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Entity Pick ed ( entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Entity Picker ViewModel Impl . error Channel . send ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Entity Pick ed ( entity : ĠF iber y Entity Data ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Channel . send ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity Picker Nav Event . On Entity Pick ed Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Entity Data Ġ= Ġentity Picker Args . parent Entity Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Ġ= Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ