package Ġio . homeassistant . comp anion . android . settings . widgets Ċ Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroidx . preference . Preference Ċ import Ġandroidx . preference . Preference Category Ċ import Ġandroidx . preference . Preference Fragment Compat Ċ import Ġio . homeassistant . comp anion . android . R Ċ import Ġio . homeassistant . comp anion . android . database . App Database Ċ import Ġio . homeassistant . comp anion . android . database . widget . Button Widget Entity Ċ import Ġio . homeassistant . comp anion . android . database . widget . MediaPlayer Controls Widget Entity Ċ import Ġio . homeassistant . comp anion . android . database . widget . Static Widget Entity Ċ import Ġio . homeassistant . comp anion . android . database . widget . Template Widget Entity Ċ import Ġio . homeassistant . comp anion . android . widgets . button . Button Widget Configure Activity Ċ import Ġio . homeassistant . comp anion . android . widgets . entity . Entity Widget Configure Activity Ċ import Ġio . homeassistant . comp anion . android . widgets . media _ player _ controls . MediaPlayer Controls Widget Configure Activity Ċ import Ġio . homeassistant . comp anion . android . widgets . template . Template Widget Configure Activity Ċ Ċ class ĠManage Widgets Settings Fragment Ġ: ĠPreference Fragment Compat () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠManage Widgets Settings Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠManage Widgets Settings Fragment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Prepare Options Menu ( menu : ĠMenu ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Prepare Options Menu ( menu ) ĊĊĠĠĠĠĠĠĠ Ġmenu . find Item ( R . id . get _ help )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . intent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse (" https :// comp anion . home - assistant . io / docs / integrations / android - widgets ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Preferences ( savedInstanceState : ĠBundle ?, Ġroot Key : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Preferences From Resource ( R . xml . manage _ widgets , Ġroot Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġactivity ?. title Ġ= ĠgetString ( R . string . widgets ) ĊĠĠĠĠĠĠĠ Ġval Ġstatic Widget Dao Ġ= ĠApp Database . getInstance ( require Context ()). static Widget Dao () ĊĠĠĠĠĠĠĠ Ġval Ġstatic Widget List Ġ= Ġstatic Widget Dao . getAll () ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget Dao Ġ= ĠApp Database . getInstance ( require Context ()). template Widget Dao () ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Widget List Ġ= Ġtemplate Widget Dao . getAll () ĊĠĠĠĠĠĠĠ Ġval Ġbutton Widget Dao Ġ= ĠApp Database . getInstance ( require Context ()). button Widget Dao () ĊĠĠĠĠĠĠĠ Ġval Ġbutton Widget List Ġ= Ġbutton Widget Dao . getAll () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Player Controls Widget Dao Ġ= ĠApp Database . getInstance ( require Context ()). media Play Ctrl Widget Dao () ĊĠĠĠĠĠĠĠ Ġval Ġmedia Widget List Ġ= Ġmedia Player Controls Widget Dao . getAll () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( static Widget List . isNull OrEmpty () Ġ&& Ġtemplate Widget List . isNull OrEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Widget List . isNull OrEmpty () Ġ&& Ġmedia Widget List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference >(" no _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ entity _ state _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ template _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ button _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ media _ player _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference >(" no _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Category Static Ġ= Ġfind Preference < Preference Category >(" list _ entity _ state _ widgets ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! static Widget List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category Static ?. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Static Widgets ( static Widget List , Ġpref Category Static ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ entity _ state _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Category Template Ġ= Ġfind Preference < Preference Category >(" list _ template _ widgets ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! template Widget List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category Template ?. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Template Widgets ( template Widget List , Ġpref Category Template ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ template _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Category Button Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ button _ widgets ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! button Widget List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category Button ?. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Button Widgets ( button Widget List , Ġpref Category Button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ button _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Category Media Ġ= Ġfind Preference < Preference Category >(" list _ media _ player _ widgets ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! media Widget List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category Media ?. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload MediaPlayer Widgets ( media Widget List , Ġpref Category Media ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < Preference Category >(" list _ media _ player _ widgets ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreload Static Widgets ( static Widget List : ĠArray < Static Widget Entity > ?, Ġpref Category : ĠPreference Category ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġpref Category ?. removeAll () ĊĠĠĠĠĠĠĠ Ġif Ġ( static Widget List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġstatic Widget List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Ġ= ĠPreference ( preference Screen . context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . key Ġ= Ġitem . id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! item . label . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġitem . label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . summary Ġ= Ġitem . entityId Ġ+ Ġitem . state Separator Ġ+ Ġitem . attribute Ids . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġitem . entityId Ġ+ Ġitem . state Separator Ġ+ Ġitem . attribute Ids ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . is Icon Space Reserved Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . setOn Preference ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( require Context (), ĠEntity Widget Configure Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġitem . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Preference ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category ?. add Preference ( pref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreload Template Widgets ( template Widget List : ĠArray < Template Widget Entity > ?, Ġpref Category : ĠPreference Category ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġpref Category ?. removeAll () ĊĠĠĠĠĠĠĠ Ġif Ġ( template Widget List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġtemplate Widget List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Ġ= ĠPreference ( preference Screen . context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . key Ġ= Ġitem . id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġitem . template . take ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . is Icon Space Reserved Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . setOn Preference ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( require Context (), ĠTemplate Widget Configure Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġitem . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Preference ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category ?. add Preference ( pref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreload Button Widgets ( button Widget List : ĠArray < Button Widget Entity > ?, Ġpref Category : ĠPreference Category ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġpref Category ?. removeAll () ĊĠĠĠĠĠĠĠ Ġif Ġ( button Widget List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġbutton Widget List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Ġ= ĠPreference ( preference Screen . context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . key Ġ= Ġitem . id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! item . label . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġitem . label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . summary Ġ= Ġ"${ item . domain }.${ item . service }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġ"${ item . domain }.${ item . service }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . is Icon Space Reserved Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . setOn Preference ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( require Context (), ĠButton Widget Configure Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġitem . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Preference ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category ?. add Preference ( pref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreload MediaPlayer Widgets ( media Widget List : ĠArray < MediaPlayer Controls Widget Entity > ?, Ġpref Category : ĠPreference Category ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġpref Category ?. removeAll () ĊĠĠĠĠĠĠĠ Ġif Ġ( media Widget List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġmedia Widget List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Ġ= ĠPreference ( preference Screen . context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . key Ġ= Ġitem . id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! item . label . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġitem . label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . summary Ġ= Ġitem . entityId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . title Ġ= Ġitem . entityId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . is Icon Space Reserved Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref . setOn Preference ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( require Context (), ĠMedia Player Controls Widget Configure Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( App Widget Manager . EXTRA _ APP WIDGET _ ID , Ġitem . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Preference ClickListener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpref Category ?. add Preference ( pref ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ