Skip to content

Commit aa3ac8f

Browse files
committed
refactor: changed home items to recycler view
1 parent 2e9d899 commit aa3ac8f

21 files changed

Lines changed: 289 additions & 392 deletions

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
android:label="@string/edit_params"
2929
android:theme="@style/AppTheme.NoActionBar" />
3030
<activity
31-
android:name=".ui.MainActivity"
31+
android:name=".ui.main.MainActivity"
3232
android:label="@string/app_name"
3333
android:theme="@style/AppTheme.NoActionBar" />
3434
<activity
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.androidvip.sysctlgui.data.models
2+
3+
import androidx.annotation.DrawableRes
4+
import androidx.annotation.StringRes
5+
6+
data class HomeItem(
7+
@StringRes val titleRes: Int,
8+
@StringRes val descriptionRes: Int,
9+
@DrawableRes val iconRes: Int
10+
)

app/src/main/kotlin/com/androidvip/sysctlgui/di/PresentationModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.androidvip.sysctlgui.di
22

3+
import com.androidvip.sysctlgui.ui.main.MainViewModel
34
import com.androidvip.sysctlgui.ui.params.browse.BrowseParamsViewModel
45
import com.androidvip.sysctlgui.ui.params.list.ListParamsViewModel
56
import com.androidvip.sysctlgui.ui.params.user.UserParamsViewModel
@@ -13,6 +14,7 @@ internal val presentationModules = module {
1314
viewModel { BrowseParamsViewModel(get(), Dispatchers.IO) }
1415
viewModel { ListParamsViewModel(get()) }
1516
viewModel { UserParamsViewModel(get(), get(), get()) }
17+
viewModel { MainViewModel() }
1618

1719
single { FavoriteWidgetParamUpdater(androidContext()).getListener() }
1820
}

app/src/main/kotlin/com/androidvip/sysctlgui/ui/SplashActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.androidvip.sysctlgui.domain.repository.AppPrefs
1616
import com.androidvip.sysctlgui.domain.usecase.PerformDatabaseMigrationUseCase
1717
import com.androidvip.sysctlgui.goAway
1818
import com.androidvip.sysctlgui.helpers.Actions
19+
import com.androidvip.sysctlgui.ui.main.MainActivity
1920
import com.androidvip.sysctlgui.ui.params.browse.KernelParamBrowserActivity
2021
import com.androidvip.sysctlgui.ui.params.edit.EditKernelParamActivity
2122
import com.androidvip.sysctlgui.ui.params.list.KernelParamListActivity

app/src/main/kotlin/com/androidvip/sysctlgui/ui/base/BaseViewHolder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ import androidx.recyclerview.widget.RecyclerView
66
abstract class BaseViewHolder<T>(
77
binding: ViewDataBinding
88
) : RecyclerView.ViewHolder(binding.root) {
9-
abstract fun bind(item: T)
10-
}
9+
abstract fun bind(item: T, position: Int)
10+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.androidvip.sysctlgui.ui.main
2+
3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import androidx.recyclerview.widget.DiffUtil
6+
import androidx.recyclerview.widget.ListAdapter
7+
import com.androidvip.sysctlgui.data.models.HomeItem
8+
import com.androidvip.sysctlgui.databinding.ListItemHomeItemBinding
9+
import com.androidvip.sysctlgui.ui.base.BaseViewHolder
10+
11+
class HomeItemAdapter(
12+
private val itemClickedListener: OnHomeItemClickedListener
13+
) : ListAdapter<HomeItem, BaseViewHolder<*>>(HomeItemDiffCallback) {
14+
15+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeItemViewHolder {
16+
val inflater = LayoutInflater.from(parent.context)
17+
val binding = ListItemHomeItemBinding.inflate(
18+
inflater, parent, false
19+
)
20+
return HomeItemViewHolder(binding)
21+
}
22+
23+
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
24+
if (holder is HomeItemViewHolder) {
25+
holder.bind(getItem(position), position)
26+
}
27+
}
28+
29+
inner class HomeItemViewHolder(
30+
private val binding: ListItemHomeItemBinding
31+
) : BaseViewHolder<HomeItem>(binding) {
32+
override fun bind(item: HomeItem, position: Int) {
33+
binding.item = item
34+
binding.position = position
35+
binding.onHomeItemClickedListener = itemClickedListener
36+
binding.executePendingBindings()
37+
}
38+
}
39+
40+
private object HomeItemDiffCallback : DiffUtil.ItemCallback<HomeItem>() {
41+
override fun areItemsTheSame(oldItem: HomeItem, newItem: HomeItem): Boolean {
42+
return oldItem.titleRes == newItem.titleRes
43+
}
44+
45+
override fun areContentsTheSame(oldItem: HomeItem, newItem: HomeItem): Boolean {
46+
return oldItem == newItem
47+
}
48+
}
49+
50+
interface OnHomeItemClickedListener {
51+
fun onHomeItemClicked(item: HomeItem, position: Int)
52+
}
53+
}

app/src/main/kotlin/com/androidvip/sysctlgui/ui/MainActivity.kt renamed to app/src/main/kotlin/com/androidvip/sysctlgui/ui/main/MainActivity.kt

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.androidvip.sysctlgui.ui
1+
package com.androidvip.sysctlgui.ui.main
22

33
import android.app.Activity
44
import android.content.Intent
@@ -12,6 +12,7 @@ import androidx.appcompat.app.AlertDialog
1212
import androidx.appcompat.app.AppCompatActivity
1313
import androidx.lifecycle.lifecycleScope
1414
import com.androidvip.sysctlgui.R
15+
import com.androidvip.sysctlgui.data.models.HomeItem
1516
import com.androidvip.sysctlgui.data.utils.RootUtils
1617
import com.androidvip.sysctlgui.databinding.ActivityMainBinding
1718
import com.androidvip.sysctlgui.domain.models.param.DomainKernelParam
@@ -28,46 +29,56 @@ import com.google.gson.JsonParseException
2829
import com.google.gson.JsonSyntaxException
2930
import kotlinx.coroutines.launch
3031
import org.koin.android.ext.android.inject
32+
import org.koin.androidx.viewmodel.ext.android.viewModel
3133

32-
class MainActivity : AppCompatActivity() {
34+
class MainActivity : AppCompatActivity(), HomeItemAdapter.OnHomeItemClickedListener {
3335
private lateinit var binding: ActivityMainBinding
3436
private val rootUtils: RootUtils by inject()
37+
3538
private val applyParamsUseCase: ApplyParamsUseCase by inject()
3639
private val clearUserParamUseCase: ClearUserParamUseCase by inject()
3740
private val addUserParamsUseCase: AddUserParamsUseCase by inject()
3841

42+
private val viewModel: MainViewModel by viewModel()
43+
3944
override fun onCreate(savedInstanceState: Bundle?) {
4045
super.onCreate(savedInstanceState)
4146
binding = ActivityMainBinding.inflate(layoutInflater)
4247
setContentView(binding.root)
4348
setSupportActionBar(binding.toolbar)
4449

45-
binding.content.mainParamsList.setOnClickListener {
46-
Intent(this, KernelParamListActivity::class.java).apply {
47-
startActivity(this)
48-
}
49-
}
50+
val adapter = HomeItemAdapter(this)
51+
binding.content.recyclerView.adapter = adapter
52+
adapter.submitList(viewModel.getHomeItems())
5053

51-
binding.content.mainParamBrowser.setOnClickListener {
52-
Intent(this, KernelParamBrowserActivity::class.java).apply {
53-
startActivity(this)
54-
}
55-
}
54+
viewModel.viewEffect.observe(this) { viewEffect ->
55+
when (viewEffect) {
56+
is MainViewEffect.NavigateToKernelList -> startActivity(
57+
Intent(this, KernelParamListActivity::class.java)
58+
)
5659

57-
binding.content.mainReadFromFile.setOnClickListener {
58-
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
59-
addCategory(Intent.CATEGORY_OPENABLE)
60-
type = "*/*"
61-
}
62-
startActivityForResult(
63-
intent,
64-
OPEN_FILE_REQUEST_CODE
65-
)
66-
}
60+
is MainViewEffect.NavigateToKernelBrowser -> startActivity(
61+
Intent(this, KernelParamBrowserActivity::class.java)
62+
)
6763

68-
binding.content.mainFavorites.setOnClickListener {
69-
Intent(this, ManageFavoritesParamsActivity::class.java).apply {
70-
startActivity(this)
64+
is MainViewEffect.ImportParamsFromFile -> {
65+
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
66+
addCategory(Intent.CATEGORY_OPENABLE)
67+
type = "*/*"
68+
}
69+
startActivityForResult(
70+
intent,
71+
OPEN_FILE_REQUEST_CODE
72+
)
73+
}
74+
75+
is MainViewEffect.NavigateToFavorites -> startActivity(
76+
Intent(this, ManageFavoritesParamsActivity::class.java)
77+
)
78+
79+
is MainViewEffect.NavigateToSettings -> {
80+
startActivity(Intent(this, SettingsActivity::class.java))
81+
}
7182
}
7283
}
7384

@@ -84,9 +95,7 @@ class MainActivity : AppCompatActivity() {
8495
when (item.itemId) {
8596
android.R.id.home -> finish()
8697

87-
R.id.action_settings -> {
88-
startActivity(Intent(this, SettingsActivity::class.java))
89-
}
98+
R.id.action_settings -> viewModel.doWhenSettingsPressed()
9099

91100
R.id.action_exit -> {
92101
moveTaskToBack(true)
@@ -126,6 +135,15 @@ class MainActivity : AppCompatActivity() {
126135
super.onActivityResult(requestCode, resultCode, data)
127136
}
128137

138+
override fun onHomeItemClicked(item: HomeItem, position: Int) {
139+
when (position) {
140+
0 -> viewModel.doWhenListPressed()
141+
1 -> viewModel.doWhenBrowsePressed()
142+
2 -> viewModel.doWhenImportPressed()
143+
3 -> viewModel.doWhenFavoritesPressed()
144+
}
145+
}
146+
129147
private suspend fun applyParamsFromUri(uri: Uri, fileExtension: String) {
130148
val successfulParams: MutableList<DomainKernelParam> = mutableListOf()
131149

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.androidvip.sysctlgui.ui.main
2+
3+
sealed class MainViewEffect {
4+
object NavigateToKernelList : MainViewEffect()
5+
object NavigateToKernelBrowser : MainViewEffect()
6+
object ImportParamsFromFile : MainViewEffect()
7+
object NavigateToFavorites : MainViewEffect()
8+
object NavigateToSettings : MainViewEffect()
9+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.androidvip.sysctlgui.ui.main
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.MutableLiveData
5+
import androidx.lifecycle.ViewModel
6+
import com.androidvip.sysctlgui.R
7+
import com.androidvip.sysctlgui.data.models.HomeItem
8+
9+
class MainViewModel : ViewModel() {
10+
private val _viewEffect = MutableLiveData<MainViewEffect>()
11+
val viewEffect: LiveData<MainViewEffect> = _viewEffect
12+
13+
fun getHomeItems(): List<HomeItem> = listOf(
14+
HomeItem(R.string.show_variables, R.string.show_variables_sum, R.drawable.ic_edit_outline),
15+
HomeItem(
16+
R.string.browse_variables,
17+
R.string.browse_variables_sum,
18+
R.drawable.ic_folder_outline
19+
),
20+
HomeItem(
21+
R.string.read_from_file,
22+
R.string.read_from_file_sum,
23+
R.drawable.ic_file_import_outline
24+
),
25+
HomeItem(
26+
R.string.show_favorites,
27+
R.string.show_favorites_sum,
28+
R.drawable.ic_favorite_unselected
29+
)
30+
)
31+
32+
fun doWhenListPressed() = _viewEffect.postValue(MainViewEffect.NavigateToKernelList)
33+
34+
fun doWhenBrowsePressed() = _viewEffect.postValue(MainViewEffect.NavigateToKernelBrowser)
35+
36+
fun doWhenImportPressed() = _viewEffect.postValue(MainViewEffect.ImportParamsFromFile)
37+
38+
fun doWhenFavoritesPressed() = _viewEffect.postValue(MainViewEffect.NavigateToFavorites)
39+
40+
fun doWhenSettingsPressed() = _viewEffect.postValue(MainViewEffect.NavigateToSettings)
41+
}

app/src/main/kotlin/com/androidvip/sysctlgui/ui/params/browse/KernelParamBrowserAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class KernelParamBrowserAdapter(
3030

3131
override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
3232
if (holder is ParamBrowserViewHolder) {
33-
holder.bind(getItem(position))
33+
holder.bind(getItem(position), position)
3434
}
3535
}
3636

@@ -41,7 +41,7 @@ class KernelParamBrowserAdapter(
4141
inner class ParamBrowserViewHolder(
4242
private val binding: ListItemKernelFileBrowserBinding
4343
) : BaseViewHolder<KernelParam>(binding) {
44-
override fun bind(item: KernelParam) {
44+
override fun bind(item: KernelParam, position: Int) {
4545
val kernelFile = File(item.path)
4646
binding.param = item
4747
binding.kernelFile = kernelFile

0 commit comments

Comments
 (0)