package Ġcom . luc . log ins ystem . utils ĊĊ Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . core . view . Window Insets Compat Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . databinding . Binding Adapter Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . google . android . material . elevation . Elevation Overlay Provider Ċ Ċ @ Binding Adapter (" src Url ", Ġ" circle Crop ", Ġ" placeholder ", Ġrequire All Ġ= Ġfalse ) Ċ fun ĠImageView . bind Src Url ( ĊĠĠĠ Ġurl : ĠString , ĊĠĠĠ Ġcircle Crop : ĠBoolean , ĊĠĠĠ Ġplaceholder : ĠDrawable ?, Ċ ) Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= ĠG lide . with ( this ). load ( url ) ĊĠĠĠ Ġif Ġ( circle Crop ) Ġrequest . circle Crop () ĊĠĠĠ Ġif Ġ( placeholder Ġ!= Ġnull ) Ġrequest . placeholder ( placeholder ) ĊĠĠĠ Ġrequest . into ( this ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAlter Ġthe Ġbackground Ġcolor Ġas Ġif Ġthis Ġview Ġhad Ġthe Ġgiven Ġelevation . ĠWe Ġdon 't Ġwant Ġto Ġactually Ċ Ġ* Ġuse Ġelevation Ġas Ġthe Ġdesign Ġcalls Ġfor Ġno Ġshadow . Ċ Ġ*/ Ċ @ Binding Adapter (" elevation Overlay ") Ċ fun ĠView . bind Elevation Overlay ( previous Elevation : ĠFloat , Ġelevation : ĠFloat ) Ġ{ ĊĠĠĠ Ġif Ġ( previous Elevation Ġ== Ġelevation ) Ġreturn ĊĠĠĠ Ġval Ġcolor Ġ= ĠE levation Overlay Provider ( context ) ĊĠĠĠĠĠĠĠ Ġ. composite Overlay With Theme Surface Color IfNeeded ( elevation ) ĊĠĠĠ Ġset BackgroundColor ( color ) Ċ } Ċ Ċ @ Binding Adapter (" layout Fullscreen ") Ċ fun ĠView . bind Layout Fullscreen ( previous Fullscreen : ĠBoolean , Ġfullscreen : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( previous Fullscreen Ġ!= Ġfullscreen Ġ&& Ġfullscreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġnew Ġalternative Ġis ĠWindow Compat . set Decor Fits System Windows , Ġbut Ġwe Ġcan 't ĊĠĠĠĠĠĠĠ Ġ// Ġalways Ġget Ġaccess Ġto Ġthe Ġwindow Ġfrom Ġa Ġview . ĊĠĠĠĠĠĠĠ Ġsystem Ui Visibility Ġ= ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ ST ABLE Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ FULL SCREEN Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ HIDE _ NAV IG ATION ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Binding Adapter ( ĊĠĠĠ Ġ" padding Left System Window Insets ", ĊĠĠĠ Ġ" padding Top System Window Insets ", ĊĠĠĠ Ġ" padding Right System Window Insets ", ĊĠĠĠ Ġ" padding Bottom System Window Insets ", ĊĠĠĠ Ġrequire All Ġ= Ġfalse Ċ ) Ċ fun ĠView . apply System Window Insets Padding ( ĊĠĠĠ Ġprevious Apply Left : ĠBoolean , ĊĠĠĠ Ġprevious Apply Top : ĠBoolean , ĊĠĠĠ Ġprevious Apply Right : ĠBoolean , ĊĠĠĠ Ġprevious Apply Bottom : ĠBoolean , ĊĠĠĠ Ġapply Left : ĠBoolean , ĊĠĠĠ Ġapply Top : ĠBoolean , ĊĠĠĠ Ġapply Right : ĠBoolean , ĊĠĠĠ Ġapply Bottom : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( previous Apply Left Ġ== Ġapply Left Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Apply Top Ġ== Ġapply Top Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Apply Right Ġ== Ġapply Right Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Apply Bottom Ġ== Ġapply Bottom ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdo On Apply Window Insets Ġ{ Ġview , Ġin sets , Ġpadding , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsystem Bars Ġ= Ġin sets . get Insets ( Window Insets Compat . Type . system Bars ()) ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġif Ġ( apply Left ) Ġsystem Bars . left Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġif Ġ( apply Top ) Ġsystem Bars . top Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġif Ġ( apply Right ) Ġsystem Bars . right Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġif Ġ( apply Bottom ) Ġsystem Bars . bottom Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġview . set Padding ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding . left Ġ+ Ġleft , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding . top Ġ+ Ġtop , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding . right Ġ+ Ġright , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding . bottom Ġ+ Ġbottom ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Binding Adapter ( ĊĠĠĠ Ġ" margin Left System Window Insets ", ĊĠĠĠ Ġ" margin Top System Window Insets ", ĊĠĠĠ Ġ" margin Right System Window Insets ", ĊĠĠĠ Ġ" margin Bottom System Window Insets ", ĊĠĠĠ Ġrequire All Ġ= Ġfalse Ċ ) Ċ Ċ fun ĠView . apply System Window Insets Margin ( ĊĠĠĠ Ġprevious Apply Left : ĠBoolean , ĊĠĠĠ Ġprevious Apply Top : ĠBoolean , ĊĠĠĠ Ġprevious Apply Right : ĠBoolean , ĊĠĠĠ Ġprevious Apply Bottom : ĠBoolean , ĊĠĠĠ Ġapply Left : ĠBoolean , ĊĠĠĠ Ġapply Top : ĠBoolean , ĊĠĠĠ Ġapply Right : ĠBoolean , ĊĠĠĠ Ġapply Bottom : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( previous Apply Left Ġ== Ġapply Left Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Apply Top Ġ== Ġapply Top Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Apply Right Ġ== Ġapply Right Ġ&& ĊĠĠĠĠĠĠĠ Ġprevious Apply Bottom Ġ== Ġapply Bottom ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdo On Apply Window Insets Ġ{ Ġview , Ġin sets , Ġ_, Ġmargin Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġsystem Bars Ġ= Ġin sets . get Insets ( Window Insets Compat . Type . system Bars ()) ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġif Ġ( apply Left ) Ġsystem Bars . left Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġif Ġ( apply Top ) Ġsystem Bars . top Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġif Ġ( apply Right ) Ġsystem Bars . right Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġif Ġ( apply Bottom ) Ġsystem Bars . bottom Ġelse Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġview . update LayoutParams < ViewGroup . Margin LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Margin Ġ= Ġmargin . left Ġ+ Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġmargin . top Ġ+ Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Margin Ġ= Ġmargin . right Ġ+ Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Margin Ġ= Ġmargin . bottom Ġ+ Ġbottom ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠView . do On Apply Window Insets ( ĊĠĠĠ Ġblock : Ġ( View , ĠWindow Insets Compat , ĠInitial Padding , ĠInitial Margin ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠCreate Ġa Ġsnapshot Ġof Ġthe Ġview 's Ġpadding Ġ& Ġmargin Ġstates ĊĠĠĠ Ġval Ġinitial Padding Ġ= Ġrecord Initial Padding For View ( this ) ĊĠĠĠ Ġval Ġinitial Margin Ġ= Ġrecord Initial Margin For View ( this ) ĊĠĠĠ Ġ// ĠSet Ġan Ġactual ĠOn Apply Window Insets Listener Ġwhich Ġproxies Ġto Ġthe Ġgiven ĊĠĠĠ Ġ// Ġlambda , Ġalso Ġpassing Ġin Ġthe Ġoriginal Ġpadding Ġ& Ġmargin Ġstates ĊĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( this ) Ġ{ Ġv , Ġin sets Ġ-> ĊĠĠĠĠĠĠĠ Ġblock ( v , Ġin sets , Ġinitial Padding , Ġinitial Margin ) ĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġreturn Ġthe Ġin sets , Ġso Ġthat Ġchildren Ġcan Ġalso Ġuse Ġthem ĊĠĠĠĠĠĠĠ Ġin sets ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġrequest Ġsome Ġin sets ĊĠĠĠ Ġrequest Apply Insets When Attached () Ċ } Ċ Ċ class ĠInitial Padding ( val Ġleft : ĠInt , Ġval Ġtop : ĠInt , Ġval Ġright : ĠInt , Ġval Ġbottom : ĠInt ) Ċ Ċ class ĠInitial Margin ( val Ġleft : ĠInt , Ġval Ġtop : ĠInt , Ġval Ġright : ĠInt , Ġval Ġbottom : ĠInt ) Ċ Ċ private Ġfun Ġrecord Initial Padding For View ( view : ĠView ) Ġ= ĠInitial Padding ( ĊĠĠĠ Ġview . padding Left , Ġview . padding Top , Ġview . padding Right , Ġview . padding Bottom Ċ ) Ċ Ċ private Ġfun Ġrecord Initial Margin For View ( view : ĠView ): ĠInitial Margin Ġ{ ĊĠĠĠ Ġval Ġlp Ġ= Ġview . layout Params Ġas ? ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Invalid Ġview Ġlayout Ġparams ") ĊĠĠĠ Ġreturn ĠInitial Margin ( lp . left Margin , Ġlp . top Margin , Ġlp . right Margin , Ġlp . bottom Margin ) Ċ } Ċ Ċ fun ĠView . request Apply Insets When Attached () Ġ{ ĊĠĠĠ Ġif Ġ( is Attached To Window ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġalready Ġattached , Ġjust Ġrequest Ġas Ġnormal ĊĠĠĠĠĠĠĠ Ġrequest Apply Insets () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġnot Ġattached Ġto Ġthe Ġhierarchy , Ġadd Ġa Ġlistener Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġrequest Ġwhen Ġwe Ġare ĊĠĠĠĠĠĠĠ Ġadd On Attach State ChangeListener ( object Ġ: ĠView . 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 ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }