package Ġcom . hol lab rowser . me force . browser . sessions Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . material . card . Material Card View Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . hol lab rowser . me force . R Ċ import Ġcom . hol lab rowser . me force . browser . activity . Browser Activity Ċ import Ġcom . hol lab rowser . me force . controller . UI Controller Ċ import Ġcom . hol lab rowser . me force . dialog . Browser Dialog Ċ import Ġcom . hol lab rowser . me force . extensions . resize And Show Ċ import Ġcom . hol lab rowser . me force . extensions . toast Ċ import Ġcom . hol lab rowser . me force . utils . FileName Input Filter Ċ import Ġcom . hol lab rowser . me force . utils . Item Drag Drop Swipe ViewHolder Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ Ċ /** Ċ Ġ* ĠThe Ġ[ RecyclerView . ViewHolder ] Ġfor Ġour Ġsession Ġlist . Ċ Ġ* ĠThat Ġrepresents Ġan Ġitem Ġin Ġour Ġlist , Ġbasically Ġone Ġsession . Ċ Ġ*/ Ċ @ Suppress Lint (" Inf late Params ") Ċ class ĠSession ViewHolder ( ĊĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġi Ui Controller : ĠUI Controller Ċ ) Ġ: ĠRecyclerView . ViewHolder ( view ), ĠView . OnClickListener , ĠView . On Long ClickListener , ĠItem Drag Drop Swipe ViewHolder Ġ{ ĊĊĊĠĠĠ Ġ// ĠUsing Ġview Ġbinding Ġwon 't Ġgive Ġus Ġmuch ĊĠĠĠ Ġval Ġtext Name : ĠTextView Ġ= Ġview . findViewById ( R . id . text _ name ) ĊĠĠĠ Ġval Ġtext Tab Count : ĠTextView Ġ= Ġview . findViewById ( R . id . text _ tab _ count ) ĊĠĠĠ Ġval Ġbutton Edit : ĠImageView Ġ= Ġview . findViewById ( R . id . button _ edit ) ĊĠĠĠ Ġval Ġbutton Delete : ĠView Ġ= Ġview . findViewById ( R . id . button _ delete ) ĊĠĠĠ Ġval Ġi Card View : ĠMaterial Card View Ġ= Ġview . findViewById ( R . id . layout _ background ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġa Ġsession ĊĠĠĠĠĠĠĠ Ġbutton Delete . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġdon 't Ġdelete Ġcurrent Ġsession Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ui Controller . get Tab Model (). i Current Session Name Ġ== Ġsession (). name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . context . toast ( R . string . session _ cant _ delete _ current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( it . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . session _ prompt _ confirm _ deletion _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( it . context . getString ( R . string . session _ prompt _ confirm _ deletion _ message , session (). name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( android . R . string . cancel , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( android . R . string . ok ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Ġconfirmed Ġdeletion , Ġgo Ġahead Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ui Controller . get Tab Model (). delete Session ( text Name . tag Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPers ist Ġour Ġsession Ġlist Ġafter Ġremoving Ġone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ui Controller . get Tab Model (). save Sessions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġour Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . context Ġas ĠBrowser Activity ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Menu . update Sessions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resize And Show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEdit Ġsession Ġname ĊĠĠĠĠĠĠĠ Ġbutton Edit . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog View Ġ= ĠLayoutInflater . from ( it . context ). inflate ( R . layout . dialog _ edit _ text , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġdialog View . findViewById < EditText >( R . id . dialog _ edit _ text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġuser Ġcan Ġonly Ġenter Ġvalid Ġfilename Ġcharacters ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . filters Ġ= ĠarrayOf < Input Filter >( FileName Input Filter ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInit Ġour Ġtext Ġfield Ġwith Ġcurrent Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setText ( session (). name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// textView . request Focus () ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// textView . show Soft Input On Focus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setOn Focus ChangeListener { Ġview , Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog ?. window ?. set Soft Input Mode ( SOFT _ INPUT _ STATE _ VISIBLE ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBrowser Dialog . show Custom Dialog ( it . context Ġas ĠAppCompatActivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( R . string . session _ name _ prompt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset View ( dialog View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( R . string . action _ ok ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewName Ġ= ĠtextView . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġsession Ġexists Ġalready Ġto Ġdisplay Ġproper Ġerror Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ui Controller . get Tab Model (). isValid Session Name ( new Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPro ceed Ġwith Ġsession Ġrename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ui Controller . get Tab Model (). rename Session ( text Name . tag Ġas ĠString , new Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġupdate Ġadapter Ġlist Ġand Ġthus Ġedited Ġitem Ġtoo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( i Ui Controller Ġas ĠBrowser Activity ). sessions Menu . update Sessions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġalready Ġhave Ġa Ġsession Ġwith Ġthat Ġname , Ġdisplay Ġan Ġerror Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . toast ( R . string . session _ already _ exists ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSession Ġitem Ġclicked ĊĠĠĠĠĠĠĠ Ġi Card View . setOnClickListener { ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! i Ui Controller . get Tab Model (). isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġstill Ġbusy Ġloading Ġa Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . context . toast ( R . string . busy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Ġwants Ġto Ġswitch Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession (). name . let Ġ{ Ġsession Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . context Ġas ĠBrowser Activity ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter ?. switch To Session ( session Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Edit Mode Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Menu . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġour Ġlist , Ġnot ably Ġcurrent Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ui Controller . get Tab Model (). do Once After Initialization Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Menu . update Sessions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Menu . scrollTo Current Session () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġi Card View . setOn Long ClickListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsession () Ġ= Ġi Ui Controller . get Tab Model (). session ( text Name . tag Ġas ĠString ) ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ=== Ġbutton Delete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ui Controller . tab Close Clicked ( adapter Position ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Long Click ( v : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ui Controller . show Close Dialog ( adapter Position ) ĊĠĠĠĠĠĠĠ Ġ// return Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFrom ĠItem Touch Helper ViewHolder ĊĠĠĠ Ġ// ĠStart Ġdragging ĊĠĠĠ Ġoverride Ġfun Ġon Item Operation Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġi Card View . is Drag ged Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFrom ĠItem Touch Helper ViewHolder ĊĠĠĠ Ġ// ĠSto pped Ġdragging ĊĠĠĠ Ġoverride Ġfun Ġon Item Operation Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġi Card View . is Drag ged Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell Ġthis Ġview Ġholder Ġto Ġstart Ġob serving Ġedit Ġmode Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġobserve Edit Mode ( observable : ĠObservable < Boolean >): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobservable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġedit Mode Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Edit . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Delete . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Edit . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Delete . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvide Ġa Ġstring Ġrepresentation Ġof Ġour Ġtab Ġcount . ĠReturn Ġan Ġempty Ġstring Ġif Ġtab Ġcount Ġis Ġnot Ġavailable . ĊĠĠĠĠ Ġ* ĠTab Ġcount Ġmay Ġnot Ġbe Ġavailable Ġfor Ġre covered Ġsessions Ġfor Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtab Count Label () Ġ= Ġif Ġ( session (). tab Count > 0 ) Ġsession (). tab Count . toString () Ġelse Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell Ġif Ġedit Ġmode Ġis Ġcurrently Ġenabled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Edit Mode Enabled () Ġ= Ġbutton Edit . visibility Ġ== ĠView . VISIBLE Ċ Ċ } Ċ