Skip to content

Commit

Permalink
Improved code readability and maintainability
Browse files Browse the repository at this point in the history
  • Loading branch information
103sbavert committed Dec 23, 2020
1 parent 2fe2ef0 commit b663bd3
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 19 deletions.
23 changes: 15 additions & 8 deletions app/src/main/java/com/sbeve/jada/fragments/main/MainFragment.kt
Expand Up @@ -31,16 +31,23 @@ class MainFragment : Fragment(R.layout.fragment_main), RecentQueriesAdapter.OnCl
private val mainActivityContext: MainActivity by lazy {
activity as MainActivity
}

//animation to be played when a fragment transaction happens from this activity a pop action transaction to this activity happens so the fragment
//doesn't disappear from the background
private val stayInPlaceAnimation: Animation? by lazy {
val anim: Animation = AlphaAnimation(1.0F, 1.0F)
anim.duration = 150
anim
}
private val viewModel: MainViewModel by viewModels()
private lateinit var fragmentMainBinding: FragmentMainBinding

//getting the saved language setting's value through a custom getter
private val savedLanguageIndex: Int
get() = mainActivityContext.applicationPreferences
.getInt(getString(R.string.language_setting_key), 0)

//adapter with empty list as the list will be provided when the database emits information
private val adapter by lazy {
RecentQueriesAdapter(emptyList(), this)
}
Expand All @@ -49,7 +56,6 @@ class MainFragment : Fragment(R.layout.fragment_main), RecentQueriesAdapter.OnCl
super.onViewCreated(view, savedInstanceState)

fragmentMainBinding = FragmentMainBinding.bind(view)
updateRecyclerView()
fragmentMainBinding.changeLanguageGearIcon.setOnClickListener {
createChangeLanguageDialog().show()
}
Expand All @@ -60,13 +66,16 @@ class MainFragment : Fragment(R.layout.fragment_main), RecentQueriesAdapter.OnCl
fragmentMainBinding.queriesRecyclerView.setHasFixedSize(true)
fragmentMainBinding.queriesRecyclerView.adapter = adapter

//set up an observer to update the recycler view whenever the database is updated
updateRecyclerView()

//set the text view's text to show whichever language is selected and update the text whenever the setting is changed
fragmentMainBinding.currentLanguage.text = RetrofitInit.supportedLanguages.first[savedLanguageIndex]
mainActivityContext.applicationPreferences.registerOnSharedPreferenceChangeListener(this)

fragmentMainBinding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
viewModel.addQuery(query, savedLanguageIndex)
viewModel.addQuery(RecentQuery(query, savedLanguageIndex))
navController.navigate(MainFragmentDirections.actionMainFragmentToResultFragment(query, savedLanguageIndex))
hideSoftKeyboard()
return true
Expand All @@ -79,6 +88,7 @@ class MainFragment : Fragment(R.layout.fragment_main), RecentQueriesAdapter.OnCl
//play an empty animation to keep the fragment from disappearing from the background when the enter animation for other fragments is playing
override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int) = stayInPlaceAnimation

//change language dialog to change the language to be used by the dictionary
private fun createChangeLanguageDialog() =
MaterialAlertDialogBuilder(mainActivityContext)
.setTitle(getString(R.string.choose_a_language))
Expand Down Expand Up @@ -113,15 +123,12 @@ class MainFragment : Fragment(R.layout.fragment_main), RecentQueriesAdapter.OnCl
}
}

override fun onItemClick(position: Int) {
val queryText = viewModel.allQueries.value!![position].queryText
val queryLanguage = viewModel.allQueries.value!![position].queryLanguage
navController.navigate(MainFragmentDirections.actionMainFragmentToResultFragment(queryText, queryLanguage))
override fun onItemClick(query: String, queryLanguageIndex: Int) {
navController.navigate(MainFragmentDirections.actionMainFragmentToResultFragment(query, queryLanguageIndex))
}

override fun onDeleteButtonClick(query: String, queryLanguageIndex: Int) {
val recentQuery = RecentQuery(query, queryLanguageIndex)
viewModel.deleteQuery(recentQuery)
viewModel.deleteQuery(RecentQuery(query, queryLanguageIndex))
}

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
Expand Down
Expand Up @@ -37,9 +37,8 @@ class MainViewModel : ViewModel() {
}

//add a query whenever a new word is searched
fun addQuery(query: String, languageIndex: Int) {
fun addQuery(recentQuery: RecentQuery) {
viewModelScope.launch(IO) {
val recentQuery = RecentQuery(query, languageIndex, System.currentTimeMillis())
databaseDao.addQuery(recentQuery)
}
}
Expand Down
Expand Up @@ -12,42 +12,44 @@ import java.util.*
import kotlin.properties.Delegates

class RecentQueriesAdapter(var dataSet: List<RecentQuery>, private val onClickListener: OnClickListener) :
RecyclerView.Adapter<RecentQueriesAdapter.ViewHolder>() {
RecyclerView.Adapter<RecentQueriesAdapter.RecentQueriesViewHolder>() {

class ViewHolder(myItemView: QueryLayoutBinding, private val onClickListener: OnClickListener) :
class RecentQueriesViewHolder(myItemView: QueryLayoutBinding, private val onClickListener: OnClickListener) :
RecyclerView.ViewHolder(myItemView.root) {

private val queryText = myItemView.queryText
private lateinit var queryTextValue: String
private val time = myItemView.time
private val queryLanguage = myItemView.language
private var queryLanguageValue by Delegates.notNull<Int>()

fun setLanguageText(languageValue: Int) {
queryLanguageValue = languageValue
queryLanguage.text = RetrofitInit.supportedLanguages.first[languageValue]

}

fun setQueryText(queryValue: String) {
queryTextValue = queryValue
queryText.text = HtmlCompat.fromHtml(queryValue, HtmlCompat.FROM_HTML_MODE_LEGACY)
}

fun setTimeText(timeValue: Long) {
time.text = SimpleDateFormat("HH:mm, dd MMM, yyyy", Locale.getDefault()).format(timeValue)
}

//setting on click listeners for each item and the delete button in each item
init {
myItemView.root.setOnClickListener { onClickListener.onItemClick(adapterPosition) }
myItemView.root.setOnClickListener { onClickListener.onItemClick(queryTextValue, queryLanguageValue) }
myItemView.deleteButton.setOnClickListener { onClickListener.onDeleteButtonClick(queryText.text.toString(), queryLanguageValue) }
}

}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecentQueriesViewHolder {
val binding = QueryLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding, onClickListener)
return RecentQueriesViewHolder(binding, onClickListener)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
override fun onBindViewHolder(holder: RecentQueriesViewHolder, position: Int) {
val currentItem = dataSet[position]
holder.setQueryText(currentItem.queryText)
holder.setTimeText(currentItem.timeDate)
Expand All @@ -56,8 +58,9 @@ class RecentQueriesAdapter(var dataSet: List<RecentQuery>, private val onClickLi

override fun getItemCount() = dataSet.size

//custom interface to be implemented by the main activity to set up onClickListeners
interface OnClickListener {
fun onItemClick(position: Int)
fun onItemClick(query: String, queryLanguageIndex: Int)
fun onDeleteButtonClick(query: String, queryLanguageIndex: Int)
}
}

0 comments on commit b663bd3

Please sign in to comment.