package Ġtop . so grey . common . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . os . Build Ċ import Ġandroid . text . TextUtils Ċ import Ġtop . so grey . common . utils . k tx . get SP Ċ import Ġtop . so grey . common . utils . k tx . set SP Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ è¯Ńè¨Ģ çĽ¸åħ³ Ċ Ġ* Ġ@ author ĠS og rey Ċ Ġ* Ġ@ date Ġ 2 0 1 9 / 1 0 / 2 6 Ċ Ġ*/ Ċ class ĠLanguage Utils Ġ{ ĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException ( this . java Class . simple Name Ġ+ Ġ" Ġcannot Ġbe Ġinstantiated ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠKEY _ LOCAL E Ġ= Ġ" KEY _ LOCAL E " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠVALUE _ FOLLOW _ SYSTEM Ġ= Ġ" VALUE _ FOLLOW _ SYSTEM " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ åºĶçĶ¨ ç³»ç»Ł è¯Ńè¨Ģ ĊĠĠĠĠĠĠĠĠ Ġ* ĠApply Ġthe Ġsystem Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġactivity Cl z ĠThe Ġclass Ġof Ġactivity Ġwill Ġbe Ġstarted Ġafter Ġapply Ġsystem Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġapply System Language ( activity Cl z : ĠClass < out ĠActivity >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Language ( Resources . getSystem (). configuration . locale , Ġactivity Cl z , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ åºĶçĶ¨ ç³»ç»Ł è¯Ńè¨Ģ ĊĠĠĠĠĠĠĠĠ Ġ* ĠApply Ġthe Ġsystem Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġactivity ClassName ĠThe Ġfull Ġclass Ġname Ġof Ġactivity Ġwill Ġbe Ġstarted Ġafter Ġapply Ġsystem Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġapply System Language ( activity ClassName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Language ( Resources . getSystem (). configuration . locale , Ġactivity ClassName , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ åºĶçĶ¨ è¯Ńè¨Ģ ĊĠĠĠĠĠĠĠĠ Ġ* ĠApply Ġthe Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlocale ĠĠĠĠĠ ĠThe Ġlanguage Ġof Ġlocale . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġactivity Cl z ĠThe Ġclass Ġof Ġactivity Ġwill Ġbe Ġstarted Ġafter Ġapply Ġsystem Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġwill Ġstart Ġthe Ġlauncher Ġactivity Ġif Ġthe Ġclass Ġis Ġnull . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġapply Language ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale : ĠLocale , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Cl z : ĠClass < out ĠActivity > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Language ( locale , Ġactivity Cl z , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ åºĶçĶ¨ è¯Ńè¨Ģ ĊĠĠĠĠĠĠĠĠ Ġ* ĠApply Ġthe Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlocale ĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġlanguage Ġof Ġlocale . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġactivity ClassName ĠThe Ġclass Ġof Ġactivity Ġwill Ġbe Ġstarted Ġafter Ġapply Ġsystem Ġlanguage . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġwill Ġstart Ġthe Ġlauncher Ġactivity Ġif Ġthe Ġclass Ġname Ġis Ġnull . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġapply Language ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale : ĠLocale , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ClassName : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Language ( locale , Ġactivity ClassName , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġapply Language ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale : ĠLocale , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Cl z : ĠClass < out ĠActivity > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Follow System : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity Cl z Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Language ( locale , Ġ"", Ġis Follow System ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Language ( locale , Ġactivity Cl z . name , Ġis Follow System ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġapply Language ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocale : ĠLocale , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ClassName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Follow System : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Follow System ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Utils . getApp (). set SP ( KEY _ LOCAL E , ĠVALUE _ FOLLOW _ SYSTEM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Language Ġ= Ġlocale . language ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Country Ġ= Ġlocale . country ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Utils . getApp (). set SP ( KEY _ LOCAL E , Ġ"$ local Language $$ local Country ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Language ( App Utils . getApp (), Ġlocale ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Activity ClassName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( activity ClassName )) Ġget Launcher Activity () Ġelse Ġactivity ClassName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . component Ġ= ĠComponent Name ( App Utils . getApp (), Ġreal Activity ClassName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Utils . getApp (). startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġapply Language ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsp Locale Ġ= Ġactivity . get SP ( KEY _ LOCAL E , Ġ"") Ġas ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( sp Locale )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VALUE _ FOLLOW _ SYSTEM Ġ== Ġsp Locale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsys Locale Ġ= ĠResources . getSystem (). configuration . locale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Language ( App Utils . getApp (), Ġsys Locale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Language ( activity , Ġsys Locale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Country Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp Locale !!. split ("\\ $ ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( language Country . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Kt Utils . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Language Utils ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġstring Ġof Ġ$ sp Locale Ġis Ġnot Ġin Ġthe Ġcorrect Ġformat ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetting Locale Ġ= ĠLocale ( language Country [ 0 ], Ġlanguage Country [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Language ( App Utils . getApp (), Ġsetting Locale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Language ( activity , Ġsetting Locale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Language ( context : ĠContext , Ġlocale : ĠLocale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġresources . configuration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Locale Ġ= Ġconfig . locale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( equals ( context Locale . language , Ġlocale . language ) Ġ&& Ġequals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Locale . country , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocale . country ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdm Ġ= Ġresources . display Metrics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . set Locale ( locale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . create Configuration Context ( config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . locale Ġ= Ġlocale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . update Configuration ( config , Ġdm ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġequals ( s 1 : ĠCharSequence ?, Ġs 2 : ĠCharSequence ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s 1 Ġ=== Ġs 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s 1 Ġ!= Ġnull Ġ&& Ġs 2 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength : ĠInt Ġ= Ġs 1 . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġs 2 . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s 1 Ġis ĠString Ġ&& Ġs 2 Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs 1 Ġ== Ġs 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s 1 [ i ] Ġ!= Ġs 2 [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Launcher Activity (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ MAIN , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ LA UNCH ER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . set Package ( App Utils . getApp (). packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpm Ġ= ĠApp Utils . getApp (). package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġpm . query Intent Activities ( intent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġinfo . iterator (). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( next Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . activity Info . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ" no Ġlauncher Ġactivity " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }