Skip to content

Commit c17a153

Browse files
committed
Supporting properly Annotations that don't have a root word in the widget.
1 parent e9348f7 commit c17a153

15 files changed

Lines changed: 83 additions & 52 deletions

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ android {
1616
minSdk = 26
1717
//noinspection EditedTargetSdkVersion
1818
targetSdk = 35
19-
versionCode = 11
20-
versionName = "3.0.1"
19+
versionCode = 12
20+
versionName = "3.0.2"
2121
buildConfigField("String", "APP_VERSION", "\"$versionName-$versionCode\"")
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

app/src/main/java/fr/berliat/hskwidget/data/dao/AnnotatedChineseWordDAO.kt

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,8 @@
11
package fr.berliat.hskwidget.data.dao
22

33
import androidx.room.Dao
4-
import androidx.room.Embedded
54
import androidx.room.Query
6-
import fr.berliat.hskwidget.data.model.ChineseWord
7-
import fr.berliat.hskwidget.data.model.ChineseWordAnnotation
8-
9-
data class AnnotatedChineseWord (
10-
@Embedded val word: ChineseWord?,
11-
@Embedded val annotation: ChineseWordAnnotation?) {
12-
13-
val simplified: String
14-
get() {
15-
return word?.simplified ?: annotation?.simplified!!
16-
}
17-
18-
companion object {
19-
fun getBlank(simplified: String = ""): AnnotatedChineseWord {
20-
return AnnotatedChineseWord(
21-
ChineseWord.getBlank(simplified),
22-
ChineseWordAnnotation.getBlank(simplified)
23-
)
24-
}
25-
}
26-
27-
fun hasAnnotation(): Boolean {
28-
return annotation?.firstSeen != null
29-
}
30-
}
5+
import fr.berliat.hskwidget.data.model.AnnotatedChineseWord
316

327
private const val select_left_join =
338
"SELECT a.a_simplified, COALESCE(w.simplified, a.a_simplified) simplified, a.a_searchable_text, " +
@@ -63,6 +38,13 @@ interface AnnotatedChineseWordDAO {
6338
" LIMIT :pageSize OFFSET (:page * :pageSize)")
6439
suspend fun searchFromStrLike(str: String?, hasAnnotation: Boolean, page: Int = 0, pageSize: Int = 30): List<AnnotatedChineseWord>
6540

41+
@Query("SELECT * FROM (" +
42+
" $select_left_join WHERE a.a_simplified IN (SELECT simplified FROM word_list_entries WHERE listId IN (:listIds) AND simplified NOT IN (:bannedWords))" +
43+
" UNION " +
44+
"$select_right_join WHERE w.simplified IN (SELECT simplified FROM word_list_entries WHERE listId IN (:listIds) AND simplified NOT IN (:bannedWords))" +
45+
") ORDER BY RANDOM() LIMIT 1")
46+
suspend fun getRandomWordFromLists(listIds: List<Long>, bannedWords: Array<String>): AnnotatedChineseWord?
47+
6648
@Query("SELECT a.a_simplified, COALESCE(w.simplified, a.a_simplified) simplified, a.a_searchable_text, " +
6749
" a.a_pinyins, a.notes, a.class_type, a.class_level, a.themes, a.first_seen, a.is_exam," +
6850
" w.traditional, w.definition, w.hsk_level, w.pinyins, w.popularity, " +

app/src/main/java/fr/berliat/hskwidget/data/dao/WordListDAO.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,4 @@ interface WordListDAO {
118118

119119
@Query("DELETE FROM word_lists")
120120
suspend fun deleteAllLists()
121-
122-
@Query("SELECT * FROM chineseword WHERE simplified IN (SELECT simplified FROM word_list_entries WHERE listId IN (:listIds) AND simplified NOT IN (:bannedWords) ORDER BY RANDOM() LIMIT 1)")
123-
suspend fun getRandomWordFromLists(listIds: List<Long>, bannedWords: Array<String>): ChineseWord?
124121
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package fr.berliat.hskwidget.data.model
2+
3+
import androidx.room.Embedded
4+
import java.util.Locale
5+
6+
data class AnnotatedChineseWord (
7+
@Embedded val word: ChineseWord?,
8+
@Embedded val annotation: ChineseWordAnnotation?) {
9+
10+
val simplified: String
11+
get() {
12+
return word?.simplified ?: annotation?.simplified!!
13+
}
14+
15+
companion object {
16+
fun getBlank(simplified: String = ""): AnnotatedChineseWord {
17+
return AnnotatedChineseWord(
18+
ChineseWord.getBlank(simplified),
19+
ChineseWordAnnotation.getBlank(simplified)
20+
)
21+
}
22+
}
23+
24+
fun hasAnnotation(): Boolean {
25+
return annotation?.firstSeen != null
26+
}
27+
28+
fun hasWord(): Boolean {
29+
return word?.hskLevel != null
30+
}
31+
32+
fun toChineseWord(): ChineseWord? {
33+
if (hasWord()) return word!!
34+
35+
if (hasAnnotation()) {
36+
return ChineseWord(simplified, "",
37+
mapOf(Pair<Locale,String>(Locale.ENGLISH, annotation?.notes ?: "")),
38+
ChineseWord.HSK_Level.NOT_HSK,
39+
ChineseWord.Pinyins(""),
40+
0)
41+
}
42+
43+
return null
44+
}
45+
}

app/src/main/java/fr/berliat/hskwidget/data/repo/WordListRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package fr.berliat.hskwidget.data.repo
22

33
import android.content.Context
44
import android.util.Log
5-
import fr.berliat.hskwidget.data.dao.AnnotatedChineseWord
5+
import fr.berliat.hskwidget.data.model.AnnotatedChineseWord
66
import fr.berliat.hskwidget.data.model.WordList
77
import fr.berliat.hskwidget.data.model.WordListEntry
88
import fr.berliat.hskwidget.data.store.AnkiStore

app/src/main/java/fr/berliat/hskwidget/data/store/AnkiStore.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import android.util.Log
66
import com.ichi2.anki.api.NoteInfo
77
import fr.berliat.hskwidget.R
88
import fr.berliat.hskwidget.data.dao.AnkiDAO
9-
import fr.berliat.hskwidget.data.dao.AnnotatedChineseWord
9+
import fr.berliat.hskwidget.data.model.AnnotatedChineseWord
1010
import fr.berliat.hskwidget.data.model.WordList
1111
import fr.berliat.hskwidget.data.model.WordListEntry
1212
import fr.berliat.hskwidget.domain.AnkiDeck

app/src/main/java/fr/berliat/hskwidget/data/store/FlashcardPreferencesStore.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import androidx.datastore.core.DataStore
55
import androidx.datastore.preferences.core.Preferences
66
import androidx.datastore.preferences.preferencesDataStore
7+
import fr.berliat.hskwidget.data.dao.WidgetListsDAO
78
import fr.berliat.hskwidget.data.model.WidgetListEntry
89
import fr.berliat.hskwidget.data.model.WordListWithCount
910
import fr.berliat.hskwidget.domain.Utils
@@ -12,7 +13,12 @@ internal val Context.dataStore: DataStore<Preferences> by preferencesDataStore("
1213

1314
class FlashcardPreferencesStore(private val context: Context, private val widgetId: Int):
1415
PrefixedPreferenceDataStoreBridge(context.dataStore, widgetId.toString()) {
15-
private suspend fun WidgetListsDAO() = ChineseWordsDatabase.getInstance(context).widgetListsDAO()
16+
private suspend fun WidgetListsDAO(): WidgetListsDAO {
17+
val inst = ChineseWordsDatabase.getInstance(context)
18+
val dao = inst.widgetListsDAO()
19+
20+
return dao
21+
}
1622
private suspend fun WordListDAO() = ChineseWordsDatabase.getInstance(context).wordListDAO()
1723

1824
var currentSimplified : String

app/src/main/java/fr/berliat/hskwidget/data/store/TypeConverters.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package fr.berliat.hskwidget.data.store
33
import androidx.room.TypeConverter
44
import com.google.gson.Gson
55
import com.google.gson.reflect.TypeToken
6-
import fr.berliat.hskwidget.data.dao.AnnotatedChineseWord
6+
import fr.berliat.hskwidget.data.model.AnnotatedChineseWord
77
import fr.berliat.hskwidget.data.model.ChineseWord
88
import fr.berliat.hskwidget.data.model.ChineseWordAnnotation
99
import java.util.Date

app/src/main/java/fr/berliat/hskwidget/domain/FlashcardManager.kt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,34 +21,35 @@ class FlashcardManager private constructor(private val context: Context,
2121
private val appWidgetMgr = AppWidgetManager.getInstance(context)
2222
private val coroutineScope = Utils.getAppScope(context)
2323

24-
private suspend fun ChineseWordDAO() = ChineseWordsDatabase.getInstance(context).chineseWordDAO()
25-
private suspend fun WordListDAO() = ChineseWordsDatabase.getInstance(context).wordListDAO()
24+
private suspend fun AnnotatedChineseWordDAO() = ChineseWordsDatabase.getInstance(context).annotatedChineseWordDAO()
2625

2726
fun getPreferenceStore(): FlashcardPreferencesStore {
2827
return FlashcardPreferencesStore(context, widgetId)
2928
}
3029

3130
suspend fun getCurrentWord() : ChineseWord {
32-
var currentWord = ChineseWordDAO().findWordFromSimplified(flashCardPrefs.currentSimplified)
31+
val currentWord = AnnotatedChineseWordDAO().getFromSimplified(flashCardPrefs.currentSimplified)
32+
?: return Utils.getDefaultWord(context)
3333

34-
if (currentWord == null) currentWord = Utils.getDefaultWord(context)
35-
36-
return currentWord
34+
return currentWord.toChineseWord() ?: Utils.getDefaultWord(context)
3735
}
3836

3937
suspend fun getNewWord(): ChineseWord {
40-
val currentWord = ChineseWordDAO().findWordFromSimplified(flashCardPrefs.currentSimplified)
38+
val currentWord = AnnotatedChineseWordDAO().getFromSimplified(flashCardPrefs.currentSimplified)
4139

4240
val allowedListIds = flashCardPrefs.getAllowedLists().map { it.wordList.id }
43-
var newWord = WordListDAO().getRandomWordFromLists(allowedListIds, arrayOf(currentWord!!.simplified))
41+
val newWord = AnnotatedChineseWordDAO().getRandomWordFromLists(allowedListIds, arrayOf(currentWord?.simplified ?: ""))
42+
43+
var finalWord = Utils.getDefaultWord(context)
4444

4545
Log.i(TAG, "Got a new word, maybe: %s".format(newWord))
46-
if (newWord == null) newWord = Utils.getDefaultWord(context)
46+
if (newWord != null)
47+
finalWord = newWord.toChineseWord() ?: finalWord
4748

4849
// Persist it in preferences for cross-App convenience
49-
flashCardPrefs.currentSimplified = newWord.simplified
50+
flashCardPrefs.currentSimplified = finalWord.simplified
5051

51-
return newWord
52+
return finalWord
5253
}
5354

5455
fun updateWord() {

app/src/main/java/fr/berliat/hskwidget/domain/Utils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import androidx.work.workDataOf
2424
import com.google.firebase.analytics.ktx.analytics
2525
import com.google.firebase.ktx.Firebase
2626
import fr.berliat.hskwidget.R
27-
import fr.berliat.hskwidget.data.dao.AnnotatedChineseWord
27+
import fr.berliat.hskwidget.data.model.AnnotatedChineseWord
2828
import fr.berliat.hskwidget.data.model.ChineseWord
2929
import fr.berliat.hskwidget.data.repo.ChineseWordFrequencyRepo
3030
import fr.berliat.hskwidget.data.store.ChineseWordsDatabase

0 commit comments

Comments
 (0)