package Ġcom . chen cc . android stud yn otes code . utils . battery čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . content . Intent .* č Ċ import Ġandroid . content . Intent Filter č Ċ import Ġandroid . net . Uri č Ċ import Ġandroid . os . Battery Manager č Ċ import Ġandroid . os . Build č Ċ import Ġandroid . os . Power Manager č Ċ import Ġandroid . provider . Settings č Ċ import Ġandroid . util . Log č Ċ import Ġandroidx . work .* čĊčĊč Ċ /** čĊ Ġ* Ġ çĶµ éĩı ä¼ĺåĮĸ çĽ¸åħ³ čĊ Ġ*/ č Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Battery Utils " čĊč Ċ /** čĊ Ġ* æ·»åĬł çĻ½ åĲį åįķ čĊ Ġ*/ č Ċ fun Ġadd While List ( context Ġ: ĠContext ) Ġ{ čĊĠĠĠ Ġval Ġpm Ġ= Ġcontext . getSystem Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager čĊĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ){ čĊĠĠĠĠĠĠĠ Ġ// Ġæ£Ģ æµĭ æĺ¯åĲ¦ å¤Ħ äºİ çĻ½ åĲį åįķ čĊĠĠĠĠĠĠĠ Ġif Ġ(! pm . is Ign oring Battery Optim izations ( context . packageName )){ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" add While List : Ġæ·»åĬł çĻ½ åĲį åįķ ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// çĽ´æİ¥ è¯¢ éĹ® çĶ¨æĪ· æĺ¯åĲ¦ åħģè®¸ æĬĬ æĪĳä»¬ åºĶçĶ¨ åĬłåħ¥ åĪ° çĻ½ åĲį åįķ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Settings . ACTION _ REQUEST _ IGNORE _ B ATTER Y _ OPTIMI Z ATIONS ). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠUri . parse (" package :${ context . packageName }") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( this ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è·³è½¬ åĪ° çĶµ éĩı ä¼ĺåĮĸ ç®¡çĲĨ è®¾ç½® č Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( Intent ( Settings . ACTION _ IGNORE _ B ATTER Y _ OPTIMI Z ATION _ SETTINGS )) čĊĠĠĠĠĠĠĠ Ġ} else { čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" åºĶçĶ¨ Ġ${ context . packageName } Ġ å·²ç»ı åľ¨ çĻ½ åĲį åįķ ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊč Ċ /** čĊ Ġ* Ġ é¸ ¡ èĤ ĭ čĊ Ġ* Ġ åĶ ¤ é ĨĴ ĠCPU čĊ Ġ*/ č Ċ fun Ġwake Lock ( context : ĠContext ) Ġ: ĠPower Manager . Wake Lock ? Ġ{ čĊĠĠĠ Ġ// Ġ è·¨ è¿Ľç¨ĭ èİ·åıĸ Ġpower Manager ĠæľįåĬ¡ čĊĠĠĠ Ġval Ġpm Ġ= Ġcontext . getSystem Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager čĊčĊĠĠĠ Ġ// ĠåĪ¤æĸŃ æĺ¯åĲ¦ æĶ¯æĮģ ĠCPU Ġ åĶ ¤ é ĨĴ čĊĠĠĠ Ġval Ġis Wake Lock Level Supported Ġ= Ġpm . is Wake Lock Level Supported ( Power Manager . PAR TIAL _ WAKE _ LOCK ) čĊčĊĠĠĠ ĠLog . i ( TAG , Ġ" æĺ¯åĲ¦ æĶ¯æĮģ Ġwake Lock : Ġ$ is Wake Lock Level Supported ") čĊčĊĠĠĠ Ġvar Ġwake Lock Ġ: ĠPower Manager . Wake Lock ? Ġ= Ġnull čĊĠĠĠ Ġ// ĠæĶ¯æĮģ ĠCPU Ġ åĶ ¤ é ĨĴ ï¼Į Ġ æīį ä¿ĿæĮģ åĶ ¤ é ĨĴ čĊĠĠĠ Ġif Ġ( is Wake Lock Level Supported ){ čĊĠĠĠĠĠĠĠ Ġ// ĠåĪĽå»º åıª åĶ ¤ é ĨĴ ĠCPU ĠçļĦ åĶ ¤ é ĨĴ éĶģ čĊĠĠĠĠĠĠĠ Ġwake Lock Ġ= Ġpm . new Wake Lock ( Power Manager . PAR TIAL _ WAKE _ LOCK , Ġ" example : WAKE _ LOCK ") č Ċ // ĠĠĠĠĠĠĠ Ġwake Lock Ġ= Ġpm . new Wake Lock ( Power Manager . FULL _ WAKE _ LOCK Ġor ĠPower Manager . AC Q UIRE _ CA USE S _ WAKE UP Ġ, Ġ" example : WAKE _ LOCK ") čĊĠĠĠĠĠĠĠ Ġ// Ġ å¼Ģå§ĭ åĶ ¤ é ĨĴ ĠCPU čĊĠĠĠĠĠĠĠ Ġwake Lock . acquire () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġreturn Ġwake Lock č Ċ } čĊčĊč Ċ /** čĊ Ġ* Ġ åĲİåı° ä»»åĬ¡ čĊ Ġ*/ č Ċ fun Ġdo Work ( context : ĠContext ){ čĊčĊĠĠĠ Ġval Ġconstraints Ġ= ĠConstraints . Builder () čĊĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Network Type . UN METER ED ) ĠĠĠĠĠ Ġ// Wi - Fi čĊĠĠĠĠĠĠĠ Ġ. set Requires Ch arging ( true ) ĠĠĠĠĠ Ġ// Ġåľ¨ è®¾å¤ĩ åħħ çĶµ æĹ¶ è¿Ĳè¡Į čĊĠĠĠĠĠĠĠ Ġ. set Requires Battery Not Low ( true ) Ġ// Ġ çĶµ éĩı ä¸į è¶³ ä¸įä¼ļ è¿Ĳè¡Į čĊĠĠĠĠĠĠĠ Ġ. build () čĊčĊĠĠĠ Ġval Ġupload Work Request Ġ= ĠOne Time Work Request . Builder ( Upload Worker :: class . java ) čĊĠĠĠĠĠĠĠ Ġ. set Constraints ( constraints ) čĊĠĠĠĠĠĠĠ Ġ. build () čĊčĊĠĠĠ ĠWork Manager . getInstance ( context ) čĊĠĠĠĠĠĠĠ Ġ. enqueue Unique Work (" upload ", ĠExisting Work Policy . KEEP , Ġupload Work Request ) čĊč Ċ } čĊčĊč Ċ fun Ġregister ( context : ĠContext ) Ġ: ĠPower Connection Receiver { čĊĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter (). apply Ġ{ čĊĠĠĠĠĠĠĠ Ġ// Ġ åħħ çĶµ çĬ¶æĢģ čĊĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ POWER _ CONNECTED ) čĊĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ POWER _ DIS CONNECTED ) čĊĠĠĠĠĠĠĠ Ġ// Ġ çĶµ éĩı æĺ¾ èĳĹ åıĺ åĽŀ čĊĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ B ATTER Y _ LOW ) čĊĠĠĠĠĠĠĠ Ġadd Action ( ACTION _ B ATTER Y _ OK AY ) čĊĠĠĠ Ġ} čĊĠĠĠ Ġreturn ĠPower Connection Receiver (). apply Ġ{ čĊĠĠĠĠĠĠĠ Ġcontext . register Receiver ( this , Ġfilter ) čĊĠĠĠ Ġ} č Ċ } čĊčĊčĊč Ċ fun Ġcheck Battery ( context : ĠContext ){ čĊĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter ( ACTION _ B ATTER Y _ CHANGED ) čĊĠĠĠ Ġval Ġbattery Status Ġ= Ġcontext . register Receiver ( null , Ġfilter ) čĊčĊĠĠĠ Ġ// Ġæĺ¯åĲ¦ æŃ£åľ¨ åħħ çĶµ čĊĠĠĠ Ġval Ġstatus Ġ= Ġbattery Status ?. getInt Extra ( Battery Manager . EXTRA _ STATUS , Ġ- 1 ) Ġ?: Ġ- 1 čĊĠĠĠ Ġval Ġis Ch arging Ġ= Ġstatus Ġ== ĠB attery Manager . B ATTER Y _ STATUS _ CHAR GING Ġ|| Ġstatus Ġ== ĠB attery Manager . B ATTER Y _ STATUS _ FULL čĊčĊĠĠĠ Ġ// Ġ Ġ ä»Ģä¹Ī æĸ¹å¼ı åħħ çĶµ čĊĠĠĠ Ġval Ġcharge Plug Ġ= Ġbattery Status ?. getInt Extra ( Battery Manager . EXTRA _ PLU GG ED , Ġ- 1 ) Ġ?: Ġ- 1 čĊčĊĠĠĠ Ġ// ĠUSB čĊĠĠĠ Ġval Ġusb Charge Ġ= Ġcharge Plug Ġ== ĠB attery Manager . B ATTER Y _ PLU GG ED _ USB čĊĠĠĠ Ġ// Ġ åħħ çĶµ åĻ¨ čĊĠĠĠ Ġval Ġac Charge Ġ= Ġcharge Plug Ġ== ĠB attery Manager . B ATTER Y _ PLU GG ED _ AC čĊčĊĠĠĠ Ġ// Ġ èİ·å¾Ĺ çĶµ éĩı čĊĠĠĠ Ġ// Ġ çĶµ éĩı çĻ¾ åĪĨ æ¯Ķ čĊĠĠĠ Ġval Ġlevel Ġ= Ġbattery Status ?. getInt Extra ( Battery Manager . EXTRA _ LEVEL , Ġ- 1 ) Ġ?: Ġ- 1 čĊĠĠĠ Ġval Ġscale Ġ= Ġbattery Status ?. getInt Extra ( Battery Manager . EXTRA _ STATUS , Ġ- 1 ) Ġ?: Ġ- 1 čĊčĊĠĠĠ Ġval Ġbattery Pct Ġ= Ġlevel Ġ* Ġ 1 0 0 Ġ/ Ġscale . toFloat () čĊčĊĠĠĠ ĠLog . i ( TAG , Ġ" check Battery : ĠĠ Ġis Ch arging Ġ: Ġ$ is Ch arging ĠĠ Ġusb Charge Ġ: Ġ$ usb Charge Ġ Ġac Charge Ġ: Ġ$ ac Charge ") čĊĠĠĠ ĠLog . i ( TAG , Ġ" check Battery : Ġ Ġå½ĵåīį çĶµ éĩı Ġ: Ġ$ battery Pct Ġ Ġlevel Ġ: Ġ$ level Ġ Ġscale Ġ: Ġ$ scale ") čĊč Ċ } čĊčĊ čĊčĊčĊ