package Ġexample . image viewer . view Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Rect Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . remember Scroll State Ċ import Ġandroidx . compose . foundation . horizontal Scroll Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . preferred Height Ċ import Ġandroidx . compose . foundation . layout . preferred Size Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . shape . Circle Shape Ċ import Ġandroidx . compose . material . Circular Progress Indicator Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . clip Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . as Image Bitmap Ċ import Ġandroidx . compose . ui . graphics . p ainter . Painter Ċ import Ġandroidx . compose . ui . graphics . Image Bitmap Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġexample . image viewer . core . Filter Type Ċ import Ġexample . image viewer . model . AppState Ċ import Ġexample . image viewer . model . Content State Ċ import Ġexample . image viewer . model . Screen Type Ċ import Ġexample . image viewer . style . Dark Gray Ċ import Ġexample . image viewer . style . Dark Green Ċ import Ġexample . image viewer . style . Foreground Ċ import Ġexample . image viewer . style . Mini ature Color Ċ import Ġexample . image viewer . style . Transparent Ċ import Ġexample . image viewer . style . ic Back Ċ import Ġexample . image viewer . style . ic Filter Blur Off Ċ import Ġexample . image viewer . style . ic Filter Blur On Ċ import Ġexample . image viewer . style . ic Filter Gray scale Off Ċ import Ġexample . image viewer . style . ic Filter Gray scale On Ċ import Ġexample . image viewer . style . ic Filter Pixel Off Ċ import Ġexample . image viewer . style . ic Filter Pixel On Ċ import Ġexample . image viewer . utils . adjust Image Scale Ċ import Ġexample . image viewer . utils . display Width Ċ import Ġexample . image viewer . utils . getDisplay Bounds Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . round ToInt Ċ Ċ @ Composable Ċ fun Ġset Image FullScreen ( ĊĠĠĠ Ġcontent : ĠContent State Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( content . is Content Ready ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ToolBar ( content . getSelected Image Name (), Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Image ( content ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġset Loading Screen () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun Ġset Loading Screen () Ġ{ ĊĊĠĠĠ ĠBox Ġ{ ĊĠĠĠĠĠĠĠ ĠSurface ( color Ġ= ĠMini ature Color , Ġmodifier Ġ= ĠModifier . preferred Height ( 4 4 . dp )) Ġ{} ĊĠĠĠĠĠĠĠ ĠBox Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface ( color Ġ= ĠDark Gray , Ġelevation Ġ= Ġ 4 . dp , Ġshape Ġ= ĠCircle Shape ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircular Progress Indicator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . preferred Size ( 5 0 . dp ). padding ( 3 . dp , Ġ 3 . dp , Ġ 4 . dp , Ġ 4 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠDark Green ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun Ġset ToolBar ( ĊĠĠĠ Ġtext : ĠString , ĊĠĠĠ Ġcontent : ĠContent State Ċ ) Ġ{ ĊĠĠĠ Ġval Ġscroll State Ġ= Ġremember Scroll State () ĊĠĠĠ ĠSurface ( color Ġ= ĠMini ature Color , Ġmodifier Ġ= ĠModifier . preferred Height ( 4 4 . dp )) Ġ{ ĊĠĠĠĠĠĠĠ ĠRow ( modifier Ġ= ĠModifier . padding ( end Ġ= Ġ 3 0 . dp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠTr ansparent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 2 0 . dp ). align ( Alignment . Center Vert ically ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= ĠCircle Shape ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClick able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content . is Content Ready ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . restore Main Image () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp State . screen State ( Screen Type . Main ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic Back (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . preferred Size ( 3 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠFore ground , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 3 0 . dp ). weight ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( Alignment . Center Vert ically ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . body 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor ( 2 5 5 , Ġ 2 5 5 , Ġ 2 5 5 , Ġ 4 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . preferred Size ( 1 5 4 . dp , Ġ 3 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( Alignment . Center Vert ically ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= ĠCircle Shape ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRow ( Modifier . horizontal Scroll ( scroll State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin ĠFilter Type . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFilter Button ( content , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠFilter Button ( ĊĠĠĠ Ġcontent : ĠContent State , ĊĠĠĠ Ġtype : ĠFilter Type , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier . preferred Size ( 3 8 . dp ) Ċ ) Ġ{ ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . background ( color Ġ= ĠTr ansparent ). clip ( Circle Shape ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠClick able ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġcontent . toggle Filter ( type ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Filter Image ( type Ġ= Ġtype , Ġcontent Ġ= Ġcontent ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSp acer ( Modifier . width ( 2 0 . dp )) Ċ } Ċ Ċ @ Composable Ċ fun Ġget Filter Image ( type : ĠFilter Type , Ġcontent : ĠContent State ): ĠP ainter Ġ{ ĊĊĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFilter Type . Gray Scale Ġ-> Ġif Ġ( content . is Filter Enabled ( type )) Ġic Filter Gray scale On () Ġelse Ġic Filter Gray scale Off () ĊĠĠĠĠĠĠĠ ĠFilter Type . Pixel Ġ-> Ġif Ġ( content . is Filter Enabled ( type )) Ġic Filter Pixel On () Ġelse Ġic Filter Pixel Off () ĊĠĠĠĠĠĠĠ ĠFilter Type . Blur Ġ-> Ġif Ġ( content . is Filter Enabled ( type )) Ġic Filter Blur On () Ġelse Ġic Filter Blur Off () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun Ġset Image ( content : ĠContent State ) Ġ{ ĊĊĠĠĠ Ġval Ġdrag Ġ= ĠDrag Handler () ĊĠĠĠ Ġval Ġscale Ġ= ĠScale Handler () ĊĊĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠDark Gray , ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDrag gable ( on Drag Ġ= Ġdrag , Ġmodifier Ġ= ĠModifier . fill MaxSize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScal able ( on Scale Ġ= Ġscale , Ġmodifier Ġ= ĠModifier . fill MaxSize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġimage By Gesture ( content , Ġscale , Ġdrag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġbitmap . as Image Bitmap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= Ġadjust Image Scale ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun Ġimage By Gesture ( ĊĠĠĠ Ġcontent : ĠContent State , ĊĠĠĠ Ġscale : ĠScale Handler , ĊĠĠĠ Ġdrag : ĠDrag Handler Ċ ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġbitmap Ġ= Ġcrop Bitmap By Scale ( content . getSelected Image (), Ġscale . factor . value , Ġdrag ) ĊĊĠĠĠ Ġif Ġ( scale . factor . value Ġ> Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĊĠĠĠ Ġif Ġ( abs ( drag . get Distance (). x ) Ġ> Ġdisplay Width () Ġ/ Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( drag . get Distance (). x Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . swipe Next () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . swipe Previous () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdrag . on Cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbitmap Ċ } Ċ Ċ private Ġfun Ġcrop Bitmap By Scale ( bitmap : ĠBitmap , Ġscale : ĠFloat , Ġdrag : ĠDrag Handler ): ĠBitmap Ġ{ ĊĊĠĠĠ Ġval Ġcrop Ġ= Ġcrop Bitmap By Bounds ( ĊĠĠĠĠĠĠĠ Ġbitmap , ĊĠĠĠĠĠĠĠ Ġget Display Bounds ( bitmap ), ĊĠĠĠĠĠĠĠ Ġscale , ĊĠĠĠĠĠĠĠ Ġdrag ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn ĠBitmap . create Bitmap ( ĊĠĠĠĠĠĠĠ Ġbitmap , ĊĠĠĠĠĠĠĠ Ġcrop . left , ĊĠĠĠĠĠĠĠ Ġcrop . top , ĊĠĠĠĠĠĠĠ Ġcrop . right Ġ- Ġcrop . left , ĊĠĠĠĠĠĠĠ Ġcrop . bottom Ġ- Ġcrop . top ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġcrop Bitmap By Bounds ( ĊĠĠĠ Ġbitmap : ĠBitmap , ĊĠĠĠ Ġbounds : ĠRect , ĊĠĠĠ Ġscale Factor : ĠFloat , ĊĠĠĠ Ġdrag : ĠDrag Handler Ċ ): ĠRect Ġ{ ĊĊĠĠĠ Ġif Ġ( scale Factor Ġ<= Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġreturn ĠRect ( 0 , Ġ 0 , Ġbitmap . width , Ġbitmap . height ) ĊĊĠĠĠ Ġvar Ġscale Ġ= Ġscale Factor . toDouble (). pow ( 1 . 4 ) ĊĊĠĠĠ Ġvar Ġbound W Ġ= Ġ( bounds . width () Ġ/ Ġscale ). round ToInt () ĊĠĠĠ Ġvar Ġbound H Ġ= Ġ( bounds . height () Ġ/ Ġscale ). round ToInt () ĊĊĠĠĠ Ġscale Ġ*= Ġdisplay Width () Ġ/ Ġbounds . width (). toDouble () ĊĊĠĠĠ Ġval Ġoffset X Ġ= Ġdrag . get Amount (). x Ġ/ Ġscale ĊĠĠĠ Ġval Ġoffset Y Ġ= Ġdrag . get Amount (). y Ġ/ Ġscale ĊĊĠĠĠ Ġif Ġ( bound W Ġ> Ġbitmap . width ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbound W Ġ= Ġbitmap . width ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( bound H Ġ> Ġbitmap . height ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbound H Ġ= Ġbitmap . height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinvisible W Ġ= Ġbitmap . width Ġ- Ġbound W ĊĠĠĠ Ġvar Ġleft Offset Ġ= Ġ( invisible W Ġ/ Ġ 2 . 0 Ġ- Ġoffset X ). round ToInt (). toFloat () ĊĊĠĠĠ Ġif Ġ( left Offset Ġ> Ġinvisible W ) Ġ{ ĊĠĠĠĠĠĠĠ Ġleft Offset Ġ= Ġinvisible W . toFloat () ĊĠĠĠĠĠĠĠ Ġdrag . get Amount (). x Ġ= Ġ- (( invisible W Ġ/ Ġ 2 . 0 ) Ġ* Ġscale ). round ToInt (). toFloat () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( left Offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrag . get Amount (). x Ġ= Ġ(( invisible W Ġ/ Ġ 2 . 0 ) Ġ* Ġscale ). round ToInt (). toFloat () ĊĠĠĠĠĠĠĠ Ġleft Offset Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinvisible H Ġ= Ġbitmap . height Ġ- Ġbound H ĊĠĠĠ Ġvar Ġtop Offset Ġ= Ġ( invisible H Ġ/ Ġ 2 Ġ- Ġoffset Y ). round ToInt (). toFloat () ĊĊĠĠĠ Ġif Ġ( top Offset Ġ> Ġinvisible H ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtop Offset Ġ= Ġinvisible H . toFloat () ĊĠĠĠĠĠĠĠ Ġdrag . get Amount (). y Ġ= Ġ- (( invisible H Ġ/ Ġ 2 . 0 ) Ġ* Ġscale ). round ToInt (). toFloat () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( top Offset Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrag . get Amount (). y Ġ= Ġ(( invisible H Ġ/ Ġ 2 . 0 ) Ġ* Ġscale ). round ToInt (). toFloat () ĊĠĠĠĠĠĠĠ Ġtop Offset Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠRect ( ĊĠĠĠĠĠĠĠ Ġleft Offset . toInt (), ĊĠĠĠĠĠĠĠ Ġtop Offset . toInt (), ĊĠĠĠĠĠĠĠ Ġ( left Offset Ġ+ Ġbound W ). toInt (), ĊĠĠĠĠĠĠĠ Ġ( top Offset Ġ+ Ġbound H ). toInt () ĊĠĠĠ Ġ) Ċ } Ċ