diff --git a/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt index f290ee843f..3d72489b10 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt @@ -17,6 +17,7 @@ package com.instructure.student.fragment import android.os.Bundle +import java.text.DateFormat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -147,10 +148,13 @@ class AssignmentBasicFragment : ParentFragment() { // Assignment description can be null var description = when { assignment.isLocked -> getLockedInfoHTML(assignment.lockInfo!!, R.string.lockedAssignmentDesc) - assignment.lockDate?.before(Calendar.getInstance(Locale.getDefault()).time) == true -> + assignment.lockDate?.before(Calendar.getInstance(Locale.getDefault()).time) == true -> { // If an assignment has an available from and until field and it has expired (the current date is after "until" it will have a lock explanation, // but no lock info because it isn't Locked as part of a module - assignment.lockExplanation + val dateString = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(assignment.lockDate!!) + val timeString = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()).format(assignment.lockDate!!) + getString(com.instructure.pandautils.R.string.closedSubtext, dateString, timeString) + } else -> assignment.description } diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModel.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModel.kt index 39f01080cf..4acb8c125b 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModel.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModel.kt @@ -446,7 +446,11 @@ class AssignmentDetailsViewModel @Inject constructor( ) } - val partialLockedMessage = assignment.lockExplanation.takeIf { it.isValid() && assignment.lockDate?.before(Date()).orDefault() }.orEmpty() + val partialLockedMessage = assignment.lockDate?.takeIf { it.before(Date()) }?.let { + val dateString = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(it) + val timeString = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()).format(it) + resources.getString(R.string.closedSubtext, dateString, timeString) + }.orEmpty() val submissionHistory = assignment.submission?.submissionHistory val attempts = submissionHistory?.let { history -> diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/utils/LocaleUtils.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/utils/LocaleUtils.kt index cb0d77e0ab..aadb76afe6 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/utils/LocaleUtils.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/utils/LocaleUtils.kt @@ -30,6 +30,7 @@ import com.instructure.canvasapi2.utils.isValid import java.time.DayOfWeek import java.util.Calendar import java.util.Locale +import java.util.TimeZone import kotlin.system.exitProcess object LocaleUtils { @@ -66,6 +67,9 @@ object LocaleUtils { Locale.Builder().setLanguageTag(localeString).build() } Locale.setDefault(locale) + // Ensure device timezone is used for all date/time formatting + val deviceTimeZone = TimeZone.getDefault() + TimeZone.setDefault(deviceTimeZone) val config = Configuration() config.setLocales(LocaleList(locale)) ContextKeeper.updateLocale(config) diff --git a/libs/pandautils/src/main/res/values/strings.xml b/libs/pandautils/src/main/res/values/strings.xml index 51772cfc49..b542fea50e 100644 --- a/libs/pandautils/src/main/res/values/strings.xml +++ b/libs/pandautils/src/main/res/values/strings.xml @@ -171,6 +171,7 @@ This student doesn\'t have a submission yet. Locked This assignment is locked until %1$s at %2$s. + This assignment was locked on %1$s at %2$s. Choose a File Attach a file to your submission by tapping an option below. Select a file to upload by tapping an option below diff --git a/libs/pandautils/src/test/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModelTest.kt b/libs/pandautils/src/test/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModelTest.kt index 5c8190e143..46a72057b5 100644 --- a/libs/pandautils/src/test/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModelTest.kt +++ b/libs/pandautils/src/test/java/com/instructure/pandautils/features/assignments/details/AssignmentDetailsViewModelTest.kt @@ -77,6 +77,7 @@ import org.junit.Rule import org.junit.Test import java.util.Calendar import java.util.Date +import java.util.Locale @ExperimentalCoroutinesApi class AssignmentDetailsViewModelTest { @@ -188,16 +189,19 @@ class AssignmentDetailsViewModelTest { @Test fun `Load partially locked assignment`() { - val lockedExplanation = "locked" + val lockDate = Calendar.getInstance().apply { add(Calendar.DAY_OF_MONTH, -1) }.time + val dateString = java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG, Locale.getDefault()).format(lockDate) + val timeString = java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT, Locale.getDefault()).format(lockDate) + val expectedLockedMessage = "This assignment was locked on $dateString at $timeString." - every { resources.getString(R.string.errorLoadingAssignment) } returns lockedExplanation + every { resources.getString(R.string.errorLoadingAssignment) } returns "" + every { resources.getString(R.string.closedSubtext, dateString, timeString) } returns expectedLockedMessage val course = Course(enrollments = mutableListOf(Enrollment(type = Enrollment.EnrollmentType.Student))) coEvery { assignmentDetailsRepository.getCourseWithGrade(any(), any()) } returns course val assignment = Assignment( - lockExplanation = lockedExplanation, - lockAt = Calendar.getInstance().apply { add(Calendar.DAY_OF_MONTH, -1) }.time.toApiString() + lockAt = lockDate.toApiString() ) coEvery { assignmentDetailsRepository.getAssignment(any(), any(), any(), any()) } returns assignment @@ -205,7 +209,7 @@ class AssignmentDetailsViewModelTest { assertEquals(ViewState.Success, viewModel.state.value) assertEquals(false, viewModel.data.value?.fullLocked) - assertEquals(lockedExplanation, viewModel.data.value?.lockedMessage) + assertEquals(expectedLockedMessage, viewModel.data.value?.lockedMessage) } @Test