package Ġcom . ta iko . nob len ote . fragments Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . add Callback Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . Transform ations Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . ta iko . nob len ote .* Ċ import Ġcom . ta iko . nob len ote . databinding . Fragment Editor Binding Ċ import Ġcom . ta iko . nob len ote . editor . Arrow Key Link Movement Method Ċ import Ġcom . ta iko . nob len ote . view models . Editor ViewModel Ċ import Ġcom . ta iko . nob len ote . editor . Find In Text Toolbar Controller Ċ import Ġcom . ta iko . nob len ote . editor . TextView Undo Redo Ċ import Ġcom . ta iko . nob len ote . extensions . get Menu Items Ċ import Ġcom . ta iko . nob len ote . extensions . setTitle And Modified Ċ import Ġcom . ta iko . nob len ote . util . logger For Ċ import Ġnet . yan zm . action bar progress . Material In determinate Progress Drawable Ċ import Ġnet . yan zm . action bar progress . Material Progress Drawable Ċ import Ġrx . lang . kotlin . plus Assign Ċ import Ġrx . subscriptions . Composite Subscription Ċ Ċ /** Ċ Ġ* Ġtext Ġeditor Ġfragment Ċ Ġ*/ Ċ class ĠEditor Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Editor Binding ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// require Activity (). window . request Feature ( Window . FEATURE _ ACTION _ MODE _ OVER LAY ) ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Editor Binding . inflate ( in flater , container , false ); ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ; ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġlogger For () ĊĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġeditor ViewModel : ĠEditor ViewModel ĊĊĠĠĠ Ġprivate Ġval Ġm Composite Subscription Ġ: ĠComposite Subscription Ġ= ĠComposite Subscription (); ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Undo Redo : ĠTextView Undo Redo ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġ Ġm Find In Text Toolbar Controller : ĠFind In Text Toolbar Controller ĊĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġlog . d ( Ġ". on View Created ()"); ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel Ġ= ĠViewModel Provider ( this , ĠViewModel Provider . Android ViewModel Factory ( require Activity (). application )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Editor ViewModel :: class . java ); ĊĊĠĠĠĠĠĠĠ Ġlifecycle . add Observer ( editor ViewModel ); ĊĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= Ġeditor ViewModel ; ĊĊĊĠĠĠĠĠĠĠ Ġbinding . progress Bar File Loading . progress Drawable Ġ= ĠMaterial Progress Drawable . create ( require Context ()) ĊĠĠĠĠĠĠĠ Ġbinding . progress Bar File Loading . in determinate Drawable Ġ= ĠMaterial In determinate Progress Drawable . create ( require Context ()) ĊĊĠĠĠĠĠĠĠ Ġbinding . editor EditText . movement Method Ġ= ĠArrow Key Link Movement Method () ĊĊĠĠĠĠĠĠĠ Ġbinding . editor EditText . text HTML ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġhide Ġsoft Ġkeyboard Ġby Ġdefault ĊĠĠĠĠĠĠĠ Ġrequire Activity (). window . set Soft Input Mode ( WindowManager . LayoutParams . SOFT _ INPUT _ STATE _ ALWAYS _ HIDDEN ) ĊĊĠĠĠĠĠĠĠ Ġm Undo Redo Ġ= ĠTextView Undo Redo ( binding . editor EditText ); ĊĊĠĠĠĠĠĠĠ Ġ// Ġuncomment Ġto Ġenable Ġclose Ġbutton Ċ /* ĠĠĠĠĠĠĠ Ġtoolbar . set Navigation Icon ( R . drawable . ic _ close _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġtoolbar . set Navigation OnClickListener Ġ{ Ġshow Exit Dialog () Ġ}*/ ĊĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġarguments Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel . populate From Bundle ( extras ); ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel . is Modified . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġbinding . editor EditText . is Modified Ġ= Ġit Ġ}) ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel . toolbar Find In Text Visible . observe ( view Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġif ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Find In Text Toolbar Controller . show Toolbar (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Find In Text Toolbar Controller . hide Toolbar (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}}) ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel . query Text . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar Find In Text Include . search Input . setText ( it ); ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠTransform ations . distinct Until Changed ( editor ViewModel . toolbar Title ). observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar Include . toolbar . setTitle And Modified ( it , Ġeditor ViewModel . is Modified . value !! ) Ġ}) ĊĊĠĠĠĠĠĠĠ ĠTransform ations . distinct Until Changed ( editor ViewModel . is Modified ). observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar Include . toolbar . get Menu Items (). first OrNull Ġ{ Ġmenu Item Ġ-> Ġmenu Item . itemId Ġ== ĠR . id . action _ done Ġ} ?. isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar Include . toolbar . setTitle And Modified ( editor ViewModel . toolbar Title . value !! , it ); ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel . toast . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĠToast . makeText ( require Activity (), it , ĠToast . LENGTH _ SHORT ). show (); Ġ}) ĊĊĠĠĠĠĠĠĠ Ġeditor ViewModel . finish Activity . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġrequire Context (). getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimm . hide Soft Input From Window ( binding . editor EditText . window Token , 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). pop Back Stack () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . editor EditText . is Text Watcher Enabled Ġ= Ġfalse ĊĊĊĊĠĠĠĠĠĠĠ Ġm Find In Text Toolbar Controller Ġ= ĠFind In Text Toolbar Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . editor EditText , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . editor ScrollView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar Include . toolbar , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toolbar Find In Text Include ); ĊĊĠĠĠĠĠĠĠ Ġbinding . toolbar Include . toolbar . inflate Menu ( R . menu . menu _ editor ); ĊĊĠĠĠĠĠĠĠ Ġbinding . toolbar Include . toolbar . setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it . itemId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ redo Ġ-> Ġm Undo Redo . redo (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ undo Ġ-> Ġm Undo Redo . undo (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ done Ġ-> Ġeditor ViewModel . on MenuItem Done Clicked (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ copy _ to _ clipboard Ġ-> Ġeditor ViewModel . on CopyTo Clipboard Clicked (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġitem Redo Ġ= Ġbinding . toolbar Include . toolbar . get Menu Items (). first Ġ{ Ġit . itemId Ġ== ĠR . id . action _ redo Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Undo Ġ= Ġbinding . toolbar Include . toolbar . get Menu Items (). first Ġ{ Ġit . itemId Ġ== ĠR . id . action _ undo Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Composite Subscription Ġ+= Ġm Undo Redo . can Undo Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Undo . isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Composite Subscription Ġ+= Ġm Undo Redo . can Redo Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Redo . isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed Dispatcher . add Callback ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding . toolbar Find In Text Include . toolbar . visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Find In Text Toolbar Controller . hide Toolbar (); ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( editor ViewModel . is Modified . value !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exit Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate Up (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġlog . d ( Ġ". onStart ()"); ĊĊĠĠĠĠĠĠĠ Ġ// Ġfix Ġselection Ġ& Ġformatting Ġfor ĠH oney comb Ġand Ġnewer Ġdevices ĊĠĠĠĠĠĠĠ Ġbinding . editor EditText . custom Selection Action Mode Callback Ġ= ĠSelection Action Mode Callback ( binding . editor EditText ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Exit Dialog () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( require Activity ()) ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage ( R . string . dialog Discard Keep Editing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . discard ) Ġ{ Ġdialog , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor ViewModel . on Discard Changes Clicked (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . keep Editing , Ġnull ) ĊĠĠĠĠĠĠĠ Ġbuilder . create (). show () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( editor ViewModel . is Modified . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exit Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĊĠĠĠĠĠĠĠ Ġlog . d ( Ġ". on Destroy View ()"); ĊĊĠĠĠĠĠĠĠ Ġm Composite Subscription . clear (); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠARG _ NOTE _ URI Ġ= Ġ" file _ path " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠARG _ OPEN _ MODE Ġ= Ġ" open _ mode " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠARG _ QUERY _ TEXT Ġ= Ġ" query _ text " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠHTML Ġ= Ġ" html " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠREAD _ WRITE Ġ= Ġ" read _ write " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠREAD _ ONLY Ġ= Ġ" read _ only " ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ