Skip to content

Commit afe8a34

Browse files
committed
Refactor tutorial and assistant item data structures
1 parent 21cca2f commit afe8a34

8 files changed

Lines changed: 90 additions & 57 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.wstxda.switchai.data
2+
3+
data class AssistantItem(
4+
val key: String,
5+
val name: String,
6+
val iconResId: Int,
7+
val isPinned: Boolean,
8+
val lastUsedTimestamp: Long,
9+
)

app/src/main/java/com/wstxda/switchai/ui/viewholder/AssistantTutorialItemViewHolder.kt renamed to app/src/main/java/com/wstxda/switchai/data/TutorialItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package com.wstxda.switchai.ui.viewholder
1+
package com.wstxda.switchai.data
22

33
import androidx.annotation.DrawableRes
44
import androidx.annotation.StringRes
55

6-
data class AssistantTutorialItemViewHolder(
6+
data class TutorialItem(
77
@DrawableRes val iconRes: Int,
88
@DrawableRes val imageRes: Int,
99
@StringRes val titleRes: Int,

app/src/main/java/com/wstxda/switchai/fragment/TutorialFragment.kt

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import android.view.LayoutInflater
66
import android.view.View
77
import android.view.ViewGroup
88
import androidx.fragment.app.Fragment
9-
import com.wstxda.switchai.R
9+
import com.wstxda.switchai.ui.utils.TutorialItemList
1010
import com.wstxda.switchai.databinding.FragmentTutorialBinding
11-
import com.wstxda.switchai.databinding.ListItemAssistantTutorialBinding
12-
import com.wstxda.switchai.ui.viewholder.AssistantTutorialItemViewHolder
11+
import com.wstxda.switchai.ui.adapter.TutorialItemViewBuilder
1312

1413
class TutorialFragment : Fragment() {
14+
1515
interface ScrollListener {
1616
fun onScrollChanged(canScrollUp: Boolean, canScrollDown: Boolean)
1717
}
@@ -39,10 +39,9 @@ class TutorialFragment : Fragment() {
3939
populateTutorials()
4040

4141
binding.tutorialScrollView.setOnScrollChangeListener { v, _, _, _, _ ->
42-
val canScrollUp = v.canScrollVertically(-1)
43-
val canScrollDown = v.canScrollVertically(1)
44-
45-
scrollListener?.onScrollChanged(canScrollUp, canScrollDown)
42+
scrollListener?.onScrollChanged(
43+
v.canScrollVertically(-1), v.canScrollVertically(1)
44+
)
4645
}
4746

4847
binding.tutorialScrollView.post {
@@ -54,18 +53,10 @@ class TutorialFragment : Fragment() {
5453
}
5554

5655
private fun populateTutorials() {
57-
val tutorialItems = defaultTutorialItems()
58-
val inflater = LayoutInflater.from(requireContext())
59-
tutorialItems.forEach { item ->
60-
val itemBinding =
61-
ListItemAssistantTutorialBinding.inflate(inflater, binding.tutorialContainer, false)
62-
itemBinding.tutorialImage.setImageResource(item.imageRes)
63-
itemBinding.tutorialTitle.setText(item.titleRes)
64-
itemBinding.tutorialTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
65-
item.iconRes, 0, 0, 0
66-
)
67-
itemBinding.tutorialSummary.setText(item.summaryRes)
68-
binding.tutorialContainer.addView(itemBinding.root)
56+
val items = TutorialItemList.getTutorialItems()
57+
items.forEach { item ->
58+
val view = TutorialItemViewBuilder.build(requireContext(), item)
59+
binding.tutorialContainer.addView(view)
6960
}
7061
}
7162

@@ -79,25 +70,4 @@ class TutorialFragment : Fragment() {
7970
super.onDetach()
8071
scrollListener = null
8172
}
82-
83-
companion object {
84-
fun defaultTutorialItems() = listOf(
85-
AssistantTutorialItemViewHolder(
86-
iconRes = R.drawable.ic_corners,
87-
imageRes = R.drawable.tutorial_gestures_card,
88-
titleRes = R.string.tutorial_edge_gestures,
89-
summaryRes = R.string.tutorial_edge_gestures_summary
90-
), AssistantTutorialItemViewHolder(
91-
iconRes = R.drawable.ic_home,
92-
imageRes = R.drawable.tutorial_button_card,
93-
titleRes = R.string.tutorial_home_button,
94-
summaryRes = R.string.tutorial_home_button_summary
95-
), AssistantTutorialItemViewHolder(
96-
iconRes = R.drawable.ic_power,
97-
imageRes = R.drawable.tutorial_power_card,
98-
titleRes = R.string.tutorial_power_button,
99-
summaryRes = R.string.tutorial_power_button_summary
100-
)
101-
)
102-
}
10373
}

app/src/main/java/com/wstxda/switchai/ui/adapter/AssistantSelectorDiffCallback.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,29 @@ class AssistantSelectorDiffCallback(
66
private val oldList: List<AssistantSelectorRecyclerView>,
77
private val newList: List<AssistantSelectorRecyclerView>,
88
) : DiffUtil.Callback() {
9+
910
override fun getOldListSize() = oldList.size
11+
1012
override fun getNewListSize() = newList.size
1113

12-
override fun areItemsTheSame(oldPos: Int, newPos: Int) = when {
13-
oldList[oldPos] is AssistantSelectorRecyclerView.AssistantSelector && newList[newPos] is AssistantSelectorRecyclerView.AssistantSelector -> (oldList[oldPos] as AssistantSelectorRecyclerView.AssistantSelector).assistantItem.key == (newList[newPos] as AssistantSelectorRecyclerView.AssistantSelector).assistantItem.key
14+
override fun areItemsTheSame(oldPos: Int, newPos: Int): Boolean = when {
15+
oldList[oldPos] is AssistantSelectorRecyclerView.AssistantSelector && newList[newPos] is AssistantSelectorRecyclerView.AssistantSelector -> {
16+
val oldItem =
17+
(oldList[oldPos] as AssistantSelectorRecyclerView.AssistantSelector).assistantItem
18+
val newItem =
19+
(newList[newPos] as AssistantSelectorRecyclerView.AssistantSelector).assistantItem
20+
oldItem.key == newItem.key
21+
}
1422

15-
oldList[oldPos] is AssistantSelectorRecyclerView.CategoryHeader && newList[newPos] is AssistantSelectorRecyclerView.CategoryHeader -> (oldList[oldPos] as AssistantSelectorRecyclerView.CategoryHeader).title == (newList[newPos] as AssistantSelectorRecyclerView.CategoryHeader).title
23+
oldList[oldPos] is AssistantSelectorRecyclerView.CategoryHeader && newList[newPos] is AssistantSelectorRecyclerView.CategoryHeader -> {
24+
val oldHeader = oldList[oldPos] as AssistantSelectorRecyclerView.CategoryHeader
25+
val newHeader = newList[newPos] as AssistantSelectorRecyclerView.CategoryHeader
26+
oldHeader.title == newHeader.title
27+
}
1628

1729
else -> false
1830
}
1931

20-
override fun areContentsTheSame(oldPos: Int, newPos: Int) = oldList[oldPos] == newList[newPos]
32+
override fun areContentsTheSame(oldPos: Int, newPos: Int): Boolean =
33+
oldList[oldPos] == newList[newPos]
2134
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package com.wstxda.switchai.ui.adapter
22

3-
import com.wstxda.switchai.viewmodel.AssistantSelectorViewModel
3+
import com.wstxda.switchai.data.AssistantItem
44

55
sealed interface AssistantSelectorRecyclerView {
66
data class CategoryHeader(val title: String) : AssistantSelectorRecyclerView
7-
data class AssistantSelector(val assistantItem: AssistantSelectorViewModel.AssistantItem) :
8-
AssistantSelectorRecyclerView
7+
data class AssistantSelector(val assistantItem: AssistantItem) : AssistantSelectorRecyclerView
98
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.wstxda.switchai.ui.adapter
2+
3+
import android.content.Context
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import com.wstxda.switchai.data.TutorialItem
7+
import com.wstxda.switchai.databinding.ListItemAssistantTutorialBinding
8+
9+
object TutorialItemViewBuilder {
10+
fun build(context: Context, item: TutorialItem): View {
11+
val binding = ListItemAssistantTutorialBinding.inflate(LayoutInflater.from(context))
12+
binding.tutorialImage.setImageResource(item.imageRes)
13+
binding.tutorialTitle.setText(item.titleRes)
14+
binding.tutorialTitle.setCompoundDrawablesRelativeWithIntrinsicBounds(item.iconRes, 0, 0, 0)
15+
binding.tutorialSummary.setText(item.summaryRes)
16+
return binding.root
17+
}
18+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.wstxda.switchai.ui.utils
2+
3+
import com.wstxda.switchai.R
4+
import com.wstxda.switchai.data.TutorialItem
5+
6+
object TutorialItemList {
7+
fun getTutorialItems() = listOf(
8+
9+
// Gestures tutorial
10+
TutorialItem(
11+
iconRes = R.drawable.ic_corners,
12+
imageRes = R.drawable.tutorial_gestures_card,
13+
titleRes = R.string.tutorial_edge_gestures,
14+
summaryRes = R.string.tutorial_edge_gestures_summary),
15+
16+
// Home button tutorial
17+
TutorialItem(
18+
iconRes = R.drawable.ic_home,
19+
imageRes = R.drawable.tutorial_button_card,
20+
titleRes = R.string.tutorial_home_button,
21+
summaryRes = R.string.tutorial_home_button_summary),
22+
23+
// Power button tutorial
24+
TutorialItem(
25+
iconRes = R.drawable.ic_power,
26+
imageRes = R.drawable.tutorial_power_card,
27+
titleRes = R.string.tutorial_power_button,
28+
summaryRes = R.string.tutorial_power_button_summary
29+
)
30+
)
31+
}

app/src/main/java/com/wstxda/switchai/viewmodel/AssistantSelectorViewModel.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.wstxda.switchai.utils.DigitalAssistantMap
1414
import org.json.JSONArray
1515
import org.json.JSONObject
1616
import androidx.core.content.edit
17+
import com.wstxda.switchai.data.AssistantItem
1718
import com.wstxda.switchai.utils.Constants.CAT_PINNED_ASSISTANTS_KEY
1819
import com.wstxda.switchai.utils.Constants.CAT_RECENTLY_USED_ASSISTANTS_KEY
1920
import com.wstxda.switchai.utils.Constants.CAT_MAX_RECENTLY_USED
@@ -214,12 +215,4 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
214215
super.onCleared()
215216
defaultSharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
216217
}
217-
218-
data class AssistantItem(
219-
val key: String,
220-
val name: String,
221-
val iconResId: Int,
222-
val isPinned: Boolean,
223-
val lastUsedTimestamp: Long,
224-
)
225218
}

0 commit comments

Comments
 (0)