Skip to content

Commit

Permalink
Merge branch 'master' into 4457-mark-all-as-read-button
Browse files Browse the repository at this point in the history
  • Loading branch information
dogi authored Sep 27, 2024
2 parents 44233e9 + 7338147 commit 9796229
Show file tree
Hide file tree
Showing 14 changed files with 159 additions and 82 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ dependencies {
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation 'de.rtner:PBKDF2:1.1.4'
implementation 'org.osmdroid:osmdroid-android:6.1.20'
implementation 'org.jetbrains:annotations:24.1.0'
implementation 'org.jetbrains:annotations:25.0.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3"
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'
Expand Down
102 changes: 65 additions & 37 deletions app/src/main/java/org/ole/planet/myplanet/ui/survey/AdapterSurvey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import io.realm.Realm
import org.ole.planet.myplanet.R
Expand All @@ -13,65 +14,92 @@ import org.ole.planet.myplanet.model.RealmExamQuestion
import org.ole.planet.myplanet.model.RealmStepExam
import org.ole.planet.myplanet.model.RealmSubmission.Companion.getNoOfSubmissionByUser
import org.ole.planet.myplanet.model.RealmSubmission.Companion.getRecentSubmissionDate
import org.ole.planet.myplanet.model.RealmUserModel
import org.ole.planet.myplanet.service.UserProfileDbHandler
import org.ole.planet.myplanet.ui.submission.AdapterMySubmission
import org.ole.planet.myplanet.ui.survey.AdapterSurvey.ViewHolderSurvey
import org.ole.planet.myplanet.utilities.TimeUtils.formatDate
import org.ole.planet.myplanet.service.UserProfileDbHandler
import org.ole.planet.myplanet.model.RealmUserModel

class AdapterSurvey(private val context: Context, private val examList: List<RealmStepExam>, private val mRealm: Realm, private val userId: String) : RecyclerView.Adapter<ViewHolderSurvey>() {
private lateinit var rowSurveyBinding: RowSurveyBinding
class AdapterSurvey(private val context: Context, private val mRealm: Realm, private val userId: String) : RecyclerView.Adapter<AdapterSurvey.ViewHolderSurvey>() {
private var examList: List<RealmStepExam> = emptyList()
private var listener: OnHomeItemClickListener? = null
var user: RealmUserModel? = null
private var user: RealmUserModel? = null

init {
if (context is OnHomeItemClickListener) {
listener = context
}
user = UserProfileDbHandler(context).userModel
}

fun updateData(newList: List<RealmStepExam>) {
val diffCallback = SurveyDiffCallback(examList, newList)
val diffResult = DiffUtil.calculateDiff(diffCallback)
examList = newList
diffResult.dispatchUpdatesTo(this)
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderSurvey {
rowSurveyBinding = RowSurveyBinding.inflate(LayoutInflater.from(context), parent, false)
return ViewHolderSurvey(rowSurveyBinding)
val binding = RowSurveyBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolderSurvey(binding)
}

override fun onBindViewHolder(holder: ViewHolderSurvey, position: Int) {
user = UserProfileDbHandler(context).userModel
rowSurveyBinding.tvTitle.text = examList[position].name
rowSurveyBinding.startSurvey.setOnClickListener {
AdapterMySubmission.openSurvey(listener, examList[position].id, false)
}
val questions: List<RealmExamQuestion> = mRealm.where(RealmExamQuestion::class.java).equalTo("examId", examList[position].id).findAll()
if (questions.isEmpty()) {
rowSurveyBinding.sendSurvey.visibility = View.GONE
rowSurveyBinding.startSurvey.visibility = View.GONE
}
rowSurveyBinding.startSurvey.text = if (examList[position].isFromNation) context.getString(R.string.take_survey) else context.getString(
R.string.record_survey
)
if (user?.id?.startsWith("guest") == true) {
rowSurveyBinding.startSurvey.visibility = View.GONE
}
val noOfSubmission = getNoOfSubmissionByUser(examList[position].id, userId, mRealm)
val subDate = getRecentSubmissionDate(examList[position].id, userId, mRealm)
val createdDate = RealmStepExam.getSurveyCreationTime(examList[position].id!!, mRealm)
rowSurveyBinding.tvNoSubmissions.text = noOfSubmission
rowSurveyBinding.tvDateCompleted.text = subDate
rowSurveyBinding.tvDate.text = formatDate(createdDate!!, "MMM dd, yyyy")
holder.bind(examList[position])
}

override fun getItemCount(): Int {
return examList.size
}
override fun getItemCount(): Int = examList.size

inner class ViewHolderSurvey(rowSurveyBinding: RowSurveyBinding) : RecyclerView.ViewHolder(rowSurveyBinding.root) {
inner class ViewHolderSurvey(private val binding: RowSurveyBinding) : RecyclerView.ViewHolder(binding.root) {
init {
rowSurveyBinding.startSurvey.visibility = View.VISIBLE
rowSurveyBinding.sendSurvey.visibility = View.GONE
rowSurveyBinding.sendSurvey.setOnClickListener {
binding.startSurvey.visibility = View.VISIBLE
binding.sendSurvey.visibility = View.GONE
binding.sendSurvey.setOnClickListener {
val current = examList[bindingAdapterPosition]
listener?.sendSurvey(current)
}
}

fun bind(exam: RealmStepExam) {
binding.apply {
tvTitle.text = exam.name
startSurvey.setOnClickListener {
AdapterMySubmission.openSurvey(listener, exam.id, false)
}

val questions = mRealm.where(RealmExamQuestion::class.java)
.equalTo("examId", exam.id)
.findAll()

if (questions.isEmpty()) {
sendSurvey.visibility = View.GONE
startSurvey.visibility = View.GONE
}

startSurvey.text = if (exam.isFromNation) {
context.getString(R.string.take_survey)
} else {
context.getString(R.string.record_survey)
}

if (user?.id?.startsWith("guest") == true) {
startSurvey.visibility = View.GONE
}

tvNoSubmissions.text = getNoOfSubmissionByUser(exam.id, userId, mRealm)
tvDateCompleted.text = getRecentSubmissionDate(exam.id, userId, mRealm)
tvDate.text = formatDate(RealmStepExam.getSurveyCreationTime(exam.id!!, mRealm)!!, "MMM dd, yyyy")
}
}
}
}

class SurveyDiffCallback(private val oldList: List<RealmStepExam>, private val newList: List<RealmStepExam>) : DiffUtil.Callback() {
override fun getOldListSize(): Int = oldList.size
override fun getNewListSize(): Int = newList.size
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition].id == newList[newItemPosition].id
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,36 +16,50 @@ class SurveyFragment : BaseRecyclerFragment<RealmStepExam?>() {
private lateinit var addNewSurvey: FloatingActionButton
private lateinit var spn: CustomSpinner
private var isTitleAscending = true
private lateinit var adapter: AdapterSurvey

override fun getLayout(): Int {
return R.layout.fragment_survey
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = AdapterSurvey(requireActivity(), mRealm, model?.id ?: "")
}

override fun getAdapter(): RecyclerView.Adapter<*> {
return model?.id?.let {
AdapterSurvey(requireActivity(), safeCastList(getList(RealmStepExam::class.java, "name", Sort.ASCENDING), RealmStepExam::class.java), mRealm, it)
}!!
return adapter
}

@SuppressLint("ResourceAsColor")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
spn = requireView().findViewById(R.id.spn_sort)
addNewSurvey = requireView().findViewById(R.id.fab_add_new_survey)
addNewSurvey.setOnClickListener { }
if (getAdapter().itemCount == 0) {
spn.visibility = View.GONE
}
showNoData(tvMessage, getAdapter().itemCount, "survey")

initializeViews(view)
setupRecyclerView()
setupListeners()
updateAdapterData()
}

private fun initializeViews(view: View) {
spn = view.findViewById(R.id.spn_sort)
addNewSurvey = view.findViewById(R.id.fab_add_new_survey)
}

private fun setupRecyclerView() {
recyclerView.setHasFixedSize(true)
recyclerView.adapter = adapter
}

private fun setupListeners() {
addNewSurvey.setOnClickListener {}

spn.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(adapterView: AdapterView<*>?, view: View?, i: Int, l: Long) {
if (view != null) {
if (i == 0) {
recyclerView.adapter = activity?.let { act -> model?.id?.let { id -> AdapterSurvey(act, safeCastList(getList(RealmStepExam::class.java, "createdDate", Sort.ASCENDING), RealmStepExam::class.java), mRealm, id) } }
} else if (i == 1){
recyclerView.adapter = activity?.let { act -> model?.id?.let { id -> AdapterSurvey(act, safeCastList(getList(RealmStepExam::class.java, "createdDate", Sort.DESCENDING), RealmStepExam::class.java), mRealm, id) } }
} else {
toggleTitleSortOrder()
}
when (i) {
0 -> updateAdapterData(Sort.ASCENDING, "createdDate")
1 -> updateAdapterData(Sort.DESCENDING, "createdDate")
2 -> toggleTitleSortOrder()
}
}

Expand All @@ -63,13 +77,36 @@ class SurveyFragment : BaseRecyclerFragment<RealmStepExam?>() {
})
}

fun <T> safeCastList(items: List<Any?>, clazz: Class<T>): List<T> {
return items.mapNotNull { it?.takeIf(clazz::isInstance)?.let(clazz::cast) }
private fun updateAdapterData(sort: Sort = Sort.ASCENDING, field: String = "name") {
val newList = getList(RealmStepExam::class.java, field, sort)
adapter.updateData(safeCastList(newList, RealmStepExam::class.java))
updateUIState()
}

private fun updateUIState() {
val itemCount = adapter.itemCount
spn.visibility = if (itemCount == 0) View.GONE else View.VISIBLE
showNoData(tvMessage, itemCount, "survey")
}

fun toggleTitleSortOrder() {
isTitleAscending = !isTitleAscending
val sort = if (isTitleAscending) Sort.ASCENDING else Sort.DESCENDING
recyclerView.adapter = AdapterSurvey(requireActivity(), safeCastList(getList(RealmStepExam::class.java, "name", sort), RealmStepExam::class.java), mRealm, model?.id!!)
updateAdapterData(sort, "name")
}

private fun <T> safeCastList(items: List<Any?>, clazz: Class<T>): List<T> {
return items.mapNotNull { it?.takeIf(clazz::isInstance)?.let(clazz::cast) }
}

override fun onDestroy() {
super.onDestroy()
mRealm.close()
}

companion object {
fun newInstance(): SurveyFragment {
return SurveyFragment()
}
}
}
6 changes: 1 addition & 5 deletions app/src/main/res/layout/fragment_notifications.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,17 @@
android:id="@+id/btnMarkAllAsRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="mark all as read"
android:text="@string/mark_all_as_read"
android:textAllCaps="false"
app:layout_constraintEnd_toEndOf="parent" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />

<Spinner
android:id="@+id/status"
android:layout_width="wrap_content"
Expand All @@ -54,7 +51,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/ltTopBar" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_notifications"
android:layout_width="match_parent"
Expand Down
24 changes: 15 additions & 9 deletions app/src/main/res/layout/my_library_alertdialog.xml
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/card_bg">
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/card_bg"
android:maxHeight="400dp"
android:padding="10dp">

<org.ole.planet.myplanet.utilities.CheckboxListView
android:id="@+id/alertDialog_listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:minHeight="100dp"
android:layout_marginLeft="18dp"
android:layout_marginTop="3dp" />

</LinearLayout>
android:layout_marginTop="3dp"
android:scrollbars="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2 changes: 1 addition & 1 deletion app/src/main/res/layout/row_notifications.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@
android:layout_gravity="center_vertical"
android:layout_margin="@dimen/_4dp"
android:padding="@dimen/padding_normal"
android:text="mark as read"
android:text="@string/mark_as_read"
android:textAllCaps="false" />
</LinearLayout>
12 changes: 5 additions & 7 deletions app/src/main/res/layout/row_reference.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="8dp"
app:cardUseCompatPadding="true">
app:cardUseCompatPadding="true"
app:cardBackgroundColor="@color/card_bg">

<LinearLayout
android:id="@+id/ll_references"
Expand All @@ -20,8 +21,7 @@
android:layout_height="@dimen/_60dp"
android:layout_gravity="center"
app:srcCompat="@drawable/ic_references"
app:tint="@color/md_black_1000" />

app:tint="@color/daynight_textColor" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
Expand All @@ -31,9 +31,7 @@
android:gravity="center"
android:padding="@dimen/eight_dp"
android:text="@string/references"
android:textColor="@color/md_black_1000"
android:textColor="@color/daynight_textColor"
android:textStyle="bold" />

</LinearLayout>

</androidx.cardview.widget.CardView>
</androidx.cardview.widget.CardView>
2 changes: 1 addition & 1 deletion app/src/main/res/layout/row_team_resource.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
android:layout_gravity="right"
android:padding="4dp"
android:src="@drawable/close_x"
app:tint="@color/md_black_1000" />
app:tint="@color/daynight_textColor" />
</LinearLayout>

<TextView
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-ar/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1179,5 +1179,7 @@
<string name="chart_description">مخطط نشاط تسجيل الدخول</string>
<string name="chart_label">عدد مرات تسجيل الدخول</string>
<string name="copied_to_clipboard">تم نسخه إلى الحافظة</string>
<string name="mark_all_as_read">وضع علامة "مقروء" على الجميع</string>
<string name="mark_as_read">وضع علامة كمقروء</string>

</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1179,5 +1179,7 @@
<string name="chart_description">Gráfico de Actividad de Inicio de Sesión</string>
<string name="chart_label">N.º de inicios de sesión</string>
<string name="copied_to_clipboard">copiado al portapapeles</string>
<string name="mark_all_as_read">Marcar todo como leído</string>
<string name="mark_as_read">Marcar como leído</string>

</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1179,5 +1179,7 @@
<string name="chart_description">Graphique d\'Activité de Connexion</string>
<string name="chart_label">Nbre de connexions</string>
<string name="copied_to_clipboard">copié dans le presse-papiers</string>
<string name="mark_all_as_read">Marquer tout comme lu</string>
<string name="mark_as_read">Marquer comme lu</string>

</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ne/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1179,5 +1179,7 @@
<string name="chart_description">लगइन गतिविधि चार्ट</string>
<string name="chart_label">लगइनहरूको संख्या</string>
<string name="copied_to_clipboard">क्लिपबोर्डमा प्रति लिइयो</string>
<string name="mark_all_as_read">सबैलाई पढिएको रूपमा चिन्ह लगाउनुहोस्</string>
<string name="mark_as_read">पढिएको रूपमा चिन्ह लगाउनुहोस्</string>

</resources>
Loading

0 comments on commit 9796229

Please sign in to comment.