/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . example . android . track r . ui . utils Ċ Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . On Attach State ChangeListener Ċ import Ġandroid . view . ViewGroup . Margin LayoutParams Ċ import Ġandroidx . core . graphics . Insets Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . core . view . Window Insets Compat Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . core . view . update Padding Ċ import Ġandroidx . databinding . Binding Adapter Ċ Ċ /** Ċ Ġ* ĠSet Ġup Ġa Ġlistener Ġto Ġapply Ġwindow Ġin sets . ĠThe Ġlambda Ġalso Ġreceives Ġthis ĠView 's Ġinitial Ġpadding Ċ Ġ* Ġand Ġmargin Ġvalues , Ġto Ġaid Ġin Ġproperly Ġupdating Ġthe Ġview Ġbased Ġon Ġthe Ġin sets . Ċ Ġ*/ Ċ fun ĠView . do On Apply Window Insets ( ĊĠĠĠ Ġf : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat , Ġpadding : ĠIn sets , Ġmargins : ĠIn sets ) Ġ-> ĠWindow Insets Compat Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġa Ġsnapshot Ġof Ġthe Ġview 's Ġpadding Ġand Ġmargins . ĊĠĠĠ Ġval Ġpadding Ġ= Ġrecord Padding () ĊĠĠĠ Ġval Ġmargins Ġ= Ġrecord Margins () ĊĠĠĠ Ġ// ĠSet Ġa Ġlistener Ġwhich Ġproxies Ġto Ġthe Ġgiven Ġlambda , Ġalso Ġpassing Ġin Ġthe Ġrecorded Ġstate . ĊĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( this ) Ġ{ Ġview , Ġin sets Ġ-> ĊĠĠĠĠĠĠĠ Ġf ( view , Ġin sets , Ġpadding , Ġmargins ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrequest Apply Insets When Attached () Ċ } Ċ Ċ fun ĠView . record Padding () Ġ= ĠIn sets . of ( padding Left , Ġpadding Top , Ġpadding Right , Ġpadding Bottom ) Ċ Ċ fun ĠView . record Margins (): ĠIn sets Ġ{ ĊĠĠĠ Ġval Ġlp Ġ= Ġlayout Params Ġas ? ĠMargin LayoutParams Ġ?: Ġreturn ĠIn sets . NONE ĊĠĠĠ Ġreturn ĠIn sets . of ( lp . left Margin , Ġlp . top Margin , Ġlp . right Margin , Ġlp . bottom Margin ) Ċ } Ċ Ċ /** Ċ Ġ* ĠConvenience Ġto Ġrequest Ġwindow Ġin sets , Ġor Ġensure Ġthat Ġthe Ġrequest Ġis Ġmade Ġwhen Ġattached Ġto Ġthe Ċ Ġ* Ġview Ġhierarchy . Ċ Ġ*/ Ċ fun ĠView . request Apply Insets When Attached () Ġ{ ĊĠĠĠ Ġif Ġ( is Attached To Window ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġalready Ġattached , Ġjust Ġrequest Ġas Ġnormal . ĊĠĠĠĠĠĠĠ Ġrequest Apply Insets () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġlistener Ġto Ġrequest Ġwhen Ġwe Ġare Ġattached Ġto Ġthe Ġhierarchy . ĊĠĠĠĠĠĠĠ Ġadd On Attach State ChangeListener ( object Ġ: ĠOn Attach State ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . remove On Attach State ChangeListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . request Apply Insets () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( v : ĠView ) Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAdjust Ġpadding Ġor Ġmargin Ġbased Ġon Ġthe Ġcurrent Ġwindow Ġin sets Ġfor Ġsystem Ġbars Ġlike Ġthe Ġnavigation Ċ Ġ* Ġbar Ġand Ġstatus Ġbar . ĠThis Ġwill Ġonly Ġever Ġincrease Ġpadding Ġor Ġmargins Ġusing Ġthe Ġsum Ġof Ġthe ĠView 's Ċ Ġ* Ġoriginal Ġpadding Ġor Ġmargin Ġplus Ġthe Ġsystem Ġin sets . Ċ Ġ* Ċ Ġ* ĠSpecify Ġwhich Ġsides Ġto Ġadjust Ġin ĠXML Ġusing Ġthe Ġbinding Ġexpression Ġ` @{ true }`. ĠFor Ġexample , Ġthe Ċ Ġ* Ġfollowing ĠView Ġwill Ġhave Ġits Ġtop Ġmargin Ġset Ġto Ġthe Ġsystem 's Ġtop Ġinset , Ġand Ġit 's Ġleft Ġand Ġright Ċ Ġ* Ġpadding Ġset Ġto Ġthe Ġsystem 's Ġleft Ġand Ġright Ġin sets Ġplus Ġ 1 6 dp . Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġ< View Ċ Ġ* ĠĠ Ġandroid : layout _ width =" match _ parent " Ċ Ġ* ĠĠ Ġandroid : layout _ height =" wrap _ content " Ċ Ġ* ĠĠ Ġandroid : padding Left =" 1 6 dp " Ċ Ġ* ĠĠ Ġandroid : padding Right =" 1 6 dp " Ċ Ġ* ĠĠ Ġapp : margin Top System Bars =" @{ true }" Ċ Ġ* ĠĠ Ġapp : padding Left System Bars =" @{ true }" Ċ Ġ* ĠĠ Ġapp : padding Right System Bars =" @{ true }" Ġ/> Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġno Ġin sets Ġwill Ġbe Ġconsumed . ĠIf Ġyou Ġneed Ġto Ġconsume Ġin sets , Ġor Ġneed Ġto Ġapply Ġsome Ġother Ċ Ġ* Ġbehavior , Ġuse Ġ[ do On Apply Window Insets ] Ġdirectly Ġinstead . Ċ Ġ*/ Ċ @ Binding Adapter ( ĊĠĠĠ Ġ" padding Left System Bars ", ĊĠĠĠ Ġ" padding Top System Bars ", ĊĠĠĠ Ġ" padding Right System Bars ", ĊĠĠĠ Ġ" padding Bottom System Bars ", ĊĠĠĠ Ġ" margin Left System Bars ", ĊĠĠĠ Ġ" margin Top System Bars ", ĊĠĠĠ Ġ" margin Right System Bars ", ĊĠĠĠ Ġ" margin Bottom System Bars ", ĊĠĠĠ Ġrequire All Ġ= Ġfalse Ċ ) Ċ fun Ġapply System Bars ( ĊĠĠĠ Ġview : ĠView , ĊĠĠĠ Ġpad Left : ĠBoolean , ĊĠĠĠ Ġpad Top : ĠBoolean , ĊĠĠĠ Ġpad Right : ĠBoolean , ĊĠĠĠ Ġpad Bottom : ĠBoolean , ĊĠĠĠ ĠmarginLeft : ĠBoolean , ĊĠĠĠ ĠmarginTop : ĠBoolean , ĊĠĠĠ ĠmarginRight : ĠBoolean , ĊĠĠĠ ĠmarginBottom : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġval Ġadjust Padding Ġ= Ġpad Left Ġ|| Ġpad Top Ġ|| Ġpad Right Ġ|| Ġpad Bottom ĊĠĠĠ Ġval Ġadjust Margins Ġ= ĠmarginLeft Ġ|| ĠmarginTop Ġ|| ĠmarginRight Ġ|| ĠmarginBottom ĊĠĠĠ Ġif Ġ(!( adjust Padding Ġ|| Ġadjust Margins )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġview . do On Apply Window Insets Ġ{ Ġv , Ġin sets , Ġpadding , Ġmargins Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsystem Bars Ġ= Ġin sets . get Insets ( Window Insets Compat . Type . system Bars ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( adjust Padding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Left Ġ= Ġif Ġ( pad Left ) Ġsystem Bars . left Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Top Ġ= Ġif Ġ( pad Top ) Ġsystem Bars . top Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Right Ġ= Ġif Ġ( pad Right ) Ġsystem Bars . right Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Bottom Ġ= Ġif Ġ( pad Bottom ) Ġsystem Bars . bottom Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . update Padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġpadding . left Ġ+ Ġsystem Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġpadding . top Ġ+ Ġsystem Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġpadding . right Ġ+ Ġsystem Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġpadding . bottom Ġ+ Ġsystem Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( adjust Margins ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Left Ġ= Ġif Ġ( margin Left ) Ġsystem Bars . left Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Top Ġ= Ġif Ġ( margin Top ) Ġsystem Bars . top Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Right Ġ= Ġif Ġ( margin Right ) Ġsystem Bars . right Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Bottom Ġ= Ġif Ġ( margin Bottom ) Ġsystem Bars . bottom Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . update LayoutParams < Margin LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Margin Ġ= Ġmargins . left Ġ+ Ġsystem Left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġmargins . top Ġ+ Ġsystem Top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Margin Ġ= Ġmargins . right Ġ+ Ġsystem Right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Margin Ġ= Ġmargins . bottom Ġ+ Ġsystem Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġin sets Ġ// ĠAlways Ġreturn Ġthe Ġin sets , Ġso Ġthat Ġchildren Ġcan Ġalso Ġuse Ġthem . ĊĠĠĠ Ġ} Ċ } Ċ