@@ -46,6 +46,7 @@ import com.ichi2.themes.Themes
4646import com.ichi2.utils.dp
4747import com.ichi2.utils.increaseHorizontalPaddingOfMenuIcons
4848import com.mrudultora.colorpicker.ColorPickerPopUp
49+ import dev.androidbroadcast.vbpd.viewBinding
4950import kotlinx.coroutines.flow.combine
5051import kotlinx.coroutines.flow.launchIn
5152import kotlinx.coroutines.flow.onEach
@@ -62,23 +63,11 @@ class WhiteboardFragment :
6263 WhiteboardViewModel .factory(AnkiDroidApp .sharedPrefs())
6364 }
6465
65- // binding pattern to handle onCreateView/onDestroyView
66- private var fragmentBinding: FragmentWhiteboardBinding ? = null
67- private val binding: FragmentWhiteboardBinding get() = fragmentBinding!!
66+ private val binding: FragmentWhiteboardBinding by viewBinding(FragmentWhiteboardBinding ::bind)
6867
6968 private var eraserPopup: PopupWindow ? = null
7069 private var strokeWidthPopup: PopupWindow ? = null
7170
72- override fun onCreateView (
73- inflater : LayoutInflater ,
74- container : ViewGroup ? ,
75- savedInstanceState : Bundle ? ,
76- ) = FragmentWhiteboardBinding
77- .inflate(inflater, container, false )
78- .apply {
79- fragmentBinding = this
80- }.root
81-
8271 /* *
8372 * Sets up the view, observers, and event listeners.
8473 */
@@ -92,19 +81,14 @@ class WhiteboardFragment :
9281 viewModel.loadState(isNightMode)
9382
9483 setupUI()
95- observeViewModel(binding.whiteboardView )
84+ observeViewModel()
9685
9786 binding.whiteboardView.onNewPath = viewModel::addPath
9887 binding.whiteboardView.onEraseGestureStart = viewModel::startPathEraseGesture
9988 binding.whiteboardView.onEraseGestureMove = viewModel::erasePathsAtPoint
10089 binding.whiteboardView.onEraseGestureEnd = viewModel::endPathEraseGesture
10190 }
10291
103- override fun onDestroyView () {
104- super .onDestroyView()
105- fragmentBinding = null
106- }
107-
10892 private fun setupUI () {
10993 binding.overflowMenuButton.setOnClickListener {
11094 val popupMenu = PopupMenu (requireContext(), binding.overflowMenuButton)
@@ -148,24 +132,26 @@ class WhiteboardFragment :
148132 /* *
149133 * Sets up observers for the ViewModel's state flows.
150134 */
151- private fun observeViewModel (whiteboardView : WhiteboardView ) {
152- viewModel.paths.onEach(whiteboardView::setHistory).launchIn(lifecycleScope)
135+ private fun observeViewModel () {
136+ viewModel.paths.onEach(binding. whiteboardView::setHistory).launchIn(lifecycleScope)
153137
154138 combine(
155139 viewModel.brushColor,
156140 viewModel.activeStrokeWidth,
157141 ) { color, width ->
158- whiteboardView.setCurrentBrush(color, width)
142+ if (view == null ) return @combine
143+ binding.whiteboardView.setCurrentBrush(color, width)
159144 }.launchIn(lifecycleScope)
160145
161146 combine(
162147 viewModel.isEraserActive,
163148 viewModel.eraserMode,
164149 viewModel.eraserDisplayWidth,
165150 ) { isActive, mode, width ->
166- whiteboardView.isEraserActive = isActive
167- fragmentBinding?.eraserButton?.updateState(isActive, mode, width)
168- whiteboardView.eraserMode = mode
151+ if (view == null ) return @combine
152+ binding.whiteboardView.isEraserActive = isActive
153+ binding.eraserButton.updateState(isActive, mode, width)
154+ binding.whiteboardView.eraserMode = mode
169155 if (! isActive) {
170156 eraserPopup?.dismiss()
171157 }
@@ -185,7 +171,8 @@ class WhiteboardFragment :
185171
186172 viewModel.isStylusOnlyMode
187173 .onEach { isEnabled ->
188- whiteboardView.isStylusOnlyMode = isEnabled
174+ if (view == null ) return @onEach
175+ binding.whiteboardView.isStylusOnlyMode = isEnabled
189176 }.launchIn(lifecycleScope)
190177
191178 viewModel.toolbarAlignment
@@ -457,21 +444,21 @@ class WhiteboardFragment :
457444 * Updates the toolbar's constraints and orientation.
458445 */
459446 private fun updateLayoutForAlignment (alignment : ToolbarAlignment ) {
460- val fragmentBinding = fragmentBinding ? : return
447+ if (view == null ) return
461448
462449 val isVertical = alignment == ToolbarAlignment .LEFT || alignment == ToolbarAlignment .RIGHT
463- fragmentBinding .innerControlsLayout.orientation = if (isVertical) LinearLayout .VERTICAL else LinearLayout .HORIZONTAL
450+ binding .innerControlsLayout.orientation = if (isVertical) LinearLayout .VERTICAL else LinearLayout .HORIZONTAL
464451
465452 if (isVertical) {
466- fragmentBinding .brushScrollViewHorizontal.visibility = View .GONE
467- fragmentBinding .brushScrollViewVertical.visibility = View .VISIBLE
453+ binding .brushScrollViewHorizontal.visibility = View .GONE
454+ binding .brushScrollViewVertical.visibility = View .VISIBLE
468455 } else {
469- fragmentBinding .brushScrollViewHorizontal.visibility = View .VISIBLE
470- fragmentBinding .brushScrollViewVertical.visibility = View .GONE
456+ binding .brushScrollViewHorizontal.visibility = View .VISIBLE
457+ binding .brushScrollViewVertical.visibility = View .GONE
471458 }
472459
473460 val dp = 1 .dp.toPx(requireContext())
474- val dividerParams = fragmentBinding .controlsDivider.layoutParams as LinearLayout .LayoutParams
461+ val dividerParams = binding .controlsDivider.layoutParams as LinearLayout .LayoutParams
475462 val dividerMargin = 4 * dp
476463 if (isVertical) {
477464 dividerParams.width = LinearLayout .LayoutParams .MATCH_PARENT
@@ -482,11 +469,11 @@ class WhiteboardFragment :
482469 dividerParams.height = LinearLayout .LayoutParams .MATCH_PARENT
483470 dividerParams.setMargins(dividerMargin, 0 , dividerMargin, 0 )
484471 }
485- fragmentBinding .controlsDivider.layoutParams = dividerParams
472+ binding .controlsDivider.layoutParams = dividerParams
486473
487474 val constraintSet = ConstraintSet ()
488- constraintSet.clone(fragmentBinding .root)
489- val containerId = fragmentBinding .controlsContainer.id
475+ constraintSet.clone(binding .root)
476+ val containerId = binding .controlsContainer.id
490477 constraintSet.clear(containerId)
491478
492479 when (alignment) {
@@ -519,7 +506,7 @@ class WhiteboardFragment :
519506 }
520507 }
521508
522- constraintSet.applyTo(fragmentBinding .root)
509+ constraintSet.applyTo(binding .root)
523510 }
524511
525512 override fun onMenuItemClick (item : MenuItem ): Boolean {
0 commit comments