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 +