Skip to content

Commit 29efbe1

Browse files
Release Parent 4.9.0 (65)
2 parents 19921fc + 012ecde commit 29efbe1

File tree

680 files changed

+42481
-7799
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

680 files changed

+42481
-7799
lines changed

.github/workflows/pr-pipeline.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ on:
44
pull_request:
55
types: [opened, synchronize, labeled]
66
branches-ignore:
7-
- 'release/**'
7+
- 'release/student'
8+
- 'release/teacher'
9+
- 'release/parent'
810

911
concurrency:
1012
group: ${{ github.head_ref || github.run_id }}
@@ -104,10 +106,14 @@ jobs:
104106
mv ./libs/pandautils/build/outputs/apk/androidTest/debug/pandautils-debug-androidTest.apk ./libs/pandautils/pandautils-test.apk
105107
./gradle/gradlew -p apps :pandautils:assembleDebugAndroidTest -DtestApplicationId=com.instructure.pandautils
106108
mv ./libs/pandautils/build/outputs/apk/androidTest/debug/pandautils-debug-androidTest.apk ./libs/pandautils/pandautils-app.apk
109+
env:
110+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
107111

108112
- name: Run submodule unit tests
109113
run: |
110114
./gradle/gradlew -p apps testDebugUnitTest -x :dataseedingapi:test -x :teacher:test -x :student:test
115+
env:
116+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
111117

112118
- name: Upload submodule test results
113119
if: always()
@@ -173,6 +179,8 @@ jobs:
173179
--no-daemon \
174180
-Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \
175181
-Dkotlin.compiler.execution.strategy=in-process
182+
env:
183+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
176184

177185
- name: Upload parent test results
178186
if: always()
@@ -225,6 +233,8 @@ jobs:
225233
--no-daemon \
226234
-Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \
227235
-Dkotlin.compiler.execution.strategy=in-process
236+
env:
237+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
228238

229239
- name: Upload student test results
230240
if: always()
@@ -277,6 +287,8 @@ jobs:
277287
--no-daemon \
278288
-Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \
279289
-Dkotlin.compiler.execution.strategy=in-process
290+
env:
291+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
280292

281293
- name: Upload teacher test results
282294
if: always()
@@ -340,6 +352,8 @@ jobs:
340352
--no-daemon \
341353
-Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \
342354
-Dkotlin.compiler.execution.strategy=in-process
355+
env:
356+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
343357

344358
- name: Upload horizon test results
345359
if: always()
@@ -403,6 +417,8 @@ jobs:
403417
--no-daemon \
404418
-Dorg.gradle.jvmargs="-Xmx6g -XX:+HeapDumpOnOutOfMemoryError" \
405419
-Dkotlin.compiler.execution.strategy=in-process
420+
env:
421+
GRADLE_OPTS: "-Djava.net.preferIPv4Stack=true"
406422

407423
- name: Upload Horizon test APK
408424
uses: actions/upload-artifact@v4

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ mkmf.log
3636
parent/app/src/androidTest/java/com/instructure/parentapp/ui/utils/espresso_secrets/
3737
parent/app/src/androidTest/java/com/instructure/parentapp/ui/data/
3838
dataseedingapi/out/
39-
soseedygrpc/out/
40-
dataseedingapi/src/main/java/com/instructure/soseedy/
4139
local.properties
4240
libs/canvas-api-2/target/pacts/
4341
apps/true/

android-vault

apps/.claude/skills/pr/SKILL.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,17 @@ Provide a user-facing description of changes. This should be:
105105

106106
Complete the following items before marking PR as ready:
107107

108-
- [ ] Dark/light mode testing
109-
- [ ] Landscape/tablet testing
110-
- [ ] Accessibility testing
111-
- [ ] Product approval (if needed)
108+
- [ ] Follow-up e2e test ticket created or not needed
109+
- [ ] Run E2E test suite
110+
- [ ] Tested in dark mode
111+
- [ ] Tested in light mode
112+
- [ ] Test in landscape mode and/or tablet
113+
- [ ] A11y checked
114+
- [ ] Approve from product
112115

113116
## Important Notes
114117

115-
- **DO NOT** include E2E tests or screenshots sections unless specifically needed
118+
- **DO NOT** include this checkbox item "- [ ] Run E2E test suite" or screenshots sections unless specifically needed
116119
- Always include the `affects:` field to specify which apps are impacted
117120
- Reference the related issue(s) with `refs:`
118121
- Complete the checklist before marking the PR as ready for review

apps/buildSrc/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ repositories {
1919
mavenCentral()
2020
}
2121

22-
val agpVersion= "8.6.1"
23-
val kotlinVersion = "2.0.21"
22+
val agpVersion= "8.13.2"
23+
val kotlinVersion = "2.2.21"
2424

2525
dependencies {
2626
implementation("com.android.tools.build:gradle:$agpVersion")

apps/buildSrc/src/main/java/GlobalDependencies.kt

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22

33
object Versions {
44
/* SDK Versions */
5-
const val COMPILE_SDK = 35
5+
const val COMPILE_SDK = 36
66
const val MIN_SDK = 28
77
const val TARGET_SDK = 35
88

99
/* Build/tooling */
10-
const val ANDROID_GRADLE_TOOLS = "8.6.1"
10+
const val ANDROID_GRADLE_TOOLS = "8.13.2"
1111
const val BUILD_TOOLS = "35.0.0"
1212

1313
/* Testing */
1414
const val JUNIT = "4.13.2"
15-
const val ROBOLECTRIC = "4.13"
15+
const val ROBOLECTRIC = "4.16"
1616
const val JACOCO_ANDROID = "0.1.5"
1717

1818
/* Kotlin */
19-
const val KOTLIN = "2.0.21"
20-
const val KOTLIN_COROUTINES = "1.9.0"
21-
const val KSP = "2.0.21-1.0.27"
19+
const val KOTLIN = "2.2.21"
20+
const val KOTLIN_COROUTINES = "1.10.2"
21+
const val KSP = "2.2.21-2.0.4"
2222

2323
/* Google, Play Services */
2424
const val GOOGLE_SERVICES = "4.4.3"
@@ -30,18 +30,18 @@ object Versions {
3030
const val MOBIUS = "1.2.1"
3131
const val HILT = "2.57.2"
3232
const val HILT_ANDROIDX = "1.3.0"
33-
const val LIFECYCLE = "2.9.4"
33+
const val LIFECYCLE = "2.10.0"
3434
const val FRAGMENT = "1.8.9"
35-
const val WORK_MANAGER = "2.10.5"
35+
const val WORK_MANAGER = "2.11.0"
3636
const val GLIDE_VERSION = "5.0.5"
37-
const val RETROFIT = "2.11.0"
37+
const val RETROFIT = "3.0.0"
3838
const val OKHTTP = "4.12.0"
39-
const val ROOM = "2.7.0"
39+
const val ROOM = "2.8.4"
4040
const val HAMCREST = "3.0"
41-
const val NAVIGATION = "2.9.5"
41+
const val NAVIGATION = "2.9.6"
4242
const val MEDIA3 = "1.8.0"
43-
const val DATASTORE = "1.1.7"
44-
const val LOTTIE = "6.6.6"
43+
const val DATASTORE = "1.2.0"
44+
const val LOTTIE = "6.7.0"
4545
const val ENCRYPTED_SHARED_PREFERENCES = "1.1.0"
4646
const val JAVA_JWT = "4.5.0"
4747
const val GLANCE = "1.1.1"
@@ -61,31 +61,30 @@ object Libs {
6161
const val APOLLO_HTTP_CACHE = "com.apollographql.apollo:apollo-http-cache:${Versions.APOLLO}"
6262

6363
/* Androidx libraries */
64-
const val ANDROIDX_ANNOTATION = "androidx.annotation:annotation:1.9.0"
65-
const val ANDROIDX_APPCOMPAT = "androidx.appcompat:appcompat:1.7.0"
66-
const val ANDROIDX_BROWSER = "androidx.browser:browser:1.8.0"
64+
const val ANDROIDX_ANNOTATION = "androidx.annotation:annotation:1.9.1"
65+
const val ANDROIDX_APPCOMPAT = "androidx.appcompat:appcompat:1.7.1"
66+
const val ANDROIDX_BROWSER = "androidx.browser:browser:1.9.0"
6767
const val ANDROIDX_CARDVIEW = "androidx.cardview:cardview:1.0.0"
68-
const val ANDROIDX_CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:2.2.0"
69-
const val ANDROIDX_EXIF = "androidx.exifinterface:exifinterface:1.3.7"
68+
const val ANDROIDX_CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:2.2.1"
69+
const val ANDROIDX_EXIF = "androidx.exifinterface:exifinterface:1.4.2"
7070
const val ANDROIDX_FRAGMENT = "androidx.fragment:fragment:${Versions.FRAGMENT}"
7171
const val ANDROIDX_FRAGMENT_KTX = "androidx.fragment:fragment-ktx:${Versions.FRAGMENT}"
7272
const val ANDROIDX_PALETTE = "androidx.palette:palette:1.0.0"
7373
const val ANDROIDX_PERCENT = "androidx.percentlayout:percentlayout:1.0.0"
7474
const val ANDROIDX_RECYCLERVIEW = "androidx.recyclerview:recyclerview:1.4.0"
7575
const val ANDROIDX_VECTOR = "androidx.vectordrawable:vectordrawable:1.2.0"
76-
const val ANDROIDX_SWIPE_REFRESH_LAYOUT = "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
76+
const val ANDROIDX_SWIPE_REFRESH_LAYOUT = "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0"
7777
const val ANDROIDX_CORE_TESTING = "androidx.arch.core:core-testing:2.2.0"
7878
const val ANDROIDX_WORK_MANAGER = "androidx.work:work-runtime:${Versions.WORK_MANAGER}"
7979
const val ANDROIDX_WORK_MANAGER_KTX = "androidx.work:work-runtime-ktx:${Versions.WORK_MANAGER}"
8080
const val ANDROIDX_WORK_TEST = "androidx.work:work-testing:${Versions.WORK_MANAGER}"
81-
const val ANDROIDX_WEBKIT = "androidx.webkit:webkit:1.12.0"
82-
const val ANDROIDX_COMPOSE_ACTIVITY = "androidx.activity:activity-compose:1.10.0"
81+
const val ANDROIDX_WEBKIT = "androidx.webkit:webkit:1.14.0"
82+
const val ANDROIDX_COMPOSE_ACTIVITY = "androidx.activity:activity-compose:1.12.1"
8383
const val DATASTORE = "androidx.datastore:datastore-preferences:${Versions.DATASTORE}"
8484
const val ENCRYPTED_SHARED_PREFERENCES = "androidx.security:security-crypto:${Versions.ENCRYPTED_SHARED_PREFERENCES}"
85-
const val JAVA_JWT = "com.auth0:java-jwt:${Versions.JAVA_JWT}"
8685

8786
/* Firebase */
88-
const val FIREBASE_BOM = "com.google.firebase:firebase-bom:34.3.0"
87+
const val FIREBASE_BOM = "com.google.firebase:firebase-bom:34.6.0"
8988
const val FIREBASE_CRASHLYTICS = "com.google.firebase:firebase-crashlytics"
9089
const val FIREBASE_MESSAGING = "com.google.firebase:firebase-messaging"
9190
const val FIREBASE_CONFIG = "com.google.firebase:firebase-config"
@@ -105,11 +104,12 @@ object Libs {
105104
/* Testing */
106105
const val JUNIT = "junit:junit:${Versions.JUNIT}"
107106
const val ROBOLECTRIC = "org.robolectric:robolectric:${Versions.ROBOLECTRIC}"
108-
const val ANDROIDX_TEST_JUNIT = "androidx.test.ext:junit:1.2.1"
109-
const val MOCKK = "io.mockk:mockk:1.13.13"
110-
const val THREETEN_BP = "org.threeten:threetenbp:1.7.0"
107+
const val ANDROIDX_TEST_JUNIT = "androidx.test.ext:junit:1.3.0"
108+
const val MOCKK = "io.mockk:mockk:1.14.7"
109+
const val THREETEN_BP = "org.threeten:threetenbp:1.7.2"
111110
const val UI_AUTOMATOR = "androidx.test.uiautomator:uiautomator:2.3.0"
112-
const val TEST_ORCHESTRATOR = "androidx.test:orchestrator:1.5.1"
111+
const val TEST_ORCHESTRATOR = "androidx.test:orchestrator:1.6.1"
112+
const val HAMCREST = "org.hamcrest:hamcrest:${Versions.HAMCREST}"
113113

114114
/* Qr Code (zxing) */
115115
const val JOURNEY_ZXING = "com.journeyapps:zxing-android-embedded:4.3.0"
@@ -130,7 +130,7 @@ object Libs {
130130
const val VIEW_MODE_SAVED_STATE = "androidx.lifecycle:lifecycle-viewmodel-savedstate:${Versions.LIFECYCLE}"
131131
const val LIFECYCLE_COMPILER = "androidx.lifecycle:lifecycle-compiler:${Versions.LIFECYCLE}"
132132
const val COMPOSE_VIEW_MODEL = "androidx.lifecycle:lifecycle-viewmodel-compose:${Versions.LIFECYCLE}"
133-
const val COMPOSE_NAVIGATION = "androidx.navigation:navigation-compose:2.8.9"
133+
134134
/* Media and content handling */
135135
const val NUTRIENT = "io.nutrient:nutrient:${Versions.NUTRIENT}"
136136
const val MEDIA3 = "androidx.media3:media3-exoplayer:${Versions.MEDIA3}"
@@ -156,29 +156,29 @@ object Libs {
156156
const val OKHTTP = "com.squareup.okhttp3:okhttp:${Versions.OKHTTP}"
157157
const val OKHTTP_LOGGING = "com.squareup.okhttp3:logging-interceptor:${Versions.OKHTTP}"
158158
const val OKHTTP_URL_CONNECTION = "com.squareup.okhttp3:okhttp-urlconnection:${Versions.OKHTTP}"
159-
const val OKIO = "com.squareup.okio:okio:3.9.1"
159+
const val OKIO = "com.squareup.okio:okio:3.16.2"
160160

161161
/* Other */
162162
const val LOTTIE = "com.airbnb.android:lottie:${Versions.LOTTIE}"
163163
const val LOTTIE_COMPOSE = "com.airbnb.android:lottie-compose:${Versions.LOTTIE}"
164164
const val SLIDING_UP_PANEL = "com.sothree.slidinguppanel:library:3.3.1"
165165
const val DISK_LRU_CACHE = "com.jakewharton:disklrucache:2.0.2"
166166
const val EVENTBUS = "org.greenrobot:eventbus:3.3.1"
167-
const val JW_THREETEN_BP = "com.jakewharton.threetenabp:threetenabp:1.4.6"
167+
const val JW_THREETEN_BP = "com.jakewharton.threetenabp:threetenabp:1.4.9"
168168
const val PROCESS_PHOENIX = "com.jakewharton:process-phoenix:2.1.2"
169169
const val KEYBOARD_VISIBILITY_LISTENER = "net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.2.1"
170170
const val APACHE_COMMONS_TEXT = "org.apache.commons:commons-text:1.12.0"
171171
const val CAMERA_VIEW = "com.otaliastudios:cameraview:2.7.2"
172+
const val JAVA_JWT = "com.auth0:java-jwt:${Versions.JAVA_JWT}"
172173

173-
const val PENDO = "sdk.pendo.io:pendoIO:3.7.+"
174+
const val PENDO = "sdk.pendo.io:pendoIO:3.9.+"
174175

176+
/* Database */
175177
const val ROOM = "androidx.room:room-runtime:${Versions.ROOM}"
176178
const val ROOM_COMPILER = "androidx.room:room-compiler:${Versions.ROOM}"
177179
const val ROOM_COROUTINES = "androidx.room:room-ktx:${Versions.ROOM}"
178180
const val ROOM_TEST = "androidx.room:room-testing:${Versions.ROOM}"
179181

180-
const val HAMCREST = "org.hamcrest:hamcrest:${Versions.HAMCREST}"
181-
182182
const val RRULE = "org.scala-saddle:google-rfc-2445:20110304"
183183

184184
// Compose
@@ -207,7 +207,7 @@ object Libs {
207207
const val NAVIGATION_KTX = "androidx.navigation:navigation-ui-ktx:${Versions.NAVIGATION}"
208208
const val NAVIGATION_COMPOSE = "androidx.navigation:navigation-compose:${Versions.NAVIGATION}"
209209

210-
const val KOTLIN_SERIALIZABLE = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0"
210+
const val KOTLIN_SERIALIZABLE = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0"
211211
}
212212

213213
object Plugins {

apps/parent/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ android {
4141
applicationId "com.instructure.parentapp"
4242
minSdkVersion Versions.MIN_SDK
4343
targetSdkVersion Versions.TARGET_SDK
44-
versionCode 64
45-
versionName "4.8.0"
44+
versionCode 65
45+
versionName "4.9.0"
4646

4747
buildConfigField "boolean", "IS_TESTING", "false"
4848
testInstrumentationRunner 'com.instructure.parentapp.ui.espresso.ParentHiltTestRunner'

apps/parent/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, com.instructure.canvas.espresso.annotations.OfflineE2E
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.OfflineE2E, 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/parent/src/androidTest/java/com/instructure/parentapp/ui/e2e/classic/HelpMenuE2ETest.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import androidx.test.espresso.intent.Intents
2121
import com.instructure.canvas.espresso.FeatureCategory
2222
import com.instructure.canvas.espresso.Priority
2323
import com.instructure.canvas.espresso.SecondaryFeatureCategory
24+
import com.instructure.canvas.espresso.StringConstants.HelpMenu
2425
import com.instructure.canvas.espresso.TestCategory
2526
import com.instructure.canvas.espresso.TestMetaData
2627
import com.instructure.canvas.espresso.annotations.E2E
@@ -77,9 +78,9 @@ class HelpMenuE2ETest : ParentComposeTest() {
7778
Intents.init()
7879

7980
try {
80-
helpPage.assertHelpMenuURL("Search the Canvas Guides", "https://community.canvaslms.com/t5/Canvas/ct-p/canvas")
81-
helpPage.assertHelpMenuURL("Submit a Feature Idea", "https://community.canvaslms.com/t5/Idea-Conversations/idb-p/ideas")
82-
helpPage.assertHelpMenuURL("Share Your Love for the App", "https://community.canvaslms.com/t5/Canvas/ct-p/canvas")
81+
helpPage.assertHelpMenuURL(HelpMenu.SEARCH_GUIDES_TITLE, "https://community.instructure.com/en/all-guides")
82+
helpPage.assertHelpMenuURL(HelpMenu.SUBMIT_FEATURE_TITLE, "https://community.canvaslms.com/t5/Idea-Conversations/idb-p/ideas")
83+
helpPage.assertHelpMenuURL(HelpMenu.SHARE_LOVE_TITLE, "market://details?id=com.instructure.parentapp")
8384
}
8485
finally {
8586
Intents.release()

apps/parent/src/androidTest/java/com/instructure/parentapp/ui/e2e/compose/AlertsE2ETest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.instructure.canvas.espresso.Priority
2222
import com.instructure.canvas.espresso.TestCategory
2323
import com.instructure.canvas.espresso.TestMetaData
2424
import com.instructure.canvas.espresso.annotations.E2E
25+
import com.instructure.canvas.espresso.annotations.ReleaseExclude
2526
import com.instructure.canvas.espresso.pressBackButton
2627
import com.instructure.canvasapi2.models.AlertType
2728
import com.instructure.dataseeding.api.AssignmentsApi
@@ -337,6 +338,7 @@ class AlertsE2ETest : ParentComposeTest() {
337338
alertsPage.assertEmptyState()
338339
}
339340

341+
@ReleaseExclude
340342
@E2E
341343
@Test
342344
@TestMetaData(Priority.NICE_TO_HAVE, FeatureCategory.ALERTS, TestCategory.E2E)

0 commit comments

Comments
 (0)