package Ġcom . char lie . badge library Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ Ċ /** Ċ Ġ* Ġæ ¶ Ī æģ¯ çº¢ çĤ¹ æłĳ Ċ Ġ* Ġ çĽ®åīį æĶ¯æĮģ åĬ¨æĢģ åĪ·æĸ° Ċ Ġ* Ġå¦Ĥæŀľ æľī åŃĲ èĬĤçĤ¹ , Ġ éĤ£ä¹Ī åıªèĥ½ éĢļè¿ĩ ä¿®æĶ¹ åŃĲ èĬĤçĤ¹ çļĦ æķ°éĩı , Ġ æľĢåĲİ åĪ·æĸ° çļĦæĹ¶åĢĻ ä¼ļ è®¡ç®Ĺ çĪ¶ èĬĤçĤ¹ çļĦ æĢ» æķ° Ċ Ġ* Ġå¦Ĥæŀľ æ²¡æľī åŃĲ èĬĤçĤ¹ , Ġåı¯ çĽ´æİ¥ ä¿®æĶ¹ è¯¥ èĬĤçĤ¹ æķ°éĩı Ċ Ġ* Ġ@ sample Ċ Ġ* Ġ 1 . ĠåĪĽå»º èĬĤçĤ¹ Ġ@ see [ createNew Node ] Ċ Ġ* Ġ 2 . Ġåľ¨ éľĢè¦ģ åĪ·æĸ° UI çļĦ åľ°æĸ¹ çĽĳåĲ¬ Ġ@ see [ observe Data ] Ċ Ġ* Ġ 3 . Ġä¿®æĶ¹ è¯¥ èĬĤçĤ¹ æķ°éĩı Ġ@ see [ set Badge Number ] Ċ Ġ* Ġ 4 . Ġ éĢļçŁ¥ çĪ¶ èĬĤçĤ¹ åĪ·æĸ° Ġ@ see [ notify Data Changed ] Ċ Ġ*/ Ċ class ĠBadge Manager Ġprivate Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġnodes : ĠHashMap < String , ĠBadge Node > Ġ= ĠHashMap () ĊĊĠĠĠ Ġ// æķ°æį® åĪ·æĸ° ĊĠĠĠ Ġprivate Ġval Ġlive Data Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġmain Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġfun Ġobserve Data ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < String >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLive Event Observer . observe < String >( live Data , Ġowner , Ġobserver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĢļçŁ¥ çº¢ çĤ¹ åĪ·æĸ° ĊĠĠĠĠ Ġ* Ġ@ param Ġkey ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnotify Data Changed ( key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun In MainThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . value Ġ= Ġkey ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun In MainThread ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is MainThread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcreate New Node ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġtype : ĠBadge Node . Type Ġ= ĠBadge Node . Type . NUMBER , ĊĠĠĠĠĠĠĠ Ġdismiss On Parent Click : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġparent Key : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( nodes . containsKey ( key )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġnode Ġ= ĠBadge Node ( key , Ġdismiss On Parent Click , Ġtype Ġ= Ġtype ) ĊĠĠĠĠĠĠĠ Ġval Ġparent Node : ĠBadge Node ? ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Node Ġ= ĠgetNode ( parent Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" parent Name : Ġ$ parent Key , Ġparent Ġnode Ġhas Ġnot Ġcreated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild List Ġ= Ġparent Node . child List Ġ?: Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild List . add ( node . key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnodes [ parent Key ] Ġ= Ġparent Node . copy ( child List Ġ= Ġchild List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġnode . copy ( parent Ġ= Ġparent Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnodes [ key ] Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¦ģ ä¿®æĶ¹ çº¢ çĤ¹ çĬ¶æĢģ , Ġä½¿çĶ¨ è¿Ļä¸ª æĸ¹æ³ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġedit ( key : ĠString ): ĠBadge Editor Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" test ", Ġ" edit Ġnode Ġ= Ġ$ key ") ĊĠĠĠĠĠĠĠ Ġval Ġbadge Node Ġ= ĠgetNode ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" badge Ġnode Ġis Ġnot Ġexist Ġkey Ġ= Ġ$ key ") ĊĠĠĠĠĠĠĠ Ġreturn ĠBadge Editor ( this , Ġbadge Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġset Node ( badge Node : ĠBadge Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnodes [ badge Node . key ] Ġ= Ġbadge Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠgetNode ( nodeName : ĠString ): ĠBadge Node ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnodes [ nodeName ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis MainThread (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠL ooper . get Main Looper (). thread Ġ=== ĠThread . currentThread () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġinstance : ĠBadge Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBadge Manager () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } ĊĊĊ