Skip to content

Commit 11268e3

Browse files
authored
[CLX-3742][Horizon] Learn screen scaffold (#3483)
refs: CLX-3742 affects: Student release note: none
1 parent 91ac109 commit 11268e3

File tree

75 files changed

+874
-1810
lines changed

Some content is hidden

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

75 files changed

+874
-1810
lines changed

apps/student/src/main/java/com/instructure/student/activity/InterwebsToApplication.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.instructure.canvasapi2.utils.PendoInitCallbackHandler
3636
import com.instructure.canvasapi2.utils.weave.apiAsync
3737
import com.instructure.canvasapi2.utils.weave.catch
3838
import com.instructure.canvasapi2.utils.weave.tryWeave
39+
import com.instructure.horizon.HorizonActivity
3940
import com.instructure.loginapi.login.tasks.LogoutTask
4041
import com.instructure.loginapi.login.util.QRLogin.performSSOLogin
4142
import com.instructure.loginapi.login.util.QRLogin.verifySSOLoginUri
@@ -46,6 +47,7 @@ import com.instructure.pandautils.typeface.TypefaceBehavior
4647
import com.instructure.pandautils.utils.Const
4748
import com.instructure.pandautils.utils.FeatureFlagProvider
4849
import com.instructure.pandautils.utils.Utils.generateUserAgent
50+
import com.instructure.pandautils.utils.orDefault
4951
import com.instructure.student.R
5052
import com.instructure.student.databinding.InterwebsToApplicationBinding
5153
import com.instructure.student.databinding.LoadingCanvasViewBinding
@@ -209,9 +211,15 @@ class InterwebsToApplication : BaseCanvasActivity() {
209211
finish()
210212
return@tryWeave
211213
} else {
212-
// Allow the UI to show
213214
delay(700)
214-
RouteMatcher.routeUrl(this@InterwebsToApplication, url, domain)
215+
if (ApiPrefs.canvasCareerView.orDefault()) {
216+
val intent = Intent(this@InterwebsToApplication, HorizonActivity::class.java)
217+
intent.data = Uri.parse(url)
218+
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
219+
startActivity(intent)
220+
} else {
221+
RouteMatcher.routeUrl(this@InterwebsToApplication, url, domain)
222+
}
215223
finish()
216224
}
217225

libs/horizon/src/androidTest/java/com/instructure/horizon/ui/features/dashboard/course/HorizonDashboardCourseSectionUiTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,8 @@ class HorizonDashboardCourseSectionUiTest {
9999
)
100100
)
101101
composeTestRule.setContent {
102-
val mainNavController = rememberNavController()
103-
val homeNavController = rememberNavController()
104-
DashboardCourseSection(state, mainNavController,homeNavController)
102+
val navController = rememberNavController()
103+
DashboardCourseSection(state, navController)
105104
}
106105

107106
composeTestRule.onNodeWithText("Program 1").assertExists()

libs/horizon/src/androidTest/java/com/instructure/horizon/ui/features/dashboard/widget/announcement/DashboardAnnouncementBannerWidgetUiTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
5555
)
5656

5757
composeTestRule.setContent {
58-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
58+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
5959
}
6060

6161
composeTestRule.waitForIdle()
@@ -73,7 +73,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
7373
)
7474

7575
composeTestRule.setContent {
76-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
76+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
7777
}
7878

7979
val errorMessage = context.getString(R.string.dashboardAnnouncementBannerErrorMessage)
@@ -109,7 +109,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
109109
)
110110

111111
composeTestRule.setContent {
112-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
112+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
113113
}
114114

115115
val announcementLabel = context.getString(R.string.notificationsAnnouncementCategoryLabel)
@@ -154,7 +154,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
154154
)
155155

156156
composeTestRule.setContent {
157-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
157+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
158158
}
159159

160160
composeTestRule.onNodeWithText("First Announcement").assertIsDisplayed()
@@ -184,7 +184,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
184184
)
185185

186186
composeTestRule.setContent {
187-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
187+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
188188
}
189189

190190
val announcementLabel = context.getString(R.string.notificationsAnnouncementCategoryLabel)
@@ -214,7 +214,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
214214
)
215215

216216
composeTestRule.setContent {
217-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
217+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
218218
}
219219

220220

@@ -245,7 +245,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
245245
)
246246

247247
composeTestRule.setContent {
248-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
248+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
249249
}
250250

251251
composeTestRule.onNodeWithText("Jan 01, 2024").assertIsDisplayed()
@@ -272,7 +272,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
272272
)
273273

274274
composeTestRule.setContent {
275-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
275+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
276276
}
277277

278278
composeTestRule.onNodeWithText("No Date Announcement").assertIsDisplayed()
@@ -300,7 +300,7 @@ class DashboardAnnouncementBannerWidgetUiTest {
300300
)
301301

302302
composeTestRule.setContent {
303-
DashboardAnnouncementBannerSection(uiState, rememberNavController(), rememberNavController())
303+
DashboardAnnouncementBannerSection(uiState, rememberNavController())
304304
}
305305

306306
composeTestRule.onNodeWithText(longTitle).assertIsDisplayed()

libs/horizon/src/main/java/com/instructure/horizon/HorizonActivity.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,17 @@ class HorizonActivity : BaseCanvasActivity() {
100100
hasUnreadPushNotification(intent.extras)
101101
) {
102102
handlePushNotification(hasUnreadPushNotification(intent.extras))
103+
} else {
104+
intent.data?.let { uri ->
105+
val request = NavDeepLinkRequest.Builder
106+
.fromUri(uri)
107+
.build()
108+
109+
navController.navigate(
110+
request,
111+
navOptions = NavOptions.Builder().setLaunchSingleTop(true).build()
112+
)
113+
}
103114
}
104115
}
105116

libs/horizon/src/main/java/com/instructure/horizon/features/account/AccountScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import androidx.compose.ui.platform.LocalContext
4141
import androidx.compose.ui.res.painterResource
4242
import androidx.compose.ui.unit.dp
4343
import androidx.navigation.NavController
44+
import androidx.navigation.NavHostController
4445
import com.instructure.horizon.horizonui.foundation.HorizonColors
4546
import com.instructure.horizon.horizonui.foundation.HorizonCornerRadius
4647
import com.instructure.horizon.horizonui.foundation.HorizonSpace
@@ -55,7 +56,7 @@ import com.instructure.pandautils.utils.getActivityOrNull
5556
@Composable
5657
fun AccountScreen(
5758
state: AccountUiState,
58-
navController: NavController,
59+
navController: NavHostController,
5960
) {
6061

6162
val renameFlow = remember { navController.currentBackStackEntry?.savedStateHandle?.getStateFlow<String?>(AccountViewModel.CHANGE_USER_NAME, null) }

libs/horizon/src/main/java/com/instructure/horizon/features/account/advanced/AccountAdvancedScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import androidx.compose.ui.Alignment
3131
import androidx.compose.ui.Modifier
3232
import androidx.compose.ui.res.stringResource
3333
import androidx.compose.ui.unit.dp
34-
import androidx.navigation.NavController
34+
import androidx.navigation.NavHostController
3535
import com.instructure.horizon.R
3636
import com.instructure.horizon.horizonui.molecules.Button
3737
import com.instructure.horizon.horizonui.molecules.ButtonWidth
@@ -45,7 +45,7 @@ import com.instructure.horizon.horizonui.platform.LoadingStateWrapper
4545
@Composable
4646
fun AccountAdvancedScreen(
4747
state: AccountAdvancedUiState,
48-
navController: NavController
48+
navController: NavHostController
4949
) {
5050
HorizonScaffold(
5151
title = stringResource(R.string.accountAdvancedTitle),

libs/horizon/src/main/java/com/instructure/horizon/features/account/calendarfeed/AccountCalendarFeedScreen.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,22 @@ import androidx.compose.ui.res.stringResource
3535
import androidx.compose.ui.text.AnnotatedString
3636
import androidx.compose.ui.unit.dp
3737
import androidx.core.content.ContextCompat.startActivity
38-
import androidx.navigation.NavController
38+
import androidx.navigation.NavHostController
3939
import com.instructure.horizon.R
4040
import com.instructure.horizon.horizonui.molecules.Button
4141
import com.instructure.horizon.horizonui.molecules.ButtonIconPosition
4242
import com.instructure.horizon.horizonui.molecules.ButtonWidth
4343
import com.instructure.horizon.horizonui.organisms.inputs.singleselectimage.SingleSelectImage
4444
import com.instructure.horizon.horizonui.organisms.inputs.singleselectimage.SingleSelectImageInputSize
4545
import com.instructure.horizon.horizonui.organisms.inputs.singleselectimage.SingleSelectImageState
46-
import com.instructure.horizon.horizonui.platform.LoadingStateWrapper
4746
import com.instructure.horizon.horizonui.organisms.scaffolds.HorizonScaffold
47+
import com.instructure.horizon.horizonui.platform.LoadingStateWrapper
4848

4949
@OptIn(ExperimentalMaterial3Api::class)
5050
@Composable
5151
fun AccountCalendarFeedScreen(
5252
state: AccountCalendarUiState,
53-
navController: NavController
53+
navController: NavHostController
5454
) {
5555
HorizonScaffold(
5656
title = stringResource(R.string.accountCalendarFeedTitle),

libs/horizon/src/main/java/com/instructure/horizon/features/account/notifications/AccountNotificationsScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import androidx.compose.ui.platform.LocalContext
4040
import androidx.compose.ui.res.stringResource
4141
import androidx.compose.ui.unit.dp
4242
import androidx.core.content.ContextCompat
43-
import androidx.navigation.NavController
43+
import androidx.navigation.NavHostController
4444
import com.instructure.horizon.R
4545
import com.instructure.horizon.horizonui.foundation.HorizonColors
4646
import com.instructure.horizon.horizonui.foundation.HorizonSpace
@@ -57,7 +57,7 @@ import com.instructure.horizon.horizonui.platform.LoadingStateWrapper
5757
@Composable
5858
fun AccountNotificationsScreen(
5959
state: AccountNotificationsUiState,
60-
navController: NavController,
60+
navController: NavHostController,
6161
) {
6262
HorizonScaffold(
6363
title = stringResource(R.string.accountNotificationsTitle),

libs/horizon/src/main/java/com/instructure/horizon/features/account/reportabug/ReportABugWebView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import androidx.compose.ui.platform.LocalContext
3131
import androidx.compose.ui.res.stringResource
3232
import androidx.lifecycle.compose.LocalLifecycleOwner
3333
import androidx.lifecycle.lifecycleScope
34-
import androidx.navigation.NavController
34+
import androidx.navigation.NavHostController
3535
import com.instructure.horizon.R
3636
import com.instructure.horizon.horizonui.organisms.scaffolds.HorizonScaffold
3737
import com.instructure.pandautils.compose.composables.ComposeCanvasWebViewWrapper
@@ -42,7 +42,7 @@ import kotlinx.coroutines.launch
4242

4343
@Composable
4444
fun ReportABugWebView(
45-
navController: NavController,
45+
navController: NavHostController,
4646
) {
4747
HorizonScaffold(
4848
title = stringResource(R.string.accountReportABug),

libs/horizon/src/main/java/com/instructure/horizon/features/dashboard/DashboardRepository.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,33 @@
1616
*/
1717
package com.instructure.horizon.features.dashboard
1818

19+
import com.instructure.canvasapi2.apis.ThemeAPI
1920
import com.instructure.canvasapi2.apis.UnreadCountAPI
21+
import com.instructure.canvasapi2.apis.UserAPI
2022
import com.instructure.canvasapi2.builders.RestParams
23+
import com.instructure.canvasapi2.models.CanvasTheme
2124
import com.instructure.canvasapi2.models.UnreadNotificationCount
25+
import com.instructure.canvasapi2.models.User
26+
import com.instructure.canvasapi2.utils.ApiPrefs
2227
import javax.inject.Inject
2328

2429
class DashboardRepository @Inject constructor(
30+
private val apiPrefs: ApiPrefs,
31+
private val themeApi: ThemeAPI.ThemeInterface,
32+
private val userApi: UserAPI.UsersInterface,
2533
private val unreadCountApi: UnreadCountAPI.UnreadCountsInterface,
2634
) {
2735
suspend fun getUnreadCounts(forceNetwork: Boolean): List<UnreadNotificationCount> {
2836
return unreadCountApi.getNotificationsCount(RestParams(isForceReadFromNetwork = forceNetwork)).dataOrNull.orEmpty()
2937
}
38+
39+
suspend fun getTheme(): CanvasTheme? {
40+
val params = RestParams(isForceReadFromNetwork = false)
41+
return themeApi.getTheme(params).dataOrNull
42+
}
43+
44+
suspend fun getSelf(): User? {
45+
val params = RestParams(isForceReadFromNetwork = true)
46+
return userApi.getSelf(params).dataOrNull
47+
}
3048
}

0 commit comments

Comments
 (0)