diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8cc72911f..1e8da18fc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,10 @@
+
+
+
+
-
-
@@ -37,7 +39,6 @@
-
+
+
+
+
-
-
@@ -37,7 +39,6 @@
-
{
- val links = ArrayList()
- val pattern = Pattern.compile("!\\[.*?]\\((.*?)\\)")
- val matcher = text?.let { pattern.matcher(it) }
- if (matcher != null) {
- while (matcher.find()) {
- val link = matcher.group(1)
- if (link != null) {
- if (link.isNotEmpty()) {
- links.add(link)
- }
- }
- }
- }
- return links
- }
-
@JvmStatic
fun saveConcatenatedLinksToPrefs() {
val settings: SharedPreferences = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
diff --git a/app/src/main/java/org/ole/planet/myplanet/model/RealmMyTeam.kt b/app/src/main/java/org/ole/planet/myplanet/model/RealmMyTeam.kt
index 7233749d9..61441d202 100644
--- a/app/src/main/java/org/ole/planet/myplanet/model/RealmMyTeam.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/model/RealmMyTeam.kt
@@ -12,7 +12,10 @@ import io.realm.RealmResults
import io.realm.annotations.PrimaryKey
import org.ole.planet.myplanet.MainApplication.Companion.context
import org.ole.planet.myplanet.utilities.AndroidDecrypter
+import org.ole.planet.myplanet.utilities.DownloadUtils.extractLinks
import org.ole.planet.myplanet.utilities.JsonUtils
+import org.ole.planet.myplanet.utilities.Utilities.getUrl
+import org.ole.planet.myplanet.utilities.Utilities.openDownloadService
import java.io.File
import java.io.FileWriter
import java.io.IOException
@@ -98,6 +101,7 @@ open class RealmMyTeam : RealmObject() {
companion object {
private val teamDataList: MutableList> = mutableListOf()
val reportsDataList: MutableList> = mutableListOf()
+ private val concatenatedLinks = ArrayList()
@JvmStatic
fun insertMyTeams(doc: JsonObject, mRealm: Realm) {
@@ -114,6 +118,13 @@ open class RealmMyTeam : RealmObject() {
myTeams.sourcePlanet = JsonUtils.getString("sourcePlanet", doc)
myTeams.title = JsonUtils.getString("title", doc)
myTeams.description = JsonUtils.getString("description", doc)
+ val links = extractLinks(JsonUtils.getString("description", doc))
+ val baseUrl = getUrl()
+ for (link in links) {
+ val concatenatedLink = "$baseUrl/$link"
+ concatenatedLinks.add(concatenatedLink)
+ }
+ openDownloadService(context, concatenatedLinks, true)
myTeams.limit = JsonUtils.getInt("limit", doc)
myTeams.status = JsonUtils.getString("status", doc)
myTeams.teamPlanetCode = JsonUtils.getString("teamPlanetCode", doc)
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt b/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt
index fb22f53b6..39699bb88 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/SettingActivity.kt
@@ -20,6 +20,9 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import androidx.preference.SwitchPreference
import io.realm.Realm
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
import org.ole.planet.myplanet.MainApplication.Companion.mRealm
import org.ole.planet.myplanet.MainApplication.Companion.setThemeMode
import org.ole.planet.myplanet.R
@@ -135,9 +138,11 @@ class SettingActivity : AppCompatActivity() {
preference.onPreferenceClickListener = OnPreferenceClickListener {
AlertDialog.Builder(requireActivity()).setTitle(R.string.are_you_sure)
.setPositiveButton(R.string.yes) { _: DialogInterface?, _: Int ->
- clearRealmDb()
- clearSharedPref()
- restartApp()
+ CoroutineScope(Dispatchers.Main).launch {
+ clearRealmDb()
+ clearSharedPref()
+ restartApp()
+ }
}.setNegativeButton(R.string.no, null).show()
false
}
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/community/ServicesFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/community/ServicesFragment.kt
index 4cfb5e6b5..1eb4515e9 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/community/ServicesFragment.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/community/ServicesFragment.kt
@@ -9,6 +9,7 @@ import android.view.ViewGroup
import android.widget.TextView
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import io.realm.RealmResults
+import org.ole.planet.myplanet.MainApplication
import org.ole.planet.myplanet.R
import org.ole.planet.myplanet.callback.OnHomeItemClickListener
import org.ole.planet.myplanet.databinding.FragmentServicesBinding
@@ -16,6 +17,7 @@ import org.ole.planet.myplanet.datamanager.DatabaseService
import org.ole.planet.myplanet.model.RealmMyTeam
import org.ole.planet.myplanet.model.RealmNews
import org.ole.planet.myplanet.service.UserProfileDbHandler
+import org.ole.planet.myplanet.ui.courses.CourseStepFragment
import org.ole.planet.myplanet.ui.team.BaseTeamFragment
import org.ole.planet.myplanet.ui.team.TeamDetailFragment
import org.ole.planet.myplanet.utilities.Markdown.setMarkdownText
@@ -47,14 +49,16 @@ class ServicesFragment : BaseTeamFragment() {
}
if (links?.size == 0) {
- val description = team?.description ?: ""
fragmentServicesBinding.llServices.visibility = View.GONE
- fragmentServicesBinding.tvDescription.visibility = View.VISIBLE
- setMarkdownText(fragmentServicesBinding.tvDescription, description)
- } else {
- setRecyclerView(links)
}
+ val description = team?.description ?: ""
+ fragmentServicesBinding.llServices.visibility = View.VISIBLE
+ fragmentServicesBinding.tvDescription.visibility = View.VISIBLE
+ val markdownContentWithLocalPaths = CourseStepFragment.prependBaseUrlToImages(description, "file://${MainApplication.context.getExternalFilesDir(null)}/ole/")
+ setMarkdownText(fragmentServicesBinding.tvDescription, markdownContentWithLocalPaths)
+ setRecyclerView(links)
+
if (user?.isManager() == true || user?.isLeader() == true) {
fragmentServicesBinding.fab.show()
} else {
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/courses/CoursesFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/courses/CoursesFragment.kt
index 608c705b0..185fc30d9 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/courses/CoursesFragment.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/courses/CoursesFragment.kt
@@ -266,7 +266,7 @@ class CoursesFragment : BaseRecyclerFragment(), OnCourseItemSele
}
private fun createAlertDialog(): AlertDialog {
- val builder = AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme)
+ val builder = AlertDialog.Builder(requireContext(), R.style.CustomAlertDialog)
var msg = getString(R.string.success_you_have_added_the_following_courses)
if ((selectedItems?.size ?: 0) <= 5) {
for (i in selectedItems?.indices!!) {
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/exam/TakeExamFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/exam/TakeExamFragment.kt
index bddf10e24..20bb49b0a 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/exam/TakeExamFragment.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/exam/TakeExamFragment.kt
@@ -7,6 +7,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.CompoundButton
import android.widget.RadioButton
+import androidx.core.content.ContextCompat
import androidx.core.widget.NestedScrollView
import com.google.android.material.snackbar.Snackbar
import com.google.gson.JsonObject
@@ -188,6 +189,8 @@ class TakeExamFragment : BaseExamFragment(), View.OnClickListener, CompoundButto
if (isRadio) {
fragmentTakeExamBinding.groupChoices.addView(rdBtn)
} else {
+ rdBtn.setTextColor(resources.getColor(R.color.daynight_textColor))
+ rdBtn.buttonTintList = ContextCompat.getColorStateList(requireContext(), R.color.daynight_textColor)
fragmentTakeExamBinding.llCheckbox.addView(rdBtn)
}
}
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/resources/ResourcesFragment.kt b/app/src/main/java/org/ole/planet/myplanet/ui/resources/ResourcesFragment.kt
index 803dcfc3b..bf9727a5e 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/resources/ResourcesFragment.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/resources/ResourcesFragment.kt
@@ -196,7 +196,7 @@ class ResourcesFragment : BaseRecyclerFragment(), OnLibraryItem
}
private fun createAlertDialog(): AlertDialog {
- val builder = AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme)
+ val builder = AlertDialog.Builder(requireContext(), R.style.CustomAlertDialog)
var msg = getString(R.string.success_you_have_added_these_resources_to_your_mylibrary)
if ((selectedItems?.size ?: 0) <= 5) {
for (i in selectedItems?.indices ?: emptyList()) {
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/sync/SyncActivity.kt b/app/src/main/java/org/ole/planet/myplanet/ui/sync/SyncActivity.kt
index 68f71992f..c92c53368 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/sync/SyncActivity.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/sync/SyncActivity.kt
@@ -19,6 +19,10 @@ import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.*
import com.google.android.material.textfield.TextInputLayout
import io.realm.*
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
import okhttp3.ResponseBody
@@ -144,9 +148,11 @@ abstract class SyncActivity : ProcessUserDataActivity(), SyncListener, CheckVers
AlertDialog.Builder(this, R.style.AlertDialogTheme)
.setMessage(message)
.setPositiveButton(getString(R.string.clear_data)) { _, _ ->
- clearRealmDb()
- clearSharedPref()
- restartApp()
+ CoroutineScope(Dispatchers.Main).launch {
+ clearRealmDb()
+ clearSharedPref()
+ restartApp()
+ }
}
.setNegativeButton(getString(R.string.cancel)) { _, _ ->
onCancel()
@@ -850,12 +856,17 @@ abstract class SyncActivity : ProcessUserDataActivity(), SyncListener, CheckVers
lateinit var cal_today: Calendar
lateinit var cal_last_Sync: Calendar
- fun clearRealmDb() {
- val realm = Realm.getDefaultInstance()
- realm.executeTransaction { transactionRealm ->
- transactionRealm.deleteAll()
+ suspend fun clearRealmDb() {
+ withContext(Dispatchers.IO) {
+ val realm = Realm.getDefaultInstance()
+ try {
+ realm.executeTransaction { transactionRealm ->
+ transactionRealm.deleteAll()
+ }
+ } finally {
+ realm.close()
+ }
}
- realm.close()
}
fun clearSharedPref() {
diff --git a/app/src/main/java/org/ole/planet/myplanet/ui/viewer/CSVViewerActivity.kt b/app/src/main/java/org/ole/planet/myplanet/ui/viewer/CSVViewerActivity.kt
index b3faa01ef..2126b7fd4 100644
--- a/app/src/main/java/org/ole/planet/myplanet/ui/viewer/CSVViewerActivity.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/ui/viewer/CSVViewerActivity.kt
@@ -1,8 +1,12 @@
package org.ole.planet.myplanet.ui.viewer
import android.os.Bundle
+import android.text.Spannable
+import android.text.SpannableStringBuilder
+import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
import com.opencsv.CSVParserBuilder
import com.opencsv.CSVReaderBuilder
import org.ole.planet.myplanet.R
@@ -32,22 +36,28 @@ class CSVViewerActivity : AppCompatActivity() {
}
try {
- val csvFile: File = if (fileName!!.startsWith("/")) {
+ val csvFile: File = if (fileName?.startsWith("/") == true) {
File(fileName)
} else {
val basePath = getExternalFilesDir(null)
File(basePath, "ole/$fileName")
}
- val reader = CSVReaderBuilder(FileReader(csvFile)).withCSVParser(CSVParserBuilder()
- .withSeparator(',')
- .withQuoteChar('"')
+ val reader = CSVReaderBuilder(FileReader(csvFile))
+ .withCSVParser(CSVParserBuilder().withSeparator(',').withQuoteChar('"').build())
.build()
- ).build()
+
val allRows = reader.readAll()
+ val spannableContent = SpannableStringBuilder()
for (row in allRows) {
- activityCsvViewerBinding.csvFileContent.append(row.contentToString())
- activityCsvViewerBinding.csvFileContent.append("\n")
+ val rowText = row.contentToString() + "\n"
+ val start = spannableContent.length
+ spannableContent.append(rowText)
+ spannableContent.setSpan(
+ ForegroundColorSpan(ContextCompat.getColor(this, R.color.daynight_textColor)),
+ start, spannableContent.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
}
+ activityCsvViewerBinding.csvFileContent.text = spannableContent
} catch (e: Exception) {
e.printStackTrace()
}
diff --git a/app/src/main/java/org/ole/planet/myplanet/utilities/DownloadUtils.kt b/app/src/main/java/org/ole/planet/myplanet/utilities/DownloadUtils.kt
index 5c18518dd..1157052b2 100644
--- a/app/src/main/java/org/ole/planet/myplanet/utilities/DownloadUtils.kt
+++ b/app/src/main/java/org/ole/planet/myplanet/utilities/DownloadUtils.kt
@@ -1,6 +1,8 @@
package org.ole.planet.myplanet.utilities
import org.ole.planet.myplanet.model.RealmMyLibrary
+import java.util.regex.Pattern
+import kotlin.text.isNotEmpty
object DownloadUtils {
@JvmStatic
@@ -20,4 +22,21 @@ object DownloadUtils {
}
return urls
}
+
+ fun extractLinks(text: String?): ArrayList {
+ val links = ArrayList()
+ val pattern = Pattern.compile("!\\[.*?]\\((.*?)\\)")
+ val matcher = text?.let { pattern.matcher(it) }
+ if (matcher != null) {
+ while (matcher.find()) {
+ val link = matcher.group(1)
+ if (link != null) {
+ if (link.isNotEmpty()) {
+ links.add(link)
+ }
+ }
+ }
+ }
+ return links
+ }
}
diff --git a/app/src/main/res/layout/activity_feedback_detail.xml b/app/src/main/res/layout/activity_feedback_detail.xml
index 32d36dbd5..25949dfbc 100644
--- a/app/src/main/res/layout/activity_feedback_detail.xml
+++ b/app/src/main/res/layout/activity_feedback_detail.xml
@@ -35,7 +35,7 @@
android:id="@+id/feedback_reply_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_weight="3"
+ android:layout_weight="2.3"
android:hint="@string/please_enter_reply"
android:textColorHint="@color/hint_color"
android:textColor="@color/daynight_textColor"
@@ -52,7 +52,7 @@
style="@style/PrimaryButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_weight="1"
+ android:layout_weight="0.8"
android:text="@string/close" />
diff --git a/app/src/main/res/layout/fragment_services.xml b/app/src/main/res/layout/fragment_services.xml
index 0e88ee094..373a7cd6f 100644
--- a/app/src/main/res/layout/fragment_services.xml
+++ b/app/src/main/res/layout/fragment_services.xml
@@ -14,15 +14,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
-
-
+
@@ -43,5 +41,4 @@
android:layout_gravity="bottom|end"
android:padding="16dp"
android:src="@drawable/ic_add" />
-
-
\ No newline at end of file
+