diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/addstudent/qr/QrPairingScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/addstudent/qr/QrPairingScreen.kt index e8029a7796..a2214172a7 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/addstudent/qr/QrPairingScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/addstudent/qr/QrPairingScreen.kt @@ -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 @@ -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 @@ -55,7 +55,7 @@ fun QrPairingScreen( onBackClicked: () -> Unit ) { CanvasTheme { - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), topBar = { CanvasAppBar( diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/details/AnnouncementDetailsScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/details/AnnouncementDetailsScreen.kt index 3df92ae074..c850163513 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/details/AnnouncementDetailsScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/details/AnnouncementDetailsScreen.kt @@ -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 @@ -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 @@ -86,7 +86,7 @@ fun AnnouncementDetailsScreen( } } - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), topBar = { CanvasThemedAppBar( diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/list/AlertsScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/list/AlertsScreen.kt index a6416609ca..e8dfaeadc4 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/list/AlertsScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/list/AlertsScreen.kt @@ -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 @@ -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 @@ -82,7 +82,7 @@ fun AlertsScreen( lazyListState: LazyListState = LazyListState() ) { CanvasTheme { - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), content = { padding -> val pullRefreshState = rememberPullRefreshState( diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/settings/AlertSettingsScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/settings/AlertSettingsScreen.kt index 66af9ed9e6..d2bad1add1 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/settings/AlertSettingsScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/alerts/settings/AlertSettingsScreen.kt @@ -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 @@ -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 @@ -100,7 +100,7 @@ fun AlertSettingsScreen( navigationActionClick: () -> Unit ) { CanvasTheme { - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), topBar = { CanvasAppBar( diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/assignment/details/ParentAssignmentDetailsBehaviour.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/assignment/details/ParentAssignmentDetailsBehaviour.kt index 3372d7d9d8..d9727a78c6 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/assignment/details/ParentAssignmentDetailsBehaviour.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/assignment/details/ParentAssignmentDetailsBehaviour.kt @@ -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 @@ -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)) } diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/courses/details/CourseDetailsScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/courses/details/CourseDetailsScreen.kt index 544bd6a4bf..dc4664badd 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/courses/details/CourseDetailsScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/courses/details/CourseDetailsScreen.kt @@ -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 @@ -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 @@ -196,7 +196,7 @@ private fun CourseDetailsScreenContent( } } - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), snackbarHost = { SnackbarHost( @@ -260,7 +260,7 @@ private fun CourseDetailsScreenContent( backgroundColor = Color(uiState.studentColor), onClick = { actionHandler(CourseDetailsAction.SendAMessage) - } + }, ) { Icon( painter = painterResource(id = R.drawable.ic_chat), diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/courses/list/CoursesScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/courses/list/CoursesScreen.kt index 84c9ef8952..48c1864083 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/courses/list/CoursesScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/courses/list/CoursesScreen.kt @@ -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 @@ -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 @@ -62,7 +62,7 @@ internal fun CoursesScreen( lazyListState: LazyListState = LazyListState() ) { CanvasTheme { - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), content = { padding -> val pullRefreshState = rememberPullRefreshState( diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/dashboard/DashboardFragment.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/dashboard/DashboardFragment.kt index 00b5948c8b..73f40a471b 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/dashboard/DashboardFragment.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/dashboard/DashboardFragment.kt @@ -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 @@ -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() @@ -287,6 +290,7 @@ class DashboardFragment : BaseCanvasFragment(), NavigationCallbacks { private fun setupNavigationDrawer() { val navView = binding.navView + navView.applySystemBarInsets() headerLayoutBinding = NavigationDrawerHeaderLayoutBinding.bind(navView.getHeaderView(0)) diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/login/createaccount/CreateAccountScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/login/createaccount/CreateAccountScreen.kt index 9c61d69476..98aaa97996 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/login/createaccount/CreateAccountScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/login/createaccount/CreateAccountScreen.kt @@ -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 @@ -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 @@ -96,7 +96,7 @@ internal fun CreateAccountScreen( } } - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, content = { padding -> diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/main/MainActivity.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/main/MainActivity.kt index 02550a9980..0fc95e8fd9 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/main/MainActivity.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/main/MainActivity.kt @@ -27,6 +27,8 @@ import android.os.Build import android.os.Bundle import android.util.Log import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment @@ -84,6 +86,7 @@ class MainActivity : BaseCanvasActivity(), OnUnreadCountInvalidated, Masqueradin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) + setupWindowInsets() setupTheme() setupNavigation() handleQrMasquerading() @@ -93,6 +96,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) diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/managestudents/ManageStudentsScreen.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/managestudents/ManageStudentsScreen.kt index 2e43b4627a..9e34b67c97 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/managestudents/ManageStudentsScreen.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/managestudents/ManageStudentsScreen.kt @@ -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 @@ -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 @@ -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 @@ -82,7 +87,7 @@ internal fun ManageStudentsScreen( modifier: Modifier = Modifier ) { CanvasTheme { - Scaffold( + CanvasScaffold( backgroundColor = colorResource(id = R.color.backgroundLightest), topBar = { CanvasThemedAppBar( @@ -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) diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/webview/HtmlContentActivity.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/webview/HtmlContentActivity.kt index 78109c437b..31ea0e0073 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/webview/HtmlContentActivity.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/webview/HtmlContentActivity.kt @@ -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 @@ -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() @@ -50,6 +57,20 @@ class HtmlContentActivity : BaseCanvasActivity() { } } + private fun setupWindowInsets() { + val root = findViewById(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 { diff --git a/apps/parent/src/main/java/com/instructure/parentapp/features/webview/SimpleWebViewFragment.kt b/apps/parent/src/main/java/com/instructure/parentapp/features/webview/SimpleWebViewFragment.kt index fca48d80f2..86539a5f2d 100644 --- a/apps/parent/src/main/java/com/instructure/parentapp/features/webview/SimpleWebViewFragment.kt +++ b/apps/parent/src/main/java/com/instructure/parentapp/features/webview/SimpleWebViewFragment.kt @@ -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 @@ -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( diff --git a/apps/parent/src/main/res/layout/fragment_dashboard.xml b/apps/parent/src/main/res/layout/fragment_dashboard.xml index 340e036fd0..5286ae3761 100644 --- a/apps/parent/src/main/res/layout/fragment_dashboard.xml +++ b/apps/parent/src/main/res/layout/fragment_dashboard.xml @@ -34,6 +34,7 @@ android:layout_height="match_parent"> @@ -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"> diff --git a/apps/parent/src/main/res/layout/fragment_simple_webview.xml b/apps/parent/src/main/res/layout/fragment_simple_webview.xml index 869b13aa97..1a3bceec93 100644 --- a/apps/parent/src/main/res/layout/fragment_simple_webview.xml +++ b/apps/parent/src/main/res/layout/fragment_simple_webview.xml @@ -24,7 +24,8 @@ @style/NoGifEditText @style/NoGifEditText @font/lato_font_family - true \ No newline at end of file diff --git a/apps/student/src/main/java/com/instructure/student/AnnotationComments/AnnotationCommentListFragment.kt b/apps/student/src/main/java/com/instructure/student/AnnotationComments/AnnotationCommentListFragment.kt index e9eaaac3c0..28d9805c24 100644 --- a/apps/student/src/main/java/com/instructure/student/AnnotationComments/AnnotationCommentListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/AnnotationComments/AnnotationCommentListFragment.kt @@ -41,7 +41,23 @@ 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 @@ -49,7 +65,7 @@ import com.instructure.student.mobius.assignmentDetails.submissionDetails.conten 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() { @@ -75,6 +91,7 @@ class AnnotationCommentListFragment : ParentFragment() { with (binding) { toolbar.title = title() toolbar.setupAsCloseButton(this@AnnotationCommentListFragment) + toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarLight(requireActivity(), toolbar) } } @@ -111,6 +128,7 @@ class AnnotationCommentListFragment : ParentFragment() { configureRecyclerView() applyTheme() setupCommentInput() + setupWindowInsets() if(recyclerAdapter?.size() == 0) { recyclerAdapter?.addAll(annotations) @@ -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() diff --git a/apps/student/src/main/java/com/instructure/student/activity/InternalWebViewActivity.kt b/apps/student/src/main/java/com/instructure/student/activity/InternalWebViewActivity.kt index f149a51e60..53dba66ee3 100644 --- a/apps/student/src/main/java/com/instructure/student/activity/InternalWebViewActivity.kt +++ b/apps/student/src/main/java/com/instructure/student/activity/InternalWebViewActivity.kt @@ -24,7 +24,9 @@ import com.instructure.canvasapi2.models.CanvasContext import com.instructure.canvasapi2.models.CanvasContext.Companion.emptyCourseContext import com.instructure.pandautils.activities.BaseActionBarActivity import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.EdgeToEdgeHelper import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.toast import com.instructure.student.R @@ -35,7 +37,9 @@ import com.instructure.student.fragment.InternalWebviewFragment.Companion.newIns class InternalWebViewActivity : BaseActionBarActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + EdgeToEdgeHelper.enableEdgeToEdge(this) toolbar?.let { ViewStyler.themeToolbarLight(this, it) } + toolbar?.applyTopSystemBarInsets() if (savedInstanceState == null) { val bundle = intent.getBundleExtra(Const.EXTRAS) bundle?.getString(Const.ACTION_BAR_TITLE)?.let { toolbar?.title = it } diff --git a/apps/student/src/main/java/com/instructure/student/activity/NavigationActivity.kt b/apps/student/src/main/java/com/instructure/student/activity/NavigationActivity.kt index 176f5122bb..b0a733953e 100644 --- a/apps/student/src/main/java/com/instructure/student/activity/NavigationActivity.kt +++ b/apps/student/src/main/java/com/instructure/student/activity/NavigationActivity.kt @@ -43,6 +43,8 @@ import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.view.GravityCompat import androidx.core.view.MenuItemCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.lifecycleScope @@ -104,6 +106,7 @@ import com.instructure.pandautils.typeface.TypefaceBehavior import com.instructure.pandautils.update.UpdateManager import com.instructure.pandautils.utils.ActivityResult import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.EdgeToEdgeHelper import com.instructure.pandautils.utils.LocaleUtils import com.instructure.pandautils.utils.NetworkStateProvider import com.instructure.pandautils.utils.OnActivityResults @@ -116,6 +119,7 @@ import com.instructure.pandautils.utils.RequestCodes.PICK_IMAGE_GALLERY import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.WebViewAuthenticator +import com.instructure.pandautils.utils.applyHorizontalSystemBarInsets import com.instructure.pandautils.utils.applyTheme import com.instructure.pandautils.utils.hideKeyboard import com.instructure.pandautils.utils.isAccessibilityEnabled @@ -362,12 +366,16 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + EdgeToEdgeHelper.enableEdgeToEdge(this) RouteMatcher.offlineDb = offlineDatabase RouteMatcher.networkStateProvider = networkStateProvider RouteMatcher.enabledTabs = enabledCourseTabs navigationDrawerBinding = NavigationDrawerBinding.bind(binding.root) canvasLoadingBinding = LoadingCanvasViewBinding.bind(binding.root) setContentView(binding.root) + + setupWindowInsets() + val masqueradingUserId: Long = intent.getLongExtra(Const.QR_CODE_MASQUERADE_ID, 0L) if (masqueradingUserId != 0L) { MasqueradeHelper.startMasquerading(masqueradingUserId, ApiPrefs.domain, NavigationActivity::class.java) @@ -439,6 +447,50 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. } } + private fun setupWindowInsets() = with(binding) { + ViewCompat.setOnApplyWindowInsetsListener(fullscreen) { 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 + } + + ViewCompat.setOnApplyWindowInsetsListener(bottomBar) { view, insets -> + val navigationBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + view.setPadding( + view.paddingLeft, + view.paddingTop, + view.paddingRight, + navigationBars.bottom + ) + insets + } + + ViewCompat.setOnApplyWindowInsetsListener(navigationDrawerBinding.navigationDrawer) { view, windowInsets -> + val insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() + ) + view.setPadding( + insets.left, + view.paddingTop, + insets.right, + insets.bottom + ) + windowInsets + } + } + private fun logOfflineEvents(isOnline: Boolean) { lifecycleScope.launch { if (isOnline) { diff --git a/apps/student/src/main/java/com/instructure/student/activity/NothingToSeeHereFragment.kt b/apps/student/src/main/java/com/instructure/student/activity/NothingToSeeHereFragment.kt index 2e52258429..df12d6725d 100644 --- a/apps/student/src/main/java/com/instructure/student/activity/NothingToSeeHereFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/activity/NothingToSeeHereFragment.kt @@ -24,6 +24,7 @@ import com.instructure.pandautils.analytics.SCREEN_VIEW_NOTHING_TO_SEE_HERE import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.student.R import com.instructure.student.databinding.FragmentNothingToSeeHereBinding @@ -46,6 +47,7 @@ class NothingToSeeHereFragment : ParentFragment() { override fun applyTheme() { binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarLight(requireActivity(), binding.toolbar) } diff --git a/apps/student/src/main/java/com/instructure/student/activity/VideoViewActivity.kt b/apps/student/src/main/java/com/instructure/student/activity/VideoViewActivity.kt index bf58280176..a603a81b2e 100644 --- a/apps/student/src/main/java/com/instructure/student/activity/VideoViewActivity.kt +++ b/apps/student/src/main/java/com/instructure/student/activity/VideoViewActivity.kt @@ -52,6 +52,7 @@ import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.RouteUtils import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applySystemBarInsets import com.instructure.student.databinding.ActivityVideoViewBinding import com.instructure.student.util.Const import kotlinx.coroutines.launch @@ -71,6 +72,7 @@ class VideoViewActivity : BaseCanvasActivity() { super.onCreate(savedInstanceState) setContentView(binding.root) binding.playerView.requestFocus() + binding.playerView.applySystemBarInsets(bottom = true) mediaDataSourceFactory = buildDataSourceFactory(true) mainHandler = Handler() val videoTrackSelectionFactory: ExoTrackSelection.Factory = AdaptiveTrackSelection.Factory() diff --git a/apps/student/src/main/java/com/instructure/student/features/coursebrowser/CourseBrowserFragment.kt b/apps/student/src/main/java/com/instructure/student/features/coursebrowser/CourseBrowserFragment.kt index 9d4b8eb090..21f6832dd3 100644 --- a/apps/student/src/main/java/com/instructure/student/features/coursebrowser/CourseBrowserFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/coursebrowser/CourseBrowserFragment.kt @@ -51,8 +51,11 @@ import com.instructure.pandautils.compose.composables.SearchBar import com.instructure.pandautils.features.smartsearch.SmartSearchFragment import com.instructure.pandautils.utils.NetworkStateProvider import com.instructure.pandautils.utils.ParcelableArg +import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.a11yManager +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.isSwitchAccessEnabled import com.instructure.pandautils.utils.makeBundle @@ -173,8 +176,13 @@ class CourseBrowserFragment : BaseCanvasFragment(), FragmentInteractions, noOverlayToolbar.title = canvasContext.name (canvasContext as? Course)?.term?.name?.let { noOverlayToolbar.subtitle = it } noOverlayToolbar.setBackgroundColor(canvasContext.color) + appBarLayout.setBackgroundColor(canvasContext.color) updateToolbarVisibility() + noOverlayToolbar.applyTopSystemBarInsets() + overlayToolbar.applyTopSystemBarInsets() + appBarLayout.applyTopSystemBarInsets() + // Hide image placeholder if color overlay is disabled and there is no valid image val hasImage = (canvasContext as? Course)?.imageUrl?.isValid() == true val hideImagePlaceholder = StudentPrefs.hideCourseColorOverlay && !hasImage @@ -190,6 +198,8 @@ class CourseBrowserFragment : BaseCanvasFragment(), FragmentInteractions, swipeRefreshLayout.setOnRefreshListener { loadTabs(true) } + swipeRefreshLayout.applyBottomSystemBarInsets() + loadTabs() } diff --git a/apps/student/src/main/java/com/instructure/student/features/discussion/details/DiscussionDetailsFragment.kt b/apps/student/src/main/java/com/instructure/student/features/discussion/details/DiscussionDetailsFragment.kt index 5ce5601cb8..7ab5d1788a 100644 --- a/apps/student/src/main/java/com/instructure/student/features/discussion/details/DiscussionDetailsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/discussion/details/DiscussionDetailsFragment.kt @@ -79,6 +79,8 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ProfileUtils import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.getModuleItemId import com.instructure.pandautils.utils.isAccessibilityEnabled import com.instructure.pandautils.utils.isGroup @@ -176,6 +178,7 @@ class DiscussionDetailsFragment : ParentFragment(), Bookmarkable { // Send out bus events to trigger a refresh for discussion list DiscussionUpdatedEvent(discussionTopicHeader, javaClass.simpleName).post() } + binding.discussionsScrollView.applyBottomSystemBarInsets() networkStateProvider.isOnlineLiveData.observe(viewLifecycleOwner) { isOnline -> if (isOnline) { @@ -241,6 +244,7 @@ class DiscussionDetailsFragment : ParentFragment(), Bookmarkable { } */ ViewStyler.themeToolbarColored(requireActivity(), toolbar, canvasContext) + toolbar.applyTopSystemBarInsets() } } diff --git a/apps/student/src/main/java/com/instructure/student/features/discussion/list/DiscussionListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/discussion/list/DiscussionListFragment.kt index 09be1b28f9..c783e397b4 100644 --- a/apps/student/src/main/java/com/instructure/student/features/discussion/list/DiscussionListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/discussion/list/DiscussionListFragment.kt @@ -52,6 +52,8 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.addSearch +import com.instructure.pandautils.utils.applyBottomAndRightSystemBarMargin +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.closeSearch import com.instructure.pandautils.utils.collectOneOffEvents import com.instructure.pandautils.utils.isTablet @@ -183,6 +185,7 @@ open class DiscussionListFragment : ParentFragment(), Bookmarkable { }) createNewDiscussion.apply { + applyBottomAndRightSystemBarMargin() setGone() backgroundTintList = ViewStyler.makeColorStateListForButton() setImageDrawable(ColorUtils.colorIt(ThemePrefs.buttonTextColor, drawable)) @@ -246,6 +249,7 @@ open class DiscussionListFragment : ParentFragment(), Bookmarkable { override fun applyTheme() { with(binding) { setupToolbarMenu(discussionListToolbar) + discussionListToolbar.applyTopSystemBarInsets() discussionListToolbar.title = title() discussionListToolbar.setupAsBackButton(this@DiscussionListFragment) val searchHint = diff --git a/apps/student/src/main/java/com/instructure/student/features/elementary/course/ElementaryCourseFragment.kt b/apps/student/src/main/java/com/instructure/student/features/elementary/course/ElementaryCourseFragment.kt index 9fe3f2409b..486b8e748b 100644 --- a/apps/student/src/main/java/com/instructure/student/features/elementary/course/ElementaryCourseFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/elementary/course/ElementaryCourseFragment.kt @@ -21,7 +21,6 @@ import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.instructure.pandautils.base.BaseCanvasFragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import com.google.android.material.tabs.TabLayout @@ -32,7 +31,17 @@ import com.instructure.canvasapi2.utils.pageview.PageViewUrlParam import com.instructure.interactions.router.Route import com.instructure.pandautils.analytics.SCREEN_VIEW_ELEMENTARY_COURSE import com.instructure.pandautils.analytics.ScreenView -import com.instructure.pandautils.utils.* +import com.instructure.pandautils.base.BaseCanvasFragment +import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.ParcelableArg +import com.instructure.pandautils.utils.StringArg +import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.argsWithContext +import com.instructure.pandautils.utils.isCourse +import com.instructure.pandautils.utils.isTablet +import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.student.databinding.FragmentElementaryCourseBinding import com.instructure.student.features.coursebrowser.CourseBrowserFragment import com.instructure.student.features.grades.GradesListFragment @@ -89,6 +98,7 @@ class ElementaryCourseFragment : BaseCanvasFragment() { data?.let { courseTabPager.offscreenPageLimit = it.tabs.size courseTabPager.adapter = ElementaryCoursePagerAdapter(it.tabs) + courseTabPager.applyBottomSystemBarInsets() val selectedTab = it.tabs.find { it.tabId == tabId } val selectedTabPosition = it.tabs.indexOf(selectedTab) @@ -112,6 +122,7 @@ class ElementaryCourseFragment : BaseCanvasFragment() { private fun applyTheme() = with(binding) { toolbar.title = canvasContext.name toolbar.setupAsBackButton(this@ElementaryCourseFragment) + toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), toolbar, canvasContext) } diff --git a/apps/student/src/main/java/com/instructure/student/features/files/details/FileDetailsFragment.kt b/apps/student/src/main/java/com/instructure/student/features/files/details/FileDetailsFragment.kt index 0483d15691..05fdcc4d5f 100644 --- a/apps/student/src/main/java/com/instructure/student/features/files/details/FileDetailsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/files/details/FileDetailsFragment.kt @@ -50,6 +50,8 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.PermissionUtils import com.instructure.pandautils.utils.StringArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.getModuleItemId import com.instructure.pandautils.utils.makeBundle import com.instructure.pandautils.utils.setGone @@ -117,6 +119,8 @@ class FileDetailsFragment : ParentFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.downloadButton.setVisible(repository.isOnline()) + binding.toolbar.applyTopSystemBarInsets() + binding.buttonContainer.applyBottomSystemBarInsets() } override fun onActivityCreated(savedInstanceState: Bundle?) { diff --git a/apps/student/src/main/java/com/instructure/student/features/files/list/FileListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/files/list/FileListFragment.kt index c6fd5a2a59..2f8730a9c5 100644 --- a/apps/student/src/main/java/com/instructure/student/features/files/list/FileListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/files/list/FileListFragment.kt @@ -71,6 +71,9 @@ import com.instructure.pandautils.utils.PermissionUtils import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.FeatureFlagProvider +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarMargin +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.isCourse import com.instructure.pandautils.utils.isCourseOrGroup import com.instructure.pandautils.utils.isGroup @@ -191,6 +194,7 @@ class FileListFragment : ParentFragment(), Bookmarkable, FileUploadDialogParent binding.toolbar.title = title() binding.toolbar.subtitle = canvasContext.name binding.addFab.setInvisible() + binding.addFab.applyBottomSystemBarMargin() binding.toolbar.setMenu(R.menu.menu_file_list) {} if (canvasContext.type == CanvasContext.Type.USER) applyTheme() @@ -311,6 +315,7 @@ class FileListFragment : ParentFragment(), Bookmarkable, FileUploadDialogParent toolbar ) toolbar.setupAsBackButton(this@FileListFragment) + toolbar.applyTopSystemBarInsets() ViewStyler.themeFAB(addFab) ViewStyler.themeFAB(addFileFab) ViewStyler.themeFAB(addFolderFab) @@ -373,6 +378,7 @@ class FileListFragment : ParentFragment(), Bookmarkable, FileUploadDialogParent } configureRecyclerView(requireView(), requireContext(), recyclerAdapter!!, R.id.swipeRefreshLayout, R.id.emptyView, R.id.listView) + swipeRefreshLayout.applyBottomSystemBarInsets() setupToolbarMenu(toolbar) diff --git a/apps/student/src/main/java/com/instructure/student/features/grades/GradesListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/grades/GradesListFragment.kt index fdf70b7cad..9fcbbd742b 100644 --- a/apps/student/src/main/java/com/instructure/student/features/grades/GradesListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/grades/GradesListFragment.kt @@ -57,6 +57,8 @@ import com.instructure.pandautils.utils.ColorKeeper import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.getContentDescriptionForMinusGradeString import com.instructure.pandautils.utils.makeBundle @@ -172,6 +174,7 @@ class GradesListFragment : ParentFragment(), Bookmarkable { R.id.listView ) } + binding.swipeRefreshLayout.applyBottomSystemBarInsets() } } @@ -187,6 +190,7 @@ class GradesListFragment : ParentFragment(), Bookmarkable { setupToolbarMenu(toolbar) toolbar.title = title() toolbar.setupAsBackButton(this@GradesListFragment) + toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), toolbar, canvasContext) } } diff --git a/apps/student/src/main/java/com/instructure/student/features/modules/list/ModuleListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/modules/list/ModuleListFragment.kt index b25e55b5cf..1352b67a2f 100644 --- a/apps/student/src/main/java/com/instructure/student/features/modules/list/ModuleListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/modules/list/ModuleListFragment.kt @@ -39,6 +39,8 @@ import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.makeBundle import com.instructure.pandautils.utils.setVisible @@ -101,6 +103,7 @@ class ModuleListFragment : ParentFragment(), Bookmarkable { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) recyclerBinding = PandaRecyclerRefreshLayoutBinding.bind(binding.root) + binding.toolbar.applyTopSystemBarInsets() } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -212,6 +215,7 @@ class ModuleListFragment : ParentFragment(), Bookmarkable { recyclerAdapter?.let { configureRecyclerView(requireView(), requireContext(), it, R.id.swipeRefreshLayout, R.id.emptyView, R.id.listView) } + recyclerBinding.swipeRefreshLayout.applyBottomSystemBarInsets() } fun notifyOfItemChanged(`object`: ModuleObject?, item: ModuleItem?) { diff --git a/apps/student/src/main/java/com/instructure/student/features/modules/progression/LockedModuleItemFragment.kt b/apps/student/src/main/java/com/instructure/student/features/modules/progression/LockedModuleItemFragment.kt index 806f82655c..8a9de6c3d7 100644 --- a/apps/student/src/main/java/com/instructure/student/features/modules/progression/LockedModuleItemFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/modules/progression/LockedModuleItemFragment.kt @@ -33,6 +33,7 @@ import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.StringArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.pandautils.views.CanvasWebView import com.instructure.student.R @@ -62,6 +63,7 @@ class LockedModuleItemFragment : ParentFragment() { binding.explanationWebView.loadHtml(lockExplanation, "") binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, course) } //endregion diff --git a/apps/student/src/main/java/com/instructure/student/features/modules/progression/NotAvailableOfflineFragment.kt b/apps/student/src/main/java/com/instructure/student/features/modules/progression/NotAvailableOfflineFragment.kt index 643c08acf7..87aa6e7f36 100644 --- a/apps/student/src/main/java/com/instructure/student/features/modules/progression/NotAvailableOfflineFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/modules/progression/NotAvailableOfflineFragment.kt @@ -57,6 +57,7 @@ class NotAvailableOfflineFragment : ParentFragment() { if (showToolbar) { binding.toolbar.title = moduleItemName binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, course) } else { binding.toolbar.setGone() diff --git a/apps/student/src/main/java/com/instructure/student/features/pages/details/PageDetailsFragment.kt b/apps/student/src/main/java/com/instructure/student/features/pages/details/PageDetailsFragment.kt index edbbc5abd9..2a28293c36 100644 --- a/apps/student/src/main/java/com/instructure/student/features/pages/details/PageDetailsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/pages/details/PageDetailsFragment.kt @@ -50,6 +50,8 @@ import com.instructure.pandautils.utils.FileDownloader import com.instructure.pandautils.utils.NullableStringArg import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.getModuleItemId import com.instructure.pandautils.utils.loadHtmlWithIframes import com.instructure.pandautils.utils.makeBundle @@ -311,6 +313,8 @@ class PageDetailsFragment : InternalWebviewFragment(), Bookmarkable { } override fun applyTheme() { + binding.toolbar.applyTopSystemBarInsets() + binding.canvasWebViewWrapper.applyBottomSystemBarInsets() binding.toolbar.let { setupToolbarMenu(it, R.menu.menu_page_details) it.title = title() diff --git a/apps/student/src/main/java/com/instructure/student/features/pages/list/PageListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/pages/list/PageListFragment.kt index 13938daf88..772a7d3399 100644 --- a/apps/student/src/main/java/com/instructure/student/features/pages/list/PageListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/pages/list/PageListFragment.kt @@ -34,7 +34,17 @@ import com.instructure.interactions.router.RouterParams import com.instructure.pandautils.analytics.SCREEN_VIEW_PAGE_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.Const +import com.instructure.pandautils.utils.ParcelableArg +import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.addSearch +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.closeSearch +import com.instructure.pandautils.utils.isTablet +import com.instructure.pandautils.utils.makeBundle +import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.student.R import com.instructure.student.databinding.FragmentCoursePagesBinding import com.instructure.student.databinding.PandaRecyclerRefreshLayoutBinding @@ -125,6 +135,7 @@ class PageListFragment : ParentFragment(), Bookmarkable { recyclerAdapter?.let { configureRecyclerView(rootView!!, requireContext(), it, R.id.swipeRefreshLayout, R.id.emptyView, R.id.listView) } + recyclerBinding.swipeRefreshLayout.applyBottomSystemBarInsets() } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -171,6 +182,7 @@ class PageListFragment : ParentFragment(), Bookmarkable { setupToolbarMenu(toolbar) toolbar.title = title() toolbar.setupAsBackButton(this@PageListFragment) + toolbar.applyTopSystemBarInsets() toolbar.addSearch(getString(R.string.searchPagesHint)) { query -> if (query.isBlank()) { recyclerBinding.emptyView.emptyViewText(R.string.noItemsToDisplayShort) diff --git a/apps/student/src/main/java/com/instructure/student/features/people/details/PeopleDetailsFragment.kt b/apps/student/src/main/java/com/instructure/student/features/people/details/PeopleDetailsFragment.kt index 758280833e..63b8e67d1d 100644 --- a/apps/student/src/main/java/com/instructure/student/features/people/details/PeopleDetailsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/people/details/PeopleDetailsFragment.kt @@ -58,6 +58,8 @@ import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.isCourse import com.instructure.pandautils.utils.makeBundle import com.instructure.pandautils.utils.setVisible +import com.instructure.pandautils.utils.applyBottomSystemBarMargin +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.toast import com.instructure.pandautils.utils.withArgs import com.instructure.student.R @@ -98,8 +100,11 @@ class PeopleDetailsFragment : ParentFragment(), Bookmarkable { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.userBackground.applyTopSystemBarInsets() + binding.avatar.applyTopSystemBarInsets() binding.compose.backgroundTintList = ColorStateList.valueOf(ThemePrefs.buttonColor) binding.compose.setImageDrawable(ColorKeeper.getColoredDrawable(requireContext(), R.drawable.ic_send, ThemePrefs.buttonTextColor)) + binding.compose.applyBottomSystemBarMargin() binding.compose.setOnClickListener { // Messaging other users is not available in Student view val route = if (ApiPrefs.isStudentView) NothingToSeeHereFragment.makeRoute() else { diff --git a/apps/student/src/main/java/com/instructure/student/features/people/list/PeopleListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/people/list/PeopleListFragment.kt index fa683d01bf..7b7096821d 100644 --- a/apps/student/src/main/java/com/instructure/student/features/people/list/PeopleListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/people/list/PeopleListFragment.kt @@ -32,7 +32,15 @@ import com.instructure.interactions.router.Route import com.instructure.pandautils.analytics.SCREEN_VIEW_PEOPLE_LIST import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.binding.viewBinding -import com.instructure.pandautils.utils.* +import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.ParcelableArg +import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.isCourse +import com.instructure.pandautils.utils.makeBundle +import com.instructure.pandautils.utils.setupAsBackButton +import com.instructure.pandautils.utils.withArgs import com.instructure.student.R import com.instructure.student.databinding.FragmentPeopleListBinding import com.instructure.student.features.people.details.PeopleDetailsFragment @@ -88,12 +96,14 @@ class PeopleListFragment : ParentFragment(), Bookmarkable { R.id.emptyView, R.id.listView ) + view.findViewById(R.id.swipeRefreshLayout)?.applyBottomSystemBarInsets() } override fun applyTheme() { with(binding) { toolbar.title = title() toolbar.setupAsBackButton(this@PeopleListFragment) + toolbar.applyTopSystemBarInsets() setupToolbarMenu(toolbar) ViewStyler.themeToolbarColored(requireActivity(), toolbar, canvasContext) } diff --git a/apps/student/src/main/java/com/instructure/student/features/quiz/list/QuizListFragment.kt b/apps/student/src/main/java/com/instructure/student/features/quiz/list/QuizListFragment.kt index fda4afb086..1b5b937b98 100644 --- a/apps/student/src/main/java/com/instructure/student/features/quiz/list/QuizListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/features/quiz/list/QuizListFragment.kt @@ -41,6 +41,8 @@ import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.addSearch +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.closeSearch import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.makeBundle @@ -99,6 +101,7 @@ class QuizListFragment : ParentFragment(), Bookmarkable { R.id.emptyView, R.id.listView ) + recyclerBinding.swipeRefreshLayout.applyBottomSystemBarInsets() } override fun applyTheme() { @@ -106,6 +109,7 @@ class QuizListFragment : ParentFragment(), Bookmarkable { setupToolbarMenu(toolbar) toolbar.title = title() toolbar.setupAsBackButton(this@QuizListFragment) + toolbar.applyTopSystemBarInsets() toolbar.addSearch(getString(R.string.searchQuizzesHint)) { query -> if (query.isBlank()) { recyclerBinding.emptyView.emptyViewText(R.string.noItemsToDisplayShort) diff --git a/apps/student/src/main/java/com/instructure/student/fragment/AccountPreferencesFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/AccountPreferencesFragment.kt index 2973b7707a..7c4b222166 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/AccountPreferencesFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/AccountPreferencesFragment.kt @@ -34,6 +34,8 @@ import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ColorKeeper import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setVisible import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.student.BuildConfig @@ -80,10 +82,12 @@ class AccountPreferencesFragment : ParentFragment() { override fun applyTheme() = with(binding) { toolbar.title = title() toolbar.setupAsBackButton(this@AccountPreferencesFragment) + toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), toolbar, ThemePrefs.primaryColor, ThemePrefs.primaryTextColor) } private fun setupViews() = with(binding) { + scrollView.applyBottomSystemBarInsets() if (BuildConfig.DEBUG) { // Only show language override picker in debug builds languageContainer.setVisible() diff --git a/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt index 6fcb4b6f85..cd35bb5cec 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/AssignmentBasicFragment.kt @@ -36,6 +36,7 @@ import com.instructure.pandautils.utils.FeatureFlagProvider import com.instructure.pandautils.utils.OnBackStackChangedEvent import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.argsWithContext import com.instructure.pandautils.utils.loadHtmlWithIframes import com.instructure.pandautils.utils.setGone @@ -186,6 +187,7 @@ class AssignmentBasicFragment : ParentFragment() { binding.toolbar.let { it.title = assignment.name ?: "" it.setupAsBackButton(this) + it.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), it, canvasContext) } } diff --git a/apps/student/src/main/java/com/instructure/student/fragment/BookmarksFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/BookmarksFragment.kt index af2dbf27e3..901ab4f897 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/BookmarksFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/BookmarksFragment.kt @@ -41,6 +41,8 @@ import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.hideKeyboard import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.setupAsBackButton @@ -105,6 +107,7 @@ class BookmarksFragment : ParentFragment() { } } + toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), toolbar, ThemePrefs.primaryColor, ThemePrefs.primaryTextColor) } @@ -126,6 +129,7 @@ class BookmarksFragment : ParentFragment() { configureRecyclerView(requireView(), requireContext(), recyclerAdapter!!, R.id.swipeRefreshLayout, R.id.emptyView, R.id.listView, R.string.no_bookmarks) pandaRecyclerBinding.listView.addItemDecoration(DividerDecoration(requireContext())) pandaRecyclerBinding.listView.isSelectionEnabled = false + pandaRecyclerBinding.swipeRefreshLayout.applyBottomSystemBarInsets() } private fun configureRecyclerAdapter() { diff --git a/apps/student/src/main/java/com/instructure/student/fragment/CourseSettingsFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/CourseSettingsFragment.kt index 639c1089e4..88a95d8ca8 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/CourseSettingsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/CourseSettingsFragment.kt @@ -29,7 +29,15 @@ import com.instructure.interactions.router.Route import com.instructure.pandautils.analytics.SCREEN_VIEW_COURSE_SETTINGS import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.binding.viewBinding -import com.instructure.pandautils.utils.* +import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.ParcelableArg +import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.makeBundle +import com.instructure.pandautils.utils.setVisible +import com.instructure.pandautils.utils.setupAsBackButton +import com.instructure.pandautils.utils.withArgs import com.instructure.student.R import com.instructure.student.databinding.FragmentCourseSettingsBinding @@ -50,6 +58,7 @@ class CourseSettingsFragment : ParentFragment() { override fun applyTheme() { binding.toolbar.title = title() binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, course) } @@ -67,6 +76,7 @@ class CourseSettingsFragment : ParentFragment() { startDate.text = DateHelper.dateToDayMonthYearString(requireContext(), course.startDate) endLayout.setVisible(course.endDate != null) endDate.text = DateHelper.dateToDayMonthYearString(requireContext(), course.endDate) + scrollView.applyBottomSystemBarInsets() } companion object { diff --git a/apps/student/src/main/java/com/instructure/student/fragment/EditPageDetailsFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/EditPageDetailsFragment.kt index 024589e5da..059bf77d14 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/EditPageDetailsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/EditPageDetailsFragment.kt @@ -192,6 +192,7 @@ class EditPageDetailsFragment : ParentFragment() { } } toolbar.title = page.title + toolbar.applyTopSystemBarInsets() setupToolbarMenu(toolbar, R.menu.menu_edit_page) ViewStyler.themeToolbarLight(requireActivity(), toolbar) ViewStyler.setToolbarElevationSmall(requireContext(), toolbar) diff --git a/apps/student/src/main/java/com/instructure/student/fragment/FeatureFlagsFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/FeatureFlagsFragment.kt index 367b70e22a..2ec81b3b71 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/FeatureFlagsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/FeatureFlagsFragment.kt @@ -26,6 +26,8 @@ import com.instructure.canvasapi2.utils.FeatureFlagPref import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.student.R import com.instructure.student.databinding.AdapterFeatureFlagBinding @@ -44,10 +46,12 @@ class FeatureFlagsFragment : BaseCanvasFragment() { super.onViewCreated(view, savedInstanceState) setupToolbar() binding.recyclerView.adapter = FeatureFlagAdapter() + binding.recyclerView.applyBottomSystemBarInsets() } private fun setupToolbar() { binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, ThemePrefs.primaryColor, ThemePrefs.primaryTextColor) } } diff --git a/apps/student/src/main/java/com/instructure/student/fragment/InternalWebviewFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/InternalWebviewFragment.kt index e64767651d..041caecac2 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/InternalWebviewFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/InternalWebviewFragment.kt @@ -55,6 +55,8 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.PermissionUtils import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.argsWithContext import com.instructure.pandautils.utils.makeBundle import com.instructure.pandautils.utils.setGone @@ -230,6 +232,8 @@ open class InternalWebviewFragment : ParentFragment() { }) + canvasWebViewWrapper.applyBottomSystemBarInsets() + if (savedInstanceState != null) { canvasWebViewWrapper?.webView?.restoreState(savedInstanceState) } @@ -299,6 +303,7 @@ open class InternalWebviewFragment : ParentFragment() { override fun applyTheme() = with(binding) { toolbar.title = title() toolbar.setupAsBackButton(this@InternalWebviewFragment) + toolbar.applyTopSystemBarInsets() if (canvasContext.type != CanvasContext.Type.COURSE && canvasContext.type != CanvasContext.Type.GROUP) { ViewStyler.themeToolbarColored(requireActivity(), toolbar, ThemePrefs.primaryColor, ThemePrefs.primaryTextColor) } else { diff --git a/apps/student/src/main/java/com/instructure/student/fragment/NotificationListFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/NotificationListFragment.kt index a8d19ad08c..6de0f8d9d4 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/NotificationListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/NotificationListFragment.kt @@ -54,6 +54,8 @@ import com.instructure.pandautils.features.inbox.details.InboxDetailsFragment import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.isCourse import com.instructure.pandautils.utils.isCourseOrGroup import com.instructure.pandautils.utils.isGroup @@ -189,10 +191,12 @@ class NotificationListFragment : ParentFragment(), Bookmarkable, FragmentManager val canvasContext = canvasContext if (canvasContext is Course || canvasContext is Group) { binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, canvasContext) } else { val navigation = navigation navigation?.attachNavigationDrawer(this, binding.toolbar) + binding.toolbar.applyTopSystemBarInsets() // Styling done in attachNavigationDrawer } } diff --git a/apps/student/src/main/java/com/instructure/student/fragment/OldDashboardFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/OldDashboardFragment.kt index 2cd28ac3b2..c1ea011bb6 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/OldDashboardFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/OldDashboardFragment.kt @@ -30,6 +30,7 @@ import android.view.MotionEvent.ACTION_CANCEL import android.view.View import android.view.ViewGroup import androidx.lifecycle.lifecycleScope +import com.instructure.pandautils.utils.applyTopSystemBarInsets import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.GridLayoutManager @@ -159,6 +160,8 @@ class OldDashboardFragment : ParentFragment() { applyTheme() + binding.toolbar.applyTopSystemBarInsets() + networkStateProvider.isOnlineLiveData.observe(this) { online -> recyclerAdapter?.refresh() if (online) recyclerBinding.swipeRefreshLayout.isRefreshing = true diff --git a/apps/student/src/main/java/com/instructure/student/fragment/OldToDoListFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/OldToDoListFragment.kt index c87f39ba29..8b0887bf29 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/OldToDoListFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/OldToDoListFragment.kt @@ -42,6 +42,7 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.accessibilityClassName +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.children import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.makeBundle @@ -154,6 +155,7 @@ class OldToDoListFragment : ParentFragment() { override fun applyTheme() { setupToolbarMenu(binding.toolbar) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, ThemePrefs.primaryColor, ThemePrefs.primaryTextColor) } diff --git a/apps/student/src/main/java/com/instructure/student/fragment/ProfileSettingsFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/ProfileSettingsFragment.kt index 1648b3278b..b1d2369175 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/ProfileSettingsFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/ProfileSettingsFragment.kt @@ -83,10 +83,12 @@ class ProfileSettingsFragment : ParentFragment(), LoaderManager.LoaderCallbacks< applyTheme() setupViews() getUserPermissions() + binding.scrollView.applyBottomSystemBarInsets() } override fun applyTheme() { binding.toolbar.setupAsBackButton(this) + binding.toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarColored(requireActivity(), binding.toolbar, ThemePrefs.primaryColor, ThemePrefs.primaryTextColor) } diff --git a/apps/student/src/main/java/com/instructure/student/fragment/ViewUnsupportedFileFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/ViewUnsupportedFileFragment.kt index abb06c8b44..5d97fa4802 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/ViewUnsupportedFileFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/ViewUnsupportedFileFragment.kt @@ -74,6 +74,7 @@ class ViewUnsupportedFileFragment : BaseCanvasFragment() { fileNameView.text = it.file.displayName } + toolbar.applyTopSystemBarInsets() if(isTablet && mToolbarColor != 0) { ViewStyler.themeToolbarColored(requireActivity(), toolbar, mToolbarColor, requireContext().getColor(R.color.white)) } else { diff --git a/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/drawer/rubric/ui/SubmissionRubricDescriptionFragment.kt b/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/drawer/rubric/ui/SubmissionRubricDescriptionFragment.kt index 0e12c066bd..37991dda3d 100644 --- a/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/drawer/rubric/ui/SubmissionRubricDescriptionFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/drawer/rubric/ui/SubmissionRubricDescriptionFragment.kt @@ -26,7 +26,15 @@ import com.instructure.pandautils.base.BaseCanvasDialogFragment import com.instructure.canvasapi2.utils.ApiPrefs import com.instructure.interactions.router.Route import com.instructure.pandautils.binding.viewBinding -import com.instructure.pandautils.utils.* +import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.StringArg +import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.setGone +import com.instructure.pandautils.utils.setVisible +import com.instructure.pandautils.utils.setupAsBackButton +import com.instructure.pandautils.utils.withArgs import com.instructure.pandautils.views.CanvasWebView import com.instructure.student.R import com.instructure.student.activity.InternalWebViewActivity @@ -53,6 +61,7 @@ class SubmissionRubricDescriptionFragment : BaseCanvasDialogFragment() { with (binding) { toolbar.title = title toolbar.setupAsBackButton(this@SubmissionRubricDescriptionFragment) + toolbar.applyTopSystemBarInsets() ViewStyler.themeToolbarLight(requireActivity(), toolbar) // Show progress bar while loading description @@ -92,6 +101,8 @@ class SubmissionRubricDescriptionFragment : BaseCanvasDialogFragment() { // make the WebView background transparent webView.setBackgroundResource(android.R.color.transparent) + webView.applyBottomSystemBarInsets() + // Load description webView.loadHtml(description, title) } diff --git a/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/ui/SubmissionDetailsView.kt b/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/ui/SubmissionDetailsView.kt index 121f848612..bfdcb237ed 100644 --- a/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/ui/SubmissionDetailsView.kt +++ b/apps/student/src/main/java/com/instructure/student/mobius/assignmentDetails/submissionDetails/ui/SubmissionDetailsView.kt @@ -41,6 +41,8 @@ import com.instructure.pandautils.binding.BindableSpinnerAdapter import com.instructure.pandautils.features.assignmentdetails.AssignmentDetailsAttemptItemViewModel import com.instructure.pandautils.features.assignmentdetails.AssignmentDetailsAttemptViewData import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.asStateList import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.hideKeyboard @@ -109,6 +111,8 @@ class SubmissionDetailsView( } init { + binding.toolbar.applyTopSystemBarInsets() + binding.submissionDetails.applyBottomSystemBarInsets() binding.toolbar.setupAsBackButton { activity.onBackPressed() } binding.retryButton.onClick { consumer?.accept(SubmissionDetailsEvent.RefreshRequested) } binding.drawerViewPager.offscreenPageLimit = 3 diff --git a/apps/student/src/main/java/com/instructure/student/mobius/elementary/ElementaryDashboardFragment.kt b/apps/student/src/main/java/com/instructure/student/mobius/elementary/ElementaryDashboardFragment.kt index a9ae53a5a2..d371f56912 100644 --- a/apps/student/src/main/java/com/instructure/student/mobius/elementary/ElementaryDashboardFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/mobius/elementary/ElementaryDashboardFragment.kt @@ -33,6 +33,8 @@ import com.instructure.pandautils.features.elementary.resources.ResourcesFragmen import com.instructure.pandautils.features.elementary.schedule.pager.SchedulePagerFragment import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.makeBundle import com.instructure.student.R @@ -60,6 +62,7 @@ class ElementaryDashboardFragment : ParentFragment() { override fun applyTheme() { binding.toolbar.title = title() + binding.toolbar.applyTopSystemBarInsets() navigation?.attachNavigationDrawer(this, binding.toolbar) } @@ -81,6 +84,7 @@ class ElementaryDashboardFragment : ParentFragment() { super.onViewCreated(view, savedInstanceState) dashboardPager.adapter = ElementaryDashboardPagerAdapter(fragments, childFragmentManager) + dashboardPager.applyBottomSystemBarInsets() dashboardTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabReselected(tab: TabLayout.Tab?) = Unit diff --git a/apps/student/src/main/java/com/instructure/student/mobius/settings/pairobserver/ui/PairObserverView.kt b/apps/student/src/main/java/com/instructure/student/mobius/settings/pairobserver/ui/PairObserverView.kt index 3595c5e834..a859eade63 100644 --- a/apps/student/src/main/java/com/instructure/student/mobius/settings/pairobserver/ui/PairObserverView.kt +++ b/apps/student/src/main/java/com/instructure/student/mobius/settings/pairobserver/ui/PairObserverView.kt @@ -42,6 +42,7 @@ class PairObserverView(inflater: LayoutInflater, parent: ViewGroup) : init { binding.toolbar.setupAsBackButton { (context as? Activity)?.onBackPressed() } + binding.toolbar.applyTopSystemBarInsets() } override fun applyTheme() { diff --git a/apps/student/src/main/java/com/instructure/student/mobius/syllabus/ui/SyllabusView.kt b/apps/student/src/main/java/com/instructure/student/mobius/syllabus/ui/SyllabusView.kt index ed2214372b..92b0c19c32 100644 --- a/apps/student/src/main/java/com/instructure/student/mobius/syllabus/ui/SyllabusView.kt +++ b/apps/student/src/main/java/com/instructure/student/mobius/syllabus/ui/SyllabusView.kt @@ -19,6 +19,8 @@ package com.instructure.student.mobius.syllabus.ui import android.app.Activity import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.FragmentActivity import com.google.android.material.tabs.TabLayout import com.instructure.canvasapi2.models.CanvasContext @@ -74,12 +76,42 @@ class SyllabusView( binding.toolbar.title = context.getString(com.instructure.pandares.R.string.syllabus) binding.toolbar.subtitle = canvasContext.name + setupWindowInsets() + adapter = SyllabusTabAdapter(activity, canvasContext, getTabTitles()) binding.syllabusPager.adapter = adapter binding.syllabusTabLayout.setupWithViewPager(binding.syllabusPager, true) } + private fun setupWindowInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding.toolbar) { view, insets -> + val statusBars = insets.getInsets(WindowInsetsCompat.Type.statusBars()) + view.setPadding( + view.paddingLeft, + statusBars.top, + view.paddingRight, + view.paddingBottom + ) + insets + } + } + + private fun setupRecyclerViewInsets() { + eventsBinding?.syllabusEventsRecycler?.let { recyclerView -> + ViewCompat.setOnApplyWindowInsetsListener(recyclerView) { view, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding( + view.paddingLeft, + view.paddingTop, + view.paddingRight, + systemBars.bottom + ) + insets + } + } + } + override fun applyTheme() { ViewStyler.themeToolbarColored(context as Activity, binding.toolbar, canvasContext) binding.syllabusTabLayout.setBackgroundColor(canvasContext.color) @@ -97,6 +129,7 @@ class SyllabusView( override fun render(state: SyllabusViewState) { webviewBinding = adapter.webviewBinding eventsBinding = adapter.eventsBinding + setupRecyclerViewInsets() when (state) { SyllabusViewState.Loading -> { binding.swipeRefreshLayout.isRefreshing = true diff --git a/apps/student/src/main/java/com/instructure/student/widget/grades/courseselector/CourseSelectorActivity.kt b/apps/student/src/main/java/com/instructure/student/widget/grades/courseselector/CourseSelectorActivity.kt index ab5eb0fa55..a2072fe0a8 100644 --- a/apps/student/src/main/java/com/instructure/student/widget/grades/courseselector/CourseSelectorActivity.kt +++ b/apps/student/src/main/java/com/instructure/student/widget/grades/courseselector/CourseSelectorActivity.kt @@ -21,6 +21,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.viewModels +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.Scaffold import androidx.compose.runtime.collectAsState @@ -63,6 +64,7 @@ class CourseSelectorActivity : BaseCanvasActivity() { setContent { val uiState by viewModel.uiState.collectAsState() Scaffold( + contentWindowInsets = WindowInsets(0, 0, 0, 0), topBar = { CanvasThemedAppBar( title = stringResource(R.string.selectCourse), diff --git a/apps/student/src/main/res/layout/course_discussion_topic.xml b/apps/student/src/main/res/layout/course_discussion_topic.xml index cc09febe77..821d9032c9 100644 --- a/apps/student/src/main/res/layout/course_discussion_topic.xml +++ b/apps/student/src/main/res/layout/course_discussion_topic.xml @@ -28,7 +28,8 @@ diff --git a/apps/student/src/main/res/layout/fragment_assignment_basic.xml b/apps/student/src/main/res/layout/fragment_assignment_basic.xml index 4ba981c087..28168b9ad8 100644 --- a/apps/student/src/main/res/layout/fragment_assignment_basic.xml +++ b/apps/student/src/main/res/layout/fragment_assignment_basic.xml @@ -26,7 +26,8 @@ @@ -155,6 +156,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent" + android:clipToPadding="false" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> diff --git a/apps/student/src/main/res/layout/fragment_course_grades.xml b/apps/student/src/main/res/layout/fragment_course_grades.xml index 36d85c1c43..76f9cd4027 100644 --- a/apps/student/src/main/res/layout/fragment_course_grades.xml +++ b/apps/student/src/main/res/layout/fragment_course_grades.xml @@ -26,7 +26,8 @@ diff --git a/apps/student/src/main/res/layout/fragment_discussions_details.xml b/apps/student/src/main/res/layout/fragment_discussions_details.xml index 4c86a44f4e..78eade94fd 100644 --- a/apps/student/src/main/res/layout/fragment_discussions_details.xml +++ b/apps/student/src/main/res/layout/fragment_discussions_details.xml @@ -33,6 +33,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" android:elevation="6dp" tools:background="#00bcd5" tools:ignore="UnusedAttribute" /> diff --git a/apps/student/src/main/res/layout/fragment_edit_page.xml b/apps/student/src/main/res/layout/fragment_edit_page.xml index 88a4f2fb50..cc046ac2fe 100644 --- a/apps/student/src/main/res/layout/fragment_edit_page.xml +++ b/apps/student/src/main/res/layout/fragment_edit_page.xml @@ -23,6 +23,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" android:elevation="2dp"> diff --git a/apps/student/src/main/res/layout/fragment_syllabus.xml b/apps/student/src/main/res/layout/fragment_syllabus.xml index e854156095..dcfb8b597a 100644 --- a/apps/student/src/main/res/layout/fragment_syllabus.xml +++ b/apps/student/src/main/res/layout/fragment_syllabus.xml @@ -27,6 +27,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?attr/actionBarSize" android:elevation="6dp" tools:background="#00bcd5" tools:navigationIcon="@drawable/ic_back_arrow" diff --git a/apps/student/src/main/res/layout/fragment_syllabus_events.xml b/apps/student/src/main/res/layout/fragment_syllabus_events.xml index 413be35314..3a9d5f98f1 100644 --- a/apps/student/src/main/res/layout/fragment_syllabus_events.xml +++ b/apps/student/src/main/res/layout/fragment_syllabus_events.xml @@ -24,6 +24,7 @@ android:id="@+id/syllabusEventsRecycler" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" tools:listitem="@layout/viewholder_card_generic" tools:visibility="gone" /> diff --git a/apps/student/src/main/res/layout/fragment_unsupported_file_type.xml b/apps/student/src/main/res/layout/fragment_unsupported_file_type.xml index c42c459331..ee4ec05891 100644 --- a/apps/student/src/main/res/layout/fragment_unsupported_file_type.xml +++ b/apps/student/src/main/res/layout/fragment_unsupported_file_type.xml @@ -24,6 +24,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" android:elevation="2dp" tools:ignore="UnusedAttribute"/> diff --git a/apps/student/src/main/res/layout/fragment_webview.xml b/apps/student/src/main/res/layout/fragment_webview.xml index 0dd387ac12..f09362c697 100644 --- a/apps/student/src/main/res/layout/fragment_webview.xml +++ b/apps/student/src/main/res/layout/fragment_webview.xml @@ -27,7 +27,8 @@ @style/PSPDFAnnotationCreationToolbarIconsStyle @style/PSPDFKitActionBarIconsStyle @style/ContextualToolbarStyle - true \ No newline at end of file diff --git a/apps/student/src/main/res/values/styles.xml b/apps/student/src/main/res/values/styles.xml index 93466a1d23..0bc8f4b601 100644 --- a/apps/student/src/main/res/values/styles.xml +++ b/apps/student/src/main/res/values/styles.xml @@ -25,7 +25,6 @@ true true true - true @@ -52,7 +50,6 @@ @style/PSPDFAnnotationCreationToolbarIconsStyle @style/PSPDFKitActionBarIconsStyle @style/ContextualToolbarStyle - true diff --git a/apps/teacher/src/main/java/com/instructure/teacher/PSPDFKit/AnnotationComments/AnnotationCommentListFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/PSPDFKit/AnnotationComments/AnnotationCommentListFragment.kt index 7521e40495..8ece81d107 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/PSPDFKit/AnnotationComments/AnnotationCommentListFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/PSPDFKit/AnnotationComments/AnnotationCommentListFragment.kt @@ -95,6 +95,13 @@ class AnnotationCommentListFragment : BaseListFragment< setupToolbar() presenter.loadData(false) setupCommentInput() + setupWindowInsets() + } + + private fun setupWindowInsets() = with(binding) { + toolbar.applyTopSystemBarInsets() + annotationCommentsRecyclerView.applyImeAndSystemBarInsets() + commentInputContainer.applyImeAndSystemBarInsets() } fun setupToolbar() { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/activities/FullscreenActivity.kt b/apps/teacher/src/main/java/com/instructure/teacher/activities/FullscreenActivity.kt index 0242a2f38c..cad40559fd 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/activities/FullscreenActivity.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/activities/FullscreenActivity.kt @@ -20,6 +20,8 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Parcelable +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import com.instructure.canvasapi2.managers.CourseManager import com.instructure.canvasapi2.managers.GroupManager @@ -53,6 +55,8 @@ class FullscreenActivity : BaseAppCompatActivity(), FullScreenInteractions { super.onCreate(savedInstanceState) setContentView(binding.root) + setupWindowInsets() + if (savedInstanceState == null) { mRoute = intent.extras!!.getParcelable(Route.ROUTE) mRoute?.let { handleRoute(it) } @@ -63,6 +67,20 @@ class FullscreenActivity : BaseAppCompatActivity(), FullScreenInteractions { } } + private fun setupWindowInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding.container) { view, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding( + systemBars.left, + 0, + systemBars.right, + 0 + ) + // Don't consume the insets - let them propagate to child fragments + insets + } + } + override fun onDestroy() { super.onDestroy() groupApiCall?.cancel() diff --git a/apps/teacher/src/main/java/com/instructure/teacher/activities/InitActivity.kt b/apps/teacher/src/main/java/com/instructure/teacher/activities/InitActivity.kt index 9b706c2d02..e8f6556481 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/activities/InitActivity.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/activities/InitActivity.kt @@ -26,6 +26,7 @@ import android.util.Log import android.view.View import android.view.accessibility.AccessibilityNodeInfo import android.widget.CompoundButton +import android.widget.RelativeLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.IdRes import androidx.annotation.PluralsRes @@ -33,7 +34,10 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.Toolbar import androidx.core.view.GravityCompat import androidx.core.view.MenuItemCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.drawerlayout.widget.DrawerLayout.SimpleDrawerListener import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -86,12 +90,14 @@ import com.instructure.pandautils.utils.AppType import com.instructure.pandautils.utils.CanvasFont import com.instructure.pandautils.utils.ColorKeeper import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.EdgeToEdgeHelper import com.instructure.pandautils.utils.FeatureFlagProvider import com.instructure.pandautils.utils.LocaleUtils import com.instructure.pandautils.utils.ProfileUtils import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.WebViewAuthenticator +import com.instructure.pandautils.utils.applyHorizontalSystemBarInsets import com.instructure.pandautils.utils.applyTheme import com.instructure.pandautils.utils.isAccessibilityEnabled import com.instructure.pandautils.utils.items @@ -213,6 +219,7 @@ class InitActivity : BasePresenterActivity + 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 + } + + ViewCompat.setOnApplyWindowInsetsListener(bottomBar) { view, insets -> + val navigationBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars()) + view.updateLayoutParams { + bottomMargin = navigationBars.bottom + } + insets + } + + navigationDrawerBinding.navigationDrawer.applyHorizontalSystemBarInsets() + } + private fun requestNotificationsPermission() { if (checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { notificationsPermissionContract.launch(Manifest.permission.POST_NOTIFICATIONS) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/activities/InternalWebViewActivity.kt b/apps/teacher/src/main/java/com/instructure/teacher/activities/InternalWebViewActivity.kt index 90d9f14dc7..ba5b2706e8 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/activities/InternalWebViewActivity.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/activities/InternalWebViewActivity.kt @@ -23,6 +23,7 @@ import com.instructure.canvasapi2.models.CanvasContext import com.instructure.interactions.router.Route import com.instructure.pandautils.activities.BasePresenterActivity import com.instructure.pandautils.utils.Const +import com.instructure.pandautils.utils.EdgeToEdgeHelper import com.instructure.teacher.R import com.instructure.teacher.factory.InternalWebViewPresenterFactory import com.instructure.teacher.fragments.InternalWebViewFragment @@ -39,6 +40,7 @@ class InternalWebViewActivity : BasePresenterActivity + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding( + systemBars.left, + 0, + systemBars.right, + 0 + ) + // Don't consume the insets - let them propagate to child fragments + insets + } + } + private fun setupWithCanvasContext(course: Course?) { if(course != null) { //we have a route, get the fragment diff --git a/apps/teacher/src/main/java/com/instructure/teacher/adapters/StudentContextFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/adapters/StudentContextFragment.kt index 0a7ee54dc6..7fa1d8462c 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/adapters/StudentContextFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/adapters/StudentContextFragment.kt @@ -50,6 +50,9 @@ import com.instructure.pandautils.utils.BooleanArg import com.instructure.pandautils.utils.LongArg import com.instructure.pandautils.utils.ProfileUtils import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomAndRightSystemBarPadding +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.asStateList import com.instructure.pandautils.utils.children import com.instructure.pandautils.utils.color @@ -150,6 +153,9 @@ class StudentContextFragment : PresenterFragment + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updatePadding(bottom = systemBars.bottom) + insets + } + if (fileSearchRecyclerView.isAttachedToWindow) { + ViewCompat.requestApplyInsets(fileSearchRecyclerView) + } } override fun createAdapter(): FileSearchAdapter = searchAdapter diff --git a/apps/teacher/src/main/java/com/instructure/teacher/features/modules/list/ui/ModuleListView.kt b/apps/teacher/src/main/java/com/instructure/teacher/features/modules/list/ui/ModuleListView.kt index b764dffaa6..3ed6b5776c 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/features/modules/list/ui/ModuleListView.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/features/modules/list/ui/ModuleListView.kt @@ -30,6 +30,8 @@ import com.instructure.pandarecycler.PaginatedScrollListener import com.instructure.pandautils.features.progress.ProgressDialogFragment import com.instructure.pandautils.room.appdatabase.entities.ModuleBulkProgressEntity import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.showThemed import com.instructure.teacher.R import com.instructure.teacher.databinding.FragmentModuleListBinding @@ -134,6 +136,7 @@ class ModuleListView( init { // Toolbar setup binding.toolbar.apply { + applyTopSystemBarInsets() subtitle = course.name setupBackButton(activity) ViewStyler.themeToolbarColored(activity, this, course) @@ -197,8 +200,11 @@ class ModuleListView( addOnScrollListener(scrollListener) } - binding.swipeRefreshLayout.setOnRefreshListener { - consumer?.accept(ModuleListEvent.PullToRefresh) + binding.swipeRefreshLayout.apply { + setOnRefreshListener { + consumer?.accept(ModuleListEvent.PullToRefresh) + } + applyBottomSystemBarInsets() } } diff --git a/apps/teacher/src/main/java/com/instructure/teacher/features/postpolicies/ui/PostPolicyFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/features/postpolicies/ui/PostPolicyFragment.kt index 506f4eda7a..ae48966260 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/features/postpolicies/ui/PostPolicyFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/features/postpolicies/ui/PostPolicyFragment.kt @@ -21,6 +21,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter @@ -33,6 +36,7 @@ import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.withArgs import com.instructure.teacher.R @@ -56,6 +60,18 @@ class PostPolicyFragment : BaseCanvasFragment() { val titles = listOf(getString(R.string.postGradesTab), getString(R.string.hideGradesTab)) binding.postPolicyPager.adapter = PostPolicyPagerAdapter(assignment, childFragmentManager, titles) binding.postPolicyTabLayout.setupWithViewPager(binding.postPolicyPager, true) + + setupWindowInsets() + } + + private fun setupWindowInsets() = with(binding) { + postPolicyToolbar.applyTopSystemBarInsets() + + ViewCompat.setOnApplyWindowInsetsListener(postPolicyPager) { view, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updatePadding(bottom = systemBars.bottom) + insets + } } override fun onResume() { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/features/speedgrader/commentlibrary/CommentLibraryFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/features/speedgrader/commentlibrary/CommentLibraryFragment.kt index 874964767a..f3fef0de3d 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/features/speedgrader/commentlibrary/CommentLibraryFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/features/speedgrader/commentlibrary/CommentLibraryFragment.kt @@ -27,6 +27,8 @@ import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.LongArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyImeAndSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.teacher.databinding.FragmentCommentLibraryBinding import com.instructure.teacher.utils.setupCloseButton import dagger.hilt.android.AndroidEntryPoint @@ -56,9 +58,17 @@ class CommentLibraryFragment : BaseCanvasFragment() { } } + setupWindowInsets() + return binding.root } + private fun setupWindowInsets() = with(binding) { + commentLibraryToolbar.applyTopSystemBarInsets() + commentLibraryRecyclerView.applyImeAndSystemBarInsets() + commentInputContainer.root.applyImeAndSystemBarInsets() + } + override fun onResume() { super.onResume() setupToolbar() diff --git a/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/edit/EditSyllabusView.kt b/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/edit/EditSyllabusView.kt index 16a964a8ec..d650f70f5f 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/edit/EditSyllabusView.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/edit/EditSyllabusView.kt @@ -28,6 +28,7 @@ import com.instructure.canvasapi2.models.Course import com.instructure.pandautils.dialogs.UnsavedChangesExitDialog import com.instructure.pandautils.discussions.DiscussionUtils import com.instructure.pandautils.utils.* +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.views.CanvasWebView import com.instructure.teacher.R import com.instructure.teacher.databinding.FragmentEditSyllabusBinding @@ -58,6 +59,7 @@ class EditSyllabusView( fun setupToolbar() = with(binding) { val activity = context as? FragmentActivity + toolbar.applyTopSystemBarInsets() toolbar.setupCloseButton { activity?.onBackPressed() } toolbar.setupMenu(R.menu.menu_edit_syllabus) { menuItem -> when (menuItem.itemId) { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusRepositoryFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusRepositoryFragment.kt index fe0e59eeaf..ca6fca3fd8 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusRepositoryFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusRepositoryFragment.kt @@ -17,6 +17,7 @@ package com.instructure.teacher.features.syllabus.ui +import android.os.Bundle import com.instructure.canvasapi2.models.CanvasContext import com.instructure.canvasapi2.models.Course import com.instructure.pandautils.utils.Const @@ -31,6 +32,11 @@ class SyllabusRepositoryFragment : SyllabusFragment() { @Inject lateinit var syllabusRepository: SyllabusRepository + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + retainInstance = false + } + override fun getRepository() = syllabusRepository companion object { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusView.kt b/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusView.kt index 4392c153fa..5fcc9fd15f 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusView.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/features/syllabus/ui/SyllabusView.kt @@ -32,6 +32,8 @@ import com.instructure.canvasapi2.utils.exhaustive import com.instructure.interactions.router.Route import com.instructure.pandautils.features.calendarevent.details.EventFragment import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.getDrawableCompat import com.instructure.pandautils.utils.onClick @@ -88,6 +90,9 @@ class SyllabusView( } init { + binding.toolbar.applyTopSystemBarInsets() + binding.swipeRefreshLayout.applyBottomSystemBarInsets() + binding.toolbar.setupMenu(R.menu.menu_edit_generic) { consumer?.accept(SyllabusEvent.EditClicked) } setEditVisibility(false) ViewStyler.themeToolbarColored(activity, binding.toolbar, canvasContext) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/AssigneeListFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/AssigneeListFragment.kt index 0e770799f8..e835e90781 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/AssigneeListFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/AssigneeListFragment.kt @@ -22,6 +22,9 @@ import android.text.SpannableStringBuilder import android.text.style.ForegroundColorSpan import android.view.View import android.widget.TextView +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.instructure.canvasapi2.models.CanvasComparable @@ -34,6 +37,7 @@ import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.fragments.BaseExpandableSyncFragment import com.instructure.pandautils.utils.* +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.views.EmptyView import com.instructure.teacher.R import com.instructure.teacher.adapters.AssigneeListAdapter @@ -72,7 +76,15 @@ class AssigneeListFragment : BaseExpandableSyncFragment< override fun withPagination() = false override fun perPageCount() = ApiPrefs.perPageCount override fun getPresenterFactory() = AssigneeListPresenterFactory(mDateGroups, mTargetIdx, sections, groups, students) - override fun onCreateView(view: View) {} + override fun onCreateView(view: View) { + binding.toolbar.applyTopSystemBarInsets() + + ViewCompat.setOnApplyWindowInsetsListener(assigneeRecyclerView) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = systemBars.bottom) + insets + } + } private fun performSave() { presenter.save() diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/AttendanceListFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/AttendanceListFragment.kt index 40a728eaeb..067060803d 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/AttendanceListFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/AttendanceListFragment.kt @@ -51,6 +51,7 @@ import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.enableAlgorithmicDarkening import com.instructure.pandautils.utils.isTablet @@ -113,6 +114,7 @@ class AttendanceListFragment : BaseSyncFragment< private fun setupViews() = with(binding) { webView.enableAlgorithmicDarkening() + toolbar.applyTopSystemBarInsets() toolbar.setupMenu(R.menu.menu_attendance) { menuItem -> when(menuItem.itemId) { R.id.menuFilterSections -> { /* Do Nothing */ } diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ChooseRecipientsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ChooseRecipientsFragment.kt index 0088707ca9..f7b5762879 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ChooseRecipientsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ChooseRecipientsFragment.kt @@ -21,6 +21,9 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.widget.Toolbar +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.recyclerview.widget.RecyclerView import com.instructure.canvasapi2.models.CanvasContext import com.instructure.canvasapi2.models.Recipient @@ -31,6 +34,7 @@ import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.fragments.BaseSyncFragment import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.nonNullArgs import com.instructure.teacher.R import com.instructure.teacher.adapters.ChooseMessageRecipientRecyclerAdapter @@ -106,12 +110,23 @@ class ChooseRecipientsFragment : BaseSyncFragment(R.id.menuDone).setTextColor(ThemePrefs.textButtonColor) + + view.findViewById(R.id.toolbar).applyTopSystemBarInsets() + return view } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { swipeRefreshLayoutContainerBinding = RecyclerSwipeRefreshLayoutBinding.bind(view) super.onViewCreated(view, savedInstanceState) + + mRecyclerView?.let { recyclerView -> + ViewCompat.setOnApplyWindowInsetsListener(recyclerView) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = systemBars.bottom) + insets + } + } } override fun layoutResId(): Int = R.layout.fragment_choose_recipients diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseBrowserFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseBrowserFragment.kt index 6c6389925d..ccdfb8ab44 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseBrowserFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseBrowserFragment.kt @@ -46,6 +46,8 @@ import com.instructure.pandautils.utils.Const.MARKET_URI_PREFIX import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.a11yManager +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.isSwitchAccessEnabled import com.instructure.pandautils.utils.isTablet @@ -197,12 +199,15 @@ class CourseBrowserFragment : BaseSyncFragment< overlayToolbar } + appBarLayout.setBackgroundColor(presenter.canvasContext.color) + appBarLayout.applyTopSystemBarInsets() toolbar.setupBackButton(this@CourseBrowserFragment) toolbar.setupMenu(R.menu.menu_course_browser, menuItemCallback) ViewStyler.colorToolbarIconsAndText(requireActivity(), toolbar, requireContext().getColor(R.color.textLightest)) ViewStyler.setStatusBarDark(requireActivity(), presenter.canvasContext.color) collapsingToolbarLayout.setContentScrimColor(presenter.canvasContext.color) + swipeRefreshLayout.applyBottomSystemBarInsets() // Hide image placeholder if color overlay is disabled and there is no valid image val hasImage = (presenter.canvasContext as? Course)?.imageUrl?.isValid() == true diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseSettingsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseSettingsFragment.kt index 726612fd84..503361ff1e 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseSettingsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/CourseSettingsFragment.kt @@ -31,6 +31,7 @@ import com.instructure.pandautils.fragments.BasePresenterFragment import com.instructure.pandautils.utils.Const import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.onClickWithRequireNetwork import com.instructure.pandautils.utils.setCourseImage @@ -99,6 +100,7 @@ class CourseSettingsFragment : BasePresenterFragment< } private fun setupToolbar() = with(binding) { + toolbar.applyTopSystemBarInsets() toolbar.setupBackButton(this@CourseSettingsFragment) toolbar.title = getString(R.string.course_settings) ViewStyler.themeToolbarLight(requireActivity(), toolbar) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/CreateOrEditPageDetailsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/CreateOrEditPageDetailsFragment.kt index 237b55bfde..5b604e6cac 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/CreateOrEditPageDetailsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/CreateOrEditPageDetailsFragment.kt @@ -27,6 +27,9 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.instructure.canvasapi2.models.CanvasContext import com.instructure.canvasapi2.models.Course import com.instructure.canvasapi2.models.Page @@ -53,6 +56,7 @@ import com.instructure.pandautils.utils.RequestCodes import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.applyTheme +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.handleLTIPlaceHolders import com.instructure.pandautils.utils.hideKeyboard import com.instructure.pandautils.utils.onClickWithRequireNetwork @@ -97,7 +101,15 @@ class CreateOrEditPageDetailsFragment : BasePresenterFragment< override val skipCheck = false override fun onRefreshFinished() {} override fun onRefreshStarted() {} - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + binding.toolbar.applyTopSystemBarInsets() + + ViewCompat.setOnApplyWindowInsetsListener(binding.scrollView) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = systemBars.bottom) + insets + } + } override fun onPresenterPrepared(presenter: CreateOrEditPagePresenter) {} override val bindingInflater: (layoutInflater: LayoutInflater) -> FragmentCreateOrEditPageBinding = FragmentCreateOrEditPageBinding::inflate diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/DashboardFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/DashboardFragment.kt index 93f0a6e499..1ebdb71530 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/DashboardFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/DashboardFragment.kt @@ -23,6 +23,9 @@ import android.view.MenuItem import android.view.MotionEvent import android.view.MotionEvent.ACTION_CANCEL import android.view.View +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import androidx.lifecycle.lifecycleScope import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.recyclerview.widget.GridLayoutManager @@ -43,6 +46,7 @@ import com.instructure.pandautils.utils.NetworkStateProvider import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.Utils import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.fadeAnimationWithAction import com.instructure.pandautils.utils.getDrawableCompat import com.instructure.pandautils.utils.requestAccessibilityFocus @@ -160,6 +164,16 @@ class DashboardFragment : BaseSyncFragment + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = padding + systemBars.bottom) + insets + } + if (courseRecyclerView.isAttachedToWindow) { + ViewCompat.requestApplyInsets(courseRecyclerView) + } + emptyCoursesView.onClickAddCourses { routeEditDashboard() } setupHeader() @@ -182,6 +196,7 @@ class DashboardFragment : BaseSyncFragment + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = systemBars.bottom) + insets + } + } override fun onResume() { super.onResume() diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditAssignmentDetailsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditAssignmentDetailsFragment.kt index 5be1cbca48..a3a2564fbe 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditAssignmentDetailsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditAssignmentDetailsFragment.kt @@ -73,6 +73,8 @@ import com.instructure.teacher.models.DueDateGroup import com.instructure.teacher.router.RouteMatcher import com.instructure.teacher.utils.* import com.instructure.teacher.view.AssignmentOverrideView +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarInsets import kotlinx.coroutines.Job import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -166,6 +168,11 @@ class EditAssignmentDetailsFragment : BaseFragment() { setupViews() setupToolbar() + setupWindowInsets() + } + + private fun setupWindowInsets() = with(binding) { + scrollView.applyBottomSystemBarInsets() } override fun onStart() { @@ -192,6 +199,7 @@ class EditAssignmentDetailsFragment : BaseFragment() { } private fun setupToolbar() = with(binding) { + toolbar.applyTopSystemBarInsets() toolbar.setupCloseButton(this@EditAssignmentDetailsFragment) toolbar.title = getString(R.string.edit_assignment) toolbar.setupMenu(R.menu.menu_save_generic) { saveAssignment() } diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditFileFolderFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditFileFolderFragment.kt index 36b01a163f..67b548ba2a 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditFileFolderFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/EditFileFolderFragment.kt @@ -25,6 +25,9 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.widget.AdapterView +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import android.widget.ArrayAdapter import android.widget.EditText import android.widget.TextView @@ -54,6 +57,7 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ParcelableArrayListArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.descendants import com.instructure.pandautils.utils.postSticky import com.instructure.pandautils.utils.setGone @@ -144,6 +148,19 @@ class EditFileFolderFragment : BasePresenterFragment< showUsageRights(presenter.usageRightsEnabled) setupToolbar() setupViews() + setupWindowInsets() + } + + private fun setupWindowInsets() = with(binding) { + toolbar.applyTopSystemBarInsets() + ViewCompat.setOnApplyWindowInsetsListener(editFileFolderContentLayout) { view, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updatePadding(bottom = systemBars.bottom) + insets + } + if (editFileFolderScrollView.isAttachedToWindow) { + ViewCompat.requestApplyInsets(editFileFolderScrollView) + } } override fun getPresenterFactory() = EditFilePresenterFactory(currentFileOrFolder, usageRightsEnabled, licenseList, courseId) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/FeatureFlagsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/FeatureFlagsFragment.kt index ac077215c9..4c45dea40e 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/FeatureFlagsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/FeatureFlagsFragment.kt @@ -20,12 +20,16 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.instructure.pandautils.base.BaseCanvasFragment import androidx.recyclerview.widget.RecyclerView import com.instructure.canvasapi2.utils.FeatureFlagPref import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.setupAsBackButton import com.instructure.teacher.R @@ -45,6 +49,14 @@ class FeatureFlagsFragment : BaseCanvasFragment() { super.onViewCreated(view, savedInstanceState) setupToolbar() binding.recyclerView.adapter = FeatureFlagAdapter() + + binding.toolbar.applyTopSystemBarInsets() + + ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = systemBars.bottom) + insets + } } private fun setupToolbar() { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/FileListFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/FileListFragment.kt index 2ecbcaf3df..8adfc5649e 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/FileListFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/FileListFragment.kt @@ -50,6 +50,11 @@ import com.instructure.pandautils.utils.FileUploadEvent import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomAndRightSystemBarPadding +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarMargin +import com.instructure.pandautils.utils.applySystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.getDrawableCompat import com.instructure.pandautils.utils.isCourse @@ -308,10 +313,12 @@ class FileListFragment : BaseSyncFragment< } private fun setupViews() = with(binding) { + swipeRefreshLayout.applyBottomSystemBarInsets() + ViewStyler.themeFAB(addFab) ViewStyler.themeFAB(addFileFab) ViewStyler.themeFAB(addFolderFab) - + addFab.applyBottomSystemBarMargin() addFab.setOnClickListener { animateFabs() } addFileFab.setOnClickListener { animateFabs() @@ -354,6 +361,7 @@ class FileListFragment : BaseSyncFragment< } private fun setupToolbar() = with(binding) { + fileListToolbar.applyTopSystemBarInsets() fileListToolbar.setupBackButton(this@FileListFragment) fileListToolbar.subtitle = presenter.mCanvasContext.name diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/InternalWebViewFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/InternalWebViewFragment.kt index 84fcb05de2..564131fc6f 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/InternalWebViewFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/InternalWebViewFragment.kt @@ -22,6 +22,9 @@ import android.os.Bundle import android.view.View import android.webkit.WebView import androidx.appcompat.widget.Toolbar +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.instructure.canvasapi2.managers.OAuthManager import com.instructure.canvasapi2.models.AuthenticatedSession import com.instructure.canvasapi2.models.CanvasContext @@ -40,6 +43,8 @@ import com.instructure.pandautils.utils.BooleanArg import com.instructure.pandautils.utils.StringArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.setGone import com.instructure.pandautils.utils.setVisible @@ -100,6 +105,10 @@ open class InternalWebViewFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) toolbar = view.findViewById(R.id.toolbar) + + toolbar?.applyTopSystemBarInsets() + + binding.canvasWebView.applyBottomSystemBarInsets() } override fun onActivityCreated(savedInstanceState: Bundle?) = with(binding) { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageDetailsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageDetailsFragment.kt index bc2cef8fd5..7168385005 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageDetailsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageDetailsFragment.kt @@ -43,6 +43,8 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.PermissionUtils import com.instructure.pandautils.utils.StringArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.getModuleItemId import com.instructure.pandautils.utils.isTablet @@ -138,6 +140,7 @@ class PageDetailsFragment : BasePresenterFragment< presenter.getPage(page.url ?: "", canvasContext, true) } setupToolbar() + canvasWebViewWraper.applyBottomSystemBarInsets() canvasWebViewWraper.webView.canvasWebViewClientCallback = object : CanvasWebView.CanvasWebViewClientCallback { override fun openMediaFromWebView(mime: String, url: String, filename: String) { @@ -222,6 +225,7 @@ class PageDetailsFragment : BasePresenterFragment< } private fun setupToolbar() = with(binding) { + toolbar.applyTopSystemBarInsets() toolbar.setupMenu(R.menu.menu_page_details) { openEditPage(page) } toolbar.setupBackButtonWithExpandCollapseAndBack(this@PageDetailsFragment) { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageListFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageListFragment.kt index 0dddfc2acd..12eda2f5e1 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageListFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/PageListFragment.kt @@ -36,6 +36,9 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.addSearch +import com.instructure.pandautils.utils.applyBottomAndRightSystemBarPadding +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.closeSearch import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.getDrawableCompat @@ -175,6 +178,7 @@ class PageListFragment : BaseSyncFragment(Const.CANVAS_CONTEXT) + peopleListToolbar.applyTopSystemBarInsets() + swipeRefreshLayoutContainerBinding.swipeRefreshLayout.applyBottomSystemBarInsets() peopleListToolbar.setTitle(R.string.tab_people) peopleListToolbar.subtitle = canvasContext!!.name if (peopleListToolbar.menu.size() == 0) peopleListToolbar.inflateMenu(R.menu.menu_people_list) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileEditFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileEditFragment.kt index 08879b9f38..acbc14f6ec 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileEditFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileEditFragment.kt @@ -69,6 +69,8 @@ import com.instructure.teacher.presenters.ProfileEditFragmentPresenter import com.instructure.teacher.utils.setupCloseButton import com.instructure.teacher.utils.setupMenu import com.instructure.teacher.viewinterface.ProfileEditFragmentView +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarInsets import retrofit2.Response import java.io.File @@ -129,9 +131,11 @@ class ProfileEditFragment : BasePresenterFragment< override fun onResume() { super.onResume() setupToolbar() + setupWindowInsets() } fun setupToolbar() = with(binding) { + toolbar.applyTopSystemBarInsets() toolbar.setupCloseButton(this@ProfileEditFragment) toolbar.title = getString(R.string.editProfile) toolbar.setupMenu(R.menu.menu_save_generic) { saveProfile() } @@ -140,6 +144,10 @@ class ProfileEditFragment : BasePresenterFragment< saveButton?.setTextColor(ThemePrefs.textButtonColor) } + private fun setupWindowInsets() = with(binding) { + usersName.applyBottomSystemBarInsets() + } + override fun readyToLoadUI(user: User?) = with(binding) { profileCameraIconWrapper.setVisible(user?.canUpdateAvatar() == true) profileCameraIconWrapper.onClickWithRequireNetwork { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileFragment.kt index 521d7996c7..ee11f13967 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ProfileFragment.kt @@ -40,6 +40,8 @@ import com.instructure.teacher.router.RouteMatcher import com.instructure.teacher.utils.adoptToolbarStyle import com.instructure.teacher.utils.setupBackButtonAsBackPressedOnly import com.instructure.teacher.utils.setupMenu +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarInsets @PageView(url = "profile") @ScreenView(SCREEN_VIEW_PROFILE) @@ -62,9 +64,11 @@ class ProfileFragment : BaseFragment() { super.onResume() setupToolbar() setupViewableData() + setupWindowInsets() } private fun setupToolbar() = with(binding) { + toolbar.applyTopSystemBarInsets() toolbar.setupMenu(R.menu.menu_settings_edit, menuItemCallback) toolbar.setupBackButtonAsBackPressedOnly(this@ProfileFragment) titleTextView.adoptToolbarStyle(toolbar) @@ -72,6 +76,10 @@ class ProfileFragment : BaseFragment() { toolbar.requestAccessibilityFocus() } + private fun setupWindowInsets() = with(binding) { + usersBio.applyBottomSystemBarInsets() + } + private fun setupViewableData() = with(binding) { val user = ApiPrefs.user ProfileUtils.loadAvatarForUser(usersAvatar, user?.shortName, user?.avatarUrl, 0) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizDetailsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizDetailsFragment.kt index 3802c47204..e2f395daa1 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizDetailsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizDetailsFragment.kt @@ -17,11 +17,15 @@ package com.instructure.teacher.fragments import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.webkit.WebChromeClient import android.webkit.WebView import android.widget.TextView import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.instructure.canvasapi2.models.Assignment import com.instructure.canvasapi2.models.CanvasContext import com.instructure.canvasapi2.models.Course @@ -50,6 +54,7 @@ import com.instructure.pandautils.utils.LongArg import com.instructure.pandautils.utils.NullableParcelableArg import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.color import com.instructure.pandautils.utils.isTablet import com.instructure.pandautils.utils.loadHtmlWithIframes @@ -145,6 +150,17 @@ class QuizDetailsFragment : BasePresenterFragment< override fun onPresenterPrepared(presenter: QuizDetailsPresenter) = Unit + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.toolbar.applyTopSystemBarInsets() + + ViewCompat.setOnApplyWindowInsetsListener(binding.swipeRefreshLayout) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.updatePadding(bottom = systemBars.bottom) + insets + } + } + override fun onRefreshFinished() = Unit override fun onRefreshStarted() { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizListFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizListFragment.kt index 6aad4ebde5..2711c6905d 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizListFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/QuizListFragment.kt @@ -34,6 +34,8 @@ import com.instructure.pandautils.fragments.BaseExpandableSyncFragment import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ViewStyler import com.instructure.pandautils.utils.addSearch +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.closeSearch import com.instructure.pandautils.utils.getDrawableCompat import com.instructure.pandautils.utils.closeSearch @@ -165,6 +167,8 @@ class QuizListFragment : BaseExpandableSyncFragment< override fun perPageCount() = ApiPrefs.perPageCount private fun setupToolbar() = with(binding) { + quizListToolbar.applyTopSystemBarInsets() + swipeRefreshLayout.applyBottomSystemBarInsets() quizListToolbar.title = getString(R.string.tab_quizzes) quizListToolbar.subtitle = canvasContext.name quizListToolbar.setupBackButton(this@QuizListFragment) diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderCommentsFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderCommentsFragment.kt index 563dddce6c..5dcfe6f7b3 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderCommentsFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderCommentsFragment.kt @@ -58,6 +58,7 @@ import com.instructure.pandautils.utils.ParcelableArg import com.instructure.pandautils.utils.ParcelableArrayListArg import com.instructure.pandautils.utils.ThemePrefs import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyImeAndSystemBarInsets import com.instructure.pandautils.utils.onClick import com.instructure.pandautils.utils.onClickWithRequireNetwork import com.instructure.pandautils.utils.onTextChanged @@ -159,6 +160,12 @@ class SpeedGraderCommentsFragment : BaseListFragment + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updatePadding(bottom = systemBars.bottom) + insets + } + if (speedGraderFilesRecyclerView.isAttachedToWindow) { + ViewCompat.requestApplyInsets(speedGraderFilesRecyclerView) + } } override fun onReadySetGo(presenter: SpeedGraderFilesPresenter) { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderGradeFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderGradeFragment.kt index bc43178cfa..d084d65758 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderGradeFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/SpeedGraderGradeFragment.kt @@ -17,6 +17,9 @@ package com.instructure.teacher.fragments import android.view.LayoutInflater import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.instructure.canvasapi2.models.Assignee import com.instructure.canvasapi2.models.Assignment import com.instructure.canvasapi2.models.Course @@ -70,6 +73,18 @@ class SpeedGraderGradeFragment : BasePresenterFragment< override fun onPresenterPrepared(presenter: SpeedGraderGradePresenter) { setupViews() + setupWindowInsets() + } + + private fun setupWindowInsets() = with(binding) { + ViewCompat.setOnApplyWindowInsetsListener(speedGraderGradeContentLayout) { view, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updatePadding(bottom = systemBars.bottom) + insets + } + if (speedGraderGradeScrollView.isAttachedToWindow) { + ViewCompat.requestApplyInsets(speedGraderGradeScrollView) + } } override fun onStart() { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ToDoFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ToDoFragment.kt index f3a9802766..e2513683f1 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ToDoFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ToDoFragment.kt @@ -52,6 +52,8 @@ import com.instructure.teacher.router.RouteMatcher import com.instructure.teacher.utils.RecyclerViewUtils import com.instructure.teacher.utils.setupBackButtonAsBackPressedOnly import com.instructure.teacher.viewinterface.ToDoView +import com.instructure.pandautils.utils.applyTopSystemBarInsets +import com.instructure.pandautils.utils.applyBottomSystemBarInsets import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -110,6 +112,7 @@ class ToDoFragment : BaseSyncFragment(R.id.toolbar).setGone() + setupWindowInsets() + } + + private fun setupWindowInsets() = with(binding) { + if (isInModulesPager) { + toolbar.applyTopSystemBarInsets() + } } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ViewPdfFragment.kt b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ViewPdfFragment.kt index 6c0ffe8b24..48918d5553 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/fragments/ViewPdfFragment.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/fragments/ViewPdfFragment.kt @@ -23,12 +23,16 @@ import android.view.View import android.view.ViewGroup import com.instructure.interactions.MasterDetailInteractions import com.instructure.interactions.router.Route +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.instructure.pandautils.analytics.SCREEN_VIEW_VIEW_PDF import com.instructure.pandautils.analytics.ScreenView import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.models.EditableFile import com.instructure.pandautils.utils.* import com.instructure.pandautils.utils.Utils.copyToClipboard +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.teacher.R import com.instructure.teacher.databinding.FragmentViewPdfBinding import com.instructure.teacher.factory.ViewPdfFragmentPresenterFactory @@ -61,6 +65,12 @@ class ViewPdfFragment : PresenterFragment @@ -151,6 +162,12 @@ class ViewPdfFragment : PresenterFragment @@ -39,7 +40,8 @@ android:animateLayoutChanges="true" android:id="@+id/commentInputContainer" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="0dp" + android:minHeight="56dp" android:layout_alignParentBottom="true" android:background="@color/backgroundLightest"> diff --git a/apps/teacher/src/main/res/layout/fragment_assignee_list.xml b/apps/teacher/src/main/res/layout/fragment_assignee_list.xml index a529d0b4b1..76b4ed87b5 100644 --- a/apps/teacher/src/main/res/layout/fragment_assignee_list.xml +++ b/apps/teacher/src/main/res/layout/fragment_assignee_list.xml @@ -27,6 +27,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" app:title="@string/page_title_add_assignees"/> diff --git a/apps/teacher/src/main/res/layout/fragment_course_settings.xml b/apps/teacher/src/main/res/layout/fragment_course_settings.xml index afb8408621..cb0448ba42 100644 --- a/apps/teacher/src/main/res/layout/fragment_course_settings.xml +++ b/apps/teacher/src/main/res/layout/fragment_course_settings.xml @@ -24,7 +24,8 @@ + android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize"/> diff --git a/apps/teacher/src/main/res/layout/fragment_dashboard.xml b/apps/teacher/src/main/res/layout/fragment_dashboard.xml index d50e04d630..0c4c6363ba 100644 --- a/apps/teacher/src/main/res/layout/fragment_dashboard.xml +++ b/apps/teacher/src/main/res/layout/fragment_dashboard.xml @@ -23,7 +23,8 @@ diff --git a/apps/teacher/src/main/res/layout/fragment_edit_filefolder.xml b/apps/teacher/src/main/res/layout/fragment_edit_filefolder.xml index 3bf1f639b2..8838581cfe 100644 --- a/apps/teacher/src/main/res/layout/fragment_edit_filefolder.xml +++ b/apps/teacher/src/main/res/layout/fragment_edit_filefolder.xml @@ -26,15 +26,18 @@ + android:layout_height="match_parent" + android:clipToPadding="false"/> diff --git a/apps/teacher/src/main/res/layout/fragment_quiz_details.xml b/apps/teacher/src/main/res/layout/fragment_quiz_details.xml index 94a325b9f5..6c174dfde7 100644 --- a/apps/teacher/src/main/res/layout/fragment_quiz_details.xml +++ b/apps/teacher/src/main/res/layout/fragment_quiz_details.xml @@ -26,6 +26,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" android:elevation="6dp" tools:background="#00bcd5" tools:ignore="UnusedAttribute"/> diff --git a/apps/teacher/src/main/res/layout/fragment_quiz_list.xml b/apps/teacher/src/main/res/layout/fragment_quiz_list.xml index 49b473c129..0fd9d1c82f 100644 --- a/apps/teacher/src/main/res/layout/fragment_quiz_list.xml +++ b/apps/teacher/src/main/res/layout/fragment_quiz_list.xml @@ -25,7 +25,8 @@ diff --git a/apps/teacher/src/main/res/layout/fragment_speedgrader_comments.xml b/apps/teacher/src/main/res/layout/fragment_speedgrader_comments.xml index 506ba23a0d..ed51855282 100644 --- a/apps/teacher/src/main/res/layout/fragment_speedgrader_comments.xml +++ b/apps/teacher/src/main/res/layout/fragment_speedgrader_comments.xml @@ -32,6 +32,7 @@ android:id="@+id/speedGraderCommentsRecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipToPadding="false" android:cacheColorHint="@android:color/transparent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> diff --git a/apps/teacher/src/main/res/layout/fragment_speedgrader_files.xml b/apps/teacher/src/main/res/layout/fragment_speedgrader_files.xml index a327865269..559a0fe4a4 100644 --- a/apps/teacher/src/main/res/layout/fragment_speedgrader_files.xml +++ b/apps/teacher/src/main/res/layout/fragment_speedgrader_files.xml @@ -30,6 +30,7 @@ android:id="@+id/speedGraderFilesRecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipToPadding="false" android:cacheColorHint="@android:color/transparent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> diff --git a/apps/teacher/src/main/res/layout/fragment_speedgrader_grade.xml b/apps/teacher/src/main/res/layout/fragment_speedgrader_grade.xml index 7be8f35b5d..eb5c676ef4 100644 --- a/apps/teacher/src/main/res/layout/fragment_speedgrader_grade.xml +++ b/apps/teacher/src/main/res/layout/fragment_speedgrader_grade.xml @@ -16,11 +16,13 @@ diff --git a/apps/teacher/src/main/res/layout/fragment_student_context.xml b/apps/teacher/src/main/res/layout/fragment_student_context.xml index 09cb655e9f..a9d9c253ad 100644 --- a/apps/teacher/src/main/res/layout/fragment_student_context.xml +++ b/apps/teacher/src/main/res/layout/fragment_student_context.xml @@ -32,7 +32,8 @@ diff --git a/apps/teacher/src/main/res/layout/fragment_view_image.xml b/apps/teacher/src/main/res/layout/fragment_view_image.xml index 1710c0e048..6843188c43 100644 --- a/apps/teacher/src/main/res/layout/fragment_view_image.xml +++ b/apps/teacher/src/main/res/layout/fragment_view_image.xml @@ -25,6 +25,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" android:elevation="2dp" tools:ignore="UnusedAttribute"/> diff --git a/apps/teacher/src/main/res/layout/fragment_view_pdf.xml b/apps/teacher/src/main/res/layout/fragment_view_pdf.xml index f6beba807f..06ad57ef3b 100644 --- a/apps/teacher/src/main/res/layout/fragment_view_pdf.xml +++ b/apps/teacher/src/main/res/layout/fragment_view_pdf.xml @@ -24,6 +24,7 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/actionBarSize" android:elevation="2dp" tools:ignore="UnusedAttribute"/> diff --git a/apps/teacher/src/main/res/layout/speed_grader_comment_input_view.xml b/apps/teacher/src/main/res/layout/speed_grader_comment_input_view.xml index 8e69f6aa36..bc2a795b2f 100644 --- a/apps/teacher/src/main/res/layout/speed_grader_comment_input_view.xml +++ b/apps/teacher/src/main/res/layout/speed_grader_comment_input_view.xml @@ -18,6 +18,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> @style/Widget.ActionButton.Overflow @color/backgroundLight @style/DatePickerStyle - true \ No newline at end of file diff --git a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginFindSchoolActivity.kt b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginFindSchoolActivity.kt index 26140718e9..16ee2c27e2 100644 --- a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginFindSchoolActivity.kt +++ b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginFindSchoolActivity.kt @@ -35,6 +35,8 @@ import androidx.annotation.ColorInt import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -53,6 +55,8 @@ import com.instructure.pandautils.base.BaseCanvasActivity import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ColorUtils import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyBottomSystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setupAsBackButton import retrofit2.Response import java.util.Locale @@ -110,14 +114,31 @@ abstract class BaseLoginFindSchoolActivity : BaseCanvasActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) + setupWindowInsets() bindViews() applyTheme() } + private fun setupWindowInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> + val insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() + ) + view.setPadding( + insets.left, + 0, + insets.right, + 0 + ) + windowInsets + } + } + private fun bindViews() = with(binding) { mWhatsYourSchoolName = findViewById(R.id.whatsYourSchoolName) mLoginFlowLogout = findViewById(R.id.loginFlowLogout) toolbar.apply { + applyTopSystemBarInsets() navigationIcon?.isAutoMirrored = true setupAsBackButton { finish() } inflateMenu(R.menu.menu_next) @@ -197,6 +218,7 @@ abstract class BaseLoginFindSchoolActivity : BaseCanvasActivity() { recyclerView.addItemDecoration(DividerItemDecoration(this@BaseLoginFindSchoolActivity, RecyclerView.VERTICAL)) recyclerView.layoutManager = LinearLayoutManager(this@BaseLoginFindSchoolActivity, RecyclerView.VERTICAL, false) recyclerView.adapter = mDomainAdapter + recyclerView.applyBottomSystemBarInsets() } /** diff --git a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginLandingPageActivity.kt b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginLandingPageActivity.kt index 5d5fb8989a..a543fc9180 100644 --- a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginLandingPageActivity.kt +++ b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginLandingPageActivity.kt @@ -60,6 +60,9 @@ import com.instructure.loginapi.login.viewmodel.LoginViewModel import com.instructure.pandautils.base.BaseCanvasActivity import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.* +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import java.util.* import javax.inject.Inject @@ -107,6 +110,19 @@ abstract class BaseLoginLandingPageActivity : BaseCanvasActivity() { } private fun bindViews() = with(binding) { + ViewCompat.setOnApplyWindowInsetsListener(rootView) { view, windowInsets -> + val insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() + ) + view.updatePadding( + left = insets.left, + top = insets.top, + right = insets.right, + bottom = insets.bottom + ) + WindowInsetsCompat.CONSUMED + } + canvasNetwork.onClick { if (APIHelper.hasNetworkConnection()) { val intent = beginCanvasNetworkFlow(URL_CANVAS_NETWORK) diff --git a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginSignInActivity.kt b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginSignInActivity.kt index fe96ba95b6..b3a9cbf246 100644 --- a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginSignInActivity.kt +++ b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/BaseLoginSignInActivity.kt @@ -41,6 +41,8 @@ import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.Toolbar +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import com.instructure.canvasapi2.RequestInterceptor.Companion.acceptedLanguageString import com.instructure.canvasapi2.StatusCallback import com.instructure.canvasapi2.TokenRefreshState @@ -88,6 +90,7 @@ import com.instructure.pandautils.base.BaseCanvasActivity import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.Utils import com.instructure.pandautils.utils.ViewStyler.themeStatusBar +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setGone import com.instructure.pandautils.utils.setVisible import com.instructure.pandautils.utils.setupAsBackButton @@ -135,6 +138,7 @@ abstract class BaseLoginSignInActivity : BaseCanvasActivity(), OnAuthenticationS override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) + setupWindowInsets() canvasLogin = intent!!.extras!!.getInt(Const.CANVAS_LOGIN, 0) setupViews() applyTheme() @@ -162,9 +166,25 @@ abstract class BaseLoginSignInActivity : BaseCanvasActivity(), OnAuthenticationS } } + private fun setupWindowInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> + val insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() + ) + view.setPadding( + insets.left, + 0, + insets.right, + 0 + ) + windowInsets + } + } + @SuppressLint("SetJavaScriptEnabled") private fun setupViews() { val toolbar = findViewById(R.id.toolbar) + toolbar.applyTopSystemBarInsets() toolbar.title = accountDomain.domain toolbar.navigationIcon?.isAutoMirrored = true toolbar.setupAsBackButton { diff --git a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/LoginWithQRActivity.kt b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/LoginWithQRActivity.kt index 5d69a26991..0e487687e1 100644 --- a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/LoginWithQRActivity.kt +++ b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/activities/LoginWithQRActivity.kt @@ -31,8 +31,13 @@ import com.instructure.loginapi.login.dialog.NoInternetConnectionDialog import com.instructure.loginapi.login.util.QRLogin import com.instructure.pandautils.binding.viewBinding import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setMenu import com.instructure.pandautils.utils.setupAsBackButton +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding +import com.instructure.pandautils.utils.EdgeToEdgeHelper abstract class LoginWithQRActivity : BaseCanvasActivity() { @@ -42,18 +47,34 @@ abstract class LoginWithQRActivity : BaseCanvasActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + EdgeToEdgeHelper.enableEdgeToEdge(this) setContentView(binding.root) + setupWindowInsets() bindViews() } + private fun setupWindowInsets() { + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets -> + val insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout() + ) + view.updatePadding( + left = insets.left, + right = insets.right + ) + windowInsets + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data) // Capture the results from the QR scanner if (result?.contents != null) { val loginUri = Uri.parse(result.contents) - if(QRLogin.verifySSOLoginUri(loginUri)) { + if (QRLogin.verifySSOLoginUri(loginUri)) { // Valid link, let's launch it launchApplicationWithQRLogin(loginUri) } else { @@ -66,6 +87,7 @@ abstract class LoginWithQRActivity : BaseCanvasActivity() { private fun bindViews() = with(binding) { toolbar.apply { + applyTopSystemBarInsets() title = getString(R.string.locateQRCode) setupAsBackButton { finish() } navigationIcon?.isAutoMirrored = true @@ -89,5 +111,12 @@ abstract class LoginWithQRActivity : BaseCanvasActivity() { val nextText: TextView = findViewById(R.id.next) nextText.setTextColor(ContextCompat.getColor(this@LoginWithQRActivity, R.color.textInfo)) + + // Apply bottom insets to the image (last element in scrollable content) + ViewCompat.setOnApplyWindowInsetsListener(image) { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updatePadding(bottom = insets.bottom) + windowInsets + } } } \ No newline at end of file diff --git a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/features/acceptableusepolicy/AcceptableUsePolicyActivity.kt b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/features/acceptableusepolicy/AcceptableUsePolicyActivity.kt index bb6643d739..79f38c08d3 100644 --- a/libs/login-api-2/src/main/java/com/instructure/loginapi/login/features/acceptableusepolicy/AcceptableUsePolicyActivity.kt +++ b/libs/login-api-2/src/main/java/com/instructure/loginapi/login/features/acceptableusepolicy/AcceptableUsePolicyActivity.kt @@ -22,8 +22,11 @@ import com.google.android.material.snackbar.Snackbar import com.instructure.loginapi.login.R import com.instructure.loginapi.login.databinding.ActivityAcceptableUsePolicyBinding import com.instructure.pandautils.base.BaseCanvasActivity +import com.instructure.pandautils.utils.EdgeToEdgeHelper import com.instructure.pandautils.utils.ToolbarColorizeHelper import com.instructure.pandautils.utils.ViewStyler +import com.instructure.pandautils.utils.applySystemBarInsets +import com.instructure.pandautils.utils.applyTopSystemBarInsets import com.instructure.pandautils.utils.setMenu import com.instructure.pandautils.utils.setupAsCloseButton import com.instructure.pandautils.utils.withRequireNetwork @@ -42,11 +45,14 @@ class AcceptableUsePolicyActivity : BaseCanvasActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + EdgeToEdgeHelper.enableEdgeToEdge(this) binding = ActivityAcceptableUsePolicyBinding.inflate(layoutInflater) binding.viewModel = viewModel binding.lifecycleOwner = this setContentView(binding.root) + binding.root.applySystemBarInsets() + binding.toolbar.applyTopSystemBarInsets() binding.toolbar.setTitle(R.string.acceptableUsePolicyTitle) binding.toolbar.setupAsCloseButton { router.logout() diff --git a/libs/login-api-2/src/main/res/layout-w720dp/activity_find_school.xml b/libs/login-api-2/src/main/res/layout-w720dp/activity_find_school.xml index aaa337efa2..559035b615 100644 --- a/libs/login-api-2/src/main/res/layout-w720dp/activity_find_school.xml +++ b/libs/login-api-2/src/main/res/layout-w720dp/activity_find_school.xml @@ -25,7 +25,8 @@ diff --git a/libs/login-api-2/src/main/res/layout/activity_find_school.xml b/libs/login-api-2/src/main/res/layout/activity_find_school.xml index 6560828757..f4593af659 100644 --- a/libs/login-api-2/src/main/res/layout/activity_find_school.xml +++ b/libs/login-api-2/src/main/res/layout/activity_find_school.xml @@ -27,7 +27,8 @@ + android:layout_weight="1" + android:clipToPadding="false"/> true @color/darkStatusBarColor @font/lato_font_family - true