Parcourir la source

refactor: complete ViewBinding migration for remaining 6 files

Migrate HomeFragment, AddAppFragment, CustomizeAppDrawerFragment,
OptionsFragment, RenameAppDialog, and RenameAppDisplayNameDialog from
kotlinx.android.synthetic to ViewBinding. Also remove android.extensions
plugin from build.gradle.kts — all 10 synthetic files are now migrated.

HomeFragment uses manual findViewById due to MotionLayout <merge> include.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
User il y a 3 semaines
Parent
commit
4f1e428702

+ 0 - 1
app/build.gradle.kts

@@ -5,7 +5,6 @@ plugins {
     id("dagger.hilt.android.plugin")
     id("com.google.protobuf") version "0.9.0"
     kotlin("android")
-    kotlin("android.extensions")
     kotlin("kapt")
 }
 

+ 1 - 2
app/src/main/java/com/simplauncher/ui/dialogs/RenameAppDialog.kt

@@ -10,7 +10,6 @@ import androidx.fragment.app.DialogFragment
 import com.simplauncher.R
 import com.simplauncher.models.HomeApp
 import com.simplauncher.models.CustomiseAppsViewModel
-import kotlinx.android.synthetic.main.customise_apps_fragment.*
 
 class RenameAppDialog : DialogFragment() {
 
@@ -18,7 +17,7 @@ class RenameAppDialog : DialogFragment() {
     private lateinit var model: CustomiseAppsViewModel
 
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
-        val view = LayoutInflater.from(context).inflate(R.layout.rename_dialog_edit_text, customise_apps_fragment, false)
+        val view = LayoutInflater.from(context).inflate(R.layout.rename_dialog_edit_text, null, false)
         val editText: EditText = view.findViewById(R.id.rename_editText)
         val appName: String = app.appNickname ?: app.appName
         editText.text.append(appName)

+ 1 - 2
app/src/main/java/com/simplauncher/ui/dialogs/RenameAppDisplayNameDialog.kt

@@ -10,14 +10,13 @@ import androidx.fragment.app.DialogFragment
 import com.simplauncher.datastore.UnlauncherApp
 import com.simplauncher.R
 import com.simplauncher.datasource.apps.UnlauncherAppsRepository
-import kotlinx.android.synthetic.main.customise_apps_fragment.*
 
 class RenameAppDisplayNameDialog : DialogFragment() {
     private lateinit var app: UnlauncherApp
     private lateinit var unlauncherAppsRepo: UnlauncherAppsRepository
 
     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
-        val view = LayoutInflater.from(context).inflate(R.layout.rename_dialog_edit_text, customise_apps_fragment, false)
+        val view = LayoutInflater.from(context).inflate(R.layout.rename_dialog_edit_text, null, false)
         val editText: EditText = view.findViewById(R.id.rename_editText)
         val appName: String = app.displayName
         editText.text.append(appName)

+ 85 - 50
app/src/main/java/com/simplauncher/ui/main/HomeFragment.kt

@@ -23,7 +23,10 @@ import android.view.View.OnClickListener
 import android.view.ViewGroup
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputMethodManager
+import android.widget.EditText
+import android.widget.ImageView
 import android.widget.PopupMenu
+import android.widget.TextView
 import android.widget.Toast
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
@@ -33,6 +36,7 @@ import androidx.fragment.app.viewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.Navigation
 import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
 import com.simplauncher.datastore.ClockType
 import com.simplauncher.datastore.SearchBarPosition
 import com.simplauncher.datastore.UnlauncherApp
@@ -48,18 +52,6 @@ import com.simplauncher.utils.BaseFragment
 import com.simplauncher.utils.OnLaunchAppListener
 import com.simplauncher.utils.isSystemApp
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.home_fragment_content.app_drawer_edit_text
-import kotlinx.android.synthetic.main.home_fragment_content.app_drawer_fragment_list
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_analog_time
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_bin_time
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_call
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_camera
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_date
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_list
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_list_exp
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_options
-import kotlinx.android.synthetic.main.home_fragment_content.home_fragment_time
-import kotlinx.android.synthetic.main.home_fragment_default.home_fragment
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import java.text.SimpleDateFormat
@@ -80,6 +72,20 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
     private lateinit var appDrawerAdapter: AppDrawerAdapter
     private lateinit var uninstallAppLauncher: ActivityResultLauncher<Intent>
 
+    // View references (content views come from <merge> include, so ViewBinding can't resolve them)
+    private var homeFragmentView: MotionLayout? = null
+    private var appDrawerEditText: EditText? = null
+    private var appDrawerFragmentList: RecyclerView? = null
+    private var homeFragmentTime: TextView? = null
+    private var homeFragmentDate: TextView? = null
+    private var homeFragmentAnalogTime: AnalogClockView? = null
+    private var homeFragmentBinTime: BinaryClockView? = null
+    private var homeFragmentList: RecyclerView? = null
+    private var homeFragmentListExp: RecyclerView? = null
+    private var homeFragmentCall: ImageView? = null
+    private var homeFragmentOptions: ImageView? = null
+    private var homeFragmentCamera: ImageView? = null
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         uninstallAppLauncher = registerForActivityResult(StartActivityForResult()) { refreshApps() }
@@ -93,15 +99,44 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
             SearchBarPosition.top -> R.layout.home_fragment_default
             else -> R.layout.home_fragment_default
         }
-        return inflater.inflate(layout, container, false)
+        val view = inflater.inflate(layout, container, false)
+        homeFragmentView = view as MotionLayout
+        appDrawerEditText = view.findViewById(R.id.app_drawer_edit_text)
+        appDrawerFragmentList = view.findViewById(R.id.app_drawer_fragment_list)
+        homeFragmentTime = view.findViewById(R.id.home_fragment_time)
+        homeFragmentDate = view.findViewById(R.id.home_fragment_date)
+        homeFragmentAnalogTime = view.findViewById(R.id.home_fragment_analog_time)
+        homeFragmentBinTime = view.findViewById(R.id.home_fragment_bin_time)
+        homeFragmentList = view.findViewById(R.id.home_fragment_list)
+        homeFragmentListExp = view.findViewById(R.id.home_fragment_list_exp)
+        homeFragmentCall = view.findViewById(R.id.home_fragment_call)
+        homeFragmentOptions = view.findViewById(R.id.home_fragment_options)
+        homeFragmentCamera = view.findViewById(R.id.home_fragment_camera)
+        return view
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        homeFragmentView = null
+        appDrawerEditText = null
+        appDrawerFragmentList = null
+        homeFragmentTime = null
+        homeFragmentDate = null
+        homeFragmentAnalogTime = null
+        homeFragmentBinTime = null
+        homeFragmentList = null
+        homeFragmentListExp = null
+        homeFragmentCall = null
+        homeFragmentOptions = null
+        homeFragmentCamera = null
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         val adapter1 = HomeAdapter(this, unlauncherDataSource)
         val adapter2 = HomeAdapter(this, unlauncherDataSource)
-        home_fragment_list.adapter = adapter1
-        home_fragment_list_exp.adapter = adapter2
+        homeFragmentList!!.adapter = adapter1
+        homeFragmentListExp!!.adapter = adapter2
 
         val unlauncherAppsRepo = unlauncherDataSource.unlauncherAppsRepo
 
@@ -129,16 +164,16 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
 
         setEventListeners()
 
-        app_drawer_fragment_list.adapter = appDrawerAdapter
+        appDrawerFragmentList!!.adapter = appDrawerAdapter
 
         unlauncherDataSource.corePreferencesRepo.liveData().observe(viewLifecycleOwner){ corePreferences ->
-            app_drawer_edit_text.visibility = if (corePreferences.showSearchBar) View.VISIBLE else View.GONE
+            appDrawerEditText!!.visibility = if (corePreferences.showSearchBar) View.VISIBLE else View.GONE
 
             val clockType = corePreferences.clockType
-            home_fragment_time.visibility = if(clockType == ClockType.digital) View.VISIBLE else View.GONE
-            home_fragment_analog_time.visibility = if(clockType == ClockType.analog) View.VISIBLE else View.GONE
-            home_fragment_bin_time.visibility = if(clockType == ClockType.binary) View.VISIBLE else View.GONE
-            home_fragment_date.visibility = if(clockType != ClockType.none) View.VISIBLE else View.GONE
+            homeFragmentTime!!.visibility = if(clockType == ClockType.digital) View.VISIBLE else View.GONE
+            homeFragmentAnalogTime!!.visibility = if(clockType == ClockType.analog) View.VISIBLE else View.GONE
+            homeFragmentBinTime!!.visibility = if(clockType == ClockType.binary) View.VISIBLE else View.GONE
+            homeFragmentDate!!.visibility = if(clockType != ClockType.none) View.VISIBLE else View.GONE
         }
     }
 
@@ -148,7 +183,7 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
         activity?.registerReceiver(receiver, IntentFilter(Intent.ACTION_TIME_TICK))
     }
 
-    override fun getFragmentView(): ViewGroup = home_fragment
+    override fun getFragmentView(): ViewGroup = homeFragmentView!!
 
     override fun onResume() {
         super.onResume()
@@ -160,9 +195,9 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
         }
 
         // scroll back to the top if user returns to this fragment
-        val layoutManager = app_drawer_fragment_list.layoutManager as LinearLayoutManager
+        val layoutManager = appDrawerFragmentList!!.layoutManager as LinearLayoutManager
         if (layoutManager.findFirstCompletelyVisibleItemPosition() != 0) {
-            app_drawer_fragment_list.scrollToPosition(0)
+            appDrawerFragmentList!!.scrollToPosition(0)
         }
     }
 
@@ -192,11 +227,11 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                 // Do nothing, we've failed :(
             }
         }
-        home_fragment_time.setOnClickListener(launchShowAlarms)
-        home_fragment_analog_time.setOnClickListener(launchShowAlarms)
-        home_fragment_bin_time.setOnClickListener(launchShowAlarms)
+        homeFragmentTime!!.setOnClickListener(launchShowAlarms)
+        homeFragmentAnalogTime!!.setOnClickListener(launchShowAlarms)
+        homeFragmentBinTime!!.setOnClickListener(launchShowAlarms)
 
-        home_fragment_date.setOnClickListener {
+        homeFragmentDate!!.setOnClickListener {
             try {
                 val builder = CalendarContract.CONTENT_URI.buildUpon().appendPath("time")
                 val intent = Intent(Intent.ACTION_VIEW, builder.build())
@@ -210,9 +245,9 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
         unlauncherDataSource.quickButtonPreferencesRepo.liveData()
             .observe(viewLifecycleOwner) { prefs ->
                 val leftButtonIcon = QuickButtonPreferencesRepository.RES_BY_ICON.getValue(prefs.leftButton.iconId)
-                home_fragment_call.setImageResource(leftButtonIcon)
+                homeFragmentCall!!.setImageResource(leftButtonIcon)
                 if (leftButtonIcon != R.drawable.ic_empty) {
-                    home_fragment_call.setOnClickListener { view ->
+                    homeFragmentCall!!.setOnClickListener { view ->
                         try {
                             val pm = context?.packageManager!!
                             val intent = Intent(Intent.ACTION_DIAL)
@@ -228,9 +263,9 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                 }
 
                 val centerButtonIcon = QuickButtonPreferencesRepository.RES_BY_ICON.getValue(prefs.centerButton.iconId)
-                home_fragment_options.setImageResource(centerButtonIcon)
+                homeFragmentOptions!!.setImageResource(centerButtonIcon)
                 if (centerButtonIcon != R.drawable.ic_empty) {
-                    home_fragment_options.setOnClickListener(
+                    homeFragmentOptions!!.setOnClickListener(
                         Navigation.createNavigateOnClickListener(
                             R.id.action_homeFragment_to_optionsFragment
                         )
@@ -238,9 +273,9 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                 }
 
                 val rightButtonIcon = QuickButtonPreferencesRepository.RES_BY_ICON.getValue(prefs.rightButton.iconId)
-                home_fragment_camera.setImageResource(rightButtonIcon)
+                homeFragmentCamera!!.setImageResource(rightButtonIcon)
                 if (rightButtonIcon != R.drawable.ic_empty) {
-                    home_fragment_camera.setOnClickListener {
+                    homeFragmentCamera!!.setOnClickListener {
                         try {
                             val intent = Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)
                             launchActivity(it, intent)
@@ -251,20 +286,20 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                 }
             }
 
-        app_drawer_edit_text.addTextChangedListener(appDrawerAdapter.searchBoxListener)
+        appDrawerEditText!!.addTextChangedListener(appDrawerAdapter.searchBoxListener)
 
-        app_drawer_edit_text.setOnEditorActionListener { _, actionId, _ ->
+        appDrawerEditText!!.setOnEditorActionListener { _, actionId, _ ->
                 if(actionId == EditorInfo.IME_ACTION_DONE && appDrawerAdapter.itemCount > 0) {
                     val firstApp = appDrawerAdapter.getFirstApp()
                     launchApp(firstApp.packageName, firstApp.className, firstApp.userSerial)
-                    home_fragment.transitionToStart()
+                    homeFragmentView!!.transitionToStart()
                     true
                 } else {
                     false
                 }
             }
 
-        home_fragment.setTransitionListener(object : TransitionListener {
+        homeFragmentView!!.setTransitionListener(object : TransitionListener {
             override fun onTransitionCompleted(motionLayout: MotionLayout?, currentId: Int) {
                 val inputMethodManager = requireContext().getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
 
@@ -280,10 +315,10 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
                         // Check for preferences to open the keyboard
                         // only if the search field is shown
                         if (preferences.showSearchBar && preferences.activateKeyboardInDrawer) {
-                            app_drawer_edit_text.requestFocus()
+                            appDrawerEditText!!.requestFocus()
                             // show the keyboard and set focus to the EditText when swiping down
                             inputMethodManager.showSoftInput(
-                                app_drawer_edit_text,
+                                appDrawerEditText!!,
                                 InputMethodManager.SHOW_IMPLICIT
                             )
                         }
@@ -309,8 +344,8 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
         updateDate()
         when (unlauncherDataSource.corePreferencesRepo.get().clockType) {
             ClockType.digital -> updateClockDigital()
-            ClockType.analog -> home_fragment_analog_time.updateClock()
-            ClockType.binary -> home_fragment_bin_time.updateClock()
+            ClockType.analog -> homeFragmentAnalogTime!!.updateClock()
+            ClockType.binary -> homeFragmentBinTime!!.updateClock()
             else -> {}
         }
     }
@@ -323,12 +358,12 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
             2 -> SimpleDateFormat("h:mm aa", Locale.getDefault())
             else -> DateFormat.getTimeFormat(context)
         }
-        home_fragment_time.text = fWatchTime.format(Date())
+        homeFragmentTime!!.text = fWatchTime.format(Date())
     }
 
     private fun updateDate() {
         val fWatchDate = SimpleDateFormat(getString(R.string.main_date_format), Locale.getDefault())
-        home_fragment_date.text = fWatchDate.format(Date())
+        homeFragmentDate!!.text = fWatchDate.format(Date())
     }
 
     override fun onLaunch(app: HomeApp, view: View) {
@@ -336,12 +371,12 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
     }
 
     override fun onBack(): Boolean {
-        home_fragment.transitionToStart()
+        homeFragmentView!!.transitionToStart()
         return true
     }
 
     override fun onHome() {
-        home_fragment.transitionToStart()
+        homeFragmentView!!.transitionToStart()
     }
 
     inner class ClockReceiver : BroadcastReceiver() {
@@ -365,9 +400,9 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
     }
 
     private fun resetAppDrawerEditText() {
-        app_drawer_edit_text.clearComposingText()
-        app_drawer_edit_text.setText("")
-        app_drawer_edit_text.clearFocus()
+        appDrawerEditText!!.clearComposingText()
+        appDrawerEditText!!.setText("")
+        appDrawerEditText!!.clearFocus()
     }
 
     inner class AppDrawerListener {
@@ -426,7 +461,7 @@ class HomeFragment : BaseFragment(), OnLaunchAppListener {
 
         fun onAppClicked(app: UnlauncherApp) {
             launchApp(app.packageName, app.className, app.userSerial)
-            home_fragment.transitionToStart()
+            homeFragmentView!!.transitionToStart()
         }
     }
 }

+ 21 - 12
app/src/main/java/com/simplauncher/ui/options/AddAppFragment.kt

@@ -11,35 +11,44 @@ import androidx.navigation.Navigation
 import com.simplauncher.R
 import com.simplauncher.adapters.AddAppAdapter
 import com.simplauncher.data.model.App
+import com.simplauncher.databinding.AddAppFragmentBinding
 import com.simplauncher.models.AddAppViewModel
 import com.simplauncher.utils.BaseFragment
 import com.simplauncher.utils.OnAppClickedListener
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.add_app_fragment.*
 
 @AndroidEntryPoint
 class AddAppFragment : BaseFragment(), OnAppClickedListener {
 
-    override fun getFragmentView(): ViewGroup = add_app_fragment
+    private var _binding: AddAppFragmentBinding? = null
+    private val binding get() = _binding!!
 
-    private  val viewModel: AddAppViewModel by viewModels()
+    override fun getFragmentView(): ViewGroup = binding.addAppFragment
 
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        return inflater.inflate(R.layout.add_app_fragment, container, false)
+    private val viewModel: AddAppViewModel by viewModels()
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+        _binding = AddAppFragmentBinding.inflate(inflater, container, false)
+        return binding.root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
     }
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
         val adapter = AddAppAdapter(this)
 
-        add_app_fragment_list.adapter = adapter
+        binding.addAppFragmentList.adapter = adapter
 
         viewModel.apps.observe(viewLifecycleOwner, {
             it?.let { apps ->
                 adapter.setItems(apps)
-                add_app_fragment_progress_bar.visibility = View.GONE
+                binding.addAppFragmentProgressBar.visibility = View.GONE
             } ?: run {
-                add_app_fragment_progress_bar.visibility = View.VISIBLE
+                binding.addAppFragmentProgressBar.visibility = View.VISIBLE
             }
         })
     }
@@ -48,12 +57,12 @@ class AddAppFragment : BaseFragment(), OnAppClickedListener {
         super.onResume()
         viewModel.setInstalledApps(getInstalledApps())
         viewModel.filterApps("")
-        add_app_fragment_edit_text.addTextChangedListener(onTextChangeListener)
+        binding.addAppFragmentEditText.addTextChangedListener(onTextChangeListener)
     }
 
     override fun onPause() {
         super.onPause()
-        add_app_fragment_edit_text?.removeTextChangedListener(onTextChangeListener)
+        binding.addAppFragmentEditText.removeTextChangedListener(onTextChangeListener)
     }
 
     private val onTextChangeListener: TextWatcher = object : TextWatcher {
@@ -73,6 +82,6 @@ class AddAppFragment : BaseFragment(), OnAppClickedListener {
 
     override fun onAppClicked(app: App) {
         viewModel.addAppToHomeScreen(app)
-        Navigation.findNavController(add_app_fragment).popBackStack()
+        Navigation.findNavController(binding.addAppFragment).popBackStack()
     }
-}
+}

+ 21 - 14
app/src/main/java/com/simplauncher/ui/options/CustomizeAppDrawerFragment.kt

@@ -7,15 +7,11 @@ import android.view.ViewGroup
 import androidx.navigation.Navigation
 import com.simplauncher.datastore.SearchBarPosition
 import com.simplauncher.R
+import com.simplauncher.databinding.CustomizeAppDrawerFragmentBinding
 import com.simplauncher.datasource.UnlauncherDataSource
 import com.simplauncher.utils.BaseFragment
 import com.simplauncher.utils.createTitleAndSubtitleText
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment_back
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment_search_options
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment_show_headings_switch
-import kotlinx.android.synthetic.main.customize_app_drawer_fragment.customize_app_drawer_fragment_visible_apps
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -24,21 +20,32 @@ class CustomizeAppDrawerFragment : BaseFragment() {
     @Inject
     lateinit var unlauncherDataSource: UnlauncherDataSource
 
-    override fun getFragmentView(): ViewGroup = customize_app_drawer_fragment
+    private var _binding: CustomizeAppDrawerFragmentBinding? = null
+    private val binding get() = _binding!!
+
+    override fun getFragmentView(): ViewGroup = binding.customizeAppDrawerFragment
 
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
-    ): View? = inflater.inflate(R.layout.customize_app_drawer_fragment, container, false)
+    ): View {
+        _binding = CustomizeAppDrawerFragmentBinding.inflate(inflater, container, false)
+        return binding.root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
-        customize_app_drawer_fragment_visible_apps
+        binding.customizeAppDrawerFragmentVisibleApps
             .setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_customiseAppDrawerFragment_to_customiseAppDrawerAppListFragment))
 
-        customize_app_drawer_fragment_back.setOnClickListener{
+        binding.customizeAppDrawerFragmentBack.setOnClickListener{
             requireActivity().onBackPressedDispatcher.onBackPressed()
         }
         
@@ -47,7 +54,7 @@ class CustomizeAppDrawerFragment : BaseFragment() {
     }
 
     private fun setupSearchFieldOptionsButton() {
-        customize_app_drawer_fragment_search_options.setOnClickListener(
+        binding.customizeAppDrawerFragmentSearchOptions.setOnClickListener(
             Navigation.createNavigateOnClickListener(R.id.action_customiseAppDrawerFragment_to_customizeSearchFieldFragment)
         )
         val preferencesRepository = unlauncherDataSource.corePreferencesRepo
@@ -72,20 +79,20 @@ class CustomizeAppDrawerFragment : BaseFragment() {
                 getText(R.string.customize_app_drawer_fragment_search_field_options_subtitle_status_hidden)
             }
 
-            customize_app_drawer_fragment_search_options.text =
+            binding.customizeAppDrawerFragmentSearchOptions.text =
                 createTitleAndSubtitleText(requireContext(), title, subtitle)
         }
     }
 
     private fun setupHeadingSwitch() {
         val prefsRepo = unlauncherDataSource.corePreferencesRepo
-        customize_app_drawer_fragment_show_headings_switch.setOnCheckedChangeListener { _, checked ->
+        binding.customizeAppDrawerFragmentShowHeadingsSwitch.setOnCheckedChangeListener { _, checked ->
             prefsRepo.updateShowDrawerHeadings(checked)
         }
         prefsRepo.liveData().observe(viewLifecycleOwner) {
-            customize_app_drawer_fragment_show_headings_switch.isChecked = it.showDrawerHeadings
+            binding.customizeAppDrawerFragmentShowHeadingsSwitch.isChecked = it.showDrawerHeadings
         }
-        customize_app_drawer_fragment_show_headings_switch.text =
+        binding.customizeAppDrawerFragmentShowHeadingsSwitch.text =
             createTitleAndSubtitleText(
                     requireContext(), R.string.customize_app_drawer_fragment_show_headings,
                     R.string.customize_app_drawer_fragment_show_headings_subtitle

+ 29 - 31
app/src/main/java/com/simplauncher/ui/options/OptionsFragment.kt

@@ -4,15 +4,13 @@ import android.content.Context.MODE_PRIVATE
 import android.content.Intent
 import android.os.Bundle
 import android.provider.Settings
-import android.text.SpannableStringBuilder
-import android.text.Spanned
-import android.text.style.TextAppearanceSpan
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.core.content.edit
 import androidx.navigation.Navigation
 import com.simplauncher.R
+import com.simplauncher.databinding.OptionsFragmentBinding
 import com.simplauncher.datasource.UnlauncherDataSource
 import com.simplauncher.ui.dialogs.ChangeThemeDialog
 import com.simplauncher.ui.dialogs.ChooseAlignmentDialog
@@ -22,7 +20,6 @@ import com.simplauncher.utils.BaseFragment
 import com.simplauncher.utils.createTitleAndSubtitleText
 import com.simplauncher.utils.isActivityDefaultLauncher
 import dagger.hilt.android.AndroidEntryPoint
-import kotlinx.android.synthetic.main.options_fragment.*
 import javax.inject.Inject
 
 @AndroidEntryPoint
@@ -30,58 +27,65 @@ class OptionsFragment : BaseFragment() {
     @Inject
     lateinit var unlauncherDataSource: UnlauncherDataSource
 
-    override fun getFragmentView(): ViewGroup = options_fragment
+    private var _binding: OptionsFragmentBinding? = null
+    private val binding get() = _binding!!
 
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        return inflater.inflate(R.layout.options_fragment, container, false)
+    override fun getFragmentView(): ViewGroup = binding.optionsFragment
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+        _binding = OptionsFragmentBinding.inflate(inflater, container, false)
+        return binding.root
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
     }
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         super.onActivityCreated(savedInstanceState)
-        options_fragment_device_settings.setOnClickListener {
+        binding.optionsFragmentDeviceSettings.setOnClickListener {
             val intent = Intent(Settings.ACTION_SETTINGS)
             launchActivity(it, intent)
         }
-        options_fragment_back.setOnClickListener{
+        binding.optionsFragmentBack.setOnClickListener{
             requireActivity().onBackPressedDispatcher.onBackPressed()
         }
-        options_fragment_device_settings.setOnLongClickListener {
+        binding.optionsFragmentDeviceSettings.setOnLongClickListener {
             val intent = Intent(Settings.ACTION_HOME_SETTINGS)
             launchActivity(it, intent)
             true
         }
-        options_fragment_change_theme.setOnClickListener {
+        binding.optionsFragmentChangeTheme.setOnClickListener {
             val changeThemeDialog = ChangeThemeDialog.getThemeChooser()
             changeThemeDialog.showNow(childFragmentManager, "THEME_CHOOSER")
         }
-        options_fragment_choose_time_format.setOnClickListener {
+        binding.optionsFragmentChooseTimeFormat.setOnClickListener {
             val chooseTimeFormatDialog = ChooseTimeFormatDialog.getInstance()
             chooseTimeFormatDialog.showNow(childFragmentManager, "TIME_FORMAT_CHOOSER")
         }
-        options_fragment_choose_clock_type.setOnClickListener {
+        binding.optionsFragmentChooseClockType.setOnClickListener {
             val chooseClockTypeDialog = ChooseClockTypeDialog.getInstance()
             chooseClockTypeDialog.showNow(childFragmentManager, "CLOCK_TYPE_CHOOSER")
         }
-        options_fragment_choose_alignment.setOnClickListener {
+        binding.optionsFragmentChooseAlignment.setOnClickListener {
             val chooseAlignmentDialog = ChooseAlignmentDialog.getInstance()
             chooseAlignmentDialog.showNow(childFragmentManager, "ALIGNMENT_CHOOSER")
         }
-        options_fragment_toggle_status_bar.setOnClickListener {
+        binding.optionsFragmentToggleStatusBar.setOnClickListener {
             val settings = requireContext().getSharedPreferences(getString(R.string.prefs_settings), MODE_PRIVATE)
             val isHidden = settings.getBoolean(getString(R.string.prefs_settings_key_toggle_status_bar), false)
             settings.edit {
                 putBoolean(getString(R.string.prefs_settings_key_toggle_status_bar), !isHidden)
             }
         }
-        options_fragment_customise_apps.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_optionsFragment_to_customiseAppsFragment))
-        options_fragment_customize_quick_buttons.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_optionsFragment_to_customiseQuickButtonsFragment))
-        options_fragment_customize_app_drawer.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_optionsFragment_to_customiseAppDrawerFragment))
+        binding.optionsFragmentCustomiseApps.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_optionsFragment_to_customiseAppsFragment))
+        binding.optionsFragmentCustomizeQuickButtons.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_optionsFragment_to_customiseQuickButtonsFragment))
+        binding.optionsFragmentCustomizeAppDrawer.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_optionsFragment_to_customiseAppDrawerFragment))
     }
 
     override fun onStart() {
         super.onStart()
-        // setting up the switch text, since changing the default launcher re-starts the activity
-        // this should able to adapt to it.
         setupAutomaticDeviceWallpaperSwitch()
     }
 
@@ -89,34 +93,28 @@ class OptionsFragment : BaseFragment() {
         val prefsRepo = unlauncherDataSource.corePreferencesRepo
         val appIsDefaultLauncher = isActivityDefaultLauncher(activity)
         setupDeviceWallpaperSwitchText(appIsDefaultLauncher)
-        options_fragment_auto_device_theme_wallpaper.isEnabled = appIsDefaultLauncher
+        binding.optionsFragmentAutoDeviceThemeWallpaper.isEnabled = appIsDefaultLauncher
 
         prefsRepo.liveData().observe(viewLifecycleOwner) {
-            // always uncheck once app isn't default launcher
-            options_fragment_auto_device_theme_wallpaper.isChecked = appIsDefaultLauncher && !it.keepDeviceWallpaper
+            binding.optionsFragmentAutoDeviceThemeWallpaper.isChecked = appIsDefaultLauncher && !it.keepDeviceWallpaper
         }
-        options_fragment_auto_device_theme_wallpaper.setOnCheckedChangeListener { _, checked ->
+        binding.optionsFragmentAutoDeviceThemeWallpaper.setOnCheckedChangeListener { _, checked ->
             prefsRepo.updateKeepDeviceWallpaper(!checked)
         }
     }
 
-    /**
-     * Adds a hint text underneath the default text when app is not the default launcher.
-     */
     private fun setupDeviceWallpaperSwitchText(appIsDefaultLauncher: Boolean) {
         val text = if (appIsDefaultLauncher) {
             getText(R.string.customize_app_drawer_fragment_auto_theme_wallpaper_text)
         } else {
             buildSwitchTextWithHint()
         }
-        options_fragment_auto_device_theme_wallpaper.text = text
+        binding.optionsFragmentAutoDeviceThemeWallpaper.text = text
     }
 
     private fun buildSwitchTextWithHint(): CharSequence {
         val titleText = getText(R.string.customize_app_drawer_fragment_auto_theme_wallpaper_text)
-        // have a title text and a subtitle text to indicate that adapting the
-        // wallpaper can only be done when app it the default launcher
         val subTitleText = getText(R.string.customize_app_drawer_fragment_auto_theme_wallpaper_subtext_no_default_launcher)
         return createTitleAndSubtitleText(requireContext(), titleText, subTitleText)
     }
-}
+}