Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
d53fa9d
[MBL-18831] Implement edge-to-edge for Student Dashboard
hermannakos Oct 17, 2025
27e0908
[MBL-18831] Implement edge-to-edge rendering for Student app
hermannakos Oct 17, 2025
97ad8ba
[MBL-18831] Add edge-to-edge support for Compose screens
hermannakos Oct 17, 2025
9408c71
Implement edge-to-edge rendering for Student app
hermannakos Oct 20, 2025
7395524
Implement edge-to-edge rendering for pandautils library fragments
hermannakos Oct 20, 2025
5102cda
Fix edge-to-edge for screens with bottom navigation and update Compos…
hermannakos Oct 20, 2025
c307ab3
Complete edge-to-edge rendering implementation for all apps
hermannakos Oct 27, 2025
952723b
[MBL-18831] Complete edge-to-edge implementation with expert review f…
hermannakos Oct 27, 2025
342c97c
Merge master into MBL-18831-edge-to-edge
hermannakos Oct 27, 2025
7f8be15
Fix horizon dialogs
domonkosadam Oct 28, 2025
8982016
Fix critical edge-to-edge issues from QA feedback
hermannakos Nov 3, 2025
44c6e7e
Apply horizontal system bar insets at container level
hermannakos Nov 3, 2025
67e9e64
Fix Teacher syllabus orientation change crash
hermannakos Nov 3, 2025
a5a0a9d
Fix bottom button and navigation bar spacing for edge-to-edge
hermannakos Nov 3, 2025
43fc00f
Fix FAB and bottom navigation spacing for edge-to-edge
hermannakos Nov 3, 2025
fab0e8b
Fix video playback controls overlap with system navigation bar
hermannakos Nov 3, 2025
9d0cebc
Fix Parent app FAB and webview toolbar overlap with system bars
hermannakos Nov 3, 2025
348b64f
Fix Teacher app HTML file viewer toolbar overlap with status bar
hermannakos Nov 3, 2025
c56b060
Fix Sync Progress screen edge-to-edge display issues
hermannakos Nov 3, 2025
36026e7
Refactor: Fix fully qualified imports in AnnotationCommentListFragment
hermannakos Nov 3, 2025
6e41e6e
Refactor: Extract IME handling into reusable extension function
hermannakos Nov 3, 2025
50b5ba7
Fix FAB positioning by using padding instead of margin for system bar…
hermannakos Nov 3, 2025
a07c229
Add horizontal system bar padding to navigation drawers in landscape …
hermannakos Nov 3, 2025
4d6f63a
Fix inbox FAB positioning with conditional inset handling
hermannakos Nov 4, 2025
221717a
Enable edge-to-edge rendering for full-screen dialogs and fix grade p…
hermannakos Nov 4, 2025
73211ed
fix assignment details
hermannakos Nov 4, 2025
53397ae
Fix landscape mode navigation bar overlap by handling horizontal syst…
hermannakos Nov 4, 2025
2970633
Merge master into MBL-18831-edge-to-edge
hermannakos Nov 4, 2025
f3e28b1
file fragments
hermannakos Nov 4, 2025
e2f4bd9
fix CRs
hermannakos Nov 10, 2025
d7cbcac
Fix keyboard horizontal padding in landscape mode by handling display…
hermannakos Nov 10, 2025
4472a73
Merge master into MBL-18831-edge-to-edge
hermannakos Nov 10, 2025
5555743
fix speedgrader
hermannakos Nov 12, 2025
9fd80b6
fix qr login
hermannakos Nov 12, 2025
5c00563
fix aup
hermannakos Nov 12, 2025
88cc923
login fixes
hermannakos Nov 12, 2025
0494397
fix drawer
hermannakos Nov 12, 2025
6268ee0
fix home fragments
hermannakos Nov 12, 2025
bfa22c8
Fix edge-to-edge insets and window dimming issues
hermannakos Nov 12, 2025
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 @@ -26,7 +26,6 @@ import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.runtime.Composable
Expand All @@ -43,6 +42,7 @@ import androidx.compose.ui.unit.sp
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasAppBar
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.Loading
import com.instructure.parentapp.R
import com.instructure.parentapp.features.addstudent.AddStudentAction
Expand All @@ -55,7 +55,7 @@ fun QrPairingScreen(
onBackClicked: () -> Unit
) {
CanvasTheme {
Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
topBar = {
CanvasAppBar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Divider
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Scaffold
import androidx.compose.material.SnackbarHost
import androidx.compose.material.SnackbarHostState
import androidx.compose.material.SnackbarResult
Expand All @@ -55,6 +54,7 @@ import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.canvasapi2.utils.DateHelper
import com.instructure.pandares.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.CanvasThemedAppBar
import com.instructure.pandautils.compose.composables.ComposeCanvasWebViewWrapper
import com.instructure.pandautils.compose.composables.ErrorContent
Expand Down Expand Up @@ -86,7 +86,7 @@ fun AnnouncementDetailsScreen(
}
}

Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
topBar = {
CanvasThemedAppBar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
Expand Down Expand Up @@ -66,6 +65,7 @@ import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.canvasapi2.utils.DateHelper
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.EmptyContent
import com.instructure.pandautils.compose.composables.ErrorContent
import com.instructure.pandautils.compose.composables.Loading
Expand All @@ -82,7 +82,7 @@ fun AlertsScreen(
lazyListState: LazyListState = LazyListState()
) {
CanvasTheme {
Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
content = { padding ->
val pullRefreshState = rememberPullRefreshState(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import androidx.compose.material.AlertDialog
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.ContentAlpha
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.material.TextField
Expand Down Expand Up @@ -78,6 +77,7 @@ import com.instructure.canvasapi2.models.User
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasAppBar
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.CanvasSwitch
import com.instructure.pandautils.compose.composables.ErrorContent
import com.instructure.pandautils.compose.composables.Loading
Expand All @@ -100,7 +100,7 @@ fun AlertSettingsScreen(
navigationActionClick: () -> Unit
) {
CanvasTheme {
Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
topBar = {
CanvasAppBar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import com.instructure.pandautils.features.assignments.details.AssignmentDetails
import com.instructure.pandautils.features.inbox.utils.InboxComposeOptions
import com.instructure.pandautils.utils.DP
import com.instructure.pandautils.utils.ViewStyler
import com.instructure.pandautils.utils.applyBottomSystemBarMargin
import com.instructure.pandautils.utils.onClick
import com.instructure.pandautils.utils.orDefault
import com.instructure.pandautils.utils.studentColor
Expand Down Expand Up @@ -96,6 +97,7 @@ class ParentAssignmentDetailsBehaviour @Inject constructor(
marginEnd = context.DP(16).toInt()
bottomMargin = context.DP(16).toInt()
}
applyBottomSystemBarMargin()
onClick {
routeToCompose?.invoke(getInboxComposeOptions(context, course, assignment))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.FloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.Scaffold
import androidx.compose.material.SnackbarHost
import androidx.compose.material.SnackbarHostState
import androidx.compose.material.SnackbarResult
Expand All @@ -51,6 +50,7 @@ import androidx.compose.ui.unit.dp
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.CanvasThemedAppBar
import com.instructure.pandautils.compose.composables.ErrorContent
import com.instructure.pandautils.compose.composables.Loading
Expand Down Expand Up @@ -196,7 +196,7 @@ private fun CourseDetailsScreenContent(
}
}

Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
snackbarHost = {
SnackbarHost(
Expand Down Expand Up @@ -260,7 +260,7 @@ private fun CourseDetailsScreenContent(
backgroundColor = Color(uiState.studentColor),
onClick = {
actionHandler(CourseDetailsAction.SendAMessage)
}
},
) {
Icon(
painter = painterResource(id = R.drawable.ic_chat),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
Expand All @@ -49,6 +48,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.EmptyContent
import com.instructure.pandautils.compose.composables.ErrorContent

Expand All @@ -62,7 +62,7 @@ internal fun CoursesScreen(
lazyListState: LazyListState = LazyListState()
) {
CanvasTheme {
Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
content = { padding ->
val pullRefreshState = rememberPullRefreshState(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ import com.instructure.pandautils.utils.ThemePrefs
import com.instructure.pandautils.utils.ViewStyler
import com.instructure.pandautils.utils.animateCircularBackgroundColorChange
import com.instructure.pandautils.utils.announceAccessibilityText
import com.instructure.pandautils.utils.applySystemBarInsets
import com.instructure.pandautils.utils.applyTheme
import com.instructure.pandautils.utils.applyTopSystemBarInsets
import com.instructure.pandautils.utils.collectDistinctUntilChanged
import com.instructure.pandautils.utils.collectOneOffEvents
import com.instructure.pandautils.utils.getDrawableCompat
Expand Down Expand Up @@ -275,6 +277,7 @@ class DashboardFragment : BaseCanvasFragment(), NavigationCallbacks {
}

private fun setupToolbar() {
binding.toolbar.applyTopSystemBarInsets()
binding.navigationButtonHolder.contentDescription = getString(R.string.navigation_drawer_open)
binding.navigationButtonHolder.onClick {
openNavigationDrawer()
Expand All @@ -287,6 +290,7 @@ class DashboardFragment : BaseCanvasFragment(), NavigationCallbacks {

private fun setupNavigationDrawer() {
val navView = binding.navView
navView.applySystemBarInsets()

headerLayoutBinding = NavigationDrawerHeaderLayoutBinding.bind(navView.getHeaderView(0))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Scaffold
import androidx.compose.material.SnackbarHost
import androidx.compose.material.SnackbarHostState
import androidx.compose.material.SnackbarResult
Expand Down Expand Up @@ -77,6 +76,7 @@ import androidx.compose.ui.unit.sp
import com.instructure.canvasapi2.models.TermsOfService
import com.instructure.pandares.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.Loading

@Composable
Expand All @@ -96,7 +96,7 @@ internal fun CreateAccountScreen(
}
}

Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
content = { padding ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
Expand Down Expand Up @@ -78,6 +80,7 @@ class MainActivity : BaseCanvasActivity(), OnUnreadCountInvalidated, Masqueradin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
setupWindowInsets()
setupTheme()
setupNavigation()
handleQrMasquerading()
Expand All @@ -86,6 +89,26 @@ class MainActivity : BaseCanvasActivity(), OnUnreadCountInvalidated, Masqueradin
RatingDialog.showRatingDialog(this, AppType.PARENT)
}

private fun setupWindowInsets() {
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
val navigationBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
val displayCutout = insets.getInsets(WindowInsetsCompat.Type.displayCutout())

// Apply both navigation bar and display cutout insets
// This ensures content is not hidden behind the navigation bar OR the hole punch camera
val leftPadding = maxOf(navigationBars.left, displayCutout.left)
val rightPadding = maxOf(navigationBars.right, displayCutout.right)

view.setPadding(
leftPadding,
0,
rightPadding,
0
)
insets
}
}

override fun onResume() {
super.onResume()
webViewAuthenticator.authenticateWebViews(lifecycleScope, this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,16 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
Expand All @@ -36,7 +41,6 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.FloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh
Expand Down Expand Up @@ -67,6 +71,7 @@ import androidx.compose.ui.unit.sp
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasScaffold
import com.instructure.pandautils.compose.composables.CanvasThemedAppBar
import com.instructure.pandautils.compose.composables.EmptyContent
import com.instructure.pandautils.compose.composables.ErrorContent
Expand All @@ -82,7 +87,7 @@ internal fun ManageStudentsScreen(
modifier: Modifier = Modifier
) {
CanvasTheme {
Scaffold(
CanvasScaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
topBar = {
CanvasThemedAppBar(
Expand Down Expand Up @@ -125,7 +130,9 @@ internal fun ManageStudentsScreen(
},
floatingActionButton = {
FloatingActionButton(
modifier = Modifier.testTag("addStudentButton"),
modifier = Modifier
.testTag("addStudentButton")
.windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal)),
backgroundColor = Color(ThemePrefs.buttonColor),
onClick = {
actionHandler(ManageStudentsAction.AddStudent)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,14 @@ package com.instructure.parentapp.features.webview
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import com.instructure.pandautils.base.BaseCanvasActivity
import com.instructure.pandautils.fragments.HtmlContentFragment
import com.instructure.pandautils.fragments.HtmlContentFragment.Companion.DARK_TOOLBAR
import com.instructure.pandautils.utils.Const
import com.instructure.pandautils.utils.EdgeToEdgeHelper
import com.instructure.parentapp.R
import dagger.hilt.android.AndroidEntryPoint

Expand All @@ -33,8 +37,11 @@ class HtmlContentActivity : BaseCanvasActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EdgeToEdgeHelper.enableEdgeToEdge(this)
setContentView(R.layout.activity_html_content)

setupWindowInsets()

if (savedInstanceState == null) {
val title = intent.getStringExtra(Const.TITLE).orEmpty()
val html = intent.getStringExtra(Const.HTML).orEmpty()
Expand All @@ -50,6 +57,20 @@ class HtmlContentActivity : BaseCanvasActivity() {
}
}

private fun setupWindowInsets() {
val root = findViewById<android.view.View>(R.id.fragmentContainer)
ViewCompat.setOnApplyWindowInsetsListener(root) { view, windowInsets ->
val insets = windowInsets.getInsets(
WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout()
)
view.updatePadding(
left = insets.left,
right = insets.right
)
windowInsets
}
}

companion object {
fun createIntent(context: Context, title: String, html: String, darkToolbar: Boolean): Intent {
return Intent(context, HtmlContentActivity::class.java).apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import com.instructure.pandautils.mvvm.ViewState
import com.instructure.pandautils.utils.Const
import com.instructure.pandautils.utils.NullableStringArg
import com.instructure.pandautils.utils.ViewStyler
import com.instructure.pandautils.utils.applyTopSystemBarInsets
import com.instructure.pandautils.utils.collectOneOffEvents
import com.instructure.pandautils.utils.enableAlgorithmicDarkening
import com.instructure.pandautils.utils.launchCustomTab
Expand Down Expand Up @@ -116,6 +117,8 @@ class SimpleWebViewFragment : BaseCanvasFragment(), NavigationCallbacks {
}

private fun applyTheme() = with(binding) {
webView.setPadding(0, 0, 0, 0)
toolbar.applyTopSystemBarInsets()
toolbar.title = title.orEmpty()
toolbar.setupAsBackButton(this@SimpleWebViewFragment)
ViewStyler.themeToolbarColored(
Expand Down
Loading