Skip to content

Commit 83ad09c

Browse files
Release Teacher 2.4.0 (88)
2 parents 3330ec5 + 5fb3d65 commit 83ad09c

File tree

7 files changed

+46
-5
lines changed

7 files changed

+46
-5
lines changed

apps/teacher/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ android {
5555
defaultConfig {
5656
minSdkVersion Versions.MIN_SDK
5757
targetSdkVersion Versions.TARGET_SDK
58-
versionCode = 86
59-
versionName = '2.3.1'
58+
versionCode = 88
59+
versionName = '2.4.0'
6060
vectorDrawables.useSupportLibrary = true
6161
testInstrumentationRunner 'com.instructure.teacher.espresso.TeacherHiltTestRunner'
6262
testInstrumentationRunnerArguments disableAnalytics: 'true'

apps/teacher/flank_e2e.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ gcloud:
1313
timeout: 60m
1414
test-targets:
1515
- annotation com.instructure.canvas.espresso.annotations.E2E
16-
- notAnnotation com.instructure.canvas.espresso.annotations.Stub, com.instructure.canvas.espresso.annotations.FlakyE2E, com.instructure.canvas.espresso.annotations.KnownBug
16+
- notAnnotation com.instructure.canvas.espresso.annotations.Stub, com.instructure.canvas.espresso.annotations.FlakyE2E, com.instructure.canvas.espresso.annotations.KnownBug, com.instructure.canvas.espresso.annotations.ReleaseExclude
1717
device:
1818
- model: Pixel2.arm
1919
version: 29
@@ -23,4 +23,3 @@ gcloud:
2323
flank:
2424
testShards: 10
2525
testRuns: 1
26-

apps/teacher/src/androidTest/java/com/instructure/teacher/ui/e2e/compose/AssignmentE2ETest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.instructure.canvas.espresso.SecondaryFeatureCategory
2525
import com.instructure.canvas.espresso.TestCategory
2626
import com.instructure.canvas.espresso.TestMetaData
2727
import com.instructure.canvas.espresso.annotations.E2E
28+
import com.instructure.canvas.espresso.annotations.ReleaseExclude
2829
import com.instructure.canvas.espresso.refresh
2930
import com.instructure.dataseeding.api.AssignmentsApi
3031
import com.instructure.dataseeding.api.SectionsApi
@@ -61,6 +62,7 @@ class AssignmentE2ETest : TeacherComposeTest() {
6162
android.Manifest.permission.CAMERA
6263
)
6364

65+
@ReleaseExclude
6466
@E2E
6567
@Test
6668
@TestMetaData(Priority.MANDATORY, FeatureCategory.ASSIGNMENTS, TestCategory.E2E)
@@ -503,6 +505,7 @@ class AssignmentE2ETest : TeacherComposeTest() {
503505
speedGraderPage.assertCommentDisplayed(commentUploadInfo.fileName, student.name)
504506
}
505507

508+
@ReleaseExclude
506509
@E2E
507510
@Test
508511
@TestMetaData(Priority.COMMON, FeatureCategory.ASSIGNMENTS, TestCategory.E2E, SecondaryFeatureCategory.SECTIONS)

apps/teacher/src/androidTest/java/com/instructure/teacher/ui/e2e/compose/SpeedGraderE2ETest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.instructure.canvas.espresso.Priority
2424
import com.instructure.canvas.espresso.TestCategory
2525
import com.instructure.canvas.espresso.TestMetaData
2626
import com.instructure.canvas.espresso.annotations.E2E
27+
import com.instructure.canvas.espresso.annotations.ReleaseExclude
2728
import com.instructure.canvas.espresso.pressBackButton
2829
import com.instructure.canvas.espresso.refresh
2930
import com.instructure.dataseeding.api.SubmissionsApi
@@ -51,6 +52,7 @@ class SpeedGraderE2ETest : TeacherComposeTest() {
5152

5253
override fun enableAndConfigureAccessibilityChecks() = Unit
5354

55+
@ReleaseExclude
5456
@OptIn(ExperimentalTestApi::class)
5557
@E2E
5658
@Test

apps/teacher/src/main/java/com/instructure/teacher/router/RouteMatcher.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.instructure.canvasapi2.managers.FileFolderManager
3131
import com.instructure.canvasapi2.models.CanvasContext
3232
import com.instructure.canvasapi2.models.Course
3333
import com.instructure.canvasapi2.models.FileFolder
34+
import com.instructure.canvasapi2.models.Group
3435
import com.instructure.canvasapi2.utils.ApiPrefs
3536
import com.instructure.canvasapi2.utils.ApiType
3637
import com.instructure.canvasapi2.utils.LinkHeaders
@@ -329,6 +330,7 @@ object RouteMatcher : BaseRouteMatcher() {
329330

330331
fun route(activity: FragmentActivity, route: Route?) {
331332
val uri = route?.uri
333+
Logger.i("RouteMatcher:route() - uri: $uri, routeContext: ${route?.routeContext}, primaryClass: ${route?.primaryClass}")
332334
if (route == null || route.routeContext === RouteContext.DO_NOT_ROUTE) {
333335
if (route?.uri != null) {
334336
//No route, no problem
@@ -364,6 +366,8 @@ object RouteMatcher : BaseRouteMatcher() {
364366
?.contains("media_attachments") == true
365367
) {
366368
handleStudioImmersiveViewRoute(route, activity)
369+
} else if (route.routeContext === RouteContext.LTI) {
370+
handleLtiRoute(activity, route)
367371
} else if (activity.resources.getBoolean(R.bool.isDeviceTablet)) {
368372
handleTabletRoute(activity, route)
369373
} else {
@@ -477,6 +481,36 @@ object RouteMatcher : BaseRouteMatcher() {
477481
}
478482
}
479483

484+
private fun handleLtiRoute(activity: FragmentActivity, route: Route) {
485+
Logger.i("RouteMatcher:handleLtiRoute()")
486+
val url = route.uri?.toString()
487+
if (url.isNullOrEmpty()) {
488+
return
489+
}
490+
491+
// Don't intercept sessionless_launch URLs - they're already being handled by an existing LtiLaunchFragment
492+
if (url.contains("sessionless_launch")) {
493+
Logger.i("RouteMatcher:handleLtiRoute() - Skipping sessionless_launch URL")
494+
return
495+
}
496+
497+
val contextId = route.paramsHash[RouterParams.COURSE_ID]?.toLongOrNull()
498+
?: route.paramsHash[RouterParams.GROUP_ID]?.toLongOrNull()
499+
500+
val canvasContext: CanvasContext? = when (route.getContextType()) {
501+
CanvasContext.Type.COURSE -> contextId?.let { Course(id = it) }
502+
CanvasContext.Type.GROUP -> contextId?.let { Group(id = it) }
503+
else -> null
504+
}
505+
506+
if (canvasContext != null) {
507+
val ltiRoute = LtiLaunchFragment.makeRoute(canvasContext, url, sessionLessLaunch = true)
508+
route(activity, ltiRoute)
509+
} else {
510+
handleWebViewUrl(activity, url)
511+
}
512+
}
513+
480514
private fun handleWebViewRoute(context: Context, route: Route) {
481515
context.startActivity(InternalWebViewActivity.createIntent(context, route, "", false))
482516
}

libs/interactions/src/main/java/com/instructure/interactions/router/RouterParams.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ object RouterParams {
55
const val EVENT_ID = "event_id"
66
const val CONVERSATION_ID = "conversation_id"
77
const val COURSE_ID = "course_id"
8+
const val GROUP_ID = "group_id"
89
const val FILE_ID = "file_id"
910
const val FOLDER_NAME = "file_name"
1011
const val GRADE_ID = "grade_id"

libs/pandautils/src/main/java/com/instructure/pandautils/features/lti/LtiLaunchFragment.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,9 @@ class LtiLaunchFragment : BaseCanvasFragment(), NavigationCallbacks {
177177
}
178178

179179
private fun canRouteInternally(url: String) =
180-
webViewRouter.canRouteInternally(url) && ltiUrl?.substringBefore("?") != url.substringBefore("?")
180+
webViewRouter.canRouteInternally(url)
181+
&& ltiUrl?.substringBefore("?") != url.substringBefore("?")
182+
&& !url.contains("sessionless_launch")
181183

182184
override fun routeInternallyCallback(url: String) {
183185
// Handle return button in external tools. Links to course homepage should close the tool.

0 commit comments

Comments
 (0)