[LeakCanary]: OnboardingFragment: Use viewbinding as official way

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-09-11 23:10:54 +05:30
parent ba2ecbd85f
commit b4e34acf31
7 changed files with 105 additions and 215 deletions

View File

@@ -24,10 +24,8 @@ import android.animation.AnimatorListenerAdapter
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewAnimationUtils import android.view.ViewAnimationUtils
import android.view.ViewGroup
import androidx.recyclerview.widget.StaggeredGridLayoutManager import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.aurora.extensions.hide import com.aurora.extensions.hide
import com.aurora.extensions.isSAndAbove import com.aurora.extensions.isSAndAbove
@@ -48,60 +46,31 @@ import java.nio.charset.StandardCharsets
import kotlin.math.sqrt import kotlin.math.sqrt
class AccentFragment : BaseFragment() { class AccentFragment : BaseFragment(R.layout.fragment_onboarding_accent) {
private lateinit var B: FragmentOnboardingAccentBinding private var _binding: FragmentOnboardingAccentBinding? = null
private val binding get() = _binding!!
private var themeId: Int = 0 private var themeId: Int = 0
private var accentId: Int = if (isSAndAbove()) 0 else 1 private var accentId: Int = if (isSAndAbove()) 0 else 1
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentOnboardingAccentBinding.bind(
inflater.inflate(
R.layout.fragment_onboarding_accent,
container,
false
)
)
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentOnboardingAccentBinding.bind(view)
themeId = Preferences.getInteger( themeId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_TYPE)
requireContext(), accentId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_ACCENT)
PREFERENCE_THEME_TYPE
)
accentId = Preferences.getInteger( // RecyclerView
requireContext(), with(binding.epoxyRecycler) {
PREFERENCE_THEME_ACCENT
)
attachRecycler()
val accentList = loadAccentsFromAssets()
updateController(accentList)
}
private fun attachRecycler() {
with(B.epoxyRecycler) {
setHasFixedSize(true) setHasFixedSize(true)
layoutManager = StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL) layoutManager = StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL)
} }
}
private fun updateController(accentList: List<Accent>) { binding.epoxyRecycler.withModels {
B.epoxyRecycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
accentList.forEach { loadAccentsFromAssets().forEach {
if (it.id == 0) { if (it.id == 0) {
if (!isSAndAbove()) return@forEach if (!isSAndAbove()) return@forEach
} }
@@ -128,25 +97,25 @@ class AccentFragment : BaseFragment() {
} }
private fun animate(view: View) { private fun animate(view: View) {
if (B.themeSwitchImage.isVisible()) { if (binding.themeSwitchImage.isVisible()) {
return; return;
} }
try { try {
val pos = IntArray(2) val pos = IntArray(2)
view.getLocationInWindow(pos) view.getLocationInWindow(pos)
val w: Int = B.root.measuredWidth val w: Int = binding.root.measuredWidth
val h: Int = B.root.measuredHeight val h: Int = binding.root.measuredHeight
val bitmap = Bitmap.createBitmap( val bitmap = Bitmap.createBitmap(
B.root.measuredWidth, binding.root.measuredWidth,
B.root.measuredHeight, binding.root.measuredHeight,
Bitmap.Config.ARGB_8888 Bitmap.Config.ARGB_8888
) )
val canvas = Canvas(bitmap) val canvas = Canvas(bitmap)
B.root.draw(canvas) binding.root.draw(canvas)
B.themeSwitchImage.setImageBitmap(bitmap) binding.themeSwitchImage.setImageBitmap(bitmap)
B.themeSwitchImage.show() binding.themeSwitchImage.show()
val finalRadius = sqrt( val finalRadius = sqrt(
((w - pos[0]) * (w - pos[0]) + (h - pos[1]) * (h - pos[1])).toDouble() ((w - pos[0]) * (w - pos[0]) + (h - pos[1]) * (h - pos[1])).toDouble()
@@ -155,7 +124,7 @@ class AccentFragment : BaseFragment() {
).toFloat() ).toFloat()
val anim: Animator = ViewAnimationUtils.createCircularReveal( val anim: Animator = ViewAnimationUtils.createCircularReveal(
B.root, binding.root,
pos[0], pos[0],
pos[1], pos[1],
0f, 0f,
@@ -166,8 +135,8 @@ class AccentFragment : BaseFragment() {
anim.interpolator = CubicBezierInterpolator.EASE_IN_OUT_QUAD anim.interpolator = CubicBezierInterpolator.EASE_IN_OUT_QUAD
anim.addListener(object : AnimatorListenerAdapter() { anim.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
B.themeSwitchImage.setImageDrawable(null) binding.themeSwitchImage.setImageDrawable(null)
B.themeSwitchImage.hide() binding.themeSwitchImage.hide()
} }
}) })
anim.start() anim.start()

View File

@@ -17,8 +17,7 @@ import com.aurora.store.databinding.FragmentAppLinksBinding
class AppLinksFragment : Fragment(R.layout.fragment_app_links) { class AppLinksFragment : Fragment(R.layout.fragment_app_links) {
private var _binding: FragmentAppLinksBinding? = null private var _binding: FragmentAppLinksBinding? = null
private val binding: FragmentAppLinksBinding private val binding get() = _binding!!
get() = _binding!!
private val playStoreDomain = "play.google.com" private val playStoreDomain = "play.google.com"

View File

@@ -21,9 +21,7 @@ package com.aurora.store.view.ui.onboarding
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.extensions.isMIUI import com.aurora.extensions.isMIUI
import com.aurora.extensions.isMiuiOptimizationDisabled import com.aurora.extensions.isMiuiOptimizationDisabled
@@ -44,15 +42,16 @@ import com.aurora.store.util.save
import com.aurora.store.view.epoxy.views.preference.InstallerViewModel_ import com.aurora.store.view.epoxy.views.preference.InstallerViewModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import java.nio.charset.StandardCharsets
import rikka.shizuku.Shizuku import rikka.shizuku.Shizuku
import java.nio.charset.StandardCharsets
class InstallerFragment : BaseFragment() { class InstallerFragment : BaseFragment(R.layout.fragment_onboarding_installer) {
private lateinit var B: FragmentOnboardingInstallerBinding private var _binding: FragmentOnboardingInstallerBinding? = null
private val binding get() = _binding!!
var installerId: Int = 0 private var installerId: Int = 0
private var shizukuAlive = false private var shizukuAlive = false
private val shizukuAliveListener = Shizuku.OnBinderReceivedListener { private val shizukuAliveListener = Shizuku.OnBinderReceivedListener {
@@ -69,7 +68,7 @@ class InstallerFragment : BaseFragment() {
if (result == PackageManager.PERMISSION_GRANTED) { if (result == PackageManager.PERMISSION_GRANTED) {
this.installerId = 5 this.installerId = 5
save(PREFERENCE_INSTALLER_ID, 5) save(PREFERENCE_INSTALLER_ID, 5)
B.epoxyRecycler.requestModelBuild() binding.epoxyRecycler.requestModelBuild()
} else { } else {
showDialog( showDialog(
R.string.action_installations, R.string.action_installations,
@@ -78,54 +77,16 @@ class InstallerFragment : BaseFragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
if (hasShizuku(requireContext()) && isOAndAbove()) {
Shizuku.addBinderReceivedListenerSticky(shizukuAliveListener)
Shizuku.addBinderDeadListener(shizukuDeadListener)
Shizuku.addRequestPermissionResultListener(shizukuResultListener)
}
B = FragmentOnboardingInstallerBinding.bind(
inflater.inflate(
R.layout.fragment_onboarding_installer,
container,
false
)
)
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentOnboardingInstallerBinding.bind(view)
installerId = Preferences.getInteger( installerId = Preferences.getInteger(requireContext(), PREFERENCE_INSTALLER_ID)
requireContext(),
PREFERENCE_INSTALLER_ID
)
val installerList = loadInstallersFromAssets() // RecyclerView
updateController(installerList) binding.epoxyRecycler.withModels {
}
override fun onDestroy() {
if (hasShizuku(requireContext()) && isOAndAbove()) {
Shizuku.removeBinderReceivedListener(shizukuAliveListener)
Shizuku.removeBinderDeadListener(shizukuDeadListener)
Shizuku.removeRequestPermissionResultListener(shizukuResultListener)
}
super.onDestroy()
}
private fun updateController(installerList: List<Installer>) {
B.epoxyRecycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
installerList.forEach { loadInstallersFromAssets().forEach {
add( add(
InstallerViewModel_() InstallerViewModel_()
.id(it.id) .id(it.id)
@@ -146,6 +107,20 @@ class InstallerFragment : BaseFragment() {
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onDestroy() {
if (hasShizuku(requireContext()) && isOAndAbove()) {
Shizuku.removeBinderReceivedListener(shizukuAliveListener)
Shizuku.removeBinderDeadListener(shizukuDeadListener)
Shizuku.removeRequestPermissionResultListener(shizukuResultListener)
}
super.onDestroy()
}
private fun save(installerId: Int) { private fun save(installerId: Int) {
when (installerId) { when (installerId) {
0 -> { 0 -> {

View File

@@ -54,8 +54,7 @@ import com.google.android.material.tabs.TabLayoutMediator
class OnboardingFragment : Fragment(R.layout.fragment_onboarding) { class OnboardingFragment : Fragment(R.layout.fragment_onboarding) {
private var _binding: FragmentOnboardingBinding? = null private var _binding: FragmentOnboardingBinding? = null
private val binding: FragmentOnboardingBinding private val binding get() = _binding!!
get() = _binding!!
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)

View File

@@ -27,9 +27,7 @@ import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isOAndAbove
@@ -44,57 +42,40 @@ import com.aurora.store.view.epoxy.views.preference.PermissionViewModel_
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
class PermissionsFragment : BaseFragment() { class PermissionsFragment : BaseFragment(R.layout.fragment_onboarding_permissions) {
private lateinit var B: FragmentOnboardingPermissionsBinding private var _binding: FragmentOnboardingPermissionsBinding? = null
private val binding get() = _binding!!
private val startForPackageManagerResult = private val startForPackageManagerResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (isOAndAbove() && requireContext().packageManager.canRequestPackageInstalls()) { if (isOAndAbove() && requireContext().packageManager.canRequestPackageInstalls()) {
toast(R.string.toast_permission_granted) toast(R.string.toast_permission_granted)
B.epoxyRecycler.requestModelBuild() binding.epoxyRecycler.requestModelBuild()
} }
} }
private val startForStorageManagerResult = private val startForStorageManagerResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (isRAndAbove() && Environment.isExternalStorageManager()) { if (isRAndAbove() && Environment.isExternalStorageManager()) {
toast(R.string.toast_permission_granted) toast(R.string.toast_permission_granted)
B.epoxyRecycler.requestModelBuild() binding.epoxyRecycler.requestModelBuild()
} }
} }
private val startForPermissions = private val startForPermissions =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (it) { if (it) {
toast(R.string.toast_permission_granted) toast(R.string.toast_permission_granted)
B.epoxyRecycler.requestModelBuild() binding.epoxyRecycler.requestModelBuild()
} else { } else {
toast(R.string.permissions_denied) toast(R.string.permissions_denied)
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentOnboardingPermissionsBinding.bind(
inflater.inflate(
R.layout.fragment_onboarding_permissions,
container,
false
)
)
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
updateController() _binding = FragmentOnboardingPermissionsBinding.bind(view)
}
private fun updateController() {
// RecyclerView
val installerList = mutableListOf( val installerList = mutableListOf(
Permission( Permission(
2, 2,
@@ -131,7 +112,7 @@ class PermissionsFragment : BaseFragment() {
) )
} }
B.epoxyRecycler.withModels { binding.epoxyRecycler.withModels {
val writeExternalStorage = if (!isRAndAbove()) ActivityCompat.checkSelfPermission( val writeExternalStorage = if (!isRAndAbove()) ActivityCompat.checkSelfPermission(
requireContext(), requireContext(),
Manifest.permission.WRITE_EXTERNAL_STORAGE Manifest.permission.WRITE_EXTERNAL_STORAGE
@@ -141,7 +122,12 @@ class PermissionsFragment : BaseFragment() {
Manifest.permission.POST_NOTIFICATIONS Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED else true ) == PackageManager.PERMISSION_GRANTED else true
val storageManager = if (isRAndAbove()) Environment.isExternalStorageManager() else true val storageManager = if (isRAndAbove()) Environment.isExternalStorageManager() else true
val canInstallPackages = if (isOAndAbove()) requireContext().packageManager.canRequestPackageInstalls() else true val canInstallPackages = if (isOAndAbove()) {
requireContext().packageManager.canRequestPackageInstalls()
} else {
true
}
setFilterDuplicates(true) setFilterDuplicates(true)
installerList.forEach { installerList.forEach {
add( add(
@@ -170,6 +156,11 @@ class PermissionsFragment : BaseFragment() {
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun checkStorageAccessPermission() { private fun checkStorageAccessPermission() {
startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
} }

View File

@@ -24,10 +24,8 @@ import android.animation.AnimatorListenerAdapter
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewAnimationUtils import android.view.ViewAnimationUtils
import android.view.ViewGroup
import com.aurora.extensions.hide import com.aurora.extensions.hide
import com.aurora.extensions.isVisible import com.aurora.extensions.isVisible
import com.aurora.extensions.show import com.aurora.extensions.show
@@ -46,50 +44,25 @@ import java.nio.charset.StandardCharsets
import kotlin.math.sqrt import kotlin.math.sqrt
class ThemeFragment : BaseFragment() { class ThemeFragment : BaseFragment(R.layout.fragment_onboarding_theme) {
private lateinit var B: FragmentOnboardingThemeBinding private var _binding: FragmentOnboardingThemeBinding? = null
private val binding get() = _binding!!
private var themeId: Int = 0 private var themeId: Int = 0
private var accentId: Int = 0 private var accentId: Int = 0
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentOnboardingThemeBinding.bind(
inflater.inflate(
R.layout.fragment_onboarding_theme,
container,
false
)
)
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
_binding = FragmentOnboardingThemeBinding.bind(view)
themeId = Preferences.getInteger( themeId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_TYPE)
requireContext(), accentId = Preferences.getInteger(requireContext(), PREFERENCE_THEME_ACCENT)
PREFERENCE_THEME_TYPE
)
accentId = Preferences.getInteger( // RecyclerView
requireContext(), binding.epoxyRecycler.withModels {
PREFERENCE_THEME_ACCENT
)
val themeList = loadThemesFromAssets()
updateController(themeList)
}
private fun updateController(themeList: List<Theme>) {
B.epoxyRecycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
themeList.forEach { loadThemesFromAssets().forEach {
add( add(
ThemeViewModel_() ThemeViewModel_()
.id(it.id) .id(it.id)
@@ -108,31 +81,36 @@ class ThemeFragment : BaseFragment() {
} }
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun update(themeId: Int) { private fun update(themeId: Int) {
requireActivity().recreate() requireActivity().recreate()
save(PREFERENCE_THEME_TYPE, themeId) save(PREFERENCE_THEME_TYPE, themeId)
} }
private fun animate(view: View) { private fun animate(view: View) {
if (B.themeSwitchImage.isVisible()) { if (binding.themeSwitchImage.isVisible()) {
return; return;
} }
try { try {
val pos = IntArray(2) val pos = IntArray(2)
view.getLocationInWindow(pos) view.getLocationInWindow(pos)
val w: Int = B.root.measuredWidth val w: Int = binding.root.measuredWidth
val h: Int = B.root.measuredHeight val h: Int = binding.root.measuredHeight
val bitmap = Bitmap.createBitmap( val bitmap = Bitmap.createBitmap(
B.root.measuredWidth, binding.root.measuredWidth,
B.root.measuredHeight, binding.root.measuredHeight,
Bitmap.Config.ARGB_8888 Bitmap.Config.ARGB_8888
) )
val canvas = Canvas(bitmap) val canvas = Canvas(bitmap)
B.root.draw(canvas) binding.root.draw(canvas)
B.themeSwitchImage.setImageBitmap(bitmap) binding.themeSwitchImage.setImageBitmap(bitmap)
B.themeSwitchImage.show() binding.themeSwitchImage.show()
val finalRadius = sqrt( val finalRadius = sqrt(
((w - pos[0]) * (w - pos[0]) + (h - pos[1]) * (h - pos[1])).toDouble() ((w - pos[0]) * (w - pos[0]) + (h - pos[1]) * (h - pos[1])).toDouble()
@@ -141,7 +119,7 @@ class ThemeFragment : BaseFragment() {
).toFloat() ).toFloat()
val anim: Animator = ViewAnimationUtils.createCircularReveal( val anim: Animator = ViewAnimationUtils.createCircularReveal(
B.root, binding.root,
pos[0], pos[0],
pos[1], pos[1],
0f, 0f,
@@ -152,8 +130,8 @@ class ThemeFragment : BaseFragment() {
anim.interpolator = CubicBezierInterpolator.EASE_IN_OUT_QUAD anim.interpolator = CubicBezierInterpolator.EASE_IN_OUT_QUAD
anim.addListener(object : AnimatorListenerAdapter() { anim.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
B.themeSwitchImage.setImageDrawable(null) binding.themeSwitchImage.setImageDrawable(null)
B.themeSwitchImage.hide() binding.themeSwitchImage.hide()
} }
}) })
anim.start() anim.start()

View File

@@ -20,9 +20,7 @@
package com.aurora.store.view.ui.onboarding package com.aurora.store.view.ui.onboarding
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import com.aurora.extensions.browse import com.aurora.extensions.browse
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.model.Dash import com.aurora.store.data.model.Dash
@@ -32,18 +30,12 @@ import com.aurora.store.view.ui.commons.BaseFragment
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
class WelcomeFragment : BaseFragment() { class WelcomeFragment : BaseFragment(R.layout.fragment_onboarding_welcome) {
private lateinit var B: FragmentOnboardingWelcomeBinding private var _binding: FragmentOnboardingWelcomeBinding? = null
private val binding get() = _binding!!
companion object { companion object {
@JvmStatic
fun newInstance(): WelcomeFragment {
return WelcomeFragment().apply {
}
}
val icMap: MutableMap<String, Int> = mutableMapOf( val icMap: MutableMap<String, Int> = mutableMapOf(
"ic_faq" to R.drawable.ic_faq, "ic_faq" to R.drawable.ic_faq,
"ic_code" to R.drawable.ic_code, "ic_code" to R.drawable.ic_code,
@@ -53,32 +45,14 @@ class WelcomeFragment : BaseFragment() {
) )
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
B = FragmentOnboardingWelcomeBinding.bind(
inflater.inflate(
R.layout.fragment_onboarding_welcome,
container,
false
)
)
return B.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val dashList = loadDashFromAssets() _binding = FragmentOnboardingWelcomeBinding.bind(view)
updateController(dashList)
}
private fun updateController(dashList: List<Dash>) { // RecyclerView
B.epoxyRecycler.withModels { binding.epoxyRecycler.withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
dashList.forEach { loadDashFromAssets().forEach {
add( add(
DashViewModel_() DashViewModel_()
.id(it.id) .id(it.id)
@@ -101,4 +75,9 @@ class WelcomeFragment : BaseFragment() {
object : TypeToken<MutableList<Dash?>?>() {}.type object : TypeToken<MutableList<Dash?>?>() {}.type
) )
} }
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} }