Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,17 @@ import android.content.Intent
import android.content.pm.ShortcutManager
import android.content.res.Configuration
import android.os.Bundle
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.core.net.toUri
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDeepLinkRequest
Expand All @@ -46,9 +48,7 @@ import com.instructure.pandautils.utils.ColorKeeper
import com.instructure.pandautils.utils.Const
import com.instructure.pandautils.utils.ThemePrefs
import com.instructure.pandautils.utils.Utils
import com.instructure.pandautils.utils.ViewStyler
import com.instructure.pandautils.utils.WebViewAuthenticator
import com.instructure.pandautils.utils.getActivityOrNull
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

Expand All @@ -67,12 +67,14 @@ class HorizonActivity : BaseCanvasActivity() {
if (ThemePrefs.appTheme != AppTheme.LIGHT.ordinal) {
setLightTheme() // Force the light theme for Horizon experience to avoid any glitches.
}
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.light(Color.Transparent.toArgb(), Color.Transparent.toArgb()),
navigationBarStyle = SystemBarStyle.light(Color.Transparent.toArgb(), Color.Transparent.toArgb())
)

setContent {
navController = rememberNavController()

val activity = LocalContext.current.getActivityOrNull()
if (activity != null) ViewStyler.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.surface_pagePrimary))
HorizonTheme {
HorizonNavigation(navController)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,15 @@ package com.instructure.horizon.features.account
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.add
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
Expand All @@ -48,6 +51,7 @@ import com.instructure.horizon.horizonui.foundation.HorizonTypography
import com.instructure.horizon.horizonui.foundation.SpaceSize
import com.instructure.horizon.horizonui.molecules.HorizonDivider
import com.instructure.horizon.horizonui.platform.LoadingStateWrapper
import com.instructure.horizon.util.HorizonEdgeToEdgeSystemBars
import com.instructure.pandautils.utils.LocaleUtils
import com.instructure.pandautils.utils.getActivityOrNull

Expand Down Expand Up @@ -75,14 +79,18 @@ fun AccountScreen(
}

LoadingStateWrapper(state.screenState) {
AccountContentScreen(state, navController, state.performLogout, state.switchExperience)
HorizonEdgeToEdgeSystemBars(
statusBarColor = HorizonColors.Surface.pagePrimary(),
) {
AccountContentScreen(state, navController, state.performLogout, state.switchExperience)
}
}
}

@Composable
private fun AccountContentScreen(state: AccountUiState, navController: NavController, onLogout: () -> Unit, switchExperience: () -> Unit) {
LazyColumn(
contentPadding = PaddingValues(24.dp)
contentPadding = WindowInsets.safeDrawing.add(WindowInsets(24.dp, 24.dp, 24.dp, 24.dp)).asPaddingValues()
) {
item {
Column {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package com.instructure.horizon.features.aiassistant

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
Expand All @@ -28,6 +29,7 @@ import androidx.navigation.compose.rememberNavController
import com.instructure.horizon.R
import com.instructure.horizon.features.aiassistant.navigation.AiAssistNavigation
import com.instructure.horizon.horizonui.foundation.HorizonColors
import com.instructure.horizon.util.bottomSafeDrawing

@OptIn(ExperimentalMaterial3Api::class)
@Composable
Expand All @@ -37,10 +39,11 @@ fun AiAssistantScreen(
val navController = rememberNavController()
val bottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
ModalBottomSheet(
containerColor = colorResource(R.color.ai_gradient_start),
containerColor = colorResource(R.color.ai_gradient_end),
onDismissRequest = { onDismiss() },
dragHandle = null,
sheetState = bottomSheetState,
contentWindowInsets = { WindowInsets.bottomSafeDrawing }
) {
Box(
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
Expand All @@ -56,8 +58,6 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
Expand Down Expand Up @@ -91,7 +91,10 @@ import com.instructure.horizon.horizonui.molecules.IconButtonColor
import com.instructure.horizon.horizonui.organisms.AnimatedHorizontalPager
import com.instructure.horizon.horizonui.organisms.CollapsableHeaderScreen
import com.instructure.horizon.navigation.MainNavigationRoute
import com.instructure.pandautils.compose.modifiers.conditional
import com.instructure.horizon.util.HorizonEdgeToEdgeSystemBars
import com.instructure.horizon.util.bottomNavigationScreenInsets
import com.instructure.horizon.util.horizontalSafeDrawing
import com.instructure.horizon.util.zeroScreenInsets
import kotlinx.coroutines.flow.MutableStateFlow

@Composable
Expand Down Expand Up @@ -135,79 +138,79 @@ fun DashboardScreen(uiState: DashboardUiState, mainNavController: NavHostControl
}
}

Scaffold(
containerColor = HorizonColors.Surface.pagePrimary(),
snackbarHost = { SnackbarHost(snackbarHostState) }
) { paddingValues ->
val pullToRefreshState = rememberPullToRefreshState()
val isRefreshing = refreshState.any { it }
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = { shouldRefresh = true },
state = pullToRefreshState,
indicator = {
Indicator(
modifier = Modifier
.align(Alignment.TopCenter)
.padding(top = 56.dp),
isRefreshing = isRefreshing,
containerColor = HorizonColors.Surface.pageSecondary(),
color = HorizonColors.Surface.institution(),
state = pullToRefreshState
)
}
){
val scrollState = rememberScrollState()
CollapsableHeaderScreen(
modifier = Modifier.padding(paddingValues),
headerContent = {
Column(
modifier = Modifier.conditional(scrollState.canScrollBackward) {
shadow(
elevation = HorizonElevation.level3,
spotColor = Color.Transparent,
HorizonEdgeToEdgeSystemBars {
Scaffold(
contentWindowInsets = WindowInsets.zeroScreenInsets,
containerColor = HorizonColors.Surface.pagePrimary(),
snackbarHost = { SnackbarHost(snackbarHostState) }
) { paddingValues ->
val pullToRefreshState = rememberPullToRefreshState()
val isRefreshing = refreshState.any { it }
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = { shouldRefresh = true },
state = pullToRefreshState,
indicator = {
Indicator(
modifier = Modifier
.align(Alignment.TopCenter)
.padding(top = 56.dp),
isRefreshing = isRefreshing,
containerColor = HorizonColors.Surface.pageSecondary(),
color = HorizonColors.Surface.institution(),
state = pullToRefreshState
)
}
) {
val scrollState = rememberScrollState()
CollapsableHeaderScreen(
modifier = Modifier.padding(paddingValues),
headerContent = {
Column(
modifier = Modifier
.windowInsetsPadding(WindowInsets.bottomNavigationScreenInsets)
) {
HomeScreenTopBar(
uiState,
mainNavController,
modifier = Modifier
.height(56.dp)
.padding(bottom = 12.dp)
)
}
) {
HomeScreenTopBar(
uiState,
mainNavController,
},
bodyContent = {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.height(56.dp)
.padding(bottom = 12.dp)
)
}
},
bodyContent = {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.verticalScroll(scrollState)
) {
HorizonSpace(SpaceSize.SPACE_12)
DashboardAnnouncementBannerWidget(
mainNavController,
homeNavController,
shouldRefresh,
refreshStateFlow
)
DashboardCourseSection(
mainNavController,
homeNavController,
shouldRefresh,
refreshStateFlow
)
HorizonSpace(SpaceSize.SPACE_16)
NumericWidgetRow(shouldRefresh, refreshStateFlow, homeNavController)
DashboardSkillHighlightsWidget(
homeNavController,
shouldRefresh,
refreshStateFlow
)
HorizonSpace(SpaceSize.SPACE_24)
.windowInsetsPadding(WindowInsets.horizontalSafeDrawing)
.verticalScroll(scrollState)
) {
HorizonSpace(SpaceSize.SPACE_12)
DashboardAnnouncementBannerWidget(
mainNavController,
homeNavController,
shouldRefresh,
refreshStateFlow
)
DashboardCourseSection(
mainNavController,
homeNavController,
shouldRefresh,
refreshStateFlow
)
HorizonSpace(SpaceSize.SPACE_16)
NumericWidgetRow(shouldRefresh, refreshStateFlow, homeNavController)
DashboardSkillHighlightsWidget(
homeNavController,
shouldRefresh,
refreshStateFlow
)
HorizonSpace(SpaceSize.SPACE_24)
}
}
}
)
)
}
}
}
}
Expand All @@ -217,7 +220,8 @@ private fun HomeScreenTopBar(uiState: DashboardUiState, mainNavController: NavCo
) {
Row(
verticalAlignment = Alignment.Bottom,
modifier = modifier.padding(horizontal = 24.dp)
modifier = modifier
.padding(horizontal = 24.dp)
) {
GlideImage(
model = uiState.logoUrl,
Expand Down
Loading