@@ -50,8 +50,8 @@ import java.util.concurrent.TimeUnit
5050
5151class NoteDirectEditFragment : BaseNoteFragment (), Branded {
5252 private var _binding : FragmentNoteDirectEditBinding ? = null
53- private val binding: FragmentNoteDirectEditBinding
54- get() = _binding !!
53+ private val binding: FragmentNoteDirectEditBinding ?
54+ get() = _binding
5555
5656 private val disposables: DisposableSet = DisposableSet ()
5757 private var switchToEditPending = false
@@ -81,41 +81,44 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
8181 inflater : LayoutInflater ,
8282 container : ViewGroup ? ,
8383 savedInstanceState : Bundle ? ,
84- ): View {
84+ ): View ? {
8585 Log .d(TAG , " onCreateView() called" )
8686 _binding = FragmentNoteDirectEditBinding .inflate(inflater, container, false )
8787 setupFab()
8888 prepareWebView()
89- return binding.root
89+ return binding? .root
9090 }
9191
9292 @SuppressLint(" ClickableViewAccessibility" ) // touch listener only for UI purposes, no need to handle click
9393 private fun setupFab () {
94- binding.plainEditingFab.isExtended = false
95- ExtendedFabUtil .toggleExtendedOnLongClick(binding.plainEditingFab)
96- // manually detect scroll as we can't get it from the webview (maybe with custom JS?)
97- binding.noteWebview.setOnTouchListener { _, event ->
98- when (event.action) {
99- MotionEvent .ACTION_DOWN -> {
100- scrollStart = event.y.toInt()
101- }
102- MotionEvent .ACTION_UP -> {
103- val scrollEnd = event.y.toInt()
104- ExtendedFabUtil .toggleVisibilityOnScroll(
105- binding.plainEditingFab,
106- scrollStart,
107- scrollEnd,
108- )
94+ binding?.run {
95+ plainEditingFab.isExtended = false
96+ ExtendedFabUtil .toggleExtendedOnLongClick(plainEditingFab)
97+
98+ // manually detect scroll as we can't get it from the webview (maybe with custom JS?)
99+ noteWebview.setOnTouchListener { _, event ->
100+ when (event.action) {
101+ MotionEvent .ACTION_DOWN -> {
102+ scrollStart = event.y.toInt()
103+ }
104+ MotionEvent .ACTION_UP -> {
105+ val scrollEnd = event.y.toInt()
106+ ExtendedFabUtil .toggleVisibilityOnScroll(
107+ plainEditingFab,
108+ scrollStart,
109+ scrollEnd,
110+ )
111+ }
109112 }
113+ return @setOnTouchListener false
110114 }
111- return @setOnTouchListener false
115+ plainEditingFab.setOnClickListener { switchToPlainEdit() }
112116 }
113- binding.plainEditingFab.setOnClickListener { switchToPlainEdit() }
114117 }
115118
116119 private fun switchToPlainEdit () {
117120 switchToEditPending = true
118- binding.noteWebview.evaluateJavascript(JS_CLOSE ) { result ->
121+ binding? .noteWebview? .evaluateJavascript(JS_CLOSE ) { result ->
119122 val resultWithoutQuotes = result.replace(" \" " , " " )
120123 if (resultWithoutQuotes != JS_RESULT_OK ) {
121124 Log .w(TAG , " Closing via JS failed: $resultWithoutQuotes " )
@@ -128,7 +131,7 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
128131 override fun onDestroyView () {
129132 super .onDestroyView()
130133 disposables.dispose()
131- binding.noteWebview.destroy()
134+ binding? .noteWebview? .destroy()
132135 _binding = null
133136 }
134137
@@ -137,7 +140,7 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
137140 val timeoutDisposable = Single .just(Unit )
138141 .delay(LOAD_TIMEOUT_SECONDS , TimeUnit .SECONDS )
139142 .map {
140- if (! binding.noteWebview.isVisible) {
143+ if (binding? .noteWebview? .isVisible == false ) {
141144 Log .w(TAG , " Editor not loaded after $LOAD_TIMEOUT_SECONDS seconds" )
142145 handleLoadError()
143146 }
@@ -197,7 +200,7 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
197200 if (BuildConfig .DEBUG ) {
198201 Log .d(TAG , " loadNoteInWebView: url = $url " )
199202 }
200- binding.noteWebview.loadUrl(url)
203+ binding? .noteWebview? .loadUrl(url)
201204 }
202205 }, { throwable ->
203206 handleLoadError()
@@ -208,30 +211,32 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
208211 }
209212
210213 private fun handleLoadError () {
211- val snackbar = BrandedSnackbar .make(
212- binding.plainEditingFab,
213- getString(R .string.direct_editing_error),
214- Snackbar .LENGTH_INDEFINITE ,
215- )
216-
217- if (note != null ) {
218- snackbar.setAction(R .string.switch_to_plain_editing) {
219- changeToEditMode()
220- }
221- } else {
222- snackbar.setAction(R .string.action_back) {
223- close()
214+ binding?.run {
215+ val snackbar = BrandedSnackbar .make(
216+ plainEditingFab,
217+ getString(R .string.direct_editing_error),
218+ Snackbar .LENGTH_INDEFINITE ,
219+ )
220+
221+ if (note != null ) {
222+ snackbar.setAction(R .string.switch_to_plain_editing) {
223+ changeToEditMode()
224+ }
225+ } else {
226+ snackbar.setAction(R .string.action_back) {
227+ close()
228+ }
224229 }
225- }
226230
227- snackbar.show()
231+ snackbar.show()
232+ }
228233 }
229234
230235 override fun shouldShowToolbar (): Boolean = false
231236
232237 @SuppressLint(" SetJavaScriptEnabled" )
233238 private fun prepareWebView () {
234- binding.noteWebview.settings.run {
239+ binding? .noteWebview? .settings? .run {
235240 // enable zoom
236241 setSupportZoom(true )
237242 builtInZoomControls = true
@@ -260,15 +265,15 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
260265
261266 if (BuildConfig .DEBUG ) {
262267 // caching disabled in debug mode
263- binding.noteWebview.settings.cacheMode = WebSettings .LOAD_NO_CACHE
268+ binding? .noteWebview? .settings? .cacheMode = WebSettings .LOAD_NO_CACHE
264269 }
265270
266- binding.noteWebview.addJavascriptInterface(
271+ binding? .noteWebview? .addJavascriptInterface(
267272 DirectEditingMobileInterface (this ),
268273 JS_INTERFACE_NAME ,
269274 )
270275
271- binding.noteWebview.webViewClient = object : WebViewClient () {
276+ binding? .noteWebview? .webViewClient = object : WebViewClient () {
272277 override fun onReceivedError (
273278 view : WebView ? ,
274279 request : WebResourceRequest ? ,
@@ -316,8 +321,11 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
316321
317322 override fun applyBrand (color : Int ) {
318323 val util = BrandingUtil .of(color, requireContext())
319- util.material.themeExtendedFAB(binding.plainEditingFab)
320- util.platform.colorCircularProgressBar(binding.progress, ColorRole .PRIMARY )
324+
325+ binding?.run {
326+ util.material.themeExtendedFAB(plainEditingFab)
327+ util.platform.colorCircularProgressBar(progress, ColorRole .PRIMARY )
328+ }
321329 }
322330
323331 private class DirectEditingMobileInterface (val noteDirectEditFragment : NoteDirectEditFragment ) {
@@ -382,9 +390,11 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
382390
383391 private fun toggleLoadingUI (loading : Boolean ) {
384392 activity?.runOnUiThread {
385- binding.progress.isVisible = loading
386- binding.noteWebview.isVisible = ! loading
387- binding.plainEditingFab.isVisible = ! loading
393+ binding?.run {
394+ progress.isVisible = loading
395+ noteWebview.isVisible = ! loading
396+ plainEditingFab.isVisible = ! loading
397+ }
388398 }
389399 }
390400
0 commit comments