diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollDetailsFragment.kt index 95a28fa6..dc7bf18f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollDetailsFragment.kt @@ -5,12 +5,12 @@ import android.content.Intent import android.os.Bundle import android.view.* import androidx.recyclerview.widget.LinearLayoutManager -import kotlinx.android.synthetic.main.fragment_bankroll.* import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.ComputedStat import net.pokeranalytics.android.calculus.Stat import net.pokeranalytics.android.calculus.bankroll.BankrollReport import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager +import net.pokeranalytics.android.databinding.FragmentBankrollDetailsBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.Bankroll @@ -47,11 +47,16 @@ class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSourc private var bankrollDetailsMenu: Menu? = null + private var _binding: FragmentBankrollDetailsBinding? = null + private val binding get() = _binding!! + // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_bankroll_details, container, false) + _binding = FragmentBankrollDetailsBinding.inflate(inflater, container, false) + return binding.root +// return inflater.inflate(R.layout.fragment_bankroll_details, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -81,6 +86,11 @@ class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSourc super.onCreateOptionsMenu(menu, inflater) } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init data */ @@ -104,7 +114,7 @@ class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSourc val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { + this.binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager adapter = bankrollAdapter @@ -188,7 +198,7 @@ class BankrollDetailsFragment : RealmFragment(), StaticRowRepresentableDataSourc // StaticRowRepresentableDataSource - override fun adapterRows(): List? { + override fun adapterRows(): List { return rows } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollFragment.kt index 38e414c6..599d0fee 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/bankroll/BankrollFragment.kt @@ -9,13 +9,14 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.github.mikephil.charting.data.LineDataSet import io.realm.RealmResults -import kotlinx.android.synthetic.main.fragment_bankroll.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager +import net.pokeranalytics.android.databinding.FragmentBankrollBinding +import net.pokeranalytics.android.databinding.FragmentBankrollDetailsBinding import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Deletable import net.pokeranalytics.android.model.realm.Bankroll @@ -62,6 +63,9 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour private lateinit var bankrolls: RealmResults + private var _binding: FragmentBankrollBinding? = null + private val binding get() = _binding!! + override fun deletableItems(): List { return this.bankrolls } @@ -70,7 +74,8 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_bankroll, container, false) + _binding = FragmentBankrollBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -103,6 +108,11 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init data */ @@ -153,13 +163,13 @@ class BankrollFragment : DeletableItemFragment(), StaticRowRepresentableDataSour val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { + this.binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager adapter = dataListAdapter } - addButton.setOnClickListener { + this.binding.addButton.setOnClickListener { EditableDataActivity.newInstanceForResult( this@BankrollFragment, dataType = LiveData.BANKROLL, diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt index 20fef5d8..5a6375a3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarDetailsFragment.kt @@ -13,7 +13,6 @@ import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.LineDataSet import com.google.android.material.tabs.TabLayout import io.realm.Realm -import kotlinx.android.synthetic.main.fragment_calendar_details.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -21,6 +20,7 @@ import net.pokeranalytics.android.R import net.pokeranalytics.android.calcul.defaultStatEntries import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.databinding.FragmentCalendarDetailsBinding import net.pokeranalytics.android.model.filter.Query import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.activity.GraphActivity @@ -54,22 +54,12 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource private var rowRepresentables: ArrayList = ArrayList() - /** - * Set data - */ -// fun setData(computedResults: ComputedResults?, sessionTypeCondition: QueryCondition?, title: String?) { -// -// this.computedResults = computedResults -// this.sessionTypeCondition = sessionTypeCondition -// this.title = title -// -// displayData() -// launchStatComputation() -// -// } + private var _binding: FragmentCalendarDetailsBinding? = null + private val binding get() = _binding!! override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_calendar_details, container, false) + _binding = FragmentCalendarDetailsBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -78,6 +68,11 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource launchStatComputation() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init UI */ @@ -96,9 +91,9 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource } } - tabs.getTabAt(tabIndexToSelect)?.select() + this.binding.tabs.getTabAt(tabIndexToSelect)?.select() - tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + this.binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { when (tab.position) { 0 -> model.sessionTypeCondition = null @@ -119,7 +114,7 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { + this.binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager adapter = statsAdapter @@ -130,7 +125,7 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource // StaticRowRepresentableDataSource - override fun adapterRows(): List? { + override fun adapterRows(): List { return rowRepresentables } @@ -165,9 +160,9 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource */ private fun launchStatComputation() { - progressBar.isVisible = true - progressBar.animate().alpha(1f).start() - recyclerView.animate().alpha(0f).start() + this.binding.progressBar.isVisible = true + this.binding.progressBar.animate().alpha(1f).start() + this.binding.recyclerView.animate().alpha(0f).start() this.model.computedResults?.let { computedResults -> @@ -227,10 +222,10 @@ class CalendarDetailsFragment : BaseFragment(), StaticRowRepresentableDataSource launch(Dispatchers.Main) { statsAdapter.notifyDataSetChanged() - progressBar.animate().cancel() - progressBar.animate().alpha(0f).withEndAction { progressBar.isVisible = false }.start() - recyclerView.animate().cancel() - recyclerView.animate().alpha(1f).start() + binding.progressBar.animate().cancel() + binding.progressBar.animate().alpha(0f).withEndAction { binding.progressBar.isVisible = false }.start() + binding.recyclerView.animate().cancel() + binding.recyclerView.animate().alpha(1f).start() } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt index cf10446c..40a7e3f0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/calendar/CalendarFragment.kt @@ -7,15 +7,14 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.tabs.TabLayout import io.realm.Realm -import kotlinx.android.synthetic.main.fragment_calendar.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.Calculator import net.pokeranalytics.android.calculus.ComputedResults import net.pokeranalytics.android.calculus.Stat +import net.pokeranalytics.android.databinding.FragmentCalendarBinding import net.pokeranalytics.android.model.Criteria import net.pokeranalytics.android.model.combined import net.pokeranalytics.android.model.filter.QueryCondition @@ -72,11 +71,15 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable TimeFilter.MONTH private var currentStat = Stat.NET_RESULT + private var _binding: FragmentCalendarBinding? = null + private val binding get() = _binding!! + // Life Cycle override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_calendar, container, false) + _binding = FragmentCalendarBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -86,7 +89,14 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable listenRealmChanges(this, ComputableResult::class.java) } - override fun adapterRows(): List? { + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + // + + override fun adapterRows(): List { return rows } @@ -134,12 +144,12 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable private fun initUI() { CalendarTabs.values().forEach { - val tab = tabs.newTab() + val tab = binding.tabs.newTab() tab.text = getString(it.resId) - tabs.addTab(tab) + binding.tabs.addTab(tab) } - tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { when (tab.position) { 0 -> currentStat = Stat.NET_RESULT @@ -162,57 +172,57 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable }) // Manage session type queryWith - filterSessionAll.setOnCheckedChangeListener { _, isChecked -> + binding.filterSessionAll.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { sessionTypeCondition = null - filterSessionCash.isChecked = false - filterSessionTournament.isChecked = false + binding.filterSessionCash.isChecked = false + binding.filterSessionTournament.isChecked = false launchAsyncStatComputation() } else if (sessionTypeCondition == null) { - filterSessionAll.isChecked = true + binding.filterSessionAll.isChecked = true } } - filterSessionCash.setOnCheckedChangeListener { _, isChecked -> + binding.filterSessionCash.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { sessionTypeCondition = QueryCondition.IsCash - filterSessionAll.isChecked = false - filterSessionTournament.isChecked = false + binding.filterSessionAll.isChecked = false + binding.filterSessionTournament.isChecked = false launchAsyncStatComputation() } else if (sessionTypeCondition == QueryCondition.IsCash) { - filterSessionCash.isChecked = true + binding.filterSessionCash.isChecked = true } } - filterSessionTournament.setOnCheckedChangeListener { _, isChecked -> + binding.filterSessionTournament.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { sessionTypeCondition = QueryCondition.IsTournament - filterSessionAll.isChecked = false - filterSessionCash.isChecked = false + binding.filterSessionAll.isChecked = false + binding.filterSessionCash.isChecked = false launchAsyncStatComputation() } else if (sessionTypeCondition == QueryCondition.IsTournament) { - filterSessionTournament.isChecked = true + binding.filterSessionTournament.isChecked = true } } // Manage time queryWith - filterTimeMonth.setOnCheckedChangeListener { _, isChecked -> + binding.filterTimeMonth.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentTimeFilter = TimeFilter.MONTH - filterTimeYear.isChecked = false + binding.filterTimeYear.isChecked = false displayData() } else if (currentTimeFilter == TimeFilter.MONTH) { - filterTimeMonth.isChecked = true + binding.filterTimeMonth.isChecked = true } } - filterTimeYear.setOnCheckedChangeListener { _, isChecked -> + binding.filterTimeYear.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { currentTimeFilter = TimeFilter.YEAR - filterTimeMonth.isChecked = false + binding.filterTimeMonth.isChecked = false displayData() } else if (currentTimeFilter == TimeFilter.YEAR) { - filterTimeYear.isChecked = true + binding.filterTimeYear.isChecked = true } } @@ -220,7 +230,7 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable calendarAdapter = RowRepresentableAdapter(this, this) - recyclerView.apply { + binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager adapter = calendarAdapter @@ -232,8 +242,8 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable */ private fun launchAsyncStatComputation() { - progressBar?.showWithAnimation() - recyclerView?.hideWithAnimation() + binding.progressBar?.showWithAnimation() + binding.recyclerView?.hideWithAnimation() GlobalScope.launch { @@ -411,8 +421,8 @@ class CalendarFragment : RealmFragment(), CoroutineScope, StaticRowRepresentable calendarAdapter.notifyDataSetChanged() - progressBar?.hideWithAnimation() - recyclerView?.showWithAnimation() + binding.progressBar.hideWithAnimation() + binding.recyclerView.showWithAnimation() } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt index a0fb2366..ce4a6fba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/CustomFieldDataFragment.kt @@ -9,8 +9,10 @@ import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.google.android.material.chip.ChipGroup -import kotlinx.android.synthetic.main.fragment_custom_view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentBankrollDetailsBinding +import net.pokeranalytics.android.databinding.FragmentCalendarDetailsBinding +import net.pokeranalytics.android.databinding.FragmentCustomViewBinding import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.CustomFieldEntry import net.pokeranalytics.android.ui.activity.components.BaseActivity @@ -102,18 +104,25 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa } }) + private var _binding: FragmentCustomViewBinding? = null + private val binding get() = _binding!! override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_custom_view, container, false) + _binding = FragmentCustomViewBinding.inflate(inflater, container, false) + return binding.root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initUI() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + override fun getDataSource(): RowRepresentableDataSource { return this } @@ -206,18 +215,18 @@ class CustomFieldDataFragment : EditableDataFragment(), StaticRowRepresentableDa */ private fun initUI() { customField.updateRowRepresentation() - bottomBar.translationY = 72f.px - bottomBar.visibility = View.VISIBLE + binding.bottomBar.translationY = 72f.px + binding.bottomBar.visibility = View.VISIBLE if (customField.sortCondition == CustomField.Sort.DEFAULT.uniqueIdentifier) { - itemTouchHelper.attachToRecyclerView(recyclerView) + itemTouchHelper.attachToRecyclerView(binding.recyclerView) } else { itemTouchHelper.attachToRecyclerView(null) } when (customField.sortCondition) { - CustomField.Sort.DEFAULT.uniqueIdentifier -> sortDefault.isChecked = true - CustomField.Sort.ASCENDING.uniqueIdentifier -> sortAscending.isChecked = true + CustomField.Sort.DEFAULT.uniqueIdentifier -> binding.sortDefault.isChecked = true + CustomField.Sort.ASCENDING.uniqueIdentifier -> binding.sortAscending.isChecked = true CustomField.Sort.DESCENDING.uniqueIdentifier -> sortDescending.isChecked = true } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt index acf1db8b..e390e06a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/EditableDataFragment.kt @@ -4,11 +4,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.widget.Toolbar import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import io.realm.RealmModel -import kotlinx.android.synthetic.main.fragment_editable_data.* -import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.interfaces.Editable import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.model.utils.CrashLogging @@ -87,6 +88,8 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat val liveDataType = this.model.liveDataType + val toolbar = this.view?.findViewById(R.id.toolbar) + val data: RealmModel? = liveDataType.getData(this.getRealm(), this.model.primaryKey) data?.let { @@ -96,13 +99,16 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat liveDataType.updateEntityLocalizedTitle(requireContext()) } - this.appBar.toolbar.title = title + toolbar?.title = title deleteButtonShouldAppear = true isUpdating = true } ?: run { - this.appBar.toolbar.title = liveDataType.newEntityLocalizedTitle(requireContext()) + toolbar?.title = liveDataType.newEntityLocalizedTitle(requireContext()) } + val recyclerView = this.view?.findViewById(R.id.recyclerView) ?: throw + PAIllegalStateException("recyclerView not found") + val viewManager = LinearLayoutManager(requireContext()) recyclerView.apply { setHasFixedSize(true) @@ -112,7 +118,7 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat val dataSource = getDataSource() this.rowRepresentableAdapter = RowRepresentableAdapter(getDataSource(), this) //this.rowRepresentableAdapter.setHasStableIds(true) - this.recyclerView.adapter = rowRepresentableAdapter + recyclerView.adapter = rowRepresentableAdapter // When creating an object, open automatically the keyboard for the first row if (!deleteButtonShouldAppear && shouldOpenKeyboard) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt index 506e3e92..8cda02b7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/data/PlayerDataFragment.kt @@ -9,12 +9,12 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import kotlinx.android.synthetic.main.fragment_player.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentPlayerBinding import net.pokeranalytics.android.model.realm.Comment import net.pokeranalytics.android.model.realm.Player import net.pokeranalytics.android.ui.activity.ColorPickerActivity @@ -22,7 +22,6 @@ import net.pokeranalytics.android.ui.activity.components.MediaActivity import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.extensions.showAlertDialog -import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType @@ -46,11 +45,14 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou private var mediaActivity: MediaActivity? = null + private var _binding: FragmentPlayerBinding? = null + private val binding get() = _binding!! - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) shouldOpenKeyboard = false - return inflater.inflate(R.layout.fragment_player, container, false) + _binding = FragmentPlayerBinding.inflate(inflater, container, false) + return binding.root } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -68,6 +70,11 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou initUI() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init UI */ @@ -80,7 +87,7 @@ class PlayerDataFragment : EditableDataFragment(), StaticRowRepresentableDataSou onRowSelected(0, PlayerRow.NAME) } - addComment.setOnClickListener { + binding.addComment.setOnClickListener { val comment = player.addComment() rowRepresentableAdapter.notifyDataSetChanged() onRowSelected(-1, comment) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt index 1973cdd6..5e616a07 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/datalist/DataListFragment.kt @@ -11,8 +11,8 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.realm.Realm import io.realm.RealmResults -import kotlinx.android.synthetic.main.fragment_data_list.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentDataListBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Deletable @@ -44,6 +44,9 @@ open class DataListFragment : DeletableItemFragment(), RowRepresentableDelegate private var menu: Menu? = null private var searchView: SearchView? = null + private var _binding: FragmentDataListBinding? = null + private val binding get() = _binding!! + open fun retrieveItems(realm: Realm): RealmResults { return realm.sorted(this.model.identifiableClass, editableOnly = true, @@ -56,7 +59,8 @@ open class DataListFragment : DeletableItemFragment(), RowRepresentableDelegate override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_data_list, container, false) + _binding = FragmentDataListBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -65,6 +69,11 @@ open class DataListFragment : DeletableItemFragment(), RowRepresentableDelegate initUI() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + fun initData() { val itemIds = this.model.itemIds @@ -106,14 +115,14 @@ open class DataListFragment : DeletableItemFragment(), RowRepresentableDelegate val itemTouchHelper = ItemTouchHelper(swipeToDelete) - recyclerView.apply { + binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager adapter = dataListAdapter itemTouchHelper.attachToRecyclerView(this) } - this.addButton.setOnClickListener { + binding.addButton.setOnClickListener { EditableDataActivity.newInstanceForResult(this, dataType = this.model.dataType, @@ -123,13 +132,13 @@ open class DataListFragment : DeletableItemFragment(), RowRepresentableDelegate } - this.addButton.isVisible = this.model.showAddButton + binding.addButton.isVisible = this.model.showAddButton } override fun onResume() { super.onResume() - this.recyclerView?.adapter?.notifyDataSetChanged() + binding.recyclerView.adapter?.notifyDataSetChanged() } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt index 82be34f4..43d6ff87 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/FeedFragment.kt @@ -10,13 +10,12 @@ import androidx.core.view.isVisible import androidx.interpolator.view.animation.FastOutSlowInInterpolator import com.android.billingclient.api.Purchase import com.google.android.material.tabs.TabLayout -import com.google.firebase.crashlytics.FirebaseCrashlytics import io.realm.RealmModel import io.realm.RealmResults import io.realm.Sort import io.realm.kotlin.where -import kotlinx.android.synthetic.main.fragment_feed.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentFeedBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.interfaces.Editable @@ -105,6 +104,9 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis } + private var _binding: FragmentFeedBinding? = null + private val binding get() = _binding!! + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) AppGuard.registerListener(this) @@ -114,9 +116,10 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_feed, container, false) + _binding = FragmentFeedBinding.inflate(inflater, container, false) + return binding.root } override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo?) { @@ -219,6 +222,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis override fun onDestroyView() { super.onDestroyView() realmTransactions.removeAllChangeListeners() + _binding = null } override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { @@ -250,43 +254,43 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis this.sessionAdapter = FeedSessionRowRepresentableAdapter(getRealm(), this) - registerForContextMenu(this.menuRecyclerView) + registerForContextMenu(binding.menuRecyclerView) val messageToShow: Preferences.FeedMessage? = Preferences.feedMessageToShow(requireContext()) if (messageToShow != null) { - messageBox.isVisible = true - message.text = getString(messageToShow.resId) + binding.messageBox.isVisible = true + binding.message.text = getString(messageToShow.resId) messageToShow.actionResId?.let { - messageBoxAction.text = requireContext().getString(it) + binding.messageBoxAction.text = requireContext().getString(it) messageToShow.action(requireContext())?.let { action -> - messageBoxAction.setOnClickListener { view -> + binding.messageBoxAction.setOnClickListener { view -> action.invoke(view) hideMessageBox(messageToShow) } } } ?: run { - messageBoxAction.visibility = View.GONE + binding.messageBoxAction.visibility = View.GONE } - messageBoxDismiss.text = requireContext().getString(messageToShow.dismissResId) - messageBoxDismiss.setOnClickListener { + binding.messageBoxDismiss.text = requireContext().getString(messageToShow.dismissResId) + binding.messageBoxDismiss.setOnClickListener { hideMessageBox(messageToShow) } } else { - messageBox.isVisible = false + binding.messageBox.isVisible = false } val viewManager = SmoothScrollLinearLayoutManager(requireContext()) - menuRecyclerView.apply { + binding.menuRecyclerView.apply { setHasFixedSize(true) layoutManager = viewManager } // Add button - addButton.setOnClickListener { + binding.addButton.setOnClickListener { activity?.let { val options = ActivityOptionsCompat.makeSceneTransitionAnimation(it) val intent = Intent(requireContext(), NewDataMenuActivity::class.java) @@ -295,7 +299,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis } // Tabs - tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + binding.tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { when (tab.position) { Tab.SESSIONS.ordinal -> { @@ -318,7 +322,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis } }) - this.subscribe.setOnClickListener { + binding.subscribe.setOnClickListener { if (!AppGuard.isProUser) { BillingActivity.newInstanceForResult(this, false) } else { @@ -330,15 +334,16 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis } private fun showSubscriptionButton() { - this.subscribe.isVisible = !AppGuard.isProUser + this.binding.subscribe.isVisible = !AppGuard.isProUser } private fun hideMessageBox(message: Preferences.FeedMessage) { Preferences.setStopShowingMessage(message, requireContext()) + val messageBox = binding.messageBox messageBox.animate().translationY(messageBox.height.toFloat()) .setInterpolator(FastOutSlowInInterpolator()) - .withEndAction { messageBox?.isVisible = false } + .withEndAction { messageBox.isVisible = false } .start() } @@ -553,7 +558,7 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis private fun selectTab(tab: Tab) { this.currentTab = tab - this.tabs.getTabAt(tab.ordinal)?.select() + this.binding.tabs.getTabAt(tab.ordinal)?.select() setAdapter() } @@ -564,9 +569,9 @@ class FeedFragment : FilterableFragment(), RowRepresentableDelegate, PurchaseLis private fun setAdapter() { when (this.currentTab) { - Tab.SESSIONS -> menuRecyclerView.adapter = sessionAdapter - Tab.TRANSACTIONS -> menuRecyclerView.adapter = transactionAdapter - Tab.HAND_HISTORY -> menuRecyclerView.adapter = handHistoryAdapter + Tab.SESSIONS -> binding.menuRecyclerView.adapter = sessionAdapter + Tab.TRANSACTIONS -> binding.menuRecyclerView.adapter = transactionAdapter + Tab.HAND_HISTORY -> binding.menuRecyclerView.adapter = handHistoryAdapter } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt index bcfa40c4..fa2cf02e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/feed/NewDataMenuActivity.kt @@ -9,14 +9,14 @@ import android.os.Build import android.os.Bundle import android.view.View import android.view.ViewAnimationUtils -import kotlinx.android.synthetic.main.activity_new_data.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.ActivityNewDataBinding import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.extensions.px +import kotlin.math.max class NewDataMenuActivity : BaseActivity() { @@ -36,6 +36,8 @@ class NewDataMenuActivity : BaseActivity() { private var menuWillBeHidden = false private val fabSize = 48.px + private lateinit var binding: ActivityNewDataBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -43,7 +45,9 @@ class NewDataMenuActivity : BaseActivity() { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } - setContentView(R.layout.activity_new_data) + binding = ActivityNewDataBinding.inflate(layoutInflater) + setContentView(binding.root) + initUI() } @@ -63,27 +67,27 @@ class NewDataMenuActivity : BaseActivity() { overridePendingTransition(0, 0) - container.viewTreeObserver.addOnGlobalLayoutListener { + binding.container.viewTreeObserver.addOnGlobalLayoutListener { showMenu() } - newCashGame.setOnClickListener { + binding.newCashGame.setOnClickListener { finishWithResult(0) } - newTournament.setOnClickListener { + binding.newTournament.setOnClickListener { finishWithResult(1) } - newTransaction.setOnClickListener { + binding.newTransaction.setOnClickListener { finishWithResult(2) } - new_hand_history.setOnClickListener { + binding.newHandHistory.setOnClickListener { finishWithResult(3) } - container.setOnClickListener { + binding.container.setOnClickListener { hideMenu() } } @@ -112,9 +116,10 @@ class NewDataMenuActivity : BaseActivity() { */ private fun showMenu() { + val menuContainer = binding.menuContainer val cx = menuContainer.measuredWidth - fabSize / 2 val cy = menuContainer.measuredHeight - fabSize / 2 - val finalRadius = Math.max(menuContainer.width, menuContainer.height) + val finalRadius = max(menuContainer.width, menuContainer.height) val anim = ViewAnimationUtils.createCircularReveal(menuContainer, cx, cy, 0f, finalRadius.toFloat()) anim.duration = 150 @@ -132,6 +137,7 @@ class NewDataMenuActivity : BaseActivity() { } menuWillBeHidden = true + val menuContainer = binding.menuContainer val cx = menuContainer.measuredWidth - fabSize / 2 val cy = menuContainer.measuredHeight - fabSize / 2 val initialRadius = menuContainer.width diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt index c81166eb..0ace340c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FilterDetailsFragment.kt @@ -6,9 +6,8 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import kotlinx.android.synthetic.main.fragment_filter_details.* -import kotlinx.android.synthetic.main.fragment_filter_details.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentFilterDetailsBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.filter.QueryCondition import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -30,6 +29,9 @@ open class FilterDetailsFragment : RealmFragment(), RowRepresentableDelegate { private lateinit var rowRepresentableAdapter: RowRepresentableAdapter + private var _binding: FragmentFilterDetailsBinding? = null + private val binding get() = _binding!! + companion object { fun newInstance(categoryRow: FilterCategoryRow): FilterDetailsFragment { @@ -44,7 +46,8 @@ open class FilterDetailsFragment : RealmFragment(), RowRepresentableDelegate { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_filter_details, container, false) + _binding = FragmentFilterDetailsBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -58,6 +61,11 @@ open class FilterDetailsFragment : RealmFragment(), RowRepresentableDelegate { saveData() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init UI */ @@ -65,11 +73,11 @@ open class FilterDetailsFragment : RealmFragment(), RowRepresentableDelegate { setDisplayHomeAsUpEnabled(true) - this.appBar.toolbar.title = getString(R.string.filter) + this.binding.toolbar.title = getString(R.string.filter) val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { + binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager } @@ -95,10 +103,10 @@ open class FilterDetailsFragment : RealmFragment(), RowRepresentableDelegate { Timber.d(">> Filter = ${this.activityModel.currentFilter}") Timber.d("selectedRow = ${this.activityModel.selectedCategoryRow}") - this.appBar.toolbar.title = this.activityModel.selectedCategoryRow?.localizedTitle(requireContext()) + this.binding.toolbar.title = this.activityModel.selectedCategoryRow?.localizedTitle(requireContext()) this.rowRepresentableAdapter = RowRepresentableAdapter(this.model, this) - this.recyclerView.adapter = rowRepresentableAdapter + this.binding.recyclerView.adapter = rowRepresentableAdapter } override fun onRowSelected(position: Int, row: RowRepresentable, tag: Int) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt index 6b8a6378..05c18a99 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersFragment.kt @@ -8,11 +8,8 @@ import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.chip.Chip -import kotlinx.android.synthetic.main.fragment_editable_data.appBar -import kotlinx.android.synthetic.main.fragment_editable_data.recyclerView -import kotlinx.android.synthetic.main.fragment_filters.* -import kotlinx.android.synthetic.main.fragment_filters.view.toolbar import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentFiltersBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.realm.Filter @@ -44,9 +41,13 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { private var showMostUsedFiltersLayout = true + private var _binding: FragmentFiltersBinding? = null + private val binding get() = _binding!! + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_filters, container, false) + _binding = FragmentFiltersBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -102,6 +103,11 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { return true } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init UI */ @@ -109,20 +115,20 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { setDisplayHomeAsUpEnabled(true) - this.appBar.toolbar.title = getString(R.string.filter) + this.binding.toolbar.title = getString(R.string.filter) val viewManager = LinearLayoutManager(requireContext()) - recyclerView.apply { + this.binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager } - moreFilters.setOnClickListener { + this.binding.moreFilters.setOnClickListener { LiveData.FILTER.subType = this.model.filterableType?.uniqueIdentifier FiltersListActivity.newSelectInstance(this, false) } - mostUsedFiltersLayout.isVisible = showMostUsedFiltersLayout + this.binding.mostUsedFiltersLayout.isVisible = showMostUsedFiltersLayout } /** @@ -133,7 +139,7 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { this.model.init(getRealm()) this.rowRepresentableAdapter = RowRepresentableAdapter(this.model, this) - this.recyclerView.adapter = rowRepresentableAdapter + this.binding.recyclerView.adapter = rowRepresentableAdapter } @@ -157,11 +163,11 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { val currentFilterId = Preferences.getActiveFilterId(requireContext()) if (this.model.isUpdating || filters.isEmpty() || (filters.size == 1 && filters.first()?.id == currentFilterId)) { - mostUsedFiltersLayout.visibility = View.GONE + this.binding.mostUsedFiltersLayout.visibility = View.GONE return } - mostUsedFilters.removeAllViews() + this.binding.mostUsedFilters.removeAllViews() filters.forEach { filter -> if (nbChips < MOST_USED_FILTERS_DISPLAYED) { @@ -185,7 +191,7 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { finishActivityWithResult("") } } - mostUsedFilters.addView(chip) + this.binding.mostUsedFilters.addView(chip) nbChips++ } } @@ -249,7 +255,7 @@ open class FiltersFragment : RealmFragment(), RowRepresentableDelegate { fun updateMostUsedFiltersVisibility(visible: Boolean) { Timber.d("updateMostUsedFiltersVisibility: $visible") showMostUsedFiltersLayout = visible - mostUsedFiltersLayout?.isVisible = visible + this.binding.mostUsedFiltersLayout.isVisible = visible } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt index a89b5e08..01050708 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/filter/FiltersListFragment.kt @@ -4,9 +4,8 @@ import android.app.Activity import android.content.Context import android.content.Intent import net.pokeranalytics.android.model.realm.Filter -import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetFragment -import net.pokeranalytics.android.ui.modules.filter.FilterHandler.Companion.INTENT_FILTER_UPDATE_FILTER_UI import net.pokeranalytics.android.ui.modules.datalist.DataListFragment +import net.pokeranalytics.android.ui.modules.filter.FilterHandler.Companion.INTENT_FILTER_UPDATE_FILTER_UI import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.util.Preferences diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorFragment.kt index a0e7310d..86d7b384 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/editor/EditorFragment.kt @@ -11,9 +11,8 @@ import android.view.animation.AccelerateDecelerateInterpolator import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import kotlinx.android.synthetic.main.fragment_hand_history.* -import kotlinx.android.synthetic.main.fragment_settings.recyclerView import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentHandHistoryBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.handhistory.Position @@ -68,6 +67,9 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen return this.model.isEdited } + private var _binding: FragmentHandHistoryBinding? = null + private val binding get() = _binding!! + companion object { fun newInstance(id: String? = null, configurationId: String? = null, attached: Boolean = false): EditorFragment { @@ -91,9 +93,10 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_hand_history, container, false) + _binding = FragmentHandHistoryBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -137,7 +140,7 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen // } // val itemTouchHelper = ItemTouchHelper(swipeToDelete) - recyclerView.apply { + binding.recyclerView.apply { setHasFixedSize(true) layoutManager = SmoothScrollLinearLayoutManager(requireContext()) adapter = editorAdapter @@ -156,7 +159,7 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen // At first, the selection is defined before the holder is bound, // so we retrieve the editText inputConnection once the recycler view has been rendered - this.recyclerView.viewTreeObserver.addOnGlobalLayoutListener { + this.binding.recyclerView.viewTreeObserver.addOnGlobalLayoutListener { when (this.model.currentKeyboard) { HHKeyboard.AMOUNT -> { val selection = this.model.currentSelection @@ -168,7 +171,7 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen } initKeyboardDefaultHeight() - this.keyboard.keyboardListener = this + this.binding.keyboard.keyboardListener = this } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -227,6 +230,11 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen return true } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun showReplayer() { (this.activity as HandHistoryActivity).showReplayer(this.model.handHistory.id) } @@ -295,10 +303,10 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen val handRow = this.model.rowRepresentableForPosition(selection.index) as? HandHistoryRow val holder = - recyclerView.findViewHolderForAdapterPosition(selection.index) as? EditorAdapter.RowHandHolder + binding.recyclerView.findViewHolderForAdapterPosition(selection.index) as? EditorAdapter.RowHandHolder holder?.let { val amountEditText = it.editTextForTag(selection.tag) - this.keyboard.setAmountEditText( + this.binding.keyboard.setAmountEditText( amountEditText, handRow?.amountForTag(this.model.handHistory, selection.tag) ) @@ -541,10 +549,10 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen */ private fun configureActionKeyboard() { val availableActions = this.model.availableActions() - this.keyboard.setAvailableAction(availableActions) + this.binding.keyboard.setAvailableAction(availableActions) val positions = this.model.positionsToAct() - this.keyboard.setPositions(positions) + this.binding.keyboard.setPositions(positions) } /*** @@ -579,7 +587,7 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen * We subtract 1 to give space and the ability to see the previously entered data */ private fun scrollToPosition(index: Int) { - this.recyclerView.smoothScrollToPosition(index - 1) + this.binding.recyclerView.smoothScrollToPosition(index - 1) } /*** @@ -606,11 +614,11 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen */ private fun showKeyboard(keyboard: HHKeyboard, endHandler: (() -> (Unit))? = null) { - val lp = this.kbTopGuideline.layoutParams as ConstraintLayout.LayoutParams + val lp = this.binding.kbTopGuideline.layoutParams as ConstraintLayout.LayoutParams if (lp.guideEnd == 0) { this.animateKeyboard(true, endHandler) } - this.keyboard.show(keyboard) + this.binding.keyboard.show(keyboard) } /*** @@ -631,11 +639,11 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen // set interpolator and updateListener to get the animated value valueAnimator.addUpdateListener { - val lp = this.kbTopGuideline.layoutParams as ConstraintLayout.LayoutParams + val lp = this.binding.kbTopGuideline.layoutParams as ConstraintLayout.LayoutParams // get the float value lp.guideEnd = (it.animatedValue as Float).toInt() // update layout params - this.kbTopGuideline.layoutParams = lp + this.binding.kbTopGuideline.layoutParams = lp if (lp.guideEnd == end.toInt()) { endHandler?.invoke() @@ -649,7 +657,7 @@ class EditorFragment : RealmFragment(), RowRepresentableDelegate, KeyboardListen * Starts by hiding the keyboard */ private fun initKeyboardDefaultHeight() { - val lp = this.kbTopGuideline.layoutParams as ConstraintLayout.LayoutParams + val lp = this.binding.kbTopGuideline.layoutParams as ConstraintLayout.LayoutParams lp.guideEnd = 0 } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerFragment.kt index 3cdaac2c..2d01c8e7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/replayer/ReplayerFragment.kt @@ -8,8 +8,8 @@ import android.widget.PopupWindow import android.widget.Switch import androidx.lifecycle.ViewModelProvider import io.realm.Sort -import kotlinx.android.synthetic.main.fragment_replayer.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.databinding.FragmentReplayerBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.handhistory.HandHistory import net.pokeranalytics.android.ui.fragment.components.RealmFragment @@ -38,6 +38,9 @@ class ReplayerFragment : RealmFragment() { */ private lateinit var model: ReplayerModel + private var _binding: FragmentReplayerBinding? = null + private val binding get() = _binding!! + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -47,9 +50,10 @@ class ReplayerFragment : RealmFragment() { } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_replayer, container, false) + _binding = FragmentReplayerBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -79,6 +83,11 @@ class ReplayerFragment : RealmFragment() { } } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + private fun initData() { val id = arguments?.getString(BundleKey.HAND_HISTORY_ID.value) ?: throw PAIllegalStateException("Attempt to start a replayer without hh id") val hh = getRealm().findById(id) ?: throw PAIllegalStateException("hh with id: $id not found") @@ -86,25 +95,25 @@ class ReplayerFragment : RealmFragment() { } private fun initUI() { - this.next_action.setOnClickListener { + this.binding.nextAction.setOnClickListener { nextAction() } - this.previous_action.setOnClickListener { + this.binding.previousAction.setOnClickListener { previousAction() } - this.next_hand.setOnClickListener { + this.binding.nextHand.setOnClickListener { nextHand() } - this.previous_hand.setOnClickListener { + this.binding.previousHand.setOnClickListener { previousHand() } - this.play_pause.setOnClickListener { + this.binding.playPause.setOnClickListener { playOrPause() } - this.speed.setOnClickListener { + this.binding.speed.setOnClickListener { changeSpeed() } - this.settings.setOnClickListener { + this.binding.settings.setOnClickListener { openSettings() } @@ -131,12 +140,12 @@ class ReplayerFragment : RealmFragment() { private fun updateSpeedButtonText() { val speedText = "${this.model.speedMultiplier.value}x" - this.speed.text = speedText + this.binding.speed.text = speedText } private fun loadHand(handHistory: HandHistory) { val config = ReplayerAnimator(handHistory, false) - this.replayer.animator = config + this.binding.replayer.animator = config this.model.animator = config } @@ -164,18 +173,18 @@ class ReplayerFragment : RealmFragment() { this.mainHandler.postDelayed(timerRunnable, 0L) this.model.isPlaying = true - this.play_pause.setImageResource(R.drawable.ic_outline_pause) + this.binding.playPause.setImageResource(R.drawable.ic_outline_pause) } private fun pause() { this.mainHandler.removeCallbacks(timerRunnable) this.model.isPlaying = false - this.play_pause.setImageResource(R.drawable.ic_play_arrow) + this.binding.playPause.setImageResource(R.drawable.ic_play_arrow) } private fun nextAction() { this.model.nextStep() - this.replayer.refresh() + this.binding.replayer.refresh() if (this.model.isPlaying) { this.mainHandler.postDelayed(timerRunnable, this.model.actionDelay) @@ -185,7 +194,7 @@ class ReplayerFragment : RealmFragment() { private fun previousAction() { this.model.previousStep() - this.replayer.refresh() + this.binding.replayer.refresh() refreshPlayButtonIfNecessary() } @@ -237,13 +246,13 @@ class ReplayerFragment : RealmFragment() { switch.isChecked = Preferences.getShowVillainCards(requireContext()) switch.setOnCheckedChangeListener { _, isChecked -> Preferences.setShowVillainCards(isChecked, requireContext()) - this.replayer.refresh() + this.binding.replayer.refresh() } val popupWindow = PopupWindow(requireContext()) popupWindow.contentView = view popupWindow.isFocusable = true - popupWindow.showAsDropDown(this.settings, 0, -300) + popupWindow.showAsDropDown(this.binding.settings, 0, -300) } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt index 97b2b73d..19107c67 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardActionView.kt @@ -2,10 +2,10 @@ package net.pokeranalytics.android.ui.modules.handhistory.views import android.content.Context import android.view.LayoutInflater +import android.widget.ImageButton import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.view_hand_keyboard_action.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.handhistory.Position @@ -26,10 +26,15 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), private var availableActions: Set = setOf() + private var recyclerView: RecyclerView + private var closeButton: ImageButton + init { - LayoutInflater.from(context) + val view = LayoutInflater.from(context) .inflate(R.layout.view_hand_keyboard_action, this, true) + this.recyclerView = view.findViewById(R.id.recyclerView) + this.closeButton = view.findViewById(R.id.closeButton) // Action recycler val spanCount = 3 @@ -39,15 +44,14 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), val spacing = 2.px val includeEdge = false - this.recyclerView.apply { + recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager adapter = dataAdapter addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, includeEdge)) } - - this.closeButton.setOnClickListener { + closeButton.setOnClickListener { this.keyboardListener?.closeKeyboard() } @@ -61,7 +65,7 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), this.positionAdapter = PositionAdapter(it) } ?: throw PAIllegalStateException("keyboard listener not set") - this.recycler.apply { + recyclerView.apply { setHasFixedSize(true) layoutManager = positionViewManager adapter = positionAdapter @@ -74,7 +78,7 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), this.positionAdapter.positions = positions } - override fun adapterRows(): List? { + override fun adapterRows(): List { return Action.Type.defaultTypes } @@ -99,7 +103,7 @@ class KeyboardActionView(context: Context) : AbstractKeyboardView(context), this.dataAdapter.notifyDataSetChanged() } - override fun textColor(position: Int, row: RowRepresentable): Int? { + override fun textColor(position: Int, row: RowRepresentable): Int { return if (isEnabled(row, 0)) { R.color.white } else { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardAmountView.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardAmountView.kt index fcc5add1..c59c3a88 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardAmountView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardAmountView.kt @@ -4,9 +4,11 @@ import android.content.Context import android.view.LayoutInflater import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputConnection +import android.widget.Button import android.widget.EditText +import android.widget.ImageView import androidx.recyclerview.widget.GridLayoutManager -import kotlinx.android.synthetic.main.view_hand_keyboard_amount.view.* +import androidx.recyclerview.widget.RecyclerView import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter @@ -17,7 +19,6 @@ import net.pokeranalytics.android.ui.view.GridSpacingItemDecoration import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.util.extensions.noGroupingFormatted -import timber.log.Timber import java.text.DecimalFormatSymbols class NumericKey : RowRepresentable { @@ -77,9 +78,22 @@ class KeyboardAmountView(context: Context) : AbstractKeyboardView(context), */ private var inputConnection: InputConnection? = null + private var recyclerView: RecyclerView + private var nextButton: Button + private var kiloButton: Button + private var millionButton: Button + private var clearButton: Button + private var closeButton: ImageView + init { - LayoutInflater.from(context) + val view = LayoutInflater.from(context) .inflate(R.layout.view_hand_keyboard_amount, this, true) + this.recyclerView = view.findViewById(R.id.recyclerView) + this.nextButton = view.findViewById(R.id.nextButton) + this.kiloButton = view.findViewById(R.id.kiloButton) + this.millionButton = view.findViewById(R.id.millionButton) + this.clearButton = view.findViewById(R.id.clearButton) + this.closeButton = view.findViewById(R.id.closeButton) val viewManager = GridLayoutManager(context, 3) this.dataAdapter = RowRepresentableAdapter(this, this) @@ -142,7 +156,7 @@ class KeyboardAmountView(context: Context) : AbstractKeyboardView(context), } - override fun adapterRows(): List? { + override fun adapterRows(): List { val keys = mutableListOf() (0 until 12).forEach { index -> val key = when (index) { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardCardView.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardCardView.kt index 5b766744..278b4ef6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardCardView.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/KeyboardCardView.kt @@ -2,8 +2,10 @@ package net.pokeranalytics.android.ui.modules.handhistory.views import android.content.Context import android.view.LayoutInflater +import android.widget.Button +import android.widget.ImageButton import androidx.recyclerview.widget.GridLayoutManager -import kotlinx.android.synthetic.main.view_hand_keyboard_card.view.* +import androidx.recyclerview.widget.RecyclerView import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.realm.handhistory.Card @@ -20,10 +22,24 @@ class KeyboardCardView(context: Context) : AbstractKeyboardView(context) { private lateinit var cardValueAdapter: CardValueAdapter private lateinit var cardSuitAdapter: CardSuitAdapter + private var valueRecyclerView: RecyclerView + private var suitRecyclerView: RecyclerView + + private var nextButton: Button + private var backSpaceButton: Button + private var clearButton: Button + private var closeButton: ImageButton + init { - LayoutInflater.from(context) + val view = LayoutInflater.from(context) .inflate(R.layout.view_hand_keyboard_card, this, true) + this.valueRecyclerView = view.findViewById(R.id.valueRecyclerView) + this.suitRecyclerView = view.findViewById(R.id.suitRecyclerView) + this.backSpaceButton = view.findViewById(R.id.backSpaceButton) + this.nextButton = view.findViewById(R.id.nextButton) + this.clearButton = view.findViewById(R.id.clearButton) + this.closeButton = view.findViewById(R.id.closeButton) this.nextButton.setOnClickListener { this.keyboardListener?.cardSelectionEnded() diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt index 724d9192..eda969c7 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/handhistory/views/RowHandHistoryViewHolder.kt @@ -1,8 +1,10 @@ package net.pokeranalytics.android.ui.modules.handhistory.views import android.view.View +import android.widget.LinearLayout +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView -import kotlinx.android.synthetic.main.row_hand_history_view.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.handhistory.Street import net.pokeranalytics.android.model.realm.handhistory.HandHistory @@ -23,13 +25,15 @@ class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemVie val handHistory = row as HandHistory - itemView.cardsLayout.removeAllViews() + val cardsLayout = itemView.findViewById(R.id.cardsLayout) + cardsLayout.removeAllViews() - handHistory.cardViews(itemView.context, itemView.cardsLayout).forEach { view -> - itemView.cardsLayout.addView(view) + handHistory.cardViews(itemView.context, cardsLayout).forEach { view -> + cardsLayout.addView(view) } - itemView.amount.text = handHistory.potSizeForStreet(Street.SUMMARY).formatted + val amount = itemView.findViewById(R.id.amount) + amount.text = handHistory.potSizeForStreet(Street.SUMMARY).formatted val heroWins = handHistory.heroWins val colorId = when(heroWins) { @@ -38,12 +42,14 @@ class RowHandHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemVie else -> R.color.kaki_light } - itemView.amount.setTextColor(itemView.context.getColor(colorId)) + amount.setTextColor(itemView.context.getColor(colorId)) val listener = View.OnClickListener { delegate?.onRowSelected(position, row) } - itemView.constraintLayout.setOnClickListener(listener) + + val constraintLayout = itemView.findViewById(R.id.constraintLayout) + constraintLayout.setOnClickListener(listener) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt index a4b6f00b..c7c58ff0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/modules/session/SessionFragment.kt @@ -11,13 +11,13 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DiffUtil -import kotlinx.android.synthetic.main.fragment_session.* import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import kotlinx.coroutines.launch import net.pokeranalytics.android.R import net.pokeranalytics.android.calculus.bankroll.BankrollReportManager import net.pokeranalytics.android.calculus.optimalduration.CashGameOptimalDurationCalculator +import net.pokeranalytics.android.databinding.FragmentSessionBinding import net.pokeranalytics.android.exceptions.PAIllegalStateException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.model.extensions.SessionState @@ -69,6 +69,9 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr } } + private var _binding: FragmentSessionBinding? = null + private val binding get() = _binding!! + // private val coroutineContext: CoroutineContext // get() = Dispatchers.Main @@ -93,9 +96,10 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { super.onCreateView(inflater, container, savedInstanceState) - return inflater.inflate(R.layout.fragment_session, container, false) + _binding = FragmentSessionBinding.inflate(inflater, container, false) + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -104,28 +108,33 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr initUI() } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + /** * Init UI */ private fun initUI() { - toolbar.title = if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game) - collapsingToolbar.title = toolbar.title + binding.toolbar.title = if (currentSession.isTournament()) getString(R.string.tournament) else getString(R.string.cash_game) + binding.collapsingToolbar.title = binding.toolbar.title sessionAdapter = RowRepresentableAdapter(this, this) - recyclerView.adapter = sessionAdapter + binding.recyclerView.adapter = sessionAdapter updateSessionUI(true) setDisplayHomeAsUpEnabled(true) val viewManager = SmoothScrollLinearLayoutManager(requireContext()) - recyclerView.apply { + binding.recyclerView.apply { setHasFixedSize(true) layoutManager = viewManager } - floatingActionButton.setOnClickListener { + binding.floatingActionButton.setOnClickListener { if (this.currentSession.isValidForSave()) { sessionHasBeenUserCustomized = true manageSessionState() @@ -279,6 +288,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr val animationDuration = if (firstDisplay) 0L else 300L + val floatingActionButton = binding.floatingActionButton when (currentSession.getState()) { SessionState.PENDING, SessionState.PLANNED -> { sessionMenu?.findItem(R.id.restart)?.isVisible = false @@ -345,17 +355,18 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr * Update adapter UI */ private fun updateAdapterUI() { - this.adapterRows()?.let { - val diffResult = DiffUtil.calculateDiff(RowRepresentableDiffCallback(it, oldRows)) - sessionAdapter.updateRows(diffResult) - oldRows.clear() - oldRows.addAll(it) + val rows = this.adapterRows() + + val diffResult = DiffUtil.calculateDiff(RowRepresentableDiffCallback(rows, oldRows)) + this.sessionAdapter.updateRows(diffResult) + + this.oldRows.clear() + this.oldRows.addAll(rows) // if (scrollToTop) { // recyclerView.smoothScrollToPosition(0) // } - } } /** @@ -373,7 +384,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr } currentSession.startOrContinue() - this.recyclerView.smoothScrollToPosition(0) + binding.recyclerView.smoothScrollToPosition(0) } SessionState.STARTED -> { @@ -493,7 +504,7 @@ class SessionFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRepr // this.rowRepresentationForCurrentState = this.updatedRowRepresentationForCurrentState(requireContext()) } - override fun adapterRows(): List? { + override fun adapterRows(): List { return this.model.rows }