package Ġcom . mini bug dev . drawable badge Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . view . Gravity Ċ import Ġandroidx . annotation .* Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ Ċ class ĠDrawable Badge Ġprivate Ġconstructor ( val Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Color Int Ġval ĠtextColor : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Color Int Ġval Ġbadge Color : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Color Int Ġval Ġbadge BorderColor : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbadge Border Size : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbadge Size : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbadge Gravity : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbadge Margin : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap : ĠBitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Show Border : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaximum Counter : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Show Counter : ĠBoolean , ){ ĊĊ ĉ class ĠBuilder ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĉ ĉ @ Color Int Ġprivate Ġvar ĠtextColor : ĠInt ? Ġ= Ġnull Ċĉ ĉ @ Color Int Ġprivate Ġvar Ġbadge Color : ĠInt ? Ġ= Ġnull Ċĉ ĉ @ Color Int Ġprivate Ġvar Ġbadge BorderColor : ĠInt ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġbadge Border Size : ĠFloat ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġbadge Size : ĠFloat ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġbadge Gravity : ĠInt ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġbadge Margin : ĠFloat ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġbitmap : ĠBitmap ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġis Show Border : ĠBoolean ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġmaximum Counter : ĠInt ? Ġ= Ġnull Ċĉ ĉ private Ġvar Ġis Show Counter : ĠBoolean ? Ġ= Ġnull ĊĊĉ ĉ private Ġfun Ġcreate Bitmap From Drawable ( drawable : ĠDrawable ): ĠBitmap Ġ{ Ċĉĉ ĉ val Ġbitmap Ġ= ĠBitmap . create Bitmap ( drawable . intrinsic Width , Ġdrawable . intrinsic Height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) Ċĉĉ ĉ val Ġcanvas Ġ= ĠCanvas ( bitmap ) Ċĉĉ ĉ drawable . setBounds ( 0 , Ġ 0 , Ġcanvas . width , Ġcanvas . height ) Ċĉĉ ĉ drawable . draw ( canvas ) Ċĉĉ ĉ return Ġbitmap Ċĉ ĉ } ĊĊĉ ĉ fun Ġdrawable Res Id (@ Drawable Res Ġdrawable Res : ĠInt ) Ġ= Ġapply Ġ{ Ċĉĉ ĉ val Ġres Ġ= Ġcontext . resources Ċĉĉ ĉ bitmap Ġ= ĠBitmap Factory . decode Resource ( res , Ġdrawable Res ) ĊĊĉĉ ĉ if Ġ( bitmap Ġ== Ġnull ) Ġ{ Ċĉĉĉ ĉ Resources Compat . get Drawable ( res , Ġdrawable Res , Ġnull ) Ċĉĉĉĉ ĉ ?. current Ċĉĉĉĉ ĉ ?. let Ġ{ Ċĉĉĉĉĉ ĉ drawable ( it ) Ċĉĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġdrawable ( drawable : ĠDrawable ): ĠBuilder Ġ= Ġapply Ġ{ Ċĉĉ ĉ val Ġdrawable Compat Ġ= ĠDrawable Compat . wrap ( drawable ) Ċĉĉ ĉ bitmap Ġ= Ġwhen Ġ( drawable Compat ) Ġ{ Ċĉĉĉ ĉ is ĠBitmap Drawable Ġ-> Ġdrawable Compat . bitmap Ċĉĉĉ ĉ else ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġcreate Bitmap From Drawable ( drawable Compat ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ fun Ġbitmap ( bitmap : ĠBitmap ) Ġ= Ġapply Ġ{ Ġthis . bitmap Ġ= Ġbitmap Ġ} ĊĊĉ ĉ fun ĠtextColor (@ Color Res ĠtextColor Res : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . textColor Ġ= ĠContext Compat . getColor ( context , ĠtextColor Res ) Ġ} ĊĊĉ ĉ fun Ġbadge Color (@ Color Res Ġbadge Color Res : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . badge Color Ġ= ĠContext Compat . getColor ( context , Ġbadge Color Res ) Ġ} ĊĊĉ ĉ fun Ġbadge BorderColor (@ Color Res Ġbadge BorderColor Res : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . badge BorderColor Ġ= ĠContext Compat . getColor ( context , Ġbadge BorderColor Res ) Ġ} ĊĊĉ ĉ fun Ġbadge Border Size (@ Dim en Res Ġbadge Border Size : ĠInt ) Ġ= Ġapply Ġ{ Ċĉĉ ĉ this . badge Border Size Ġ= Ġcontext . resources . get Dimension Pixel Offset ( badge Border Size ) Ċĉĉĉ ĉ . toFloat () Ċĉ ĉ } ĊĊĉ ĉ fun Ġbadge Border Size (@ Px Ġbadge Border Size : ĠFloat ) Ġ= Ġapply Ġ{ Ġthis . badge Border Size Ġ= Ġbadge Border Size Ġ} ĊĊĉ ĉ fun Ġbadge Size (@ Dim en Res Ġbadge Size : ĠInt ) Ġ= Ġapply Ġ{ Ċĉĉ ĉ this . badge Size Ġ= Ġcontext . resources . get Dimension Pixel Offset ( badge Size ) Ċĉĉĉ ĉ . toFloat () Ċĉ ĉ } ĊĊĉ ĉ fun Ġbadge Size (@ Px Ġbadge Size : ĠFloat ) Ġ= Ġapply Ġ{ Ġthis . badge Size Ġ= Ġbadge Size Ġ} ĊĊĉ ĉ fun Ġbadge Gravity ( badge Gravity : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . badge Gravity Ġ= Ġbadge Gravity Ġ} ĊĊĉ ĉ fun Ġbadge Margin (@ Dim en Res Ġbadge Margin : ĠInt ) Ġ= Ġapply Ġ{ Ċĉĉ ĉ this . badge Margin Ġ= Ġcontext . resources . get Dimension Pixel Offset ( badge Margin ) Ċĉĉĉ ĉ . toFloat () Ċĉ ĉ } ĊĊĉ ĉ fun Ġbadge Margin (@ Px Ġbadge Margin : ĠFloat ) Ġ= Ġapply Ġ{ Ġthis . badge Margin Ġ= Ġbadge Margin Ġ} ĊĊĉ ĉ fun Ġshow Border ( is Show Border : ĠBoolean ) Ġ= Ġapply Ġ{ Ġthis . is Show Border Ġ= Ġis Show Border Ġ} ĊĊĉ ĉ fun Ġmaximum Counter ( maximum Counter : ĠInt ) Ġ= Ġapply Ġ{ Ġthis . maximum Counter Ġ= Ġmaximum Counter Ġ} ĊĊĉ ĉ fun Ġshow Counter ( is Show Counter : ĠBoolean ) Ġ= Ġapply Ġ{ Ġthis . is Show Counter Ġ= Ġis Show Counter Ġ} ĊĊĉ ĉ fun Ġbuild (): ĠDrawable Badge Ġ{ Ċĉĉ ĉ if Ġ( bitmap Ġ== Ġnull ) Ġthrow ĠIllegalArgumentException (" Badge Ġdrawable / bitmap Ġcan Ġnot Ġbe Ġnull .") Ċĉĉ ĉ if Ġ( badge Size Ġ== Ġnull ) Ġbadge Size ( R . dim en . default _ badge _ size ) Ċĉĉ ĉ if Ġ( textColor Ġ== Ġnull ) ĠtextColor ( R . color . default _ badge _ text _ color ) Ċĉĉ ĉ if Ġ( badge Color Ġ== Ġnull ) Ġbadge Color ( R . color . default _ badge _ color ) Ċĉĉ ĉ if Ġ( badge BorderColor Ġ== Ġnull ) Ġbadge BorderColor ( R . color . default _ badge _ border _ color ) Ċĉĉ ĉ if Ġ( badge Border Size Ġ== Ġnull ) Ġbadge Border Size ( R . dim en . default _ badge _ border _ size ) Ċĉĉ ĉ if Ġ( badge Gravity Ġ== Ġnull ) Ġbadge Gravity ( Gravity . TOP Ġor ĠGr avity . END ) Ċĉĉ ĉ if Ġ( is Show Border Ġ== Ġnull ) Ġshow Border ( true ) Ċĉĉ ĉ if Ġ( maximum Counter Ġ== Ġnull ) Ġmaximum Counter ( MAXIMUM _ COUNT ) Ċĉĉ ĉ if Ġ( is Show Counter Ġ== Ġnull ) Ġshow Counter ( true ) ĊĊĉĉ ĉ return ĠDrawable Badge ( Ċĉĉĉĉ ĉ context Ġ= Ġcontext , Ċĉĉĉĉ ĉ bitmap Ġ= Ġbitmap !! , Ċĉĉĉĉ ĉ textColor Ġ= ĠtextColor !! , Ċĉĉĉĉ ĉ badge Color Ġ= Ġbadge Color !! , Ċĉĉĉĉ ĉ badge BorderColor Ġ= Ġbadge BorderColor !! , Ċĉĉĉĉ ĉ badge Border Size Ġ= Ġbadge Border Size !! , Ċĉĉĉĉ ĉ badge Size Ġ= Ġbadge Size !! , Ċĉĉĉĉ ĉ badge Gravity Ġ= Ġbadge Gravity !! , Ċĉĉĉĉ ĉ badge Margin Ġ= Ġbadge Margin Ġ?: Ġ 0 . 0 f , Ċĉĉĉĉ ĉ is Show Border Ġ= Ġis Show Border !! , Ċĉĉĉĉ ĉ maximum Counter Ġ= Ġmaximum Counter !! , Ċĉĉĉĉ ĉ is Show Counter Ġ= Ġis Show Counter !! ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ fun Ġget ( counter : ĠInt ): ĠDrawable Ġ{ Ċĉ ĉ val Ġresources Ġ= Ġcontext . resources Ċĉ ĉ if Ġ( counter Ġ== Ġ 0 ) Ġreturn ĠBitmap Drawable ( resources , Ġbitmap ) ĊĊĉ ĉ val Ġsource Bitmap Ġ= Ġbitmap Ċĉ ĉ val Ġwidth Ġ= Ġsource Bitmap . width Ċĉ ĉ val Ġheight Ġ= Ġsource Bitmap . height Ċĉ ĉ val Ġoutput Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĊĉ ĉ val Ġcanvas Ġ= ĠCanvas ( output ) Ċĉ ĉ val Ġrect Ġ= ĠRect ( 0 , Ġ 0 , Ġwidth , Ġheight ) Ċĉ ĉ val Ġpaint Ġ= ĠPaint (). apply Ġ{ Ċĉĉ ĉ is Anti Alias Ġ= Ġtrue Ċĉĉ ĉ is Filter Bitmap Ġ= Ġtrue Ċĉĉ ĉ is D ither Ġ= Ġtrue Ċĉĉ ĉ textAlign Ġ= ĠPaint . Align . CENTER Ċĉĉ ĉ color Ġ= Ġbadge Color Ċĉ ĉ } Ċĉ ĉ canvas . draw Bitmap ( source Bitmap , Ġrect , Ġrect , Ġpaint ) ĊĊĉ ĉ val Ġbadge Rect Ġ= Ġget Badge Rect ( rect ) Ċĉ ĉ canvas . draw O val ( badge Rect , Ġpaint ) ĊĊĉ ĉ if Ġ( is Show Border ) Ġ{ Ċĉĉ ĉ val Ġpaint Border Ġ= ĠPaint (). apply Ġ{ Ċĉĉĉ ĉ is Anti Alias Ġ= Ġtrue Ċĉĉĉ ĉ is Filter Bitmap Ġ= Ġtrue Ċĉĉĉ ĉ is D ither Ġ= Ġtrue Ċĉĉĉ ĉ textAlign Ġ= ĠPaint . Align . CENTER Ċĉĉĉ ĉ style Ġ= ĠPaint . Style . ST RO KE Ċĉĉĉ ĉ color Ġ= Ġbadge BorderColor Ċĉĉĉ ĉ stroke Width Ġ= Ġbadge Border Size Ċĉĉ ĉ } Ċĉĉ ĉ canvas . draw O val ( badge Rect , Ġpaint Border ) Ċĉ ĉ } ĊĊĉ ĉ if ( is Show Counter ) Ġ{ Ċĉĉ ĉ val Ġtext Size : ĠFloat Ċĉĉ ĉ val Ġtext : ĠString Ċĉĉ ĉ val Ġmax Ġ= Ġif Ġ( maximum Counter Ġ> ĠMAX IMUM _ COUNT ) ĠMAX IMUM _ COUNT Ġelse Ġmaximum Counter Ċĉĉ ĉ if Ġ( counter Ġ> Ġmax ) Ġ{ Ċĉĉĉ ĉ text Size Ġ= Ġbadge Rect . height () Ġ* Ġ 0 . 4 5 f Ċĉĉĉ ĉ text Ġ= Ġ"$ max +" Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ text Size Ġ= Ġbadge Rect . height () Ġ* Ġ 0 . 5 5 f Ċĉĉĉ ĉ text Ġ= Ġcounter . toString () Ċĉĉ ĉ } ĊĊĉĉ ĉ val Ġtext Paint Ġ= ĠText Paint (). apply Ġ{ Ċĉĉĉ ĉ this . is Anti Alias Ġ= Ġtrue Ċĉĉĉ ĉ this . color Ġ= ĠtextColor Ċĉĉĉ ĉ this . text Size Ġ= Ġtext Size Ċĉĉ ĉ } ĊĊĉĉ ĉ val Ġx Ġ= Ġbadge Rect . center X () Ġ- Ġ( text Paint . measure Text ( text ) Ġ/ Ġ 2 f ) Ċĉĉ ĉ val Ġy Ġ= Ġbadge Rect . center Y () Ġ- Ġ( text Paint . as cent () Ġ+ Ġtext Paint . desc ent ()) Ġ* Ġ 0 . 5 f Ċĉĉ ĉ canvas . draw Text ( text , Ġx , Ġy , Ġtext Paint ) Ċĉ ĉ } ĊĊĉ ĉ return ĠBitmap Drawable ( resources , Ġoutput ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġget Badge Rect ( bound : ĠRect ): ĠRect F Ġ{ Ċĉ ĉ val Ġborder Size Ġ= Ġif Ġ( is Show Border ) Ġbadge Border Size Ġelse Ġ 0 f Ċĉ ĉ val Ġadjust Space Ġ= Ġborder Size Ġ+ Ġbadge Margin ĊĊĉ ĉ val Ġdest Ġ= ĠRect () Ċĉ ĉ val Ġsize Ġ= Ġbadge Size . toInt () Ċĉ ĉ Gravity . apply ( badge Gravity , Ġsize , Ġsize , Ġbound , Ġadjust Space . toInt (), Ġadjust Space . toInt (), Ġdest ) Ċĉ ĉ return ĠRect F ( dest ) Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ private Ġconst Ġval ĠMAX IMUM _ COUNT Ġ= Ġ 9 9 Ċ ĉ } Ċ } Ċ