Skip to content

Commit 0919e96

Browse files
authored
Merge branch 'master' into 13498-surveys-ui-improvements
2 parents 967f994 + e334904 commit 0919e96

112 files changed

Lines changed: 4188 additions & 3336 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@
8585
<activity
8686
android:name=".ui.resources.AddResourceActivity"
8787
android:theme="@style/AppTheme" />
88-
<activity android:name=".ui.viewer.AudioPlayerActivity"
89-
android:configChanges="orientation|screenSize" />
9088
<activity
9189
android:name=".ui.feedback.FeedbackDetailActivity"
9290
android:theme="@style/AppTheme" />
@@ -96,19 +94,9 @@
9694
android:label="@string/title_activity_dashboard"
9795
android:windowSoftInputMode="adjustResize"
9896
android:theme="@style/FullscreenTheme" />
99-
<activity android:name=".ui.viewer.PDFReaderActivity"
100-
android:configChanges="orientation|screenSize" />
10197
<activity android:name=".ui.viewer.WebViewActivity"
10298
android:configChanges="orientation|screenSize" />
103-
<activity android:name=".ui.viewer.VideoViewerActivity"
104-
android:configChanges="orientation|screenSize" />
105-
<activity android:name=".ui.viewer.ImageViewerActivity"
106-
android:configChanges="orientation|screenSize" />
107-
<activity android:name=".ui.viewer.TextFileViewerActivity"
108-
android:configChanges="orientation|screenSize" />
109-
<activity android:name=".ui.viewer.MarkdownViewerActivity"
110-
android:configChanges="orientation|screenSize" />
111-
<activity android:name=".ui.viewer.CSVViewerActivity"
99+
<activity android:name=".ui.viewer.ResourceViewerActivity"
112100
android:configChanges="orientation|screenSize" />
113101
<activity
114102
android:name=".ui.dictionary.DictionaryActivity"

app/src/main/java/org/ole/planet/myplanet/base/BaseResourceFragment.kt

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import androidx.recyclerview.widget.RecyclerView
2222
import dagger.hilt.android.AndroidEntryPoint
2323
import io.realm.RealmObject
2424
import javax.inject.Inject
25-
import kotlinx.coroutines.Deferred
26-
import kotlinx.coroutines.async
2725
import kotlinx.coroutines.isActive
2826
import kotlinx.coroutines.launch
2927
import org.ole.planet.myplanet.R
@@ -35,7 +33,6 @@ import org.ole.planet.myplanet.model.RealmStepExam
3533
import org.ole.planet.myplanet.model.RealmSubmission
3634
import org.ole.planet.myplanet.model.RealmTag
3735
import org.ole.planet.myplanet.model.RealmUser
38-
import org.ole.planet.myplanet.repository.ConfigurationsRepository
3936
import org.ole.planet.myplanet.repository.CoursesRepository
4037
import org.ole.planet.myplanet.repository.ResourcesRepository
4138
import org.ole.planet.myplanet.repository.SubmissionsRepository
@@ -70,8 +67,6 @@ abstract class BaseResourceFragment : Fragment() {
7067
@Inject
7168
lateinit var surveysRepository: SurveysRepository
7269
@Inject
73-
lateinit var configurationsRepository: ConfigurationsRepository
74-
@Inject
7570
lateinit var profileDbHandler: UserSessionManager
7671
@Inject
7772
lateinit var sharedPrefManager: SharedPrefManager
@@ -80,7 +75,6 @@ abstract class BaseResourceFragment : Fragment() {
8075
private var resourceNotFoundDialog: AlertDialog? = null
8176
private var downloadSuggestionDialog: AlertDialog? = null
8277
private var pendingSurveyDialog: AlertDialog? = null
83-
private var serverCheckDeferred: Deferred<Boolean>? = null
8478

8579
private fun isFragmentActive(): Boolean {
8680
return isAdded && activity != null &&
@@ -138,14 +132,14 @@ abstract class BaseResourceFragment : Fragment() {
138132
if (!fileUrl.isNullOrEmpty() && fileUrl in pendingDownloadUrls) {
139133
if (download.progress == 100) {
140134
pendingDownloadUrls.remove(fileUrl)
135+
onSingleResourceDownloaded(fileUrl)
141136
}
142137
setProgress(download.apply { completeAll = pendingDownloadUrls.isEmpty() })
143138
}
144139
}
145140
} else {
146141
pendingDownloadUrls.clear()
147-
prgDialog.dismiss()
148-
download?.message?.let { showError(prgDialog, it) }
142+
download?.message?.let { showError(prgDialog, it) } ?: prgDialog.dismiss()
149143
}
150144
}
151145
}
@@ -168,7 +162,7 @@ abstract class BaseResourceFragment : Fragment() {
168162
setPadding(48, 40, 48, 0)
169163
textSize = 18f
170164
maxLines = 5
171-
setSingleLine(false)
165+
isSingleLine = false
172166
setTextColor(androidx.core.content.ContextCompat.getColor(requireContext(), R.color.daynight_textColor))
173167
}
174168
alertDialogBuilder.setView(convertView)
@@ -177,47 +171,34 @@ abstract class BaseResourceFragment : Fragment() {
177171

178172
.setPositiveButton(R.string.download_selected) { _: DialogInterface?, _: Int ->
179173
lifecycleScope.launch {
180-
val serverAvailable = serverCheckDeferred?.await()
181-
?: configurationsRepository.checkServerAvailability()
182-
if (serverAvailable) {
183-
val selectedItemsList = (lv?.adapter as? CheckboxAdapter)?.selectedItemsList
184-
selectedItemsList?.let {
185-
addToLibrary(dbMyLibrary, ArrayList(it))
186-
val selectedLibraries = it.mapNotNull { index ->
187-
dbMyLibrary.getOrNull(
188-
index
189-
) }
190-
if (resourcesRepository.downloadResources(selectedLibraries)) {
191-
trackDownloadUrls(selectedLibraries.mapNotNull { lib -> lib?.resourceRemoteAddress })
192-
showProgressDialog()
193-
}
174+
val selectedItemsList = (lv?.adapter as? CheckboxAdapter)?.selectedItemsList
175+
selectedItemsList?.let {
176+
addToLibrary(dbMyLibrary, ArrayList(it))
177+
val selectedLibraries = it.mapNotNull { index -> dbMyLibrary.getOrNull(index) }
178+
if (resourcesRepository.downloadResources(selectedLibraries)) {
179+
val urls = selectedLibraries.mapNotNull { lib -> lib.resourceRemoteAddress }
180+
trackDownloadUrls(urls)
181+
showProgressDialog()
194182
}
195-
} else {
196-
showNotConnectedToast()
197183
}
198184
}
199185
}.setNeutralButton(R.string.download_all) { _: DialogInterface?, _: Int ->
200186
lifecycleScope.launch {
201-
if (serverCheckDeferred?.await() ?: configurationsRepository.checkServerAvailability()) {
202-
addAllToLibrary(dbMyLibrary)
203-
val filtered = dbMyLibrary.filterNotNull()
204-
if (resourcesRepository.downloadResources(filtered)) {
205-
trackDownloadUrls(filtered.mapNotNull { lib -> lib?.resourceRemoteAddress })
206-
showProgressDialog()
207-
}
208-
} else {
209-
showNotConnectedToast()
187+
addAllToLibrary(dbMyLibrary)
188+
val filtered = dbMyLibrary.filterNotNull()
189+
if (resourcesRepository.downloadResources(filtered)) {
190+
val urls = filtered.mapNotNull { lib -> lib.resourceRemoteAddress }
191+
trackDownloadUrls(urls)
192+
showProgressDialog()
210193
}
211194
}
212195
}.setNegativeButton(R.string.txt_cancel, null)
213196
downloadSuggestionDialog?.dismiss()
214197
downloadSuggestionDialog = alertDialogBuilder.create()
215-
serverCheckDeferred = lifecycleScope.async { configurationsRepository.checkServerAvailability() }
216198
downloadSuggestionDialog?.let { dialog ->
217199
createListView(dbMyLibrary, dialog)
218200
dialog.setOnDismissListener {
219201
downloadSuggestionDialog = null
220-
serverCheckDeferred = null
221202
}
222203
dialog.show()
223204
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = ((lv?.adapter as? CheckboxAdapter)?.selectedItemsList?.size
@@ -301,6 +282,8 @@ abstract class BaseResourceFragment : Fragment() {
301282
}
302283
}
303284

285+
protected open fun onSingleResourceDownloaded(url: String) {}
286+
304287
open fun onDownloadComplete() {
305288
prgDialog.dismiss()
306289

app/src/main/java/org/ole/planet/myplanet/model/ChatMessage.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ data class ChatMessage(
88
companion object {
99
const val QUERY = 1
1010
const val RESPONSE = 2
11+
const val LOAD_MORE = 3
1112
const val RESPONSE_SOURCE_UNKNOWN = 0
1213
const val RESPONSE_SOURCE_SHARED_VIEW_MODEL = 1
1314
const val RESPONSE_SOURCE_NETWORK = 2

app/src/main/java/org/ole/planet/myplanet/model/RealmMyCourse.kt

Lines changed: 3 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
package org.ole.planet.myplanet.model
22

33
import android.text.TextUtils
4-
import android.util.Base64
54
import com.google.gson.JsonArray
65
import com.google.gson.JsonObject
76
import io.realm.Realm
87
import io.realm.RealmList
98
import io.realm.RealmObject
109
import io.realm.annotations.Index
1110
import io.realm.annotations.PrimaryKey
12-
import org.ole.planet.myplanet.model.RealmMyLibrary.Companion.createStepResource
13-
import org.ole.planet.myplanet.model.RealmStepExam.Companion.insertCourseStepsExams
1411
import org.ole.planet.myplanet.services.SharedPrefManager
15-
import org.ole.planet.myplanet.utils.DownloadUtils.extractLinks
1612
import org.ole.planet.myplanet.utils.JsonUtils
17-
import org.ole.planet.myplanet.utils.UrlUtils
1813

1914
open class RealmMyCourse : RealmObject() {
2015
@PrimaryKey
@@ -65,62 +60,13 @@ open class RealmMyCourse : RealmObject() {
6560
private val concatenatedLinks = HashSet<String>()
6661

6762
@JvmStatic
68-
fun insertMyCourses(userId: String?, myCoursesDoc: JsonObject?, mRealm: Realm, spm: SharedPrefManager) {
69-
val id = JsonUtils.getString("_id", myCoursesDoc)
70-
var myMyCoursesDB = mRealm.where(RealmMyCourse::class.java).equalTo("id", id).findFirst()
71-
if (myMyCoursesDB == null) {
72-
myMyCoursesDB = mRealm.createObject(RealmMyCourse::class.java, id)
73-
}
74-
myMyCoursesDB?.setUserId(userId)
75-
myMyCoursesDB?.courseId = JsonUtils.getString("_id", myCoursesDoc)
76-
myMyCoursesDB?.courseRev = JsonUtils.getString("_rev", myCoursesDoc)
77-
myMyCoursesDB?.languageOfInstruction = JsonUtils.getString("languageOfInstruction", myCoursesDoc)
78-
myMyCoursesDB?.courseTitle = JsonUtils.getString("courseTitle", myCoursesDoc)
79-
myMyCoursesDB?.memberLimit = JsonUtils.getInt("memberLimit", myCoursesDoc)
80-
val description = JsonUtils.getString("description", myCoursesDoc)
81-
myMyCoursesDB?.description = description
82-
val links = extractLinks(description)
83-
val baseUrl = UrlUtils.getUrl()
63+
fun addConcatenatedLink(link: String) {
8464
synchronized(concatenatedLinks) {
85-
for (link in links) {
86-
concatenatedLinks.add("$baseUrl/$link")
87-
}
65+
concatenatedLinks.add(link)
8866
}
89-
myMyCoursesDB?.method = JsonUtils.getString("method", myCoursesDoc)
90-
myMyCoursesDB?.gradeLevel = JsonUtils.getString("gradeLevel", myCoursesDoc)
91-
myMyCoursesDB?.subjectLevel = JsonUtils.getString("subjectLevel", myCoursesDoc)
92-
myMyCoursesDB?.createdDate = JsonUtils.getLong("createdDate", myCoursesDoc)
93-
val courseStepsJsonArray = JsonUtils.getJsonArray("steps", myCoursesDoc)
94-
val stepsSize = courseStepsJsonArray.size()
95-
myMyCoursesDB?.setNumberOfSteps(stepsSize)
96-
val courseStepsList = mutableListOf<RealmCourseStep>()
97-
98-
for (i in 0 until stepsSize) {
99-
val stepElement = courseStepsJsonArray[i]
100-
val stepId = Base64.encodeToString(stepElement.toString().toByteArray(), Base64.NO_WRAP)
101-
val stepJson = stepElement.asJsonObject
102-
val step = RealmCourseStep()
103-
step.id = stepId
104-
step.stepTitle = JsonUtils.getString("stepTitle", stepJson)
105-
val stepDescription = JsonUtils.getString("description", stepJson)
106-
step.description = stepDescription
107-
val stepLinks = extractLinks(stepDescription)
108-
synchronized(concatenatedLinks) {
109-
for (stepLink in stepLinks) {
110-
concatenatedLinks.add("$baseUrl/$stepLink")
111-
}
112-
}
113-
insertCourseStepsAttachments(myMyCoursesDB?.courseId, stepId, JsonUtils.getJsonArray("resources", stepJson), mRealm, spm)
114-
insertExam(stepJson, mRealm, stepId, i + 1, myMyCoursesDB?.courseId)
115-
insertSurvey(stepJson, mRealm, stepId, i + 1, myMyCoursesDB?.courseId, myMyCoursesDB?.createdDate)
116-
step.noOfResources = JsonUtils.getJsonArray("resources", stepJson).size()
117-
step.courseId = myMyCoursesDB?.courseId
118-
courseStepsList.add(step)
119-
}
120-
myMyCoursesDB?.courseSteps = RealmList()
121-
myMyCoursesDB?.courseSteps?.addAll(courseStepsList)
12267
}
12368

69+
12470
@JvmStatic
12571
fun saveConcatenatedLinksToPrefs(spm: SharedPrefManager) {
12672
val existingJsonLinks = spm.getConcatenatedLinks()
@@ -142,49 +88,9 @@ open class RealmMyCourse : RealmObject() {
14288
}
14389

14490

145-
private fun insertExam(stepContainer: JsonObject, mRealm: Realm, stepId: String, i: Int, myCoursesID: String?) {
146-
if (stepContainer.has("exam")) {
147-
val `object` = stepContainer.getAsJsonObject("exam")
148-
`object`.addProperty("stepNumber", i)
149-
insertCourseStepsExams(myCoursesID, stepId, `object`, mRealm)
150-
}
151-
}
15291

153-
private fun insertSurvey(stepContainer: JsonObject, mRealm: Realm, stepId: String, i: Int, myCoursesID: String?, createdDate: Long?) {
154-
if (stepContainer.has("survey")) {
155-
val `object` = stepContainer.getAsJsonObject("survey")
156-
`object`.addProperty("stepNumber", i)
157-
`object`.addProperty("createdDate", createdDate)
158-
insertCourseStepsExams(myCoursesID, stepId, `object`, mRealm)
159-
}
160-
}
16192

162-
private fun insertCourseStepsAttachments(myCoursesID: String?, stepId: String?, resources: JsonArray, mRealm: Realm?, spm: SharedPrefManager) {
163-
resources.forEach { resource ->
164-
if (mRealm != null) {
165-
createStepResource(mRealm, resource.asJsonObject, myCoursesID, stepId, spm)
166-
}
167-
}
168-
}
16993

170-
@JvmStatic
171-
fun insert(mRealm: Realm, myCoursesDoc: JsonObject?, spm: SharedPrefManager) {
172-
val startedTransaction = !mRealm.isInTransaction
173-
if (startedTransaction) {
174-
mRealm.beginTransaction()
175-
}
176-
try {
177-
insertMyCourses("", myCoursesDoc, mRealm, spm)
178-
if (startedTransaction) {
179-
mRealm.commitTransaction()
180-
}
181-
} catch (e: Exception) {
182-
if (startedTransaction && mRealm.isInTransaction) {
183-
mRealm.cancelTransaction()
184-
}
185-
throw e
186-
}
187-
}
18894

18995
@JvmStatic
19096
fun serialize(course: RealmMyCourse, realm: Realm): JsonObject {

app/src/main/java/org/ole/planet/myplanet/model/RealmMyLibrary.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,9 @@ open class RealmMyLibrary : RealmObject() {
282282
resourceRemoteAddress = "${spm.getCouchdbUrl().ifEmpty { "http://" }}/resources/$resourceId/$key"
283283
resourceLocalAddress = key
284284
resourceOffline = FileUtils.checkFileExist(context, resourceRemoteAddress)
285+
if (resourceOffline) {
286+
downloadedRev = JsonUtils.getString("_rev", doc)
287+
}
285288
}
286289
}
287290
}

app/src/main/java/org/ole/planet/myplanet/model/ResourceItem.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ data class ResourceItem(
1111
val isOffline: Boolean,
1212
val _rev: String?,
1313
val uploadDate: String?,
14-
val filename: String?
14+
val filename: String?,
15+
val resourceLocalAddress: String? = null
1516
)

app/src/main/java/org/ole/planet/myplanet/repository/ActivitiesRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ interface ActivitiesRepository {
2222
suspend fun getUnuploadedLoginActivities(): List<org.ole.planet.myplanet.model.LoginActivityData>
2323
suspend fun markActivitiesUploaded(ids: Array<String>, revMap: Map<String, com.google.gson.JsonObject?>)
2424
suspend fun recordSyncActivity(userId: String)
25+
suspend fun recordSyncUserChallengeAction(userId: String)
2526
suspend fun insertActivity(json: JsonObject)
2627
suspend fun getRecentLogin(): RealmOfflineActivity?
2728
suspend fun insertSearchActivityFromNewsLog(log: org.ole.planet.myplanet.model.RealmNewsLog)

app/src/main/java/org/ole/planet/myplanet/repository/ActivitiesRepositoryImpl.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,19 @@ class ActivitiesRepositoryImpl @Inject constructor(
235235
}
236236

237237

238+
override suspend fun recordSyncUserChallengeAction(userId: String) {
239+
executeTransaction { realm ->
240+
val action = realm.createObject(
241+
org.ole.planet.myplanet.model.RealmUserChallengeActions::class.java,
242+
UUID.randomUUID().toString()
243+
)
244+
action.userId = userId
245+
action.actionType = "sync"
246+
action.resourceId = null
247+
action.time = System.currentTimeMillis()
248+
}
249+
}
250+
238251
override suspend fun recordSyncActivity(userId: String) {
239252
val user = userRepository.get().getUserById(userId)
240253
if (user == null || user.id?.startsWith("guest") == true) {

app/src/main/java/org/ole/planet/myplanet/repository/CoursesRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ interface CoursesRepository {
6060
suspend fun removeCourseFromShelf(courseId: String, userId: String)
6161
suspend fun logCourseVisit(courseId: String, title: String, userId: String)
6262
suspend fun getCurrentProgress(steps: List<RealmCourseStep?>?, userId: String?, courseId: String?): Int
63-
suspend fun getCourseProgress(userId: String?): java.util.HashMap<String?, com.google.gson.JsonObject>
63+
suspend fun getCourseProgress(userId: String?, courseIds: List<String>): java.util.HashMap<String?, com.google.gson.JsonObject>
6464
suspend fun isStepCompleted(stepId: String?, userId: String?): Boolean
6565
suspend fun hasUnfinishedSurveys(courseId: String, userId: String?): Boolean
6666
suspend fun getCourseTags(courseId: String): List<RealmTag>

0 commit comments

Comments
 (0)