package Ġcom . byte byte 6 . view . me Ċ Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . activity . result . Activity Result Callback Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . recyclerview . selection . Selection Tracker Ċ import Ġcom . byte byte 6 . common .* Ċ import Ġcom . byte byte 6 . utils . Linear Space Decoration Ċ import Ġcom . byte byte 6 . view .* Ċ import Ġcom . byte byte 6 . view . R Ċ import Ġcom . byte byte 6 . view . adapter . Playlist Adapter Ċ import Ġcom . byte byte 6 . view . databinding . Fragment Me Binding Ċ import Ġcom . byte byte 6 . view . main . MainActivity Ċ import Ġcom . byte byte 6 . view model . Me ViewModel Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġorg . k oin . android . view model . ext . android . viewModel ĊĊ Ċ /*** Ċ Ġ* Ġ å¯¼åħ¥ Ċ Ġ* Ġ 1 ãĢģ æľ¬åľ° å¯¼åħ¥ ok Ċ Ġ* Ġ 2 ãĢģ åı¯ ä»İ ç½ĳç»ľ éĵ¾æİ¥ å¯¼åħ¥ todo Ċ Ġ*/ Ċ class ĠMe Fragment Ġ: ĠBase Share Fragment < Fragment Me Binding >( R . layout . fragment _ me ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Me Fragment " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMe ViewModel Ġby ĠviewModel () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlauncher : ĠActivity Result Launcher < String > ĊĊĠĠĠ Ġprivate Ġval Ġlistener Ġ= Ġobject Ġ: ĠSimple Drawer Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drawer Closed ( drawer View : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. empty Box ?. resume Animation () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit View Binding ( view : ĠView ): ĠFragment Me Binding Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFragment Me Binding . bind ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠActivity Result Callback < Uri ?> Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . parse M 3 u ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠgetContent Ġ= ĠActivity Result Contracts . Get Content () ĊĠĠĠĠĠĠĠ Ġlauncher Ġ= Ġregister For Activity Result ( getContent , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Toolbar Menu Mode Ġ{ Ġbinding ?. empty Box ?. pause Animation () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdrawer Helper Ġ= Ġ( require Activity () Ġas ĠMainActivity ). drawer Helper ĊĠĠĠĠĠĠĠ Ġdrawer Helper . add Drawer Listener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġdo On Exit Transition End One Shot Ġ{ Ġclear RecyclerView () Ġ} ĊĠĠĠĠĠĠĠ Ġsetup On Back Pressed Dispatcher Back To Home () ĊĊĠĠĠĠĠĠĠ Ġval Ġme Binding Ġ= Ġbinding !! ĊĊĠĠĠĠĠĠĠ Ġ// init Ġre cycler view ĊĠĠĠĠĠĠĠ Ġval Ġplaylist Adapter Ġ= ĠPlaylist Adapter () ĊĠĠĠĠĠĠĠ Ġplaylist Adapter . on Item Click Ġ= Ġ{ Ġpos , ĠitemView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme To Playlist ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist Adapter . list [ pos ]. playlist Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist Adapter . list [ pos ]. playlist Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . re cyclerView Ġ= Ġme Binding . re cyclerView ĊĠĠĠĠĠĠĠ Ġme Binding . re cyclerView . adapter Ġ= Ġplaylist Adapter ĊĠĠĠĠĠĠĠ Ġme Binding . re cyclerView . addItem Decoration ( Linear Space Decoration ()) ĊĠĠĠĠĠĠĠ Ġme Binding . re cyclerView . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġplaylist Adapter . setup Selection Tracker ( me Binding . re cyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSelection Tracker . Selection Observer < Long >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Selection Changed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Selection Ġ= Ġplaylist Adapter . selection Tracker !!. has Selection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Selection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. fab ?. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. fab ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġselection Tracker Ġ= Ġplaylist Adapter . selection Tracker !! ĊĊĠĠĠĠĠĠĠ Ġme Binding . toolbar . setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher . launch ("* /* ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġme Binding . fab . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! selection Tracker . selection . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Dialog ( selection Tracker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . delete Result . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . emit IfNot Handled ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. fab ?. hide ( object Ġ: ĠFloating ActionButton . On Visibility Changed Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Hidden ( fab : ĠFloating ActionButton ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Sn ackBar ( R . string . tip _ del _ success ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Tracker . clear Selection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Sn ackBar ( R . string . tip _ del _ fail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . play lists . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist Adapter . replace ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme Binding . empty Box . isVisible Ġ= Ġit . isEmpty () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . parse Result . observe ( view Lifecycle Owner , Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . emit IfNot Handled ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Sn ackBar ( 0 , getString ( R . string . tip _ parse _ file _ error , Ġit . error . message . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġval Ġdrawer Helper Ġ= Ġ( require Activity () Ġas ĠMainActivity ). drawer Helper ĊĠĠĠĠĠĠĠ Ġdrawer Helper . remove Drawer Listener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Dialog ( selection Tracker : ĠSelection Tracker < Long >) Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . tip _ del _ playlist )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( getString ( R . string . tip _ be yond _ retrieve )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . enter )) Ġ{ Ġdialog Interface : ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . delete ( selection Tracker . selection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( getString ( R . string . cancel )) Ġ{ Ġdialog Interface : ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Interface . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Sn ackBar ( message Id : ĠInt , Ġmessage : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fab . isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Setup : ĠSn ackbar . () Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchor View Ġ= Ġfab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlong Sn ack Ġ= Ġif Ġ( message Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . long Sn ack ( message Id , Ġaction Setup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . long Sn ack ( message , Ġaction Setup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// memory Ġleak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Sn ack . add Callback ( object Ġ: ĠSn ackbar . Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Dis missed ( transient Bottom Bar : ĠSn ackbar ?, Ġevent : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransient Bottom Bar ?. anchor View Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Sn ack . remove Callback ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). long Sn ack ( message Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire View (). long Sn ack ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow ProgressBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide ProgressBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }