Skip to content

Commit 29926e9

Browse files
committed
Implemented questionnaire editor
1 parent 149df60 commit 29926e9

35 files changed

+1894
-146
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* Alarms
1717
* Statistics
1818
* Backup / Export
19+
1920
Everything is supposed to be as customizable as possible
2021

2122
## 🛡️ Privacy

app/src/main/java/com/bitflaker/lucidsourcekit/MainActivity.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,14 @@ private void addDebugQuestionnaire(MainDatabase db) {
195195
int q5 = qd.insert(new Question("Anything else?", 4, id, null, null, false)).blockingGet().intValue();
196196

197197
QuestionOptionsDao qo = db.getQuestionOptionsDao();
198-
qo.insert(new QuestionOptions(q2, 1, "Option 1", null)).blockingSubscribe();
199-
qo.insert(new QuestionOptions(q2, 2, "Option 2", null)).blockingSubscribe();
200-
qo.insert(new QuestionOptions(q2, 3, "Option 3", null)).blockingSubscribe();
201-
202-
qo.insert(new QuestionOptions(q3, 1, "Option 1", null)).blockingSubscribe();
203-
qo.insert(new QuestionOptions(q3, 2, "Option 2", null)).blockingSubscribe();
204-
qo.insert(new QuestionOptions(q3, 3, "Option 3", null)).blockingSubscribe();
205-
qo.insert(new QuestionOptions(q3, 4, "Option 4", null)).blockingSubscribe();
198+
qo.insert(new QuestionOptions(q2, 1, "Option 1", 1, false, null)).blockingSubscribe();
199+
qo.insert(new QuestionOptions(q2, 2, "Option 2", 2, false, null)).blockingSubscribe();
200+
qo.insert(new QuestionOptions(q2, 3, "Option 3", 3, false, null)).blockingSubscribe();
201+
202+
qo.insert(new QuestionOptions(q3, 1, "Option 1", 1, false, null)).blockingSubscribe();
203+
qo.insert(new QuestionOptions(q3, 2, "Option 2", 2, false, null)).blockingSubscribe();
204+
qo.insert(new QuestionOptions(q3, 3, "Option 3", 3, false, null)).blockingSubscribe();
205+
qo.insert(new QuestionOptions(q3, 4, "Option 4", 4, false, null)).blockingSubscribe();
206206
}
207207

208208
private void applicationLogin() {

app/src/main/java/com/bitflaker/lucidsourcekit/database/MainDatabase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
Weekdays.class, ActiveAlarm.class, StoredAlarm.class, NotificationObfuscations.class,
8282
NotificationMessage.class, NotificationCategory.class, ShuffleTransaction.class,
8383
Questionnaire.class, Question.class, QuestionType.class, CompletedQuestionnaire.class,
84-
QuestionnaireAnswer.class, QuestionOptions.class, SelectedOptions.class}, version = 17, exportSchema = false)
84+
QuestionnaireAnswer.class, QuestionOptions.class, SelectedOptions.class}, version = 18, exportSchema = false)
8585
@TypeConverters({Converters.class})
8686
public abstract class MainDatabase extends RoomDatabase {
8787

@@ -161,6 +161,7 @@ private static MainDatabase create(final Context context) {
161161
.addMigrations(MainDatabaseMigrations.MIGRATION_14_15)
162162
.addMigrations(MainDatabaseMigrations.MIGRATION_15_16)
163163
.addMigrations(MainDatabaseMigrations.MIGRATION_16_17)
164+
.addMigrations(MainDatabaseMigrations.MIGRATION_17_18)
164165
.build();
165166
}
166167

app/src/main/java/com/bitflaker/lucidsourcekit/database/MainDatabaseMigrations.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,4 +296,12 @@ public void migrate(@NonNull SupportSQLiteDatabase database) {
296296
database.execSQL("ALTER TABLE CompletedQuestionnaire ADD answerDuration INTEGER DEFAULT 0 NOT NULL;");
297297
}
298298
};
299+
300+
public static final Migration MIGRATION_17_18 = new Migration(17, 18) {
301+
@Override
302+
public void migrate(@NonNull SupportSQLiteDatabase database) {
303+
database.execSQL("ALTER TABLE QuestionOptions ADD orderNr INTEGER DEFAULT 0 NOT NULL;");
304+
database.execSQL("ALTER TABLE QuestionOptions ADD isHidden INTEGER DEFAULT 0 NOT NULL;");
305+
}
306+
};
299307
}

app/src/main/java/com/bitflaker/lucidsourcekit/database/questionnaire/daos/QuestionDao.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@ interface QuestionDao {
1414
@Query("SELECT * FROM Question ORDER BY id")
1515
fun getAll(): Single<List<Question>>
1616

17-
@Query("SELECT * FROM Question WHERE questionnaireId = :id ORDER BY orderNr, id")
17+
@Query("SELECT * FROM Question WHERE questionnaireId = :id AND isHidden = 0 ORDER BY orderNr, id")
1818
fun getAllForQuestionnaire(id: Int): Single<List<Question>>
1919

2020
@Query("SELECT * FROM Question WHERE id = :id")
2121
fun getById(id: Int): Single<Question>
2222

23+
@Query("SELECT (SELECT COUNT(*) FROM QuestionnaireAnswer WHERE questionId = :id) + (SELECT COUNT(*) FROM SelectedOptions WHERE questionId = :id) > 0")
24+
fun isQuestionReferenced(id: Int): Single<Boolean>
25+
2326
@Update
2427
fun update(entry: Question): Completable
2528

app/src/main/java/com/bitflaker/lucidsourcekit/database/questionnaire/daos/QuestionOptionsDao.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,18 @@ interface QuestionOptionsDao {
1414
@Query("SELECT * FROM QuestionOptions ORDER BY questionId, id")
1515
fun getAll(): Single<List<QuestionOptions>>
1616

17-
@Query("SELECT * FROM QuestionOptions WHERE questionId = :questionId ORDER BY id")
17+
@Query("SELECT * FROM QuestionOptions WHERE questionId = :questionId AND isHidden = 0 ORDER BY orderNr, id")
1818
fun getAllForQuestion(questionId: Int): Single<List<QuestionOptions>>
1919

20+
@Query("SELECT MAX(id) + 1 FROM QuestionOptions WHERE questionId = :questionId")
21+
fun getNextId(questionId: Int): Single<Int>
22+
2023
@Query("SELECT * FROM QuestionOptions WHERE questionId = :questionId AND id = :optionId")
2124
fun getById(questionId: Int, optionId: Int): Single<QuestionOptions>
2225

26+
@Query("SELECT COUNT(*) > 0 FROM SelectedOptions WHERE questionId = :questionId AND optionId = :optionId")
27+
fun isReferenced(questionId: Int, optionId: Int): Single<Boolean>
28+
2329
@Update
2430
fun update(entry: QuestionOptions): Completable
2531

app/src/main/java/com/bitflaker/lucidsourcekit/database/questionnaire/daos/QuestionnaireDao.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,31 @@ interface QuestionnaireDao {
1717

1818
@Query("""SELECT fq.*, COUNT(cq.id) AS completedCount, AVG(cq.answerDuration) AS averageDuration
1919
FROM (
20-
SELECT q.id, q.title, q.description, q.isCompact, q.isHidden, Count(Question.id) AS questionCount
20+
SELECT q.id, q.title, q.description, q.isCompact, q.colorCode, Count(*) AS questionCount
2121
FROM Questionnaire q
2222
LEFT JOIN Question ON q.id = Question.questionnaireId
23-
GROUP BY q.id, q.title, q.description, q.isCompact, q.isHidden
23+
GROUP BY q.id, q.title, q.description, q.isCompact, q.colorCode
24+
HAVING q.isHidden = 0 AND Question.isHidden = 0
25+
ORDER BY q.id
26+
) fq
27+
LEFT JOIN CompletedQuestionnaire cq ON fq.id = cq.questionnaireId
28+
GROUP BY fq.id, fq.title, fq.description, fq.isCompact, fq.colorCode, fq.questionCount""")
29+
fun getAllDetails(): Single<List<QuestionnaireDetails>>
30+
31+
@Query("""SELECT fq.*, COUNT(cq.id) AS completedCount, AVG(cq.answerDuration) AS averageDuration
32+
FROM (
33+
SELECT q.id, q.title, q.description, q.isCompact, q.colorCode, Count(Question.id) AS questionCount
34+
FROM Questionnaire q
35+
LEFT JOIN Question ON q.id = Question.questionnaireId
36+
GROUP BY q.id, q.title, q.description, q.isCompact, q.colorCode
37+
HAVING q.id = :questionnaireId AND q.isHidden = 0 AND Question.isHidden = 0
2438
ORDER BY q.id
2539
) fq
2640
LEFT JOIN CompletedQuestionnaire cq ON fq.id = cq.questionnaireId""")
27-
fun getAllMore(): Single<List<QuestionnaireDetails>>
41+
fun getDetailsById(questionnaireId: Int): Single<QuestionnaireDetails>
42+
43+
@Query("SELECT (SELECT COUNT(*) FROM Question WHERE questionnaireId = :id) + (SELECT COUNT(*) FROM CompletedQuestionnaire WHERE questionnaireId = :id) > 0")
44+
fun isReferenced(id: Int): Single<Boolean>
2845

2946
@Query("SELECT * FROM Questionnaire WHERE id = :id")
3047
fun getById(id: Int): Single<Questionnaire>

app/src/main/java/com/bitflaker/lucidsourcekit/database/questionnaire/entities/Question.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,20 @@ import androidx.room.PrimaryKey
2424
indices = [Index("questionTypeId"), Index("questionnaireId")]
2525
)
2626
data class Question(
27-
@PrimaryKey(autoGenerate = true) val id: Int,
27+
@PrimaryKey(autoGenerate = true) var id: Int,
2828
val question: String,
2929
val questionTypeId: Int,
30-
val questionnaireId: Int,
31-
val orderNr: Int,
32-
val valueFrom: Int?,
33-
val valueTo: Int?,
30+
var questionnaireId: Int,
31+
var orderNr: Int,
32+
var valueFrom: Int?,
33+
var valueTo: Int?,
3434
val autoContinue: Boolean,
35-
val isHidden: Boolean
35+
var isHidden: Boolean
3636
) {
3737
@Ignore
3838
constructor(question: String, questionTypeId: Int, questionnaireId: Int, valueFrom: Int?, valueTo: Int?, autoContinue: Boolean):
3939
this(0, question, questionTypeId, questionnaireId, 0, valueFrom, valueTo, autoContinue, false)
40+
41+
@Ignore
42+
var options: MutableList<QuestionOptions>? = null
4043
}

app/src/main/java/com/bitflaker/lucidsourcekit/database/questionnaire/entities/QuestionOptions.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.bitflaker.lucidsourcekit.database.questionnaire.entities
22

33
import androidx.room.Entity
44
import androidx.room.ForeignKey
5+
import androidx.room.Ignore
56
import androidx.room.Index
67

78
@Entity(primaryKeys = ["questionId", "id"],
@@ -17,8 +18,13 @@ import androidx.room.Index
1718
indices = [Index("questionId")]
1819
)
1920
data class QuestionOptions(
20-
val questionId: Int,
21-
val id: Int,
22-
val text: String,
21+
var questionId: Int,
22+
var id: Int,
23+
var text: String,
24+
var orderNr: Int,
25+
var isHidden: Boolean,
2326
val description: String?
24-
)
27+
) {
28+
@Ignore
29+
constructor(questionId: Int) : this(questionId, -1, "", 0, false, null)
30+
}

app/src/main/java/com/bitflaker/lucidsourcekit/database/questionnaire/entities/Questionnaire.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ import androidx.room.PrimaryKey
77
@Entity
88
data class Questionnaire(
99
@PrimaryKey(autoGenerate = true) val id: Int,
10-
val title: String,
11-
val description: String?,
12-
val orderNr: Int,
13-
val colorCode: String?,
14-
val isHidden: Boolean,
15-
val isCompact: Boolean
10+
var title: String,
11+
var description: String?,
12+
var orderNr: Int,
13+
var colorCode: String?,
14+
var isHidden: Boolean,
15+
var isCompact: Boolean
1616
) {
1717
@Ignore
1818
constructor(title: String, description: String?, colorCode: String?, isCompact: Boolean) : this(0, title, description, -1, colorCode, false, isCompact)
19+
20+
@Ignore
21+
constructor() : this(0, "", null, -1, null, false, false)
1922
}

0 commit comments

Comments
 (0)