package Ġcom . t ver ona . scp any where . view models Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġcom . t ver ona . scp any where . R Ċ import Ġcom . t ver ona . scp any where . utils . log v Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* ĠView Ġmodel Ġthat Ġprovides ĠCSS Ġcontent Ċ Ġ*/ Ċ class ĠCss Override ViewModel ( application : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ), ĊĠĠĠ ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġshared Preferences : ĠSharedPreferences Ġ= ĊĠĠĠĠĠĠĠ ĠPreference Manager . getDefault SharedPreferences ( getApplication ()) ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠStyle ( val Ġname : ĠString , Ġval Ġpath : ĠString ) ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠFont ( val Ġname : ĠString , Ġval Ġprefix : ĠString ) ĊĊĠĠĠ Ġprivate Ġvar Ġ_ css Merged Content Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval Ġcss Merged Content : ĠLive Data < String > Ġby Ġthis ::_ css Merged Content ĊĊĠĠĠ Ġprivate Ġfun ĠgetResource String ( id : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Application < Application >(). getString ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetResource Integer ( id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Application < Application >(). resources . getInteger ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCor outine Ġto Ġupdate Ġcurrent Ġcss Ġcont ant ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Content () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfontSize Scale Factor Ġ= ĠgetResource Integer ( R . integer . font _ size _ scale _ factor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfontSize Ġ= Ġ( shared Preferences . getInt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . font _ size _ key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 Ġ/ ĠfontSize Scale Factor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ* ĠfontSize Scale Factor ). toString () Ġ+ Ġ"% " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Ġ= Ġshared Preferences . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . font _ key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . font _ default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Path Ġ= Ġshared Preferences . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . theme _ key ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . theme _ default ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog v (" Setting Ġcss Ġwith Ġfont Ġsize : Ġ$ fontSize , Ġfont : Ġ$ font , Ġtheme Ġpath : Ġ'$ theme Path '") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġbase Ġcss Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Css Content Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Application < Application >(). assets . open ( getResource String ( R . string . base _ css _ theme )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffered Reader (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġcss Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcss Content Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Css Content Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Application < Application >(). assets . open ( theme Path ). buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġfont Ġ( if Ġnot Ġdefault ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! font . equals ( getResource String ( R . string . font _ default ), Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Template Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Application < Application >(). assets . open ( getResource String ( R . string . font _ template )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffered Reader (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcss Content Ġ+= Ġfont Template . replace ("\ ${ font - name }", Ġfont , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġfont Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfontSize Template Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Application < Application >(). assets . open ( getResource String ( R . string . font _ size _ template )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffered Reader (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcss Content Ġ+= ĠfontSize Template . replace ("\ ${ font - size }", ĠfontSize , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ css Merged Content . post Value ( css Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences , Ġkey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . font _ size _ key ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . font _ key ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetResource String ( R . string . theme _ key ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġshared Preferences . register On Shared Preference ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġupdate Content () ĊĠĠĠ Ġ} Ċ } Ċ