소스 검색

refactor: migrate 4 medium fragments from synthetics to ViewBinding

Migrate CustomizeSearchFieldFragment, CustomizeQuickButtonsFragment,
CustomiseAppsFragment, and CustomizeAppDrawerAppListFragment from
kotlinx.android.synthetic to ViewBinding pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
User 3 주 전
부모
커밋
f2909f2c4a

+ 34 - 20
app/src/main/java/com/simplauncher/ui/options/CustomiseAppsFragment.kt

@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.ItemTouchHelper
 import androidx.recyclerview.widget.RecyclerView
 import com.simplauncher.R
 import com.simplauncher.adapters.CustomAppsAdapter
+import com.simplauncher.databinding.CustomiseAppsFragmentBinding
 import com.simplauncher.models.CustomiseAppsViewModel
 import com.simplauncher.models.HomeApp
 import com.simplauncher.ui.dialogs.RemoveAllAppsDialog
@@ -20,30 +21,29 @@ import com.simplauncher.utils.BaseFragment
 import com.simplauncher.utils.OnItemActionListener
 import com.simplauncher.utils.OnShitDoneToAppsListener
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.customise_apps_fragment.customise_apps_fragment
-import kotlinx.android.synthetic.main.customise_apps_fragment.customise_apps_fragment_add
-import kotlinx.android.synthetic.main.customise_apps_fragment.customise_apps_fragment_back
-import kotlinx.android.synthetic.main.customise_apps_fragment.customise_apps_fragment_list
-import kotlinx.android.synthetic.main.customise_apps_fragment.customise_apps_fragment_remove_all
-
 
 @AndroidEntryPoint
 class CustomiseAppsFragment : BaseFragment(), OnShitDoneToAppsListener {
 
-    override fun getFragmentView(): ViewGroup = customise_apps_fragment
+    private var _binding: CustomiseAppsFragmentBinding? = null
+    private val binding get() = _binding!!
+
+    override fun getFragmentView(): ViewGroup = binding.customiseAppsFragment
 
     private val viewModel: CustomiseAppsViewModel by viewModels()
 
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        return inflater.inflate(R.layout.customise_apps_fragment, container, false)
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+        _binding = CustomiseAppsFragmentBinding.inflate(inflater, container, false)
+        return binding.root
     }
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
-        customise_apps_fragment_back.setOnClickListener {
+        binding.customiseAppsFragmentBack.setOnClickListener {
             requireActivity().onBackPressedDispatcher.onBackPressed()
         }
     }
+
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         val adapter = CustomAppsAdapter(this)
@@ -51,20 +51,26 @@ class CustomiseAppsFragment : BaseFragment(), OnShitDoneToAppsListener {
         viewModel.apps.observe(viewLifecycleOwner, {
             it?.let { apps ->
                 adapter.setItems(apps)
-                customise_apps_fragment_add.visibility = if(apps.size < 6) View.VISIBLE else View.INVISIBLE
+                binding.customiseAppsFragmentAdd.visibility = if (apps.size < 6) View.VISIBLE else View.INVISIBLE
             } ?: adapter.setItems(listOf())
         })
-        customise_apps_fragment_remove_all.setOnClickListener {
+        binding.customiseAppsFragmentRemoveAll.setOnClickListener {
             RemoveAllAppsDialog.getInstance(viewModel.apps.value!!, viewModel).show(childFragmentManager, "REMOVE_APPS")
         }
 
-        customise_apps_fragment_list.adapter = adapter
+        binding.customiseAppsFragmentList.adapter = adapter
         val listener: OnItemActionListener = adapter
         val simpleItemTouchCallback = object : ItemTouchHelper.Callback() {
 
-            override fun onChildDraw(c: Canvas, recyclerView: RecyclerView,
-                                     viewHolder: RecyclerView.ViewHolder, dX: Float,
-                                     dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
+            override fun onChildDraw(
+                c: Canvas,
+                recyclerView: RecyclerView,
+                viewHolder: RecyclerView.ViewHolder,
+                dX: Float,
+                dY: Float,
+                actionState: Int,
+                isCurrentlyActive: Boolean
+            ) {
                 if (isCurrentlyActive) {
                     viewHolder.itemView.alpha = 0.5f
                 } else {
@@ -84,8 +90,11 @@ class CustomiseAppsFragment : BaseFragment(), OnShitDoneToAppsListener {
                 return makeMovementFlags(dragFlags, swipeFlags)
             }
 
-            override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,
-                                target: RecyclerView.ViewHolder): Boolean {
+            override fun onMove(
+                recyclerView: RecyclerView,
+                viewHolder: RecyclerView.ViewHolder,
+                target: RecyclerView.ViewHolder
+            ): Boolean {
                 return listener.onViewMoved(viewHolder.adapterPosition, target.adapterPosition)
             }
 
@@ -98,11 +107,11 @@ class CustomiseAppsFragment : BaseFragment(), OnShitDoneToAppsListener {
 
         val itemTouchHelper = ItemTouchHelper(simpleItemTouchCallback)
 
-        itemTouchHelper.attachToRecyclerView(customise_apps_fragment_list)
+        itemTouchHelper.attachToRecyclerView(binding.customiseAppsFragmentList)
 
         adapter.setItemTouchHelper(itemTouchHelper)
 
-        customise_apps_fragment_add.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_customiseAppsFragment_to_addAppFragment))
+        binding.customiseAppsFragmentAdd.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_customiseAppsFragment_to_addAppFragment))
     }
 
     private fun showPopupMenu(view: View): PopupMenu {
@@ -133,4 +142,9 @@ class CustomiseAppsFragment : BaseFragment(), OnShitDoneToAppsListener {
             true
         }
     }
+
+    override fun onDestroyView() {
+        _binding = null
+        super.onDestroyView()
+    }
 }

+ 18 - 13
app/src/main/java/com/simplauncher/ui/options/CustomizeAppDrawerAppListFragment.kt

@@ -4,15 +4,11 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import com.simplauncher.R
 import com.simplauncher.adapters.CustomizeAppDrawerAppsAdapter
+import com.simplauncher.databinding.CustomizeAppDrawerAppListFragmentBinding
 import com.simplauncher.datasource.UnlauncherDataSource
 import com.simplauncher.utils.BaseFragment
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.customize_app_drawer_app_list_fragment.customize_app_drawer_fragment
-import kotlinx.android.synthetic.main.customize_app_drawer_app_list_fragment.customize_app_drawer_fragment_app_list
-import kotlinx.android.synthetic.main.customize_app_drawer_app_list_fragment.customize_app_drawer_fragment_app_progress_bar
-import kotlinx.android.synthetic.main.customize_app_drawer_app_list_fragment.customize_app_drawer_fragment_back
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -20,30 +16,39 @@ class CustomizeAppDrawerAppListFragment : BaseFragment() {
     @Inject
     lateinit var unlauncherDataSource: UnlauncherDataSource
 
-    override fun getFragmentView(): ViewGroup = customize_app_drawer_fragment
+    private var _binding: CustomizeAppDrawerAppListFragmentBinding? = null
+    private val binding get() = _binding!!
+
+    override fun getFragmentView(): ViewGroup = binding.customizeAppDrawerFragment
 
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
-    ): View? {
-        return inflater.inflate(R.layout.customize_app_drawer_app_list_fragment, container, false)
+    ): View {
+        _binding = CustomizeAppDrawerAppListFragmentBinding.inflate(inflater, container, false)
+        return binding.root
     }
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
         val unlauncherAppsRepo = unlauncherDataSource.unlauncherAppsRepo
-        customize_app_drawer_fragment_app_list.adapter =
+        binding.customizeAppDrawerFragmentAppList.adapter =
             CustomizeAppDrawerAppsAdapter(viewLifecycleOwner, unlauncherAppsRepo)
         unlauncherAppsRepo.liveData().observe(viewLifecycleOwner) {
             it?.let {
-                customize_app_drawer_fragment_app_progress_bar.visibility = View.GONE
+                binding.customizeAppDrawerFragmentAppProgressBar.visibility = View.GONE
             } ?: run {
-                customize_app_drawer_fragment_app_progress_bar.visibility = View.VISIBLE
+                binding.customizeAppDrawerFragmentAppProgressBar.visibility = View.VISIBLE
             }
         }
-        customize_app_drawer_fragment_back.setOnClickListener {
+        binding.customizeAppDrawerFragmentBack.setOnClickListener {
             requireActivity().onBackPressedDispatcher.onBackPressed()
         }
     }
-}
+
+    override fun onDestroyView() {
+        _binding = null
+        super.onDestroyView()
+    }
+}

+ 21 - 15
app/src/main/java/com/simplauncher/ui/options/CustomizeQuickButtonsFragment.kt

@@ -4,17 +4,12 @@ import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import com.simplauncher.R
+import com.simplauncher.databinding.CustomizeQuickButtonsFragmentBinding
 import com.simplauncher.datasource.UnlauncherDataSource
 import com.simplauncher.datasource.quickbuttonprefs.QuickButtonPreferencesRepository
 import com.simplauncher.ui.dialogs.ChooseQuickButtonDialog
 import com.simplauncher.utils.BaseFragment
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.customize_quick_buttons_fragment
-import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.customize_quick_buttons_fragment_back
-import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.customize_quick_buttons_fragment_center
-import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.customize_quick_buttons_fragment_left
-import kotlinx.android.synthetic.main.customize_quick_buttons_fragment.customize_quick_buttons_fragment_right
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -22,47 +17,58 @@ class CustomizeQuickButtonsFragment : BaseFragment() {
     @Inject
     lateinit var unlauncherDataSource: UnlauncherDataSource
 
-    override fun getFragmentView(): ViewGroup = customize_quick_buttons_fragment
+    private var _binding: CustomizeQuickButtonsFragmentBinding? = null
+    private val binding get() = _binding!!
+
+    override fun getFragmentView(): ViewGroup = binding.customizeQuickButtonsFragment
 
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
-    ): View? = inflater.inflate(R.layout.customize_quick_buttons_fragment, container, false)
+    ): View {
+        _binding = CustomizeQuickButtonsFragmentBinding.inflate(inflater, container, false)
+        return binding.root
+    }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         val prefsRepo = unlauncherDataSource.quickButtonPreferencesRepo
 
         prefsRepo.liveData().observe(viewLifecycleOwner) { prefs ->
-            customize_quick_buttons_fragment_left
+            binding.customizeQuickButtonsFragmentLeft
                 .setImageResource(QuickButtonPreferencesRepository.RES_BY_ICON.getValue(prefs.leftButton.iconId))
-            customize_quick_buttons_fragment_center
+            binding.customizeQuickButtonsFragmentCenter
                 .setImageResource(QuickButtonPreferencesRepository.RES_BY_ICON.getValue(prefs.centerButton.iconId))
-            customize_quick_buttons_fragment_right
+            binding.customizeQuickButtonsFragmentRight
                 .setImageResource(QuickButtonPreferencesRepository.RES_BY_ICON.getValue(prefs.rightButton.iconId))
         }
 
-        customize_quick_buttons_fragment_back.setOnClickListener {
+        binding.customizeQuickButtonsFragmentBack.setOnClickListener {
             requireActivity().onBackPressedDispatcher.onBackPressed()
         }
-        customize_quick_buttons_fragment_left.setOnClickListener {
+        binding.customizeQuickButtonsFragmentLeft.setOnClickListener {
             ChooseQuickButtonDialog(
                 prefsRepo,
                 QuickButtonPreferencesRepository.IC_CALL
             ).showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
         }
-        customize_quick_buttons_fragment_center.setOnClickListener {
+        binding.customizeQuickButtonsFragmentCenter.setOnClickListener {
             ChooseQuickButtonDialog(
                 prefsRepo,
                 QuickButtonPreferencesRepository.IC_COG
             ).showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
         }
-        customize_quick_buttons_fragment_right.setOnClickListener {
+        binding.customizeQuickButtonsFragmentRight.setOnClickListener {
             ChooseQuickButtonDialog(
                 prefsRepo,
                 QuickButtonPreferencesRepository.IC_PHOTO_CAMERA
             ).showNow(childFragmentManager, "QUICK_BUTTON_CHOOSER")
         }
     }
+
+    override fun onDestroyView() {
+        _binding = null
+        super.onDestroyView()
+    }
 }

+ 32 - 32
app/src/main/java/com/simplauncher/ui/options/CustomizeSearchFieldFragment.kt

@@ -5,19 +5,12 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import com.simplauncher.R
+import com.simplauncher.databinding.CustomizeAppDrawerFragmentSearchFieldOptionsBinding
 import com.simplauncher.datasource.UnlauncherDataSource
 import com.simplauncher.ui.dialogs.ChooseSearchBarPositionDialog
 import com.simplauncher.utils.BaseFragment
 import com.simplauncher.utils.createTitleAndSubtitleText
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customise_apps_fragment_back
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_fragment_search_field_options
-
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_fragment_search_field_position
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_fragment_show_search_field_switch
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_open_keyboard_switch
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment_search_field_options.customize_app_drawer_search_all_switch
-
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -26,22 +19,24 @@ class CustomizeSearchFieldFragment : BaseFragment() {
     @Inject
     lateinit var unlauncherDataSource: UnlauncherDataSource
 
-    override fun getFragmentView(): ViewGroup = customize_app_drawer_fragment_search_field_options
+    private var _binding: CustomizeAppDrawerFragmentSearchFieldOptionsBinding? = null
+    private val binding get() = _binding!!
+
+    override fun getFragmentView(): ViewGroup = binding.customizeAppDrawerFragmentSearchFieldOptions
 
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
-    ): View? = inflater.inflate(
-        R.layout.customize_app_drawer_fragment_search_field_options,
-        container,
-        false
-    )
+    ): View {
+        _binding = CustomizeAppDrawerFragmentSearchFieldOptionsBinding.inflate(inflater, container, false)
+        return binding.root
+    }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        customise_apps_fragment_back.setOnClickListener{
+        binding.customiseAppsFragmentBack.setOnClickListener {
             requireActivity().onBackPressedDispatcher.onBackPressed()
         }
 
@@ -53,25 +48,25 @@ class CustomizeSearchFieldFragment : BaseFragment() {
 
     private fun setupShowSearchBarSwitch() {
         val prefsRepo = unlauncherDataSource.corePreferencesRepo
-        customize_app_drawer_fragment_show_search_field_switch.setOnCheckedChangeListener { _, checked ->
+        binding.customizeAppDrawerFragmentShowSearchFieldSwitch.setOnCheckedChangeListener { _, checked ->
             prefsRepo.updateShowSearchBar(checked)
             enableSearchBarOptions(checked)
         }
         prefsRepo.liveData().observe(viewLifecycleOwner) {
             val checked = it.showSearchBar
-            customize_app_drawer_fragment_show_search_field_switch.isChecked = checked
+            binding.customizeAppDrawerFragmentShowSearchFieldSwitch.isChecked = checked
             enableSearchBarOptions(checked)
         }
     }
 
     private fun enableSearchBarOptions(enabled: Boolean) {
-        customize_app_drawer_fragment_search_field_position.isEnabled = enabled
-        customize_app_drawer_open_keyboard_switch.isEnabled = enabled
+        binding.customizeAppDrawerFragmentSearchFieldPosition.isEnabled = enabled
+        binding.customizeAppDrawerOpenKeyboardSwitch.isEnabled = enabled
     }
 
     private fun setupSearchBarPositionOption() {
         val prefRepo = unlauncherDataSource.corePreferencesRepo
-        customize_app_drawer_fragment_search_field_position.setOnClickListener {
+        binding.customizeAppDrawerFragmentSearchFieldPosition.setOnClickListener {
             val positionDialog = ChooseSearchBarPositionDialog.getSearchBarPositionChooser()
             positionDialog.showNow(childFragmentManager, "POSITION_CHOOSER")
         }
@@ -79,20 +74,20 @@ class CustomizeSearchFieldFragment : BaseFragment() {
             val position = it.searchBarPosition.number
             val title = getText(R.string.customize_app_drawer_fragment_search_bar_position)
             val subtitle = resources.getTextArray(R.array.search_bar_position_array)[position]
-            customize_app_drawer_fragment_search_field_position.text =
+            binding.customizeAppDrawerFragmentSearchFieldPosition.text =
                 createTitleAndSubtitleText(requireContext(), title, subtitle)
         }
     }
 
     private fun setupKeyboardSwitch() {
         val prefsRepo = unlauncherDataSource.corePreferencesRepo
-        customize_app_drawer_open_keyboard_switch.setOnCheckedChangeListener { _, checked ->
+        binding.customizeAppDrawerOpenKeyboardSwitch.setOnCheckedChangeListener { _, checked ->
             prefsRepo.updateActivateKeyboardInDrawer(checked)
         }
         prefsRepo.liveData().observe(viewLifecycleOwner) {
-            customize_app_drawer_open_keyboard_switch.isChecked = it.activateKeyboardInDrawer
+            binding.customizeAppDrawerOpenKeyboardSwitch.isChecked = it.activateKeyboardInDrawer
         }
-        customize_app_drawer_open_keyboard_switch.text =
+        binding.customizeAppDrawerOpenKeyboardSwitch.text =
             createTitleAndSubtitleText(
                 requireContext(), R.string.customize_app_drawer_fragment_open_keyboard,
                 R.string.customize_app_drawer_fragment_open_keyboard_subtitle
@@ -101,16 +96,21 @@ class CustomizeSearchFieldFragment : BaseFragment() {
 
     private fun setupSearchAllAppsSwitch() {
         val prefsRepo = unlauncherDataSource.corePreferencesRepo
-        customize_app_drawer_search_all_switch.setOnCheckedChangeListener { _, checked ->
+        binding.customizeAppDrawerSearchAllSwitch.setOnCheckedChangeListener { _, checked ->
             prefsRepo.updateSearchAllAppsInDrawer(checked)
         }
         prefsRepo.liveData().observe(viewLifecycleOwner) {
-            customize_app_drawer_search_all_switch.isChecked = it.searchAllAppsInDrawer
+            binding.customizeAppDrawerSearchAllSwitch.isChecked = it.searchAllAppsInDrawer
         }
-        customize_app_drawer_search_all_switch.text =
-                createTitleAndSubtitleText(
-                        requireContext(), R.string.customize_app_drawer_fragment_search_all,
-                        R.string.customize_app_drawer_fragment_search_all_subtitle
-                )
+        binding.customizeAppDrawerSearchAllSwitch.text =
+            createTitleAndSubtitleText(
+                requireContext(), R.string.customize_app_drawer_fragment_search_all,
+                R.string.customize_app_drawer_fragment_search_all_subtitle
+            )
+    }
+
+    override fun onDestroyView() {
+        _binding = null
+        super.onDestroyView()
     }
-}
+}