package Ġcom . squared c andy . material banner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Transformation Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . core . content . with Styled Attributes Ċ import Ġcom . google . android . material . button . Material Button Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof ĠMaterial Ġdesign 's ĠBanner Ġfor ĠAndroid Ċ Ġ* Ġhttps :// material . io / components / b anners Ċ Ġ*/ Ċ class ĠMaterial Banner View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull Ċ ) Ġ: ĠLinearLayout ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġnegative ClickListener : ĠOn ClickListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpositive ClickListener : ĠOn ClickListener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġcontext TextView : ĠTextView ĊĠĠĠ Ġprivate Ġval Ġnegative Button : ĠMaterial Button ĊĠĠĠ Ġprivate Ġval Ġpositive Button : ĠMaterial Button ĊĠĠĠ Ġprivate Ġval Ġicon ImageView : ĠImageView ĊĊĠĠĠ Ġvar Ġis Visible : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠView . inflate ( context , ĠR . layout . view _ banner , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġcontext TextView Ġ= Ġview . findViewById ( R . id . banner _ content ) ĊĠĠĠĠĠĠĠ Ġnegative Button Ġ= Ġview . findViewById ( R . id . banner _ button _ negative ) ĊĠĠĠĠĠĠĠ Ġpositive Button Ġ= Ġview . findViewById ( R . id . banner _ button _ positive ) ĊĠĠĠĠĠĠĠ Ġicon ImageView Ġ= Ġview . findViewById ( R . id . banner _ icon ) ĊĊĠĠĠĠĠĠĠ Ġnegative Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnegative ClickListener ?. onClick ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpositive Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositive ClickListener ?. onClick ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext . with Styled Attributes ( attrs , ĠR . style able . Material Banner View , Ġ 0 , Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Text Ġ= ĠgetString ( R . style able . Material Banner View _ context Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnegative ButtonText Ġ= ĠgetString ( R . style able . Material Banner View _ negative ButtonText ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpositive ButtonText Ġ= ĠgetString ( R . style able . Material Banner View _ positive ButtonText ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġget Drawable ( R . style able . Material Banner View _ icon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext TextView . text Ġ= Ġcontent Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( negative ButtonText Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button . text Ġ= Ġnegative ButtonText ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( positive ButtonText Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button . text Ġ= Ġpositive ButtonText ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Icon ( icon ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow () Ġ= Ġthis . expand () ĊĊĠĠĠ Ġfun Ġdismiss () Ġ= Ġthis . collapse () ĊĊĠĠĠ Ġfun Ġset Negative Button (@ String Res Ġstring Res : ĠInt ?, ĠonClick Listener : Ġ( View ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Negative Button ( string Res , ĠOn ClickListener Ġ{ ĠonClick Listener ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Negative Button ( string : ĠString ?, ĠonClick Listener : Ġ( View ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Negative Button ( string , ĠOn ClickListener Ġ{ ĠonClick Listener ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Negative Button (@ String Res Ġstring Res : ĠInt ?, ĠonClick Listener : ĠOn ClickListener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġstring Res ?. let Ġ{ Ġcontext . getString ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġset Negative Button ( string , ĠonClick Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Negative Button ( string : ĠString ?, ĠonClick Listener : ĠOn ClickListener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġnegative Button . text Ġ= Ġstring ĊĠĠĠĠĠĠĠ Ġnegative ClickListener Ġ= ĠonClick Listener ĊĠĠĠĠĠĠĠ Ġif ( string Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Negative Button ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenable Negative Button ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnegative Button . visibility Ġ= Ġif ( enabled ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Positive Button (@ String Res Ġstring Res : ĠInt ?, ĠonClick Listener : Ġ( View ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Positive Button ( string Res , ĠOn ClickListener Ġ{ ĠonClick Listener ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Positive Button ( string : ĠString ?, ĠonClick Listener : Ġ( View ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Positive Button ( string , ĠOn ClickListener Ġ{ ĠonClick Listener ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Positive Button (@ String Res Ġstring Res : ĠInt ?, ĠonClick Listener : ĠOn ClickListener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġstring Res ?. let Ġ{ Ġcontext . getString ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġset Positive Button ( string , ĠonClick Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Positive Button ( string : ĠString ?, ĠonClick Listener : ĠOn ClickListener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġpositive Button . text Ġ= Ġstring ĊĠĠĠĠĠĠĠ Ġpositive ClickListener Ġ= ĠonClick Listener ĊĠĠĠĠĠĠĠ Ġif ( string Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Positive Button ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenable Positive Button ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpositive Button . visibility Ġ= Ġif ( enabled ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Icon (@ Drawable Res Ġdrawable Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Icon ( context . get Drawable ( drawable Res )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Icon ( drawable : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġicon ImageView . setImage Drawable ( drawable ) ĊĠĠĠĠĠĠĠ Ġicon ImageView . visibility Ġ= Ġif ( drawable Ġ!= Ġnull ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Context Text (@ String Res Ġstring Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext TextView . setText ( string Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Context Text ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext TextView . text Ġ= Ġtext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . expand () Ġ{ ĊĠĠĠĠĠĠĠ Ġmeasure ( ViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġheight Ġwe Ġwant Ġto Ġget Ġto ĊĠĠĠĠĠĠĠ Ġval Ġtarget Height Ġ= Ġmeasured Height ĊĊĠĠĠĠĠĠĠ Ġ// ĠForce Ġthe Ġheight Ġto Ġbe Ġ 0 ĊĠĠĠĠĠĠĠ Ġlayout Params . height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġvisibility Ġto ĠVIS IBLE Ġas Ġit Ġis Ġmost Ġlikely ĠG ONE Ġright Ġnow ĊĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġval Ġexpand Animation Ġ= Ġobject Ġ: ĠAnimation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Transformation ( interpol ated Time : ĠFloat , Ġt : ĠTransformation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . height Ġ= Ġif Ġ( interpol ated Time Ġ>= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġit Ġat Ġthe Ġcorrect Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ( target Height Ġ* Ġinterpolated Time ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwill Change Bounds (): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpand Animation . duration Ġ= Ġ( target Height . toFloat () Ġ/ Ġcontext . resources . display Metrics . density ). to Long () ĊĠĠĠĠĠĠĠ Ġstart Animation ( expand Animation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . collapse () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCurrent Ġheight ĊĠĠĠĠĠĠĠ Ġval Ġinitial Height Ġ= Ġmeasured Height ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= Ġobject Ġ: ĠAnimation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Transformation ( interpol ated Time : ĠFloat , Ġt : ĠTransformation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( interpol ated Time Ġ== Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġit Ġdis appear Ġwhen Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġget Ġthe Ġapproximate Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . height Ġ= Ġinitial Height Ġ- Ġ( initial Height Ġ* Ġinterpolated Time ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwill Change Bounds (): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimation . duration Ġ= Ġ( initial Height . toFloat () Ġ/ Ġcontext . resources . display Metrics . density ). to Long () ĊĠĠĠĠĠĠĠ Ġstart Animation ( animation ) ĊĠĠĠ Ġ} Ċ }