Skip to content
This repository was archived by the owner on Apr 28, 2023. It is now read-only.

Commit 1fd2f74

Browse files
committed
First user achievement started
1 parent 0c13ce8 commit 1fd2f74

File tree

17 files changed

+229
-42
lines changed

17 files changed

+229
-42
lines changed

app/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ android {
88

99
defaultConfig {
1010
applicationId "it.androidclient"
11-
minSdkVersion 23
11+
minSdkVersion 26
1212
targetSdkVersion 29
1313
versionCode 1
1414
versionName "1.0"
@@ -51,4 +51,5 @@ dependencies {
5151

5252
implementation "com.squareup.retrofit2:retrofit:2.8.1"
5353
implementation "com.squareup.retrofit2:converter-gson:2.8.1"
54+
implementation 'com.google.code.gson:gson:2.8.6'
5455
}

app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@
1212
android:roundIcon="@mipmap/ic_launcher_round"
1313
android:supportsRtl="true"
1414
android:theme="@style/AppTheme">
15-
<activity android:name=".Views.WelcomeActivity"></activity>
16-
<activity android:name=".Views.CongratulationsActivity" />
17-
<activity android:name=".Views.ReadActivity" />
15+
<activity android:name=".Views.WelcomeActivity"
16+
tools:ignore="InnerclassSeparator" />
17+
<activity android:name=".Views.CongratulationsActivity"
18+
tools:ignore="InnerclassSeparator" />
19+
<activity android:name=".Views.ReadActivity"
20+
tools:ignore="InnerclassSeparator" />
1821
<activity
1922
android:name=".Views.MainActivity"
2023
android:configChanges="orientation|keyboardHidden"
2124
android:screenOrientation="portrait"
22-
tools:ignore="LockedOrientationActivity">
25+
tools:ignore="InnerclassSeparator,LockedOrientationActivity">
2326
<intent-filter>
2427
<action android:name="android.intent.action.MAIN" />
25-
2628
<category android:name="android.intent.category.LAUNCHER" />
2729
</intent-filter>
2830
</activity>

app/src/main/java/it/androidclient/Line/LineAdapter.kt

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package it.androidclient.Line
22

33
import android.content.Intent
4+
import android.opengl.Visibility
45
import android.view.LayoutInflater
56
import android.view.View
67
import android.view.ViewGroup
78
import android.widget.Toast
89
import androidx.core.content.ContextCompat
910
import androidx.recyclerview.widget.RecyclerView
1011
import it.androidclient.R
12+
import it.androidclient.UserCtx.AchievementsModel
13+
import it.androidclient.UserCtx.UserDataDto
1114
import it.androidclient.Views.ReadActivity
15+
import java.time.LocalDateTime
16+
import java.time.temporal.ChronoUnit
1217
import java.util.*
1318

1419
class LineAdapter(model: ArrayList<LineModel>?) : RecyclerView.Adapter<LineHolder>() {
1520
private val mModel: MutableList<LineModel>?
21+
private lateinit var userDataDto: UserDataDto
1622
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LineHolder {
23+
userDataDto = UserDataDto(parent.context.applicationContext)
1724
return LineHolder(
1825
LayoutInflater.from(parent.context)
1926
.inflate(R.layout.rv_main_item, parent, false)
@@ -26,7 +33,7 @@ class LineAdapter(model: ArrayList<LineModel>?) : RecyclerView.Adapter<LineHolde
2633
mModel!![position].title
2734
)
2835

29-
val color = when (position) {
36+
var color = when (position) {
3037
0 -> R.color.applicationList1
3138
1 -> R.color.applicationList2
3239
2 -> R.color.applicationList3
@@ -36,6 +43,13 @@ class LineAdapter(model: ArrayList<LineModel>?) : RecyclerView.Adapter<LineHolde
3643
else -> R.color.applicationList1
3744
}
3845

46+
color = when (mModel[position].completed){
47+
true -> R.color.applicationListDone
48+
else -> color
49+
}
50+
51+
holder.isCompleted.visibility = if (mModel[position].completed) View.VISIBLE else View.GONE
52+
3953
val listener = when (position){
4054
0 -> readListener
4155
1 -> languageListener
@@ -63,30 +77,120 @@ class LineAdapter(model: ArrayList<LineModel>?) : RecyclerView.Adapter<LineHolde
6377

6478
private val languageListener =
6579
View.OnClickListener { v ->
80+
if (userDataDto.userAchievements == null){
81+
userDataDto.userAchievements = AchievementsModel.UserCalendarModel(hashMapOf())
82+
}
83+
84+
val currentAchievements = userDataDto.userAchievements as AchievementsModel.UserCalendarModel
85+
if (currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] == null) {
86+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] =
87+
AchievementsModel.DailyMilestonesAchieved(
88+
achievedReading = false,
89+
achievedLanguage = false,
90+
achievedAbstractThinking = false,
91+
achievedConcentration = false,
92+
achievedPraxias = false,
93+
achievedSensorial = false
94+
)
95+
}
96+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)]?.achievedLanguage = true
97+
userDataDto.userAchievements = currentAchievements
6698
Toast.makeText(v.context.applicationContext, "Lenguaje not implemented", Toast.LENGTH_SHORT).show()
6799
notifyDataSetChanged()
68100
}
69101

70102
private val abstractListener =
71103
View.OnClickListener { v ->
104+
if (userDataDto.userAchievements == null){
105+
userDataDto.userAchievements = AchievementsModel.UserCalendarModel(hashMapOf())
106+
}
107+
108+
val currentAchievements = userDataDto.userAchievements as AchievementsModel.UserCalendarModel
109+
if (currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] == null) {
110+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] =
111+
AchievementsModel.DailyMilestonesAchieved(
112+
achievedReading = false,
113+
achievedLanguage = false,
114+
achievedAbstractThinking = false,
115+
achievedConcentration = false,
116+
achievedPraxias = false,
117+
achievedSensorial = false
118+
)
119+
}
120+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)]?.achievedAbstractThinking = true
121+
userDataDto.userAchievements = currentAchievements
72122
Toast.makeText(v.context.applicationContext, "Pensamiento abstracto not implemented", Toast.LENGTH_SHORT).show()
73123
notifyDataSetChanged()
74124
}
75125

76126
private val concentrationListener =
77127
View.OnClickListener { v ->
128+
if (userDataDto.userAchievements == null){
129+
userDataDto.userAchievements = AchievementsModel.UserCalendarModel(hashMapOf())
130+
}
131+
132+
val currentAchievements = userDataDto.userAchievements as AchievementsModel.UserCalendarModel
133+
if (currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] == null) {
134+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] =
135+
AchievementsModel.DailyMilestonesAchieved(
136+
achievedReading = false,
137+
achievedLanguage = false,
138+
achievedAbstractThinking = false,
139+
achievedConcentration = false,
140+
achievedPraxias = false,
141+
achievedSensorial = false
142+
)
143+
}
144+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)]?.achievedConcentration = true
145+
userDataDto.userAchievements = currentAchievements
78146
Toast.makeText(v.context.applicationContext, "Concentracion not implemented", Toast.LENGTH_SHORT).show()
79147
notifyDataSetChanged()
80148
}
81149

82150
private val praxiasListener =
83151
View.OnClickListener { v ->
152+
if (userDataDto.userAchievements == null){
153+
userDataDto.userAchievements = AchievementsModel.UserCalendarModel(hashMapOf())
154+
}
155+
156+
val currentAchievements = userDataDto.userAchievements as AchievementsModel.UserCalendarModel
157+
if (currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] == null) {
158+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] =
159+
AchievementsModel.DailyMilestonesAchieved(
160+
achievedReading = false,
161+
achievedLanguage = false,
162+
achievedAbstractThinking = false,
163+
achievedConcentration = false,
164+
achievedPraxias = false,
165+
achievedSensorial = false
166+
)
167+
}
168+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)]?.achievedPraxias = true
169+
userDataDto.userAchievements = currentAchievements
84170
Toast.makeText(v.context.applicationContext, "Praxias not implemented", Toast.LENGTH_SHORT).show()
85171
notifyDataSetChanged()
86172
}
87173

88174
private val perceptionListener =
89175
View.OnClickListener { v ->
176+
if (userDataDto.userAchievements == null){
177+
userDataDto.userAchievements = AchievementsModel.UserCalendarModel(hashMapOf())
178+
}
179+
180+
val currentAchievements = userDataDto.userAchievements as AchievementsModel.UserCalendarModel
181+
if (currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] == null) {
182+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)] =
183+
AchievementsModel.DailyMilestonesAchieved(
184+
achievedReading = false,
185+
achievedLanguage = false,
186+
achievedAbstractThinking = false,
187+
achievedConcentration = false,
188+
achievedPraxias = false,
189+
achievedSensorial = false
190+
)
191+
}
192+
currentAchievements.achievementList[LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)]?.achievedSensorial = true
193+
userDataDto.userAchievements = currentAchievements
90194
Toast.makeText(v.context.applicationContext, "Percepcion sensorial not implemented", Toast.LENGTH_SHORT).show()
91195
notifyDataSetChanged()
92196
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package it.androidclient.Line
22

33
import android.view.View
4+
import android.widget.ImageView
45
import android.widget.TextView
56
import androidx.recyclerview.widget.RecyclerView
67
import it.androidclient.R
78

89
class LineHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
910
var title: TextView = itemView.findViewById<View>(R.id.cardTextView) as TextView
10-
11+
var isCompleted: ImageView = itemView.findViewById<ImageView>(R.id.isCompleted) as ImageView
1112
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package it.androidclient.Line
22

3-
class LineModel(var title: String)
3+
class LineModel(var title: String, var completed: Boolean)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package it.androidclient.UserCtx
2+
3+
import java.time.LocalDateTime
4+
import kotlin.collections.HashMap
5+
6+
object AchievementsModel {
7+
data class UserCalendarModel(var achievementList: HashMap<LocalDateTime, DailyMilestonesAchieved>)
8+
data class DailyMilestonesAchieved(var achievedReading: Boolean, var achievedLanguage: Boolean, var achievedAbstractThinking: Boolean, var achievedConcentration: Boolean, var achievedPraxias: Boolean, var achievedSensorial: Boolean)
9+
}

app/src/main/java/it/androidclient/UserCtx/Preferences.kt

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import android.content.Context
22
import android.content.SharedPreferences
33
import com.google.gson.Gson
4+
import com.google.gson.GsonBuilder
5+
import com.google.gson.JsonDeserializer
46
import it.androidclient.Services.TodaysPostModel
7+
import it.androidclient.UserCtx.AchievementsModel
8+
import java.time.LocalDate
9+
import java.time.LocalDateTime
10+
import java.time.ZonedDateTime
511
import kotlin.reflect.KProperty
612

13+
714
/**
815
* Represents a single [SharedPreferences] file.
916
*
@@ -51,7 +58,8 @@ abstract class Preferences(private var context: Context, private val name: Strin
5158
Boolean,
5259
Long,
5360
StringSet,
54-
TodaysPostObject
61+
TodaysPostObject,
62+
AchievementsModelObject
5563
}
5664

5765
inner class GenericPrefDelegate<T>(prefKey: String? = null, private val defaultValue: T?, val type: StorableType) :
@@ -75,6 +83,15 @@ abstract class Preferences(private var context: Context, private val name: Strin
7583
val gson = Gson()
7684
gson.fromJson(serialized, TodaysPostModel.Result::class.java) as T?
7785
}
86+
StorableType.AchievementsModelObject -> {
87+
val serialized = prefs.getString(prefKey ?: property.name, defaultValue as String?)
88+
val gson = GsonBuilder().registerTypeAdapter(
89+
LocalDateTime::class.java,
90+
JsonDeserializer<Any?> { json, _, _ ->
91+
LocalDateTime.parse(json.asJsonPrimitive.asString)
92+
}).create()
93+
gson.fromJson(serialized, AchievementsModel.UserCalendarModel::class.java) as T?
94+
}
7895
}
7996

8097
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
@@ -109,6 +126,12 @@ abstract class Preferences(private var context: Context, private val name: Strin
109126
prefs.edit().putString(prefKey ?: property.name, serialized).apply()
110127
onPrefChanged(property)
111128
}
129+
StorableType.AchievementsModelObject -> {
130+
val gson = Gson()
131+
val serialized = gson.toJson(value)
132+
prefs.edit().putString(prefKey ?: property.name, serialized).apply()
133+
onPrefChanged(property)
134+
}
112135
}
113136
}
114137

@@ -120,6 +143,9 @@ abstract class Preferences(private var context: Context, private val name: Strin
120143
fun todaysPostPref(prefKey: String? = null, defaultValue:Any?=null) =
121144
GenericPrefDelegate(prefKey, defaultValue, StorableType.TodaysPostObject)
122145

146+
fun achievementsPref(prefKey: String? = null, defaultValue:Any?=null) =
147+
GenericPrefDelegate(prefKey, defaultValue, StorableType.AchievementsModelObject)
148+
123149
fun intPref(prefKey: String? = null, defaultValue: Int = 0) =
124150
GenericPrefDelegate(prefKey, defaultValue, StorableType.Int)
125151

app/src/main/java/it/androidclient/UserCtx/UserDataDto.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ class UserDataDto(ctx: Context) : Preferences(ctx) {
77
var userName by stringPref()
88
var todaysPost by todaysPostPref()
99
var needsDyslexicFont by booleanPref()
10+
var userAchievements by achievementsPref()
1011
}

app/src/main/java/it/androidclient/Views/MainActivity.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,44 @@ import androidx.recyclerview.widget.LinearLayoutManager
99
import it.androidclient.Line.LineAdapter
1010
import it.androidclient.Line.LineModel
1111
import it.androidclient.R
12+
import it.androidclient.UserCtx.AchievementsModel
1213
import it.androidclient.UserCtx.UserDataDto
1314
import kotlinx.android.synthetic.main.activity_main.*
15+
import java.time.LocalDateTime
16+
import java.time.temporal.ChronoUnit
1417

1518

1619
class MainActivity : AppCompatActivity() {
1720

1821
private var mAdapter: LineAdapter? = null
1922
override fun onCreate(savedInstanceState: Bundle?) {
2023
super.onCreate(savedInstanceState)
21-
val userDataDto =
22-
UserDataDto(applicationContext)
24+
val userDataDto = UserDataDto(applicationContext)
2325
if (userDataDto.userName.isNullOrBlank()){
2426
val intent = Intent(applicationContext, WelcomeActivity::class.java)
2527
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
2628
startActivity(intent)
29+
return
2730
}
2831
setContentView(R.layout.activity_main)
2932
findViewById<TextView>(R.id.toolbar_title).apply {
3033
text = resources.getString(R.string.greeting).replace("{0}", userDataDto.userName.toString())
3134
}
32-
setupRecycler()
35+
setupRecycler(userDataDto)
3336
}
3437

35-
private fun setupRecycler() {
38+
private fun setupRecycler(userDataDto: UserDataDto) {
3639
val layoutManager = LinearLayoutManager(this)
3740
rvMain.layoutManager = layoutManager
3841

3942
val list = arrayListOf<LineModel>()
40-
list.add(LineModel("LECTURA"))
41-
list.add(LineModel("LENGUAJE"))
42-
list.add(LineModel("PENSAMIENTO ABSTRACTO"))
43-
list.add(LineModel("CONCENTRACION"))
44-
list.add(LineModel("PRAXIAS"))
45-
list.add(LineModel("PERCEPCION SENSORIAL"))
43+
val todaysAchievements = (userDataDto.userAchievements as AchievementsModel.UserCalendarModel?)?.achievementList?.get(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS))
44+
list.add(LineModel("LECTURA", todaysAchievements?.achievedReading ?: false))
45+
list.add(LineModel("LENGUAJE", todaysAchievements?.achievedLanguage ?: false))
46+
list.add(LineModel("PENSAMIENTO ABSTRACTO", todaysAchievements?.achievedAbstractThinking ?: false))
47+
list.add(LineModel("CONCENTRACION", todaysAchievements?.achievedConcentration ?: false))
48+
list.add(LineModel("PRAXIAS", todaysAchievements?.achievedPraxias ?: false))
49+
list.add(LineModel("PERCEPCION SENSORIAL", todaysAchievements?.achievedSensorial ?: false))
4650
mAdapter = LineAdapter(list)
4751
rvMain.adapter = mAdapter
4852

0 commit comments

Comments
 (0)