package Ġjp . blank tar . ru um usic . view ĊĊ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . Parcelable Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . ContextMenu Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . TextView Ċ Ċ import Ġjp . blank tar . ru um usic . R Ċ import Ġjp . blank tar . ru um usic . util . R uu Directory Ċ import Ġjp . blank tar . ru um usic . util . R uu File Base ĊĊ Ċ class ĠF iler View ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: ĠFrame Layout ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġval Ġnamespace Ġ= Ġ" http :// ru um usic . blank tar . jp / view " ĊĊĠĠĠ Ġprivate Ġval Ġframe Ġ= ĠLayoutInflater . from ( context ). inflate ( R . layout . view _ filer , Ġthis ) ĊĠĠĠ Ġprivate Ġval Ġlist Ġ= Ġframe . findViewById < android x . recyclerview . widget . RecyclerView >( R . id . list ) !! ĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠAdapter () ĊĠĠĠ Ġprivate Ġval Ġlayout Ġ= ĠLinearLayoutManager ( context ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġlist . layout Manager Ġ= Ġlayout ĊĠĠĠĠĠĠĠ Ġlist . addItem Decoration ( Divider Decoration ( context )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġparent : ĠR uu Directory ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġhas Parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġx ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Ġ&& Ġ! has Parent Ġ-> Ġadapter . notify Item Removed ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! old Ġ&& Ġhas Parent Ġ-> Ġadapter . notify Item Inserted ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Ġ&& Ġhas Parent Ġ-> Ġadapter . notify Item Changed ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparent Name : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== ĠR uu Directory . root Directory ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent ?. name Ġ+ Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠR uu File Base . NotFound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhas Parent ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġparent Ġ!= Ġnull ĊĊĠĠĠ Ġvar Ġshow Path Ġ= Ġattrs . getAttribute Boolean Value ( namespace , Ġ" show _ path ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġset ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( if Ġ( has Parent ) Ġ 1 Ġelse Ġ 0 , Ġadapter . item Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġfiles : ĠList < R uu File Base >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġval Ġhas Content ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( files ?. size Ġ?: Ġ 0 ) Ġ> Ġ 0 ĊĊĠĠĠ Ġvar Ġloading Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . findViewById < View >( R . id . progress ). visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . findViewById < View >( R . id . progress ). visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar ĠonClick Listener : Ġ(( R uu File Base ) Ġ-> ĠUnit )? Ġ= Ġ{ Ġon EventListener ?. onClick ( it ) Ġ} ĊĊĠĠĠ Ġvar Ġon Long ClickListener : Ġ(( R uu File Base , ĠContext Menu ) Ġ-> ĠUnit )? Ġ= Ġ{ Ġfile , Ġmenu Ġ-> Ġon EventListener ?. on Long Click ( file , Ġmenu ) Ġ} ĊĊĠĠĠ Ġvar Ġon EventListener : ĠOn EventListener ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġchange Files ( files : ĠList < R uu File Base >, Ġparent : ĠR uu Directory ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . files Ġ= Ġfiles ĊĠĠĠĠĠĠĠ Ġthis . parent Ġ= Ġparent ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġlist . scrollTo Position ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Directory ( dir : ĠR uu Directory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Files ( dir . children , Ġif Ġ( R uu Directory . root Directory ( context ) Ġ!= Ġdir ) Ġdir . parent Ġelse Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġlayout State : ĠParcel able ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlayout . on Save InstanceState () ĊĠĠĠĠĠĠĠ Ġset ( state ) Ġ= Ġlayout . on Restore InstanceState ( state !! ) ĊĊĊĠĠĠ Ġinner Ġclass ĠAdapter Ġ: Ġandroidx . recyclerview . widget . RecyclerView . Adapter < Adapter . ViewHolder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠVIEW TYPE _ NORMAL Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠVIEW TYPE _ UPPER _ DIR Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠVIEW TYPE _ WITH _ PATH Ġ= Ġ 2 ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ== Ġ 0 Ġ&& Ġhas Parent Ġ-> ĠVIEW TYPE _ UPPER _ DIR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Path Ġ-> ĠVIEW TYPE _ WITH _ PATH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVIEW TYPE _ NORMAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( view Group : ĠViewGroup , Ġview Type : ĠInt ): ĠAdapter . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= ĠLayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVIEW TYPE _ UPPER _ DIR Ġ-> ĠViewHolder ( in flater . inflate ( R . layout . view _ filer _ upper , Ġview Group , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVIEW TYPE _ WITH _ PATH Ġ-> ĠViewHolder ( in flater . inflate ( R . layout . view _ filer _ with path , Ġview Group , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠViewHolder ( in flater . inflate ( R . layout . view _ filer _ item , Ġview Group , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Type Ġ== ĠVIEW TYPE _ UPPER _ DIR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Listener ?. invoke ( parent !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Listener ?. invoke ( it [ holder . adapter Position Ġ- Ġif Ġ( has Parent ) Ġ 1 Ġelse Ġ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOn Create ContextMenu Listener Ġ{ Ġmenu , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Type Ġ== ĠVIEW TYPE _ UPPER _ DIR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Long ClickListener ?. invoke ( parent !! , Ġmenu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Long ClickListener ?. invoke ( it [ holder . adapter Position Ġ- Ġif Ġ( has Parent ) Ġ 1 Ġelse Ġ 0 ], Ġmenu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġholder ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠAdapter . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . item ViewType Ġ== ĠVIEW TYPE _ UPPER _ DIR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . text ?. text Ġ= Ġcontext . getString ( R . string . upper _ dir , Ġparent Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġit [ position Ġ- Ġif Ġ( has Parent ) Ġ 1 Ġelse Ġ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . name ?. text Ġ= Ġitem . name Ġ+ Ġif Ġ( item . isDirectory ) Ġ"/" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . path ?. text Ġ= Ġitem . ru u Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠR uu File Base . OutOf Root Directory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . path ?. text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġ( files ?. size Ġ?: Ġ 0 ) Ġ+ Ġif Ġ( has Parent ) Ġ 1 Ġelse Ġ 0 ĊĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠViewHolder ( view : ĠView ) Ġ: Ġandroidx . recyclerview . widget . RecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġview . findViewById < TextView ? >( R . id . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġview . findViewById < TextView ? >( R . id . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġview . findViewById < TextView ? >( R . id . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠDiv ider Decoration ( context : ĠContext ) Ġ: Ġandroidx . recyclerview . widget . RecyclerView . Item Decoration () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdivider Ġ= Ġcontext . resources . get Drawable ( R . drawable . view _ filer _ divider ) !! ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas , Ġparent : Ġandroidx . recyclerview . widget . RecyclerView , Ġstate : Ġandroidx . recyclerview . widget . RecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġparent . padding Left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġparent . width Ġ- Ġparent . padding Right ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparent . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġparent . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġchild . layout Params Ġas Ġandroidx . recyclerview . widget . RecyclerView . LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġchild . bottom Ġ+ Ġparams . bottom Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġtop Ġ+ Ġdivider . intrinsic Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdivider . setBounds ( left Ġ+ ĠView Compat . get Translation X ( child ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ+ ĠView Compat . get Translation Y ( child ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ+ ĠView Compat . get Translation X ( child ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ+ ĠView Compat . get Translation Y ( child ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdivider . alpha Ġ= Ġ( View Compat . get Alpha ( child ) Ġ* Ġ 2 5 5 f ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdivider . draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( rect : ĠRect , Ġview : ĠView , Ġparent : Ġandroidx . recyclerview . widget . RecyclerView , Ġstate : Ġandroidx . recyclerview . widget . RecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . set ( 0 , Ġ 0 , Ġ 0 , Ġdivider . intrinsic Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġabstract Ġclass ĠOn EventListener Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠonClick ( file : ĠR uu File Base ) ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Long Click ( file : ĠR uu File Base , Ġmenu : ĠContext Menu ) ĊĠĠĠ Ġ} Ċ } Ċ