Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 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
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 @@ -40,6 +40,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.CanvasAppBar
Expand All @@ -57,6 +58,7 @@ fun QrPairingScreen(
CanvasTheme {
Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
topBar = {
CanvasAppBar(
title = stringResource(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.models.Attachment
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.canvasapi2.utils.DateHelper
Expand Down Expand Up @@ -88,6 +89,7 @@ fun AnnouncementDetailsScreen(

Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
topBar = {
CanvasThemedAppBar(
title = uiState.pageTitle.orEmpty(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.models.AlertType
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.canvasapi2.utils.DateHelper
Expand All @@ -84,6 +85,7 @@ fun AlertsScreen(
CanvasTheme {
Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
content = { padding ->
val pullRefreshState = rememberPullRefreshState(
refreshing = uiState.isRefreshing,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.models.AlertType
import com.instructure.canvasapi2.models.ThresholdWorkflowState
import com.instructure.canvasapi2.models.User
Expand Down Expand Up @@ -102,6 +103,7 @@ fun AlertSettingsScreen(
CanvasTheme {
Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
topBar = {
CanvasAppBar(
title = stringResource(id = R.string.alertSettingsTitle),
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 @@ -18,8 +18,12 @@
package com.instructure.parentapp.features.courses.details

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.FloatingActionButton
Expand Down Expand Up @@ -48,6 +52,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
Expand Down Expand Up @@ -198,6 +203,7 @@ private fun CourseDetailsScreenContent(

Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
snackbarHost = {
SnackbarHost(
hostState = snackbarHostState,
Expand Down Expand Up @@ -260,7 +266,8 @@ private fun CourseDetailsScreenContent(
backgroundColor = Color(uiState.studentColor),
onClick = {
actionHandler(CourseDetailsAction.SendAMessage)
}
},
modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal))
) {
Icon(
painter = painterResource(id = R.drawable.ic_chat),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
import com.instructure.pandautils.compose.composables.EmptyContent
Expand All @@ -64,6 +65,7 @@ internal fun CoursesScreen(
CanvasTheme {
Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
content = { padding ->
val pullRefreshState = rememberPullRefreshState(
refreshing = uiState.isLoading,
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.applyHorizontalSystemBarInsets
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.applyHorizontalSystemBarInsets()

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.models.TermsOfService
import com.instructure.pandares.R
import com.instructure.pandautils.compose.CanvasTheme
Expand All @@ -98,6 +99,7 @@ internal fun CreateAccountScreen(

Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
content = { padding ->
Column(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,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 +87,19 @@ class MainActivity : BaseCanvasActivity(), OnUnreadCountInvalidated, Masqueradin
RatingDialog.showRatingDialog(this, AppType.PARENT)
}

private fun setupWindowInsets() {
androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
val systemBars = insets.getInsets(androidx.core.view.WindowInsetsCompat.Type.systemBars())
view.setPadding(
systemBars.left,
0,
systemBars.right,
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,15 @@ 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.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 Down Expand Up @@ -64,6 +68,7 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.WindowInsets
import com.instructure.canvasapi2.utils.ContextKeeper
import com.instructure.pandautils.R
import com.instructure.pandautils.compose.CanvasTheme
Expand All @@ -84,6 +89,7 @@ internal fun ManageStudentsScreen(
CanvasTheme {
Scaffold(
backgroundColor = colorResource(id = R.color.backgroundLightest),
contentWindowInsets = WindowInsets(0, 0, 0, 0),
topBar = {
CanvasThemedAppBar(
title = stringResource(id = R.string.screenTitleManageStudents),
Expand Down Expand Up @@ -125,7 +131,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 @@ -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,7 @@ class SimpleWebViewFragment : BaseCanvasFragment(), NavigationCallbacks {
}

private fun applyTheme() = with(binding) {
toolbar.applyTopSystemBarInsets()
toolbar.title = title.orEmpty()
toolbar.setupAsBackButton(this@SimpleWebViewFragment)
ViewStyler.themeToolbarColored(
Expand Down
2 changes: 2 additions & 0 deletions apps/parent/src/main/res/layout/fragment_dashboard.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
android:layout_height="match_parent">

<LinearLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
Expand All @@ -58,6 +59,7 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/actionBarSize"
app:contentInsetStart="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
Expand Down
3 changes: 2 additions & 1 deletion apps/parent/src/main/res/layout/fragment_simple_webview.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:layout_height="wrap_content"
android:minHeight="?android:attr/actionBarSize"
android:background="@color/textDarkest"
android:elevation="6dp"
app:layout_constraintTop_toTopOf="parent"
Expand Down
1 change: 0 additions & 1 deletion apps/parent/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,5 @@
<item name="android:editTextStyle">@style/NoGifEditText</item>
<item name="editTextStyle">@style/NoGifEditText</item>
<item name="fontFamily">@font/lato_font_family</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
</style>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,31 @@ import com.instructure.interactions.router.Route
import com.instructure.pandautils.analytics.SCREEN_VIEW_ANNOTATION_COMMENT_LIST
import com.instructure.pandautils.analytics.ScreenView
import com.instructure.pandautils.binding.viewBinding
import com.instructure.pandautils.utils.*
import com.instructure.pandautils.utils.BooleanArg
import com.instructure.pandautils.utils.LongArg
import com.instructure.pandautils.utils.ParcelableArg
import com.instructure.pandautils.utils.ParcelableArrayListArg
import com.instructure.pandautils.utils.StringArg
import com.instructure.pandautils.utils.ThemePrefs
import com.instructure.pandautils.utils.ViewStyler
import com.instructure.pandautils.utils.applyImeAndSystemBarInsets
import com.instructure.pandautils.utils.applyTopSystemBarInsets
import com.instructure.pandautils.utils.hideKeyboard
import com.instructure.pandautils.utils.onClickWithRequireNetwork
import com.instructure.pandautils.utils.onTextChanged
import com.instructure.pandautils.utils.setGone
import com.instructure.pandautils.utils.setInvisible
import com.instructure.pandautils.utils.setVisible
import com.instructure.pandautils.utils.setupAsCloseButton
import com.instructure.pandautils.utils.withArgs
import com.instructure.student.R
import com.instructure.student.databinding.FragmentAnnotationCommentListBinding
import com.instructure.student.fragment.ParentFragment
import com.instructure.student.mobius.assignmentDetails.submissionDetails.content.PdfStudentSubmissionView
import kotlinx.coroutines.Job
import okhttp3.ResponseBody
import org.greenrobot.eventbus.EventBus
import java.util.*
import java.util.Locale

@ScreenView(SCREEN_VIEW_ANNOTATION_COMMENT_LIST)
class AnnotationCommentListFragment : ParentFragment() {
Expand All @@ -75,6 +91,7 @@ class AnnotationCommentListFragment : ParentFragment() {
with (binding) {
toolbar.title = title()
toolbar.setupAsCloseButton(this@AnnotationCommentListFragment)
toolbar.applyTopSystemBarInsets()
ViewStyler.themeToolbarLight(requireActivity(), toolbar)
}
}
Expand Down Expand Up @@ -111,6 +128,7 @@ class AnnotationCommentListFragment : ParentFragment() {
configureRecyclerView()
applyTheme()
setupCommentInput()
setupWindowInsets()

if(recyclerAdapter?.size() == 0) {
recyclerAdapter?.addAll(annotations)
Expand Down Expand Up @@ -156,6 +174,12 @@ class AnnotationCommentListFragment : ParentFragment() {
}
}

private fun setupWindowInsets() = with(binding) {
toolbar.applyTopSystemBarInsets()
annotationCommentsRecyclerView.applyImeAndSystemBarInsets()
commentInputContainer.applyImeAndSystemBarInsets()
}

private fun showSendingStatus() = with(binding) {
sendCommentButton.setInvisible()
sendingProgressBar.setVisible()
Expand Down
Loading
Loading