package Ġcom . s ui han 7 4 . sat ena . scenes . preferences . pages Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . s ui han 7 4 . sat ena . R Ċ import Ġcom . s ui han 7 4 . sat ena . dialogs . AlertDialog Fragment Ċ import Ġcom . s ui han 7 4 . sat ena . dialogs . Number Picker Dialog Ċ import Ġcom . s ui han 7 4 . sat ena . models . Preference Key Ċ import Ġcom . s ui han 7 4 . sat ena . models . Text Id Container Ċ import Ġcom . s ui han 7 4 . sat ena . scenes . preferences . Preferences Adapter Ċ import Ġcom . s ui han 7 4 . sat ena . scenes . preferences . Preferences ViewModel Ċ import Ġcom . s ui han 7 4 . utilities . Safe SharedPreferences Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* Ġ è¨Ńå®ļ ãĥªãĤ¹ãĥĪ çĶ» éĿ¢ çĶ¨ ãĥĻãĥ¼ãĤ¹ ViewModel Ċ Ġ*/ Ċ abstract Ġclass ĠList Preferences ViewModel ( ĊĠĠĠ Ġcontext : ĠContext Ċ ) Ġ: ĠPreferences ViewModel < Preference Key >( Safe SharedPreferences . create ( context )) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ preferences Items Ġ= ĠMutable LiveData < List < Preferences Adapter . Item >>() ĊĠĠĠ Ġval Ġpreferences Items Ġ: ĠLive Data < List < Preferences Adapter . Item >> Ġ= Ġ_ preferences Items ĊĊĠĠĠ Ġ/** Ġ è¨Ńå®ļ ãĥªãĤ¹ãĥĪ ãĤĴä½ľæĪĲ ãģĹ ãĥĵ ãĥ¥ ãĥ¼ ãģ« åıį æĺł ãģĻãĤĭ Ġ*/ ĊĠĠĠ Ġfun Ġload ( fragment : ĠList Preferences Fragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch When Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ preferences Items . post Value ( create List ( fragment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ------ Ġ// ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġopen Ġfun ĠonCreate View ( fragment : ĠList Preferences Fragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload ( fragment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¨Ńå®ļ ãĥªãĤ¹ãĥĪ ãĤĴ çĶŁæĪĲ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ` load ()` ãĥ¡ ãĤ½ãĥĥãĥī ãģĭãĤī åĳ¼ ãģ° ãĤĮãĤĭ åł´åĲĪ ï¼Į ĊĠĠĠĠ Ġ* Ġ` fragment . lifecycle Scope . launch When Created Ġ{} ` Ġ åĨħ ãģ§ åĳ¼ ãģ° ãĤĮãĤĭ ãģĵãģ¨ ãĤĴ ä¿Ŀ è¨¼ ãģĹãģ¦ãģĦãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġcreate List ( ĊĠĠĠĠĠĠĠ Ġfragment : ĠList Preferences Fragment ĊĠĠĠ Ġ) Ġ: ĠList < Preferences Adapter . Item > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnum åĢ¤ ãĤĴ éģ¸æĬŀ ãģĻãĤĭ ãĥĢ ãĤ¤ ãĤ¢ ãĥŃãĤ° ãĤĴ éĸĭ ãģı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġopen Enum Selection Dialog ( ĊĠĠĠĠĠĠĠ Ġvalues : ĠArray < T >, ĊĠĠĠĠĠĠĠ Ġlive Data : ĠMutable LiveData < T >, ĊĠĠĠĠĠĠĠ Ġ@ String Res Ġtitle Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġfragment Manager : ĠFragment Manager , ĊĠĠĠĠĠĠĠ Ġon Selected : Ġ(( f : ĠAlertDialog Fragment , Ġold : ĠT , Ġnew : ĠT )-> Unit )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġwhere ĠT : ĠEnum < T >, ĠT : ĠText Id Container Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ids Ġ= Ġvalues . map Ġ{ Ġit . text Id Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġlive Data . value Ġas ĠT ĊĠĠĠĠĠĠĠ Ġval Ġinitial Selected Ġ= Ġvalues . indexOf ( old ) ĊĊĠĠĠĠĠĠĠ ĠAlertDialog Fragment . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( label Ids , Ġinitial Selected ) Ġ{ Ġf , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġvalues [ which ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . value Ġ= Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Selected ?. invoke ( f , Ġold , Ġnew ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. dismiss OnClick Item ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . dialog _ cancel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( fragment Manager , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ æķ° åĢ¤ ãĤĴ éģ¸æĬŀ ãģĻãĤĭ ãĥĢ ãĤ¤ ãĤ¢ ãĥŃãĤ° ãĤĴ éĸĭ ãģı Ġ*/ ĊĠĠĠ Ġfun Ġopen Number Picker Dialog ( ĊĠĠĠĠĠĠĠ Ġlive Data : ĠMutable LiveData < Int >, ĊĠĠĠĠĠĠĠ Ġ@ String Res Ġtitle Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ String Res ĠmessageId : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġfragment Manager : ĠFragment Manager , ĊĠĠĠĠĠĠĠ Ġmin : ĠInt , ĊĠĠĠĠĠĠĠ Ġmax : ĠInt , ĊĠĠĠĠĠĠĠ ĠonComplete : Ġ(( value : ĠInt )-> Unit )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠNumber Picker Dialog . create Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġmin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġmax , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġ= Ġlive Data . value !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Id Ġ= Ġtitle Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= ĠmessageId ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete ?. invoke ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdialog . show ( fragment Manager , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ æķ° åĢ¤ ãĤĴ éģ¸æĬŀ ãģĻãĤĭ ãĥĢ ãĤ¤ ãĤ¢ ãĥŃãĤ° ãĤĴ éĸĭ ãģı Ġ*/ ĊĠĠĠ Ġfun Ġopen Number Picker Dialog ( ĊĠĠĠĠĠĠĠ Ġlive Data : ĠMutable LiveData < Long >, ĊĠĠĠĠĠĠĠ Ġ@ String Res Ġtitle Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ String Res ĠmessageId : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġfragment Manager : ĠFragment Manager , ĊĠĠĠĠĠĠĠ Ġmin : ĠLong , ĊĠĠĠĠĠĠĠ Ġmax : ĠLong , ĊĠĠĠĠĠĠĠ ĠonComplete : Ġ(( value : ĠLong )-> Unit )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠNumber Picker Dialog . create Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġmin . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġmax . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġ= Ġlive Data . value !!. toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Id Ġ= Ġtitle Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= ĠmessageId ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Long Ġ= Ġvalue . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . value Ġ= Ġvalue Long ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete ?. invoke ( value Long ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdialog . show ( fragment Manager , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ