package Ġio . homeassistant . comp anion . android . sensors čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . os . Environment č Ċ import Ġandroid . os . Stat Fs č Ċ import Ġandroid . util . Log č Ċ import Ġio . homeassistant . comp anion . android . R č Ċ import Ġjava . io . File č Ċ import Ġkotlin . math . round ToInt čĊč Ċ class ĠStorage Sensor Manager Ġ: ĠSensor Manager Ġ{ čĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Storage Sensor " čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstorage Sensor Ġ= ĠSensor Manager . Basic Sensor ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" storage _ sensor ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sensor ", čĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . basic _ sensor _ name _ internal _ storage , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sensor _ description _ internal _ storage , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Of Measurement Ġ= Ġ"% " čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġexternal Storage Ġ= ĠSensor Manager . Basic Sensor ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" external _ storage ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sensor ", čĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . basic _ sensor _ name _ external _ storage , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sensor _ description _ external _ storage , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Of Measurement Ġ= Ġ"% " čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġval Ġpath : ĠFile Ġ= ĠEnvironment . getData Directory () čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstat Ġ= ĠStat Fs ( path . path ) čĊĠĠĠĠĠĠĠ Ġvar Ġavailable Blocks Ġ= Ġstat . available Blocks Long čĊĠĠĠĠĠĠĠ Ġvar ĠblockSize Ġ= Ġstat . block Size Long čĊĠĠĠĠĠĠĠ Ġvar Ġtotal Blocks Ġ= Ġstat . block Count Long čĊĠĠĠĠĠĠĠ Ġvar ĠblockSize SD Ġ= Ġ 0 L čĊĠĠĠĠĠĠĠ Ġvar Ġavailable Blocks SD Ġ= Ġ 0 L čĊĠĠĠĠĠĠĠ Ġvar Ġtotal Blocks SD Ġ= Ġ 0 L čĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġexternal Path : ĠFile ? Ġ= Ġnull čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġexternal Memory Available ( context : ĠContext ): ĠFile ? Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaths SD Ġ= Ġcontext . get External Files Dirs ( null ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġremov able : ĠBoolean čĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" PATHS ĠSD Ġ${ paths SD . size }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġpaths SD ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PATH Ġ$ item Ġis Ġmounted Ġ${ Environment . get External Storage State ( item ) Ġ== ĠEnvironment . MEDIA _ MOUNT ED } Ġand Ġremov able Ġis Ġ${ Environment . is External Storage Remov able ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) }" čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Environment . get External Storage State ( item ) Ġ== ĠEnvironment . MEDIA _ MOUNT ED ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremov able Ġ= ĠEnvironment . is External Storage Remov able ( item ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re mov able ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Path Ġ= Ġitem čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexternal Path čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġdocs Link (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġ" https :// comp anion . home - assistant . io / docs / core / sensors # storage - sensor " čĊĠĠĠ Ġ} čĊĠĠĠ Ġoverride Ġval Ġenabled ByDefault : ĠBoolean čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfalse čĊĠĠĠ Ġoverride Ġval Ġname : ĠInt čĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠR . string . sensor _ name _ storage čĊĠĠĠ Ġoverride Ġfun Ġget Available Sensors ( context : ĠContext ): ĠList < Sensor Manager . Basic Sensor > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( storage Sensor , Ġexternal Storage ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġrequired Permissions ( sensor Id : ĠString ): ĠArray < String > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġempty Array () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġrequest Sensor Update ( čĊĠĠĠĠĠĠĠ Ġcontext : ĠContext čĊĠĠĠ Ġ) Ġ{ čĊĠĠĠĠĠĠĠ Ġupdate Storage Sensor ( context ) čĊĠĠĠĠĠĠĠ Ġupdate External Storage Sensor ( context ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġupdate Storage Sensor ( context : ĠContext ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(! isEnabled ( context , Ġstorage Sensor . id )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġval Ġtotal Internal Storage Ġ= ĠgetTotal Internal Memory Size () čĊĠĠĠĠĠĠĠ Ġval Ġfree Internal Storage Ġ= Ġget Available Internal Memory Size () čĊĠĠĠĠĠĠĠ Ġval Ġpercentage Free Internal Storage Ġ= Ġget Percentage Internal () čĊčĊĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġ" mdi : har dd isk " čĊčĊĠĠĠĠĠĠĠ Ġon Sensor Updated ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Sensor , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpercentage Free Internal Storage , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Free Ġinternal Ġstorage " Ġto Ġfree Internal Storage , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Total Ġinternal Ġstorage " Ġto Ġtotal Internal Storage čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġupdate External Storage Sensor ( context : ĠContext ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(! isEnabled ( context , Ġexternal Storage . id )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊčĊĠĠĠĠĠĠĠ Ġexternal Path Ġ= Ġexternal Memory Available ( context ) čĊĠĠĠĠĠĠĠ Ġvar Ġtotal External Storage Ġ= Ġ" No ĠSD ĠCard " čĊĠĠĠĠĠĠĠ Ġvar Ġfree External Storage Ġ= Ġ" No ĠSD ĠCard " čĊĠĠĠĠĠĠĠ Ġvar Ġpercent Free External Ġ= Ġ 0 čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( external Path Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat SD Ġ= ĠStat Fs ( external Path . toString ()) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠblockSize SD Ġ= Ġstat SD . block Size Long čĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Blocks SD Ġ= Ġstat SD . available Blocks Long čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Blocks SD Ġ= Ġstat SD . block Count Long čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal External Storage Ġ= ĠgetTotal External Memory Size () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree External Storage Ġ= Ġget Available External Memory Size () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Free External Ġ= Ġ(( available Blocks SD . toDouble () Ġ/ Ġtotal Blocks SD . toDouble ()) Ġ* Ġ 1 0 0 ). round ToInt () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġ" mdi : micro - sd " čĊčĊĠĠĠĠĠĠĠ Ġon Sensor Updated ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Storage , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Free External , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" free _ external _ storage " Ġto Ġfree External Storage , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" total _ external _ storage " Ġto Ġtotal External Storage čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġformat Size ( size : ĠLong ): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġsuffix Ġ= Ġ"" čĊčĊĠĠĠĠĠĠĠ Ġvar Ġsize Long Ġ= Ġsize čĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġ 1 0 2 4 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuffix Ġ= Ġ" KB " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Long Ġ/= Ġ 1 0 2 4 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġ 1 0 2 4 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuffix Ġ= Ġ" MB " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Long Ġ/= Ġ 1 0 2 4 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġ 1 0 2 4 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuffix Ġ= Ġ" GB " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Long Ġ/= Ġ 1 0 2 4 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġresult Buffer Ġ= ĠStringBuilder ( size Long . toString ()) čĊčĊĠĠĠĠĠĠĠ Ġvar Ġcomma Offset Ġ= Ġresult Buffer . length Ġ- Ġ 3 čĊĠĠĠĠĠĠĠ Ġwhile Ġ( comma Offset Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Buffer . insert ( comma Offset , Ġ', ') čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomma Offset Ġ-= Ġ 3 čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġresult Buffer . append ( suffix ) čĊĠĠĠĠĠĠĠ Ġreturn Ġresult Buffer . toString () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠgetTotal Internal Memory Size (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġformat Size ( total Blocks Ġ* ĠblockSize ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġget Available Internal Memory Size (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġformat Size ( available Blocks Ġ* ĠblockSize ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġget Percentage Internal (): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġ(( available Blocks . toDouble () Ġ/ Ġtotal Blocks . toDouble ()) Ġ* Ġ 1 0 0 ). round ToInt () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġget Available External Memory Size (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġformat Size ( available Blocks SD Ġ* ĠblockSize SD ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠgetTotal External Memory Size (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġformat Size ( total Blocks SD Ġ* ĠblockSize SD ) čĊĠĠĠ Ġ} č Ċ } čĊ