package Ġcom . ar ast hel . span ned grid layout manager Ċ Ċ import Ġandroid . graphics . Rect Ċ Ċ /** Ċ Ġ* ĠA Ġhelper Ġto Ġfind Ġfree Ġrect s Ġin Ġthe Ġcurrent Ġlayout . Ċ Ġ*/ Ċ open Ġclass ĠRect s Helper ( ĊĠĠĠ Ġval Ġlayout Manager : ĠSp anned Grid LayoutManager , ĊĠĠĠ Ġval Ġorientation : ĠSp anned Grid LayoutManager . Orientation Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComparator Ġto Ġsort Ġfree Ġrect s Ġby Ġposition , Ġbased Ġon Ġorientation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrect Comparator Ġ= ĠComparator < Rect > Ġ{ Ġrect 1 , Ġrect 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp anned Grid LayoutManager . Orientation . VERTICAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect 1 . top Ġ== Ġrect 2 . top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect 1 . left Ġ< Ġrect 2 . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect 1 . top Ġ< Ġrect 2 . top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp anned Grid LayoutManager . Orientation . HORIZONTAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect 1 . left Ġ== Ġrect 2 . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect 1 . top Ġ< Ġrect 2 . top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect 1 . left Ġ< Ġrect 2 . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrows Ġ= Ġmutable Map Of < Int , ĠSet < Int >>() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCache Ġof Ġrect s Ġthat Ġare Ġalready Ġused ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrect s Cache Ġ= Ġmutable Map Of < Int , ĠRect >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġof Ġrect s Ġthat Ġare Ġstill Ġfree ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġfree Rects Ġ= Ġmutable ListOf < Rect >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFree Ġspace Ġto Ġdivide Ġin Ġspans ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( orientation Ġ== ĠSp anned Grid LayoutManager . Orientation . VERTICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . width Ġ- Ġlayout Manager . padding Left Ġ- Ġlayout Manager . padding Right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager . height Ġ- Ġlayout Manager . padding Top Ġ- Ġlayout Manager . padding Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpace Ġoccupied Ġby Ġeach Ġspan ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġitem Size : ĠInt Ġget () Ġ= Ġsize Ġ/ Ġlayout Manager . spans ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġrow / column Ġfor Ġfree Ġrect s ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġstart : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( orientation Ġ== ĠSp anned Grid LayoutManager . Orientation . VERTICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Rects [ 0 ]. top Ġ* Ġitem Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Rects [ 0 ]. left Ġ* Ġitem Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnd Ġrow / column Ġfor Ġfree Ġrect s ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġend : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( orientation Ġ== ĠSp anned Grid LayoutManager . Orientation . VERTICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( free Rects . last (). top Ġ+ Ġ 1 ) Ġ* Ġitem Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( free Rects . last (). left Ġ+ Ġ 1 ) Ġ* Ġitem Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThere Ġwill Ġalways Ġbe Ġa Ġfree Ġrect Ġthat Ġgoes Ġto ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġinitial Free Rect Ġ= Ġif Ġ( orientation Ġ== ĠSp anned Grid LayoutManager . Orientation . VERTICAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( 0 , Ġ 0 , Ġlayout Manager . spans , ĠInt . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( 0 , Ġ 0 , ĠInt . MAX _ VALUE , Ġlayout Manager . spans ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfree Rects . add ( initial Free Rect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġfree Ġrect Ġfor Ġthe Ġgiven Ġspan Ġand Ġitem Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind Rect ( position : ĠInt , Ġspan Size : ĠSpan Size ): ĠRect Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrect s Cache [ position ] Ġ?: Ġfind Rect For Span Size ( span Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġa Ġvalid Ġfree Ġrect Ġfor Ġthe Ġgiven Ġspan Ġsize ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġfind Rect For Span Size ( span Size : ĠSpan Size ): ĠRect Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlane Ġ= Ġfree Rects . first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Rect Ġ= ĠRect ( it . left , Ġit . top , Ġit . left Ġ+ Ġspan Size . width , Ġit . top Ġ+ Ġspan Size . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . contains ( item Rect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRect ( lane . left , Ġlane . top , Ġlane . left Ġ+ Ġspan Size . width , Ġlane . top Ġ+ Ġspan Size . height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPush Ġthis Ġrect Ġfor Ġthe Ġgiven Ġposition , Ġsubtract Ġit Ġfrom Ġ[ free Rects ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpush Rect ( position : ĠInt , Ġrect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġif Ġ( orientation Ġ== ĠSp anned Grid LayoutManager . Orientation . VERTICAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . top Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . left ĊĠĠĠĠĠĠĠ Ġval Ġstart Row Ġ= Ġrows [ start ]?. to Mutable Set () Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠ Ġstart Row . add ( position ) ĊĠĠĠĠĠĠĠ Ġrows [ start ] Ġ= Ġstart Row ĊĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġif Ġ( orientation Ġ== ĠSp anned Grid LayoutManager . Orientation . VERTICAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . bottom Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . right ĊĠĠĠĠĠĠĠ Ġval Ġend Row Ġ= Ġrows [ end Ġ- Ġ 1 ]?. to Mutable Set () Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠ Ġend Row . add ( position ) ĊĠĠĠĠĠĠĠ Ġrows [ end Ġ- Ġ 1 ] Ġ= Ġend Row ĊĊĠĠĠĠĠĠĠ Ġrect s Cache [ position ] Ġ= Ġrect ĊĠĠĠĠĠĠĠ Ġsubtract ( rect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Positions For Row ( row Position : ĠInt ): ĠSet < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrows [ row Position ] Ġ?: Ġempty Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthis Ġrect Ġfrom Ġthe Ġ[ free Rects ], Ġmerge Ġand Ġreorder Ġnew Ġfree Ġrect s ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġsubtract ( subtract ed Rect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinteresting Rects Ġ= Ġfree Rects . filter Ġ{ Ġit . is Adjacent To ( subtract ed Rect ) Ġ|| Ġit . intersect s ( subtract ed Rect ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpossible New Rects Ġ= Ġmutable ListOf < Rect >() ĊĠĠĠĠĠĠĠ Ġval Ġadjacent Rects Ġ= Ġmutable ListOf < Rect >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( free Ġin Ġinteresting Rects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( free . is Adjacent To ( subtract ed Rect ) Ġ&& Ġ! subtract ed Rect . contains ( free )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjacent Rects . add ( free ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Rects . remove ( free ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( free . left Ġ< Ġsubtract ed Rect . left ) Ġ{ Ġ// ĠLeft ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible New Rects . add ( Rect ( free . left , Ġfree . top , Ġsubtract ed Rect . left , Ġfree . bottom )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( free . right Ġ> Ġsubtract ed Rect . right ) Ġ{ Ġ// ĠRight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible New Rects . add ( Rect ( subtract ed Rect . right , Ġfree . top , Ġfree . right , Ġfree . bottom )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( free . top Ġ< Ġsubtract ed Rect . top ) Ġ{ Ġ// ĠTop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible New Rects . add ( Rect ( free . left , Ġfree . top , Ġfree . right , Ġsubtract ed Rect . top )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( free . bottom Ġ> Ġsubtract ed Rect . bottom ) Ġ{ Ġ// ĠBottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpossible New Rects . add ( Rect ( free . left , Ġsubtract ed Rect . bottom , Ġfree . right , Ġfree . bottom )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( rect Ġin Ġpossible New Rects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Adjacent Ġ= Ġadjacent Rects . first OrNull Ġ{ Ġit Ġ!= Ġrect Ġ&& Ġit . contains ( rect ) Ġ} Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Adjacent ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Cont ained Ġ= Ġpossible New Rects . first OrNull Ġ{ Ġit Ġ!= Ġrect Ġ&& Ġit . contains ( rect ) Ġ} Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cont ained ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Rects . add ( rect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfree Rects . sort With ( rect Comparator ) ĊĠĠĠ Ġ} Ċ }