package Ġcom . a 1 0 m ia om iao . bil im iao . utils Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . app . Ui Mode Manager Ċ import Ġandroid . arch . lifecycle . Lifecycle Owner Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent . get Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . support . annotation . Style Res Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 4 . content . Context Compat . startActivity Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . support . v 7 . app . AppCompat Delegate Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Frame Layout Ċ import Ġcom . a 1 0 m ia om iao . bil im iao . R Ċ import Ġcom . a 1 0 m ia om iao . bil im iao . config . config Ċ import Ġcom . a 1 0 m ia om iao . bil im iao . ui . MainActivity Ċ import Ġorg . jetbrains . ank o . ui Mode Manager Ċ Ċ class ĠTheme Util ( ĊĠĠĠĠĠĠĠ Ġval Ġactivity : ĠAppCompatActivity Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠKEY _ THEME Ġ= Ġ" theme _ name " ĊĠĠĠ Ġprivate Ġval ĠKEY _ N IGHT Ġ= Ġ" night " ĊĠĠĠ Ġval Ġtheme Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġval Ġlight 2 Dark Theme Map Ġ= Ġmap Of < Int , ĠInt >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . P ink Theme Ġto ĠR . style . Dark P ink Theme , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . Red Theme Ġto ĠR . style . Dark P ink Theme , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . Yellow Theme Ġto ĠR . style . Dark P ink Theme , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . Green Theme Ġto ĠR . style . Dark P ink Theme , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . Blue Theme Ġto ĠR . style . Dark P ink Theme , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . Pur ple Theme Ġto ĠR . style . Dark P ink Theme ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtheme Name Ġ= ĠSetting Util . getString ( activity , ĠKEY _ THEME , Ġ" P ink Theme ") ĊĠĠĠĠĠĠĠ Ġtheme . value Ġ= Ġtheme Name ĊĠĠĠĠĠĠĠ Ġactivity . set Theme ( get Theme Res Id ( theme Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Theme ( new Theme : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtheme Id = Ġget Theme Res Id ( new Theme ) ĊĠĠĠĠĠĠĠ Ġactivity . set Theme ( theme Id ) ĊĠĠĠĠĠĠĠ Ġactivity . window . navigation Bar Color Ġ= Ġactivity . config . theme Color ĊĠĠĠĠĠĠĠ Ġtheme . value Ġ= Ġnew Theme ĊĠĠĠĠĠĠĠ ĠSetting Util . putString ( activity , ĠKEY _ THEME , Ġnew Theme ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġset Night ( mode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mode Ġin Ġ 0 .. 2 Ġ&& Ġmode Ġ!= Ġget Night ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSetting Util . put Int ( activity , ĠKEY _ N IGHT , Ġmode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Theme ( theme . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Night () Ġ= ĠSetting Util . getInt ( activity , ĠKEY _ N IGHT , ĠAppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ) ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ å¼ĢåĲ¯ æļ Ĺ é»ĳ æ¨¡å¼ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Dark Mode Status (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( get Night ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġactivity . resources . configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġconfiguration . ui Mode Ġand ĠConfiguration . UI _ MODE _ N IGHT _ MASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmode Ġ== ĠConfiguration . UI _ MODE _ N IGHT _ YES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Theme Res Id ( theme Name : ĠString ) Ġ= Ġtry { ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġif Ġ( is Dark Mode Status ()) Ġ" Dark $ theme Name " Ġelse Ġtheme Name ĊĠĠĠĠĠĠĠ ĠR . style :: class . java . getField ( name ). getInt ( null ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠ ĠR . style . P ink Theme ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġobserve Theme ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < String >) Ġ= Ġtheme . observe ( owner , Ġobserver ) ĊĊĠĠĠ Ġ// Ġ åĬ¨æĢģ ä¸»é¢ĺ åĪĩæį¢ , Ġ éĩįæĸ° æŀĦå»º view ï¼Į çĽ´æİ¥ æĽ¿æį¢ æĹ§ view ĊĠĠĠ Ġfun Ġdynamic Theme ( owner : ĠLifecycle Owner , Ġbuilder : Ġ() Ġ-> ĠView , Ġanimate : ĠBoolean Ġ= Ġfalse ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= ĠFrame Layout ( activity ) ĊĠĠĠĠĠĠĠ Ġlayout . addView ( builder . invoke ()) ĊĠĠĠĠĠĠĠ Ġtheme . observe ( owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew View Ġ= Ġbuilder . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew View . alpha Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . addView ( new View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate ( new View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout . child Count Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . remove View At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . removeAll Views () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . addView ( builder . invoke ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġlayout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanimate ( view : ĠView , Ġon Animation End : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Listener Ġ= Ġobject Ġ: ĠAn imator . Animator Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAn imator ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Animation End . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Animation End . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . animate (). alpha ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( anim ator Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ