diff --git a/apps/student/build.gradle b/apps/student/build.gradle index eb7d68d8d1..2f4fbf214a 100644 --- a/apps/student/build.gradle +++ b/apps/student/build.gradle @@ -59,8 +59,8 @@ android { applicationId "com.instructure.candroid" minSdkVersion Versions.MIN_SDK targetSdkVersion Versions.TARGET_SDK - versionCode = 230 - versionName = '6.14.0' + versionCode = 231 + versionName = '6.14.1' vectorDrawables.useSupportLibrary = true multiDexEnabled = true 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 b443bcc4a3..b5264e3f96 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 @@ -99,8 +99,10 @@ import kotlinx.coroutines.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import java.util.* import javax.inject.Inject +private const val BOTTOM_NAV_SCREEN = "bottomNavScreen" @AndroidEntryPoint @Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") @@ -126,6 +128,8 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. private var mDrawerToggle: ActionBarDrawerToggle? = null private var colorOverlayJob: Job? = null + private val bottomNavScreensStack: Deque = ArrayDeque() + override fun contentResId(): Int = R.layout.activity_navigation private val isDrawerOpen: Boolean @@ -194,7 +198,7 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. /* Update nav bar visibility to show for specific 'root' fragments. Also show the nav bar when there is only one fragment on the backstack, which commonly occurs with non-root fragments when routing from external sources. */ - val visible = it::class.java in navigationBehavior.bottomNavBarFragments || supportFragmentManager.backStackEntryCount <= 1 + val visible = isBottomNavFragment(it) || supportFragmentManager.backStackEntryCount <= 1 bottomBar.setVisible(visible) bottomBarDivider.setVisible(visible) } @@ -316,8 +320,8 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. override fun loadLandingPage(clearBackStack: Boolean) { if (clearBackStack) clearBackStack(navigationBehavior.homeFragmentClass) - val homeRoute = navigationBehavior.createHomeFragmentRoute(ApiPrefs.user) - addFragment(navigationBehavior.createHomeFragment(homeRoute), homeRoute) + selectBottomNavFragment(navigationBehavior.homeFragmentClass) + bottomNavScreensStack.clear() if (intent.extras?.containsKey(AppShortcutManager.APP_SHORTCUT_PLACEMENT) == true) { // Launch to the app shortcut placement @@ -331,26 +335,15 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. val route = BookmarksFragment.makeRoute(ApiPrefs.user) addFragment(BookmarksFragment.newInstance(route) { RouteMatcher.routeUrl(this, it.url!!) }, route) } - AppShortcutManager.APP_SHORTCUT_CALENDAR -> { - val route = CalendarFragment.makeRoute() - addFragment(CalendarFragment.newInstance(route), route) - } - AppShortcutManager.APP_SHORTCUT_TODO -> { - val route = ToDoListFragment.makeRoute(ApiPrefs.user!!) - addFragment(ToDoListFragment.newInstance(route), route) - } - AppShortcutManager.APP_SHORTCUT_NOTIFICATIONS -> { - val route = NotificationListFragment.makeRoute(ApiPrefs.user!!) - addFragment(NotificationListFragment.newInstance(route), route) - } + AppShortcutManager.APP_SHORTCUT_CALENDAR -> selectBottomNavFragment(CalendarFragment::class.java) + AppShortcutManager.APP_SHORTCUT_TODO -> selectBottomNavFragment(ToDoListFragment::class.java) + AppShortcutManager.APP_SHORTCUT_NOTIFICATIONS -> selectBottomNavFragment(NotificationListFragment::class.java) AppShortcutManager.APP_SHORTCUT_INBOX -> { if (ApiPrefs.isStudentView) { // Inbox not available in Student View - val route = NothingToSeeHereFragment.makeRoute() - addFragment(NothingToSeeHereFragment.newInstance(), route) + selectBottomNavFragment(NothingToSeeHereFragment::class.java) } else { - val route = InboxFragment.makeRoute() - addFragment(InboxFragment.newInstance(route), route) + selectBottomNavFragment(InboxFragment::class.java) } } } @@ -453,10 +446,14 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. Logger.e("Error getting version: " + e) } - toolbar.setNavigationIcon(R.drawable.ic_hamburger) - toolbar.navigationContentDescription = getString(R.string.navigation_drawer_open) - toolbar.setNavigationOnClickListener { - openNavigationDrawer() + if (isBottomNavFragment(fragment)) { + toolbar.setNavigationIcon(R.drawable.ic_hamburger) + toolbar.navigationContentDescription = getString(R.string.navigation_drawer_open) + toolbar.setNavigationOnClickListener { + openNavigationDrawer() + } + } else { + toolbar.setupAsBackButton(fragment) } drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START) @@ -547,24 +544,15 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. private val bottomBarItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item: MenuItem -> when (item.itemId) { - R.id.bottomNavigationHome -> handleRoute(Route(navigationBehavior.homeFragmentClass, ApiPrefs.user)) - R.id.bottomNavigationCalendar -> handleRoute(CalendarFragment.makeRoute()) - R.id.bottomNavigationToDo -> { - val route = ToDoListFragment.makeRoute(ApiPrefs.user!!) - addFragment(ToDoListFragment.newInstance(route), route) - } - R.id.bottomNavigationNotifications ->{ - val route = NotificationListFragment.makeRoute(ApiPrefs.user!!) - addFragment(NotificationListFragment.newInstance(route), route) - } + R.id.bottomNavigationHome -> selectBottomNavFragment(navigationBehavior.homeFragmentClass) + R.id.bottomNavigationCalendar -> selectBottomNavFragment(CalendarFragment::class.java) + R.id.bottomNavigationToDo -> selectBottomNavFragment(ToDoListFragment::class.java) + R.id.bottomNavigationNotifications -> selectBottomNavFragment(NotificationListFragment::class.java) R.id.bottomNavigationInbox -> { if (ApiPrefs.isStudentView) { - // Inbox not available in Student View - val route = NothingToSeeHereFragment.makeRoute() - addFragment(NothingToSeeHereFragment.newInstance(), route) + selectBottomNavFragment(NothingToSeeHereFragment::class.java) } else { - val route = InboxFragment.makeRoute() - addFragment(InboxFragment.newInstance(route), route) + selectBottomNavFragment(InboxFragment::class.java) } } } @@ -588,24 +576,15 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. if(!abortReselect) { when (item.itemId) { - R.id.bottomNavigationHome -> handleRoute(Route(navigationBehavior.homeFragmentClass, ApiPrefs.user)) - R.id.bottomNavigationCalendar -> handleRoute(CalendarFragment.makeRoute()) - R.id.bottomNavigationToDo -> { - val route = ToDoListFragment.makeRoute(ApiPrefs.user!!) - addFragment(ToDoListFragment.newInstance(route), route) - } - R.id.bottomNavigationNotifications -> { - val route = NotificationListFragment.makeRoute(ApiPrefs.user!!) - addFragment(NotificationListFragment.newInstance(route), route) - } + R.id.bottomNavigationHome -> selectBottomNavFragment(navigationBehavior.homeFragmentClass) + R.id.bottomNavigationCalendar -> selectBottomNavFragment(CalendarFragment::class.java) + R.id.bottomNavigationToDo -> selectBottomNavFragment(ToDoListFragment::class.java) + R.id.bottomNavigationNotifications -> selectBottomNavFragment(NotificationListFragment::class.java) R.id.bottomNavigationInbox -> { if (ApiPrefs.isStudentView) { - // Inbox not available in Student View - val route = NothingToSeeHereFragment.makeRoute() - addFragment(NothingToSeeHereFragment.newInstance(), route) + selectBottomNavFragment(NothingToSeeHereFragment::class.java) } else { - val route = InboxFragment.makeRoute() - addFragment(InboxFragment.newInstance(route), route) + selectBottomNavFragment(InboxFragment::class.java) } } } @@ -681,19 +660,6 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. } addBookmark() return true - } else if (item.itemId == android.R.id.home) { - //if we hit the x while we're on a detail fragment, we always want to close the top fragment - //and not have it trigger an actual "back press" - val topFragment = topFragment - if (supportFragmentManager.backStackEntryCount > 0) { - if (topFragment != null) { - supportFragmentManager.beginTransaction().remove(topFragment).commit() - } - super.onBackPressed() - } else if (topFragment == null) { - super.onBackPressed() - } - return true } return super.onOptionsItemSelected(item) @@ -789,31 +755,72 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. } private fun addFragment(fragment: Fragment?, route: Route) { + if (RouteType.DIALOG == route.routeType && fragment is DialogFragment && isTablet) { + val ft = supportFragmentManager.beginTransaction() + ft.addToBackStack(fragment::class.java.name) + fragment.show(ft, fragment::class.java.name) + } else { + if (fragment != null && fragment::class.java.name in getBottomNavFragmentNames() && isBottomNavFragment(currentFragment)) { + selectBottomNavFragment(fragment::class.java) + } else { + addFullScreenFragment(fragment) + } + } + } + + private fun selectBottomNavFragment(fragmentClass: Class) { + val selectedFragment = supportFragmentManager.findFragmentByTag(fragmentClass.name) + + if (selectedFragment == null) { + val fragment = createBottomNavFragment(fragmentClass.name) + val newArguments = if (fragment?.arguments != null) fragment.requireArguments() else Bundle() + newArguments.putBoolean(BOTTOM_NAV_SCREEN, true) + fragment?.arguments = newArguments + addFullScreenFragment(fragment) + } else { + showHiddenFragment(selectedFragment) + } + + bottomNavScreensStack.remove(fragmentClass.name) + bottomNavScreensStack.push(fragmentClass.name) + } + + private fun addFullScreenFragment(fragment: Fragment?) { if (fragment == null) { - Logger.e("NavigationActivity:addFragment() - Could not route null Fragment.") + Logger.e("NavigationActivity:addFullScreenFragment() - Could not route null Fragment.") return } val ft = supportFragmentManager.beginTransaction() + ft.setCustomAnimations(R.anim.fade_in_quick, R.anim.fade_out_quick) + currentFragment?.let { ft.hide(it) } + ft.add(R.id.fullscreen, fragment, fragment::class.java.name) + ft.addToBackStack(fragment::class.java.name) + ft.commitAllowingStateLoss() + } - if (RouteType.DIALOG == route.routeType && fragment is DialogFragment && isTablet) { - ft.addToBackStack(fragment::class.java.name) - fragment.show(ft, fragment::class.java.name) - } else { - ft.setCustomAnimations(R.anim.fade_in_quick, R.anim.fade_out_quick) - currentFragment?.let { ft.hide(it) } - ft.add(R.id.fullscreen, fragment, fragment::class.java.name) - ft.addToBackStack(fragment::class.java.name) - ft.commitAllowingStateLoss() + private fun showHiddenFragment(fragment: Fragment) { + val ft = supportFragmentManager.beginTransaction() + ft.setCustomAnimations(R.anim.fade_in_quick, R.anim.fade_out_quick) + val bottomBarFragments = getBottomBarFragments(fragment::class.java.name) + bottomBarFragments.forEach { + ft.hide(it) } + ft.show(fragment) + ft.commitAllowingStateLoss() } + private fun getBottomBarFragments(selectedFragmentName: String): List { + return getBottomNavFragmentNames() + .filter { it != selectedFragmentName } + .mapNotNull { supportFragmentManager.findFragmentByTag(it) } + } //endregion //region Back Stack override fun onBackPressed() { - if(isDrawerOpen) { + if (isDrawerOpen) { closeNavigationDrawer() return } @@ -827,19 +834,48 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. val topFragment = topFragment if (topFragment is ParentFragment) { if (!topFragment.handleBackPressed()) { - super.onBackPressed() + if (isBottomNavFragment(topFragment)) { + handleBottomNavBackStack() + } else { + super.onBackPressed() + } } } else { super.onBackPressed() } } + private fun handleBottomNavBackStack() { + if (bottomNavScreensStack.size == 0) { + finish() + } else if (bottomNavScreensStack.size == 1) { + bottomNavScreensStack.pop() + val previousFragment = supportFragmentManager.findFragmentByTag(navigationBehavior.homeFragmentClass.name) + if (previousFragment != null) { + showHiddenFragment(previousFragment) + applyCurrentFragmentTheme() + } + } else { + bottomNavScreensStack.pop() + val previousFragmentName = bottomNavScreensStack.peek() + val previousFragment = supportFragmentManager.findFragmentByTag(previousFragmentName) + if (previousFragment != null) { + showHiddenFragment(previousFragment) + applyCurrentFragmentTheme() + } + } + } + override val topFragment: Fragment? get() { val stackSize = supportFragmentManager.backStackEntryCount if (stackSize > 0) { - val fragmentTag = supportFragmentManager.getBackStackEntryAt(stackSize - 1).name - return supportFragmentManager.findFragmentByTag(fragmentTag) + val backStackEntryName = supportFragmentManager.getBackStackEntryAt(stackSize - 1).name + return if (backStackEntryName in getBottomNavFragmentNames()) { + currentFragment + } else { + supportFragmentManager.findFragmentByTag(backStackEntryName) + } } return null } @@ -854,7 +890,20 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. return null } - override val currentFragment: Fragment? get() = supportFragmentManager.findFragmentById(R.id.fullscreen) + override val currentFragment: Fragment? + get() { + val fragment = supportFragmentManager.findFragmentById(R.id.fullscreen) + return if (fragment != null && isBottomNavFragment(fragment)) { + val currentFragmentName = bottomNavScreensStack.peek() ?: navigationBehavior.homeFragmentClass.name + supportFragmentManager.findFragmentByTag(currentFragmentName) + } else { + fragment + } + } + + private fun isBottomNavFragment(fragment: Fragment?) = fragment?.arguments?.getBoolean(BOTTOM_NAV_SCREEN) == true + + private fun getBottomNavFragmentNames() = navigationBehavior.bottomNavBarFragments.map { it.name } private fun clearBackStack(cls: Class<*>?) { val fragment = topFragment @@ -944,16 +993,6 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. gauge.tag = gaugeLaunchDefinition } - override fun updateCalendarStartDay() { - //Restarts the CalendarListViewFragment to update the changed start day of the week - val fragment = supportFragmentManager.findFragmentByTag(CalendarFragment::class.java.name) as? ParentFragment - if (fragment != null) { - supportFragmentManager.beginTransaction().remove(fragment).commit() - } - val route = CalendarFragment.makeRoute() - addFragment(CalendarFragment.newInstance(route), route) - } - override fun addBookmark() { val dialog = BookmarkCreationDialog.newInstance(this, topFragment, peekingFragment) dialog?.show(supportFragmentManager, BookmarkCreationDialog::class.java.simpleName) @@ -1047,6 +1086,33 @@ class NavigationActivity : BaseRouterActivity(), Navigation, MasqueradingDialog. toast(R.string.errorOccurred) } + private fun createBottomNavFragment(name: String?): ParentFragment? { + return when (name) { + navigationBehavior.homeFragmentClass.name -> { + val route = navigationBehavior.createHomeFragmentRoute(ApiPrefs.user) + navigationBehavior.createHomeFragment(route) + } + CalendarFragment::class.java.name -> { + val route = CalendarFragment.makeRoute() + CalendarFragment.newInstance(route) + } + ToDoListFragment::class.java.name -> { + val route = ToDoListFragment.makeRoute(ApiPrefs.user!!) + ToDoListFragment.newInstance(route) + } + NotificationListFragment::class.java.name -> { + val route = NotificationListFragment.makeRoute(ApiPrefs.user!!) + NotificationListFragment.newInstance(route) + } + InboxFragment::class.java.name -> { + val route = InboxFragment.makeRoute() + InboxFragment.newInstance(route) + } + NothingToSeeHereFragment::class.java.name -> NothingToSeeHereFragment.newInstance() + else -> null + } + } + companion object { fun createIntent(context: Context, route: Route): Intent { return Intent(context, NavigationActivity::class.java).apply { putExtra(Route.ROUTE, route) } diff --git a/apps/student/src/main/java/com/instructure/student/fragment/FlutterCalendarFragment.kt b/apps/student/src/main/java/com/instructure/student/fragment/FlutterCalendarFragment.kt index 3468d97569..f6953342f8 100644 --- a/apps/student/src/main/java/com/instructure/student/fragment/FlutterCalendarFragment.kt +++ b/apps/student/src/main/java/com/instructure/student/fragment/FlutterCalendarFragment.kt @@ -109,7 +109,9 @@ class FlutterCalendarFragment : FlutterFragment() { // Perform onBackPressed on the FlutterFragment, which will attempt to pop the current route and update // the 'shouldPop' value for future use. - onBackPressed() + if (!shouldPop) { + onBackPressed() + } // If 'shouldPop' was true it means we just popped a CalendarScreen in Flutter and that we should also // allow this fragment to be popped 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 db429acfc6..e7844fdb00 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 @@ -25,11 +25,16 @@ import com.google.android.material.tabs.TabLayout import com.instructure.canvasapi2.models.CanvasContext import com.instructure.interactions.router.Route import com.instructure.pandautils.features.elementary.ElementaryDashboardPagerAdapter +import com.instructure.pandautils.features.elementary.grades.GradesFragment +import com.instructure.pandautils.features.elementary.homeroom.HomeroomFragment +import com.instructure.pandautils.features.elementary.resources.ResourcesFragment +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.isTablet import com.instructure.pandautils.utils.makeBundle import com.instructure.student.R +import com.instructure.student.databinding.FragmentElementaryDashboardBinding import com.instructure.student.fragment.ParentFragment import kotlinx.android.synthetic.main.fragment_course_grid.toolbar import kotlinx.android.synthetic.main.fragment_elementary_dashboard.* @@ -38,6 +43,15 @@ class ElementaryDashboardFragment : ParentFragment() { private val canvasContext by ParcelableArg(key = Const.CANVAS_CONTEXT) + private val schedulePagerFragment = SchedulePagerFragment.newInstance() + + private val fragments = listOf( + HomeroomFragment.newInstance(), + schedulePagerFragment, + GradesFragment.newInstance(), + ResourcesFragment.newInstance() + ) + override fun title(): String = if (isAdded) getString(R.string.dashboard) else "" override fun applyTheme() { @@ -45,23 +59,24 @@ class ElementaryDashboardFragment : ParentFragment() { navigation?.attachNavigationDrawer(this, toolbar) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = - layoutInflater.inflate(R.layout.fragment_elementary_dashboard, container, false) + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val binding = FragmentElementaryDashboardBinding.inflate(inflater, container, false) + binding.lifecycleOwner = this + binding.todayButtonVisibility = schedulePagerFragment.getTodayButtonVisibility() - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + binding.todayButton.setOnClickListener { + schedulePagerFragment.jumpToToday() + } - dashboardPager.adapter = ElementaryDashboardPagerAdapter(canvasContext, childFragmentManager) - dashboardPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) = Unit + binding.dashboardPager.offscreenPageLimit = fragments.size - override fun onPageSelected(position: Int) { - DashboardStateStore.currentPage = position - } + return binding.root + } - override fun onPageScrollStateChanged(state: Int) = Unit + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - }) + dashboardPager.adapter = ElementaryDashboardPagerAdapter(fragments, childFragmentManager) dashboardTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabReselected(tab: TabLayout.Tab?) = Unit @@ -70,12 +85,15 @@ class ElementaryDashboardFragment : ParentFragment() { override fun onTabSelected(tab: TabLayout.Tab?) { tab?.let { dashboardPager.setCurrentItem(it.position, !isTablet) + if (it.position != fragments.indexOf(schedulePagerFragment)) { + todayButton.visibility = View.GONE + } else { + todayButton.visibility = + if (schedulePagerFragment.getTodayButtonVisibility().value == true) View.VISIBLE else View.GONE + } } } }) - - dashboardPager.setCurrentItem(DashboardStateStore.currentPage, false) - dashboardTabLayout.getTabAt(DashboardStateStore.currentPage)?.select() } override fun onHiddenChanged(hidden: Boolean) { @@ -93,9 +111,4 @@ class ElementaryDashboardFragment : ParentFragment() { fun makeRoute(canvasContext: CanvasContext?) = Route(ElementaryDashboardFragment::class.java, canvasContext) } -} - -object DashboardStateStore { - - var currentPage: Int = 0 } \ No newline at end of file diff --git a/apps/student/src/main/res/layout-sw720dp/fragment_elementary_dashboard.xml b/apps/student/src/main/res/layout-sw720dp/fragment_elementary_dashboard.xml index 88e7204b57..3c596cc38e 100644 --- a/apps/student/src/main/res/layout-sw720dp/fragment_elementary_dashboard.xml +++ b/apps/student/src/main/res/layout-sw720dp/fragment_elementary_dashboard.xml @@ -14,82 +14,108 @@ ~ along with this program. If not, see . ~ --> - + xmlns:tools="http://schemas.android.com/tools"> - + - + - + + - + - + android:layout_height="?android:attr/actionBarSize" + android:background="@color/defaultPrimary" + android:elevation="6dp" + app:layout_constraintTop_toTopOf="parent" + app:theme="@style/ToolBarStyle"> - + + + + android:background="@color/white" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbar" + app:tabContentStart="8dp" + app:tabIconTint="@color/tab_layout_icon_tint" + app:tabIndicator="@drawable/tab_bar_indicator" + app:tabIndicatorColor="@color/blueAnnotation" + app:tabIndicatorFullWidth="false" + app:tabIndicatorHeight="3dp" + app:tabInlineLabel="true" + app:tabMode="scrollable" + app:tabPaddingEnd="12dp" + app:tabPaddingStart="8dp" + app:tabSelectedTextColor="@color/blueAnnotation" + app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget" + app:tabTextColor="@color/defaultTextDark"> - + - - - + + + + + + + + + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/apps/student/src/main/res/layout/fragment_elementary_dashboard.xml b/apps/student/src/main/res/layout/fragment_elementary_dashboard.xml index 20fc5e183c..bd1330b2da 100644 --- a/apps/student/src/main/res/layout/fragment_elementary_dashboard.xml +++ b/apps/student/src/main/res/layout/fragment_elementary_dashboard.xml @@ -14,80 +14,106 @@ ~ along with this program. If not, see . ~ --> - + xmlns:tools="http://schemas.android.com/tools"> - + - + - + + - + - + android:layout_height="?android:attr/actionBarSize" + android:background="@color/defaultPrimary" + android:elevation="6dp" + app:layout_constraintTop_toTopOf="parent" + app:theme="@style/ToolBarStyle"> - + + + + android:background="@color/white" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbar" + app:tabContentStart="16dp" + app:tabIconTint="@color/tab_layout_icon_tint" + app:tabIndicator="@drawable/tab_bar_indicator" + app:tabIndicatorColor="@color/blueAnnotation" + app:tabIndicatorFullWidth="false" + app:tabIndicatorHeight="3dp" + app:tabInlineLabel="true" + app:tabMode="scrollable" + app:tabPaddingEnd="12dp" + app:tabPaddingStart="8dp" + app:tabSelectedTextColor="@color/blueAnnotation" + app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget" + app:tabTextColor="@color/defaultTextDark"> - + - + - + + + + + + + + + - \ No newline at end of file + + \ No newline at end of file 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 47cecb3246..451a908904 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 @@ -461,7 +461,11 @@ class EditAssignmentDetailsFragment : BaseFragment() { } catch (e: Throwable) { saveButton?.setVisible() savingProgressBar.setGone() - toast(R.string.error_saving_assignment) + if (mAssignment.inClosedGradingPeriod) { + toast(R.string.error_saving_assignment_closed_grading_period) + } else { + toast(R.string.error_saving_assignment) + } } } } diff --git a/apps/teacher/src/main/java/com/instructure/teacher/view/grade_slider/SpeedGraderSlider.kt b/apps/teacher/src/main/java/com/instructure/teacher/view/grade_slider/SpeedGraderSlider.kt index 6e45e44609..2ae9f95e2c 100644 --- a/apps/teacher/src/main/java/com/instructure/teacher/view/grade_slider/SpeedGraderSlider.kt +++ b/apps/teacher/src/main/java/com/instructure/teacher/view/grade_slider/SpeedGraderSlider.kt @@ -36,7 +36,7 @@ import kotlin.math.roundToInt import kotlin.properties.Delegates class SpeedGraderSlider @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { var onGradeChanged: (String, Boolean) -> Unit by Delegates.notNull() @@ -44,6 +44,7 @@ class SpeedGraderSlider @JvmOverloads constructor( private lateinit var assignment: Assignment private var submission: Submission? = null private lateinit var assignee: Assignee + private var maxGradeValue: Int = 0 private var isExcused: Boolean = false private var notGraded: Boolean = false @@ -68,7 +69,25 @@ class SpeedGraderSlider @JvmOverloads constructor( accessibleTouchTarget() } - slider.max = 0 + minGrade.apply { + setOnClickListener { + updateGrade(0) + notGraded = false + isExcused = false + } + accessibleTouchTarget() + } + + maxGrade.apply { + setOnClickListener { + updateGrade(maxGradeValue) + notGraded = false + isExcused = false + } + accessibleTouchTarget() + } + + slider.max = maxGradeValue } fun setData(assignment: Assignment, submission: Submission?, assignee: Assignee) { @@ -111,17 +130,26 @@ class SpeedGraderSlider @JvmOverloads constructor( pointsPossibleView.setGone() } slider.progress = this.submission?.score?.div(this.assignment.pointsPossible)?.times(100)?.toInt() - ?: 0 + ?: 0 minGrade.text = "0%" } + maxGradeValue = slider.max + slider.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (!isExcused && !notGraded) { if (assignment.gradingType?.let { Assignment.getGradingTypeFromAPIString(it) } == Assignment.GradingType.PERCENT) { - EventBus.getDefault().post(ShowSliderGradeEvent(seekBar, this@SpeedGraderSlider.assignee.id, "$progress%")) + EventBus.getDefault() + .post(ShowSliderGradeEvent(seekBar, this@SpeedGraderSlider.assignee.id, "$progress%")) } else { - EventBus.getDefault().post(ShowSliderGradeEvent(seekBar, this@SpeedGraderSlider.assignee.id, progress.toString())) + EventBus.getDefault().post( + ShowSliderGradeEvent( + seekBar, + this@SpeedGraderSlider.assignee.id, + progress.toString() + ) + ) } } @@ -188,7 +216,8 @@ class SpeedGraderSlider @JvmOverloads constructor( val label: String if (assignment.gradingType?.let { Assignment.getGradingTypeFromAPIString(it) } == Assignment.GradingType.POINTS) { - anchorRect.left = anchorRect.left + slider.paddingLeft + (this.assignment.pointsPossible.toInt() * stepWidth).roundToInt() + anchorRect.left = + anchorRect.left + slider.paddingLeft + (this.assignment.pointsPossible.toInt() * stepWidth).roundToInt() label = NumberHelper.formatDecimal(this.assignment.pointsPossible, 0, true) } else { anchorRect.left = anchorRect.left + slider.paddingLeft + width / 2 diff --git a/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/Assignment.kt b/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/Assignment.kt index 0eb75ac813..4095fa0d94 100644 --- a/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/Assignment.kt +++ b/libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/Assignment.kt @@ -103,7 +103,9 @@ data class Assignment( val externalToolAttributes: ExternalToolAttributes? = null, @SerializedName("planner_override") val plannerOverride: PlannerOverride? = null, - var isStudioEnabled: Boolean = false + var isStudioEnabled: Boolean = false, + @SerializedName("in_closed_grading_period") + val inClosedGradingPeriod: Boolean = false ) : CanvasModel() { override val comparisonDate get() = dueDate override val comparisonString get() = dueAt diff --git a/libs/interactions/src/main/java/com/instructure/interactions/Navigation.kt b/libs/interactions/src/main/java/com/instructure/interactions/Navigation.kt index 417b8337dc..cb4f8288ae 100644 --- a/libs/interactions/src/main/java/com/instructure/interactions/Navigation.kt +++ b/libs/interactions/src/main/java/com/instructure/interactions/Navigation.kt @@ -25,7 +25,6 @@ interface Navigation { val currentFragment: Fragment? fun popCurrentFragment() - fun updateCalendarStartDay() fun addBookmark() fun canBookmark(): Boolean diff --git a/libs/pandares/src/main/res/drawable/ic_jump_to_today.xml b/libs/pandares/src/main/res/drawable/ic_jump_to_today.xml new file mode 100644 index 0000000000..2cc4087ebd --- /dev/null +++ b/libs/pandares/src/main/res/drawable/ic_jump_to_today.xml @@ -0,0 +1,10 @@ + + + diff --git a/libs/pandares/src/main/res/values-ar/strings.xml b/libs/pandares/src/main/res/values-ar/strings.xml index ef7889eab5..69f58d9a2e 100644 --- a/libs/pandares/src/main/res/values-ar/strings.xml +++ b/libs/pandares/src/main/res/values-ar/strings.xml @@ -15,6 +15,7 @@ ~ --> + لم يتم العثور على الملفات البحث عن ملفات أدخل مصطلح بحث يحتوي على ثلاثة أحرف أو أكثر @@ -35,7 +36,6 @@ المحدد: %s - تفاصيل المهمة أنواع الإرسال @@ -1097,7 +1097,6 @@ - اختر الرأس: %s اختر الجسم: %s اختر القدم: %s @@ -1238,7 +1237,6 @@ مرحبًا! تظهر الموضوعات هنا. ليس لديك موضوعات في الوقت الحالي. - طريقة عرض المدارس الابتدائية يتطلب إعادة تشغيل التطبيق تحديد تحديد فترة التقييم @@ -1252,6 +1250,17 @@ التقديرات غير متاحة جلسة التسجيل + عرض جلسة التسجيل + الروابط الهامة + تقديمات الطالب + معلومات الاتصال الخاصة بالعاملين + اختر مساقًا + الروابط الهامة + المعلم + المعلم المساعد + مواردك تظهر هنا. + فشل تحميل الموارد + فشل تحديث الموارد فتح طريقة عرض بديلة أكثر سهولة المتلقون diff --git a/libs/pandares/src/main/res/values-b+da+instk12/strings.xml b/libs/pandares/src/main/res/values-b+da+instk12/strings.xml index ca7cdc15c1..851c6c2122 100644 --- a/libs/pandares/src/main/res/values-b+da+instk12/strings.xml +++ b/libs/pandares/src/main/res/values-b+da+instk12/strings.xml @@ -15,6 +15,7 @@ ~ --> + Ingen filer fundet Søg filer Indtast et søgeord med tre eller flere tegn @@ -32,7 +33,6 @@ Valgt: %s - Opgaveoplysninger Afleveringstyper @@ -1046,7 +1046,6 @@ - Valgt hoved: %s Valgt krop: %s Valgte fødder: %s @@ -1183,7 +1182,6 @@ Velkommen! Dine emner vises her. Du har i øjeblikket ingen emner. - Folkeskole-visning Kræver genstart af app Vælg Vælg vurderingsperiode @@ -1197,6 +1195,17 @@ Vurderinger ikke tilgængelige Klasselokale + Klasseværelsevisning + Vigtige links + Applikationer for elev + Kontaktoplysninger for personale + Vælg et fag + Vigtige links + Lærer + Undervisningsassistent + Dine ressourcer vises her. + Kunne ikke indlæse ressourcer + Kunne ikke opdatere ressourcer Åbn en mere tilgængelig alternativ visning Modtagere diff --git a/libs/pandares/src/main/res/values-b+en+AU+unimelb/strings.xml b/libs/pandares/src/main/res/values-b+en+AU+unimelb/strings.xml index 9d461921f1..7eb9f67485 100644 --- a/libs/pandares/src/main/res/values-b+en+AU+unimelb/strings.xml +++ b/libs/pandares/src/main/res/values-b+en+AU+unimelb/strings.xml @@ -15,6 +15,7 @@ ~ --> + No Files Found Search files Enter a search term with three or more characters @@ -32,7 +33,6 @@ Selected: %s - Assignment Details Submission Types @@ -1046,7 +1046,6 @@ - Chosen head: %s Chosen body: %s Chosen feet: %s @@ -1183,7 +1182,6 @@ Welcome! Your topics show up here. You currently have no topics. - Elementary View Requires app restart Select Select Grading Period @@ -1197,6 +1195,17 @@ Grades not available Homeroom + Homeroom View + Important Links + Student Applications + Staff Contact Info + Choose a Subject + Important Links + Instructor + Tutor + Your resources show up here. + Failed to load resources + Failed to refresh resources Open a more accessible alternative view Recipients diff --git a/libs/pandares/src/main/res/values-b+nb+instk12/strings.xml b/libs/pandares/src/main/res/values-b+nb+instk12/strings.xml index ed30559bb0..abf4ccb63d 100644 --- a/libs/pandares/src/main/res/values-b+nb+instk12/strings.xml +++ b/libs/pandares/src/main/res/values-b+nb+instk12/strings.xml @@ -15,6 +15,7 @@ ~ --> + Fant ingen filer Søk i filer Skriv inn en søkeord med tre eller flere tegn @@ -32,7 +33,6 @@ Valgt: %s - Oppgavedetaljer Innleveringstyper @@ -1046,7 +1046,6 @@ - Valgt hode: %s Valgt kropp: %s Valgte føtter: %s @@ -1183,7 +1182,6 @@ Velkommen! Fagene dine vises her. Du har for øyeblikket ingen fag. - Grunnskolevisning Krever omstart av appen Velg Velg vurderingsperiode @@ -1197,6 +1195,17 @@ Vurderingerer er ikke tilgjengelig Hjem + Vis hjemmerom + Viktige lenker + Elev-applikasjoner + Kontaktinformasjon personale + Velg et fag + Viktige lenker + Lærer + Lærerassistent + Ressusrene dine vises her. + Kunne ikke laste opp ressurser + Kunne ikke oppdatere ressurser Åpne en mer tilgjengelig alternativ visning Mottakere diff --git a/libs/pandares/src/main/res/values-b+sv+instk12/strings.xml b/libs/pandares/src/main/res/values-b+sv+instk12/strings.xml index 5f46679215..c360246ff2 100644 --- a/libs/pandares/src/main/res/values-b+sv+instk12/strings.xml +++ b/libs/pandares/src/main/res/values-b+sv+instk12/strings.xml @@ -15,6 +15,7 @@ ~ --> + Inga filer hittades Sök i filer Ange en sökterm med tre eller fler tecken @@ -32,7 +33,6 @@ Valda: %s - Uppgiftsdetaljer Inlämningstyper @@ -1046,7 +1046,6 @@ - Vald rubrik: %s Vald brödtext: %s Vald fotnot: %s @@ -1183,7 +1182,6 @@ Välkommen! Dina ämnen visas här. Du har inga ämnen för närvarande. - Elementary-vy Kräver omstart av appen Välj Välj bedömningsperiod @@ -1197,6 +1195,17 @@ Bedömningar är inte tillgängliga Hemrum + Vy för fjärrundervisningsrum + Viktiga länkar + Elev-applikationer + Kontaktuppgifter för personal + Välj en kurs + Viktiga länkar + Lärare + Lärarassistent + Dina resurser visas här. + Det gick inte att läsa in resurser + Det gick inte att uppdatera resurser Öppna en mer tillgänglig alternativ vy Mottagare diff --git a/libs/pandares/src/main/res/values-ca/strings.xml b/libs/pandares/src/main/res/values-ca/strings.xml index b89f223301..1bc293502c 100644 --- a/libs/pandares/src/main/res/values-ca/strings.xml +++ b/libs/pandares/src/main/res/values-ca/strings.xml @@ -15,6 +15,7 @@ ~ --> + No s\'ha trobat cap fitxer Cerca fitxers Introduïu un terme de cerca de tres o més caràcters @@ -32,7 +33,6 @@ Seleccionat: %s - Detalls de la tasca Tipus d\'entrega @@ -1046,7 +1046,6 @@ - Cap triat: %s Cos triat: %s Peus triats: %s @@ -1183,7 +1182,6 @@ Us donem la benvinguda! Les vostres matèries es mostren aquí. En aquest moment, no teniu cap matèria. - Vista elemental Heu de reiniciar l’aplicació. Selecciona Selecciona el període de qualificació @@ -1197,6 +1195,17 @@ No hi cap qualificació disponible Tutoria + Vista de la tutoria. + Enllaços importants + Sol·licituds dels estudiants + Informació de contacte del personal + Tria un curs + Enllaços importants + Professor + Auxiliar de professor + Els vostres recursos es mostren aquí. + No s\'han pogut carregar els recursos + No s\'han pogut actualitzar els recursos Obriu una visualització alternativa més accessible Destinataris diff --git a/libs/pandares/src/main/res/values-cy/strings.xml b/libs/pandares/src/main/res/values-cy/strings.xml index c6ae2bb0fd..cba13db359 100644 --- a/libs/pandares/src/main/res/values-cy/strings.xml +++ b/libs/pandares/src/main/res/values-cy/strings.xml @@ -15,6 +15,7 @@ ~ --> + Heb ddod o hyd i unrhyw ffeiliau Chwilio ffeiliau Rhowch derm chwilio sy’n cynnwys tri nod neu fwy @@ -32,7 +33,6 @@ Wedi dewis: %s - Manylion Aseiniad Mathau o Gyflwyniadau @@ -1046,7 +1046,6 @@ - Dewis pen: %s Dewis corff: %s Dewis traed: %s @@ -1183,7 +1182,6 @@ Croeso! Mae eich pynciau’n ymddangos yma. Does gennych chi ddim pynciau ar hyn o bryd. - Gwedd Sylfaenol Mae angen ailddechrau’r ap Dewiswch Dewis Cyfnod Graddio @@ -1197,6 +1195,17 @@ Graddau ddim ar gael Ystafell hafan + Gwedd Homeroom + Dolenni Pwysig + Ceisiadau Myfyriwr + Manylion Cyswllt Staff + Dewis Cwrs + Dolenni Pwysig + Athro + Cynorthwyydd Dysgu + Mae eich adnoddau’n ymddangos yma. + Wedi methu llwytho adnoddau + Wedi methu adnewyddu’r adnoddau Agor gwedd arall fwy hygyrch Derbynwyr diff --git a/libs/pandares/src/main/res/values-da/strings.xml b/libs/pandares/src/main/res/values-da/strings.xml index fb7d732609..0d6821981e 100644 --- a/libs/pandares/src/main/res/values-da/strings.xml +++ b/libs/pandares/src/main/res/values-da/strings.xml @@ -15,6 +15,7 @@ ~ --> + Ingen filer fundet Søg filer Indtast et søgeord med tre eller flere tegn @@ -32,7 +33,6 @@ Valgt: %s - Opgaveoplysninger Afleveringsformer @@ -1046,7 +1046,6 @@ - Valgt hoved: %s Valgt krop: %s Valgte fødder: %s @@ -1183,7 +1182,6 @@ Velkommen! Dine emner vises her. Du har i øjeblikket ingen emner. - Folkeskole-visning Kræver genstart af app Vælg Vælg karakterperiode @@ -1197,6 +1195,17 @@ Karakterer ikke tilgængelige Klasselokale + Klasseværelsevisning + Vigtige links + Applikationer for studerende + Kontaktoplysninger for personale + Vælg et fag + Vigtige links + Lærer + Undervisningsassistent + Dine ressourcer vises her. + Kunne ikke indlæse ressourcer + Kunne ikke opdatere ressourcer Åbn en mere tilgængelig alternativ visning Modtagere diff --git a/libs/pandares/src/main/res/values-de/strings.xml b/libs/pandares/src/main/res/values-de/strings.xml index 15f2662201..c31728f9f5 100644 --- a/libs/pandares/src/main/res/values-de/strings.xml +++ b/libs/pandares/src/main/res/values-de/strings.xml @@ -15,6 +15,7 @@ ~ --> + Es wurden keine Dateien gefunden. Dateien suchen Geben Sie einen Suchbegriff mit drei oder mehr Zeichen ein. @@ -32,7 +33,6 @@ Ausgewählt: %s - Aufgabendetails Abgabearten @@ -1046,7 +1046,6 @@ - Gewählte Kopfzeile: %s Gewählter Text: %s Gewählte Fußzeile: %s @@ -1183,7 +1182,6 @@ Willkommen! Ihre Fächer werden hier angezeigt. Zurzeit haben Sie keine Themen. - Elementare Ansicht Erfordert Neustart der App Auswählen Benotungszeitraum auswählen @@ -1197,6 +1195,17 @@ Noten nicht verfügbar Organisationsstunde + Organisationsstundenansicht + Wichtige Links + Anwendungen für Studenten + Mitarbeiterkontakt-Info + Einen Kurs auswählen + Wichtige Links + Lehrer + Lehrassistent + Ihre Ressourcen werden hier angezeigt. + Ressourcen konnten nicht geladen werden + Ressourcen konnten nicht aktualisiert werden Eine leichter zugängliche, alternative Ansicht öffnen Empfänger diff --git a/libs/pandares/src/main/res/values-en-rAU/strings.xml b/libs/pandares/src/main/res/values-en-rAU/strings.xml index 1c8b761a35..e2fdc62e38 100644 --- a/libs/pandares/src/main/res/values-en-rAU/strings.xml +++ b/libs/pandares/src/main/res/values-en-rAU/strings.xml @@ -15,6 +15,7 @@ ~ --> + No Files Found Search files Enter a search term with three or more characters @@ -32,7 +33,6 @@ Selected: %s - Assignment Details Submission Types @@ -1046,7 +1046,6 @@ - Chosen head: %s Chosen body: %s Chosen feet: %s @@ -1183,7 +1182,6 @@ Welcome! Your subjects show up here. You currently have no subjects. - Elementary View Requires app restart Select Select Grading Period @@ -1197,6 +1195,17 @@ Grades not available Homeroom + Homeroom View + Important Links + Student Applications + Staff Contact Info + Choose a Course + Important Links + Teacher + Teaching Assistant + Your resources show up here. + Failed to load resources + Failed to refresh resources Open a more accessible alternative view Recipients diff --git a/libs/pandares/src/main/res/values-en-rCA/strings.xml b/libs/pandares/src/main/res/values-en-rCA/strings.xml index 668023ae26..4476d3a3a0 100644 --- a/libs/pandares/src/main/res/values-en-rCA/strings.xml +++ b/libs/pandares/src/main/res/values-en-rCA/strings.xml @@ -1183,7 +1183,6 @@ Welcome! Your subjects show up here. You currently have no subjects. - Elementary View Requires app restart Select Select Grading Period @@ -1196,6 +1195,17 @@ Change grading period Grades not available Homeroom + Homeroom View + Important Links + Student Applications + Staff Contact Info + Choose a Course + Important Links + Teacher + Teaching Assistant + Your resources show up here. + Failed to load resources + Failed to refresh resources Open a more accessible alternative view diff --git a/libs/pandares/src/main/res/values-en-rCY/strings.xml b/libs/pandares/src/main/res/values-en-rCY/strings.xml index 7c38cbc861..f0f137853f 100644 --- a/libs/pandares/src/main/res/values-en-rCY/strings.xml +++ b/libs/pandares/src/main/res/values-en-rCY/strings.xml @@ -15,6 +15,7 @@ ~ --> + No Files Found Search files Enter a search term with three or more characters @@ -32,7 +33,6 @@ Selected: %s - Assignment details Submission types @@ -1046,7 +1046,6 @@ - Chosen head: %s Chosen body: %s Chosen feet: %s @@ -1183,7 +1182,6 @@ Welcome! Your subjects show up here. You currently have no subjects. - Elementary View Requires app restart Select Select Grading Period @@ -1197,6 +1195,17 @@ Grades not available Homeroom + Homeroom View + Important Links + Student Applications + Staff Contact Info + Choose a Module + Important Links + Teacher + Teaching Assistant + Your resources show up here. + Failed to load resources + Failed to refresh resources Open a more accessible alternative view Recipients diff --git a/libs/pandares/src/main/res/values-en-rGB/strings.xml b/libs/pandares/src/main/res/values-en-rGB/strings.xml index d385ceaa69..1b6933e87a 100644 --- a/libs/pandares/src/main/res/values-en-rGB/strings.xml +++ b/libs/pandares/src/main/res/values-en-rGB/strings.xml @@ -15,6 +15,7 @@ ~ --> + No Files Found Search files Enter a search term with three or more characters @@ -32,7 +33,6 @@ Selected: %s - Assignment details Submission types @@ -1046,7 +1046,6 @@ - Chosen head: %s Chosen body: %s Chosen feet: %s @@ -1183,7 +1182,6 @@ Welcome! Your subjects show up here. You currently have no subjects. - Elementary View Requires app restart Select Select Grading Period @@ -1197,6 +1195,17 @@ Grades not available Homeroom + Homeroom View + Important Links + Student Applications + Staff Contact Info + Choose a Course + Important Links + Teacher + Teaching Assistant + Your resources show up here. + Failed to load resources + Failed to refresh resources Open a more accessible alternative view Recipients diff --git a/libs/pandares/src/main/res/values-es/strings.xml b/libs/pandares/src/main/res/values-es/strings.xml index f8d69e7fe4..610c7afa98 100644 --- a/libs/pandares/src/main/res/values-es/strings.xml +++ b/libs/pandares/src/main/res/values-es/strings.xml @@ -15,6 +15,7 @@ ~ --> + No se encontraron archivos Buscar archivos Ingrese un término de búsqueda con tres o más caracteres @@ -32,7 +33,6 @@ Seleccionado: %s - Detalles de la tarea Tipos de entrega @@ -1046,7 +1046,6 @@ - Cabeza seleccionada: %s Cuerpo seleccionado: %s Pies seleccionados: %s @@ -1183,7 +1182,6 @@ ¡Bienvenido! Sus materias se muestran aquí. No tiene materias actualmente. - Vista de primaria Requiere reiniciar la aplicación Seleccionar Seleccionar Período de Calificación @@ -1197,6 +1195,17 @@ No hay calificaciones disponibles Aula principal + Vista del aula + Enlaces importantes + Solicitudes del alumno + Información de contacto del personal + Elegir un curso + Enlaces importantes + Profesor + Profesor asistente + Sus recursos se muestran aquí. + No se pudieron cargar los recursos + No se pudieron actualizar los recursos Abrir una vista alternativa más accesible Destinatarios diff --git a/libs/pandares/src/main/res/values-fi/strings.xml b/libs/pandares/src/main/res/values-fi/strings.xml index 9bbae7c15c..260a17bd02 100644 --- a/libs/pandares/src/main/res/values-fi/strings.xml +++ b/libs/pandares/src/main/res/values-fi/strings.xml @@ -15,6 +15,7 @@ ~ --> + Tiedostoja ei löytynyt Tiedostojen etsiminen Syötä hakutermi, jossa on vähintään kolme merkkiä @@ -32,7 +33,6 @@ Valittu: %s - Tehtävän tiedot Lähetystyypit @@ -1046,7 +1046,6 @@ - Valittu pää: %s Valittu keho: %s Valitut jalat: %s @@ -1183,7 +1182,6 @@ Tervetuloa! Aiheesi näkyvät täällä. Sinulla ei tällä hetkellä ole aiheita. - Elementary-näkymä Vaatii sovelluksen uudelleenkäynnistyksen Valitse Valitse arvosanojen antojakso @@ -1197,6 +1195,17 @@ Arvosanat eivät ole käytettävissä Homeroom + Homeroom-näkymä + Tärkeitä linkkejä + Opiskeluhakemukset + Henkilökunnan yhteistiedot + Valitse kurssi + Tärkeitä linkkejä + Opettaja + Apuopettaja + Resurssisi näkyvät täällä. + Resurssien lataus epäonnistui + Resurssien päivitys epäonnistui Avaa lähestyttävämpi vaihtoehtoinen näkymä Vastaanottajat diff --git a/libs/pandares/src/main/res/values-fr-rCA/strings.xml b/libs/pandares/src/main/res/values-fr-rCA/strings.xml index fdbde2770a..e8a26f722b 100644 --- a/libs/pandares/src/main/res/values-fr-rCA/strings.xml +++ b/libs/pandares/src/main/res/values-fr-rCA/strings.xml @@ -15,6 +15,7 @@ ~ --> + Aucun fichier trouvé Chercher des fichiers Indiquez un élément à rechercher comprenant au moins trois caractères @@ -32,7 +33,6 @@ Sélectionné : %s - Détails de la tâche Types d’envoi @@ -1046,7 +1046,6 @@ - Entête choisi : %s Corps choisi : %s Pied de page choisi : %s @@ -1183,7 +1182,6 @@ Bienvenue! Vos sujets apparaissent ici. Vous n’avez actuellement aucun sujet. - Vue élémentaire Redémarrage de l\'application requis Sélectionner Choisir la période de notation @@ -1197,6 +1195,17 @@ Notes non disponibles Classe titulaire + Vue de la salle d’accueil + Liens importants + Dossiers de l’étudiant + Coordonnées du personnel + Choisir un cours + Liens importants + Enseignant + Assistants d’enseignement + Vos ressources apparaissent ici. + Échec lors du chargement de ressource + Échec lors de l’actualisation des ressources Ouvrir une vue alternative plus accessible Destinataires diff --git a/libs/pandares/src/main/res/values-fr/strings.xml b/libs/pandares/src/main/res/values-fr/strings.xml index 09b6d81e3a..0f40060f14 100644 --- a/libs/pandares/src/main/res/values-fr/strings.xml +++ b/libs/pandares/src/main/res/values-fr/strings.xml @@ -15,6 +15,7 @@ ~ --> + Aucun fichier trouvé Rechercher des fichiers Saisissez un terme de recherche de trois caractères ou davantage @@ -32,7 +33,6 @@ Sélectionné : %s - Informations sur le devoir Types de soumission @@ -1046,7 +1046,6 @@ - Tête sélectionnée : %s Corps sélectionné : %s Pieds sélectionnés : %s @@ -1183,7 +1182,6 @@ Bienvenue ! Vos sujets s\'affichent ici. Vous n\'avez actuellement aucun sujet. - Vue élémentaire Nécessite de redémarrer l’application Sélectionner Sélectionner la période de notation @@ -1197,6 +1195,17 @@ Notes indisponibles Salle d\'accueil + Vue de la classe d’attache + Liens importants + Applications des élèves + Coordonnées du personnel + Choisir un cours + Liens importants + Enseignant + Assistant d\'enseignement + Vos ressources s\'affichent ici + Échec du chargement des ressources + Échec de l\'actualisation des ressources Ouvrir une vue alternative plus accessible Destinataires diff --git a/libs/pandares/src/main/res/values-ht/strings.xml b/libs/pandares/src/main/res/values-ht/strings.xml index 6965107d39..f0ba4c395e 100644 --- a/libs/pandares/src/main/res/values-ht/strings.xml +++ b/libs/pandares/src/main/res/values-ht/strings.xml @@ -15,6 +15,7 @@ ~ --> + Yo pa Jwenn Okenn Fichye Rechèch fichye Antre yon tèm rechèch ki gen pou pi piti twa karaktè @@ -32,7 +33,6 @@ Seleksyone: %s - Detay Sesyon Tip Soumisyon @@ -1046,7 +1046,6 @@ - Antèt chwazi: %s Kò chwazi: %s Pye chwazi: %s @@ -1183,7 +1182,6 @@ Bienveni! Matyè ou yo afiche la a. Pou kounye a ou pa gen matyè. - Afichaj Elemantè App la bezwen redemare Seleksyone Seleksyone Peryòd Klasman @@ -1197,6 +1195,17 @@ Nòt pa disponib Sal kou + Apèsi Sal la + Lyen Enpòtan + Aplikasyon Elèv + Kontakte Anplwaye + Chwazi yon Kou + Lyen Enpòtan + Pwofesè + Asistan Pwofesè + Resous ou yo ap afiche la a. + Enposib pou chaje resous yo + Enposib pou aktyalize resous yo Ouvri yon lòt afichaj ki pi aksesib Destinatè diff --git a/libs/pandares/src/main/res/values-is/strings.xml b/libs/pandares/src/main/res/values-is/strings.xml index e8c47aa1d6..00a0d241d5 100644 --- a/libs/pandares/src/main/res/values-is/strings.xml +++ b/libs/pandares/src/main/res/values-is/strings.xml @@ -15,6 +15,7 @@ ~ --> + Engar skrár fundust Leita í skrám Skráðu leitarorð sem er þrír stafir eða lengra @@ -32,7 +33,6 @@ Valið: %s - Upplýsingar um verkefni Tegundir skila @@ -1046,7 +1046,6 @@ - Valinn haus: %s Valið meginmál: %s Valinn fótur: %s @@ -1183,7 +1182,6 @@ Velkomin(n)! Efni þitt sést hér. Þú hefur engin efni eins og er. - Grunnsýn Krefst endurræsingar á forritinu Velja Velja einkunnatímabil @@ -1197,6 +1195,17 @@ Einkunnir ekki í boði Námssalur + Yfirlit yfir námssal + Mikilvægir tenglar + Forrit nemenda + Samskiptaupplýsingar starfsfólks + Velja námskeið + Mikilvægir tenglar + Kennari + Aðstoðarkennari + Auðlindir þínar sjást hér. + Mistókst að hlaða auðlindum + Mistókst að endurglæða auðlindir Opnið annað auðveldara útlit Viðtakendur diff --git a/libs/pandares/src/main/res/values-it/strings.xml b/libs/pandares/src/main/res/values-it/strings.xml index a8921e852d..b61e257b2c 100644 --- a/libs/pandares/src/main/res/values-it/strings.xml +++ b/libs/pandares/src/main/res/values-it/strings.xml @@ -15,6 +15,7 @@ ~ --> + Nessun file trovato Cerca file Inserisci un termine di ricerca con tre caratteri o più @@ -32,7 +33,6 @@ Selezionato: %s - Dettagli compiti Tipi di consegna @@ -1046,7 +1046,6 @@ - Testa scelta: %s Corpo scelto: %s Piedi scelti: %s @@ -1183,7 +1182,6 @@ Benvenuto! Le materie sono visualizzate qui. Attualmente non hai materie. - Visualizzazione elementare Richiede il riavvio dell’app Seleziona Seleziona Periodo di valutazione @@ -1197,6 +1195,17 @@ Voti non disponibili Homeroom + Visualizzazione homeroom + Link importanti + Applicazioni studente + Informazioni di contatto del personale + Scegli un corso + Link importanti + Insegnante + Assistente del docente + Le tue risorse vengono visualizzate qui + Impossibile caricare le risorse + Impossibile aggiornare le risorsa Apri una vista alternativa più accessibile Destinatari diff --git a/libs/pandares/src/main/res/values-ja/strings.xml b/libs/pandares/src/main/res/values-ja/strings.xml index fde5d0626f..bd1bebd5de 100644 --- a/libs/pandares/src/main/res/values-ja/strings.xml +++ b/libs/pandares/src/main/res/values-ja/strings.xml @@ -15,6 +15,7 @@ ~ --> + ファイルが見つかりません ファイルを検索する 3文字以上の検索語を入力してください @@ -31,7 +32,6 @@ 選択されたもの:%s - 課題の詳細 提出タイプ @@ -1033,7 +1033,6 @@ - 選択した頭部:%s 選択したボディ:%s 選択した足:%s @@ -1169,7 +1168,6 @@ どういたしまして! あなたの科目はここに表示されます。 現在、科目はありません。 - エレメンタリービュー アプリの再起動が必要 選択 採点期間を選択 @@ -1183,6 +1181,17 @@ 利用可能な成績なし ホームルーム + ホームルームビュー + 重要なリンク + 生徒アプリケーション + スタッフの連絡先情報 + コースを選択する + 重要なリンク + 講師 + 講師の助手 + あなたリソースはここに表示されます。 + リソース読み込みに失敗 + リソース更新に失敗 よりアクセスしやすい代替ビューを開く 受信者 diff --git a/libs/pandares/src/main/res/values-mi/strings.xml b/libs/pandares/src/main/res/values-mi/strings.xml index 098feeb9c3..3a4412e013 100644 --- a/libs/pandares/src/main/res/values-mi/strings.xml +++ b/libs/pandares/src/main/res/values-mi/strings.xml @@ -15,6 +15,7 @@ ~ --> + Kaore ngā kōnae e kitea Rapu ngā kōnae Whakauruhia he kupu rapu me te toru neke atu rānei o nga pūāhua @@ -32,7 +33,6 @@ Kua tīpakohia: %s - Taipitopito whakataunga Ngā momo tāpaetanga @@ -1046,7 +1046,6 @@ - Ūpoko i tohua: %s Tinana i tohua: %s Waewae i tohua: %s @@ -1183,7 +1182,6 @@ Nau Mai! Ka kitea ō marau i konei. Kaore koe e whiwhi marau i tēnei wā. - Tiro Tuatahi E hiahia taupanga timata Tīpakohia Tīpakohia te Kōeke Wā @@ -1197,6 +1195,17 @@ Kāore ngā kōeke i te wātea Kainga rūma + Kainga rūma Tiro + Ngā Hono Mea Nui + Ākonga Tono + Kaimahi Whakapā Pūrongo + Kōwhiri he Akoranga + Ngā Hono Mea Nui + Kaiako + Kaiako Kaiāwhina + Ka kitea ō rauemi i konei. + I rahua te uta i ngā rauemi + I rāhua te whakahou i ngā rauemi Huaki he wāhanga whakauru ngāwari mo tētahi tiro atu Ngā Kaiwhiwhi diff --git a/libs/pandares/src/main/res/values-nb/strings.xml b/libs/pandares/src/main/res/values-nb/strings.xml index 97d62bc923..8a4a5831a1 100644 --- a/libs/pandares/src/main/res/values-nb/strings.xml +++ b/libs/pandares/src/main/res/values-nb/strings.xml @@ -15,6 +15,7 @@ ~ --> + Fant ingen filer Søk i filer Skriv inn en søkeord med tre eller flere tegn @@ -32,7 +33,6 @@ Valgt: %s - Oppgavedetaljer Innleveringstyper @@ -1046,7 +1046,6 @@ - Valgt hode: %s Valgt kropp: %s Valgte føtter: %s @@ -1183,7 +1182,6 @@ Velkommen! Emnene dine vises her. Du har for øyeblikket ingen emner. - Grunnskolevisning Krever omstart av appen Velg Velg vurderingsperiode @@ -1197,6 +1195,17 @@ Karakterer er ikke tilgjengelig Hjem + Vis hjemmerom + Viktige lenker + Studentsøknader + Kontaktinformasjon personale + Velg et emne + Viktige lenker + Lærer + Lærerassistent + Ressusrene dine vises her. + Kunne ikke laste opp ressurser + Kunne ikke oppdatere ressurser Åpne en mer tilgjengelig alternativ visning Mottakere diff --git a/libs/pandares/src/main/res/values-nl/strings.xml b/libs/pandares/src/main/res/values-nl/strings.xml index 56bd0c973e..f666c72ca7 100644 --- a/libs/pandares/src/main/res/values-nl/strings.xml +++ b/libs/pandares/src/main/res/values-nl/strings.xml @@ -15,6 +15,7 @@ ~ --> + Geen bestanden gevonden Bestanden zoeken Voer een zoekterm van drie of meer tekens in. @@ -32,7 +33,6 @@ Geselecteerd: %s - Opdrachtdetails Inleveringstypen @@ -1046,7 +1046,6 @@ - Gekozen kop: %s Gekozen hoofdtekst: %s Gekozen voettekst: %s @@ -1183,7 +1182,6 @@ Welkom! Je vakken worden hier getoond. Je hebt momenteel geen vakken. - Elementaire weergave Vereist herstarten van app Selecteren Beoordelingsperiode selecteren @@ -1197,6 +1195,17 @@ Cijfers niet beschikbaar Klas + Huisklasweergave + Belangrijke links + Cursistapplicaties + Contactgegevens van medewerkers + Een cursus kiezen + Belangrijke links + Docent + Onderwijsassistent + Je bronnen worden hier getoond. + Laden van bronnen mislukt + Verversen van bronnen mislukt Open een meer toegankelijke alternatieve weergave Geadresseerden diff --git a/libs/pandares/src/main/res/values-pl/strings.xml b/libs/pandares/src/main/res/values-pl/strings.xml index 4b3d66cd0c..a0874855a2 100644 --- a/libs/pandares/src/main/res/values-pl/strings.xml +++ b/libs/pandares/src/main/res/values-pl/strings.xml @@ -15,6 +15,7 @@ ~ --> + Nie odnaleziono żadnych plików Wyszukaj pliki Wprowadź szukany termin zawierający co najmniej trzy znaki @@ -34,7 +35,6 @@ Wybrano: %s - Szczegóły zadania Typy przesłanych materiałów @@ -1072,7 +1072,6 @@ - Wybrana głowa: %s Wybrany tułów: %s Wybrane stopy: %s @@ -1211,7 +1210,6 @@ Witamy! Twoje tematy pojawią się tutaj. Nie masz obecnie żadnych tematów. - Widok podstawowy Wymaga ponownego uruchomienia aplikacji Wybierz Wybierz okres oceniania @@ -1225,6 +1223,17 @@ Brak dostępnych ocen Pokój główny + Widok pokoju głównego + Ważne łącza + Aplikacje uczestników + Dane kontaktowe pracowników + Wybierz kurs + Ważne łącza + Nauczyciel + Asystent instruktora + Twoje zasoby pojawią się tutaj. + Nie udało się załadować zasobów + Nie udało się odświeżyć zasobów Otwórz alternatywny widok z ułatwieniami dostępu Odbiorcy diff --git a/libs/pandares/src/main/res/values-pt-rBR/strings.xml b/libs/pandares/src/main/res/values-pt-rBR/strings.xml index a96d79654f..36a8ab08f0 100644 --- a/libs/pandares/src/main/res/values-pt-rBR/strings.xml +++ b/libs/pandares/src/main/res/values-pt-rBR/strings.xml @@ -15,6 +15,7 @@ ~ --> + Nenhum arquivo encontrado Pesquisar arquivos Insira um termo de pesquisa com três ou mais caracteres @@ -32,7 +33,6 @@ Selecionado: %s - Detalhes da tarefa Tipos de envio @@ -1046,7 +1046,6 @@ - Cabeça escolhida: %s Corpo escolhido: %s Pés escolhidos: %s @@ -1183,7 +1182,6 @@ Bem-vindo(a)! Suas disciplinas aparecem aqui. Você atualmente não tem disciplinas. - Visualização elementar Precisa reiniciar o aplicativo Selecionar Selecionar período de avaliação @@ -1197,6 +1195,17 @@ Notas não disponíveis Sala de aula + Visualização da sala de aula + Links importantes + Inscrições de alunos + Informações de contato da equipe + Escolher um curso + Links importantes + Professor + Professor assistente + Seus recursos aparecem aqui. + Falha ao carregar recursos + Falha ao atualizar recursos Abra uma exibição alternativa mais acessível Recipientes diff --git a/libs/pandares/src/main/res/values-pt-rPT/strings.xml b/libs/pandares/src/main/res/values-pt-rPT/strings.xml index a69ba910ec..4374fab19e 100644 --- a/libs/pandares/src/main/res/values-pt-rPT/strings.xml +++ b/libs/pandares/src/main/res/values-pt-rPT/strings.xml @@ -15,6 +15,7 @@ ~ --> + Nenhum ficheiro encontrado Pesquisar ficheiros Digite um termo de pesquisa com três ou mais caracteres @@ -32,7 +33,6 @@ Selecionado: %s - Detalhes da tarefa Tipos de submissão @@ -1046,7 +1046,6 @@ - Cabeça escolhida: %s Corpo escolhido: %s Pé escolhido: %s @@ -1183,7 +1182,6 @@ Bem-vindo! Os seus assuntos aparecem aqui. Atualmente, não tem assuntos. - Vista Elementar Requer reinicialização da aplicação Selecionar Selecionar Período de classificação @@ -1197,6 +1195,17 @@ Classificações não disponíveis Casa de família + Exibição da sala de aula + Ligações importantes + Aplicações para alunos + Informações de contato do pessoal + Escolha uma Disciplina + Ligações importantes + Professor + Assistente de ensino + Os seus recursos aparecem aqui. + Falha no carregamento de recursos + Falha na actualização de recursos Abrir uma vista alternativa mais acessível Destinatários diff --git a/libs/pandares/src/main/res/values-ru/strings.xml b/libs/pandares/src/main/res/values-ru/strings.xml index 859e6e29d6..c41f6aa27a 100644 --- a/libs/pandares/src/main/res/values-ru/strings.xml +++ b/libs/pandares/src/main/res/values-ru/strings.xml @@ -15,6 +15,7 @@ ~ --> + Файлы не найдены Поиск файлов Введите ключевое слово из трех или более символов @@ -34,7 +35,6 @@ Выбрано: %s - Сведения о задании Типы сдаваемых работ @@ -1072,7 +1072,6 @@ - Выбранная голова: %s Выбранное тело: %s Выбранные ноги: %s @@ -1211,7 +1210,6 @@ Добро пожаловать! Ваши темы будут отображаться здесь. В настоящее время у вас нет тем. - Простой вид Требуется перезапуск приложения Выбрать Выбрать период оценивания @@ -1225,6 +1223,17 @@ Оценки недоступны «Домашняя комната» + Представление домашней комнаты + Важные ссылки + Заявки учащихся + Контактная информация персонала + Выбрать курс + Важные ссылки + Преподаватель + Ассистент преподавателя + Ваши ресурсы будут отображаться здесь. + Не удалось загрузить ресурсы + Не удалось обновить ресурсы Откройте более доступный альтернативный вид Получатели diff --git a/libs/pandares/src/main/res/values-sl/strings.xml b/libs/pandares/src/main/res/values-sl/strings.xml index b80c301eb0..b809060cb3 100644 --- a/libs/pandares/src/main/res/values-sl/strings.xml +++ b/libs/pandares/src/main/res/values-sl/strings.xml @@ -1183,7 +1183,6 @@ Dobrodošli. Vaši predmeti se prikažejo tukaj. Trenutno nimate premetov. - Osnovni pogled Zahteva ponovni zagon aplikacije Izberi Izberi ocenjevalno obdobje @@ -1196,6 +1195,17 @@ Sprememba ocenjevalnega obdobja Ocene niso na voljo Matični razred + Pogled matičnega razreda + Pomembne povezave + Vloge študentov + Kontaktni podatki osebja + Izberite predmet + Pomembne povezave + Izvajalec + Demonstrator + Tukaj se prikažejo vaši viri. + Nalaganje virov ni uspelo + Osveževanje virov ni uspelo Odpri dostopnejši alternativni pogled diff --git a/libs/pandares/src/main/res/values-sv/strings.xml b/libs/pandares/src/main/res/values-sv/strings.xml index ce55c56275..5d11231ec2 100644 --- a/libs/pandares/src/main/res/values-sv/strings.xml +++ b/libs/pandares/src/main/res/values-sv/strings.xml @@ -15,6 +15,7 @@ ~ --> + Inga filer hittades Sök i filer Ange en sökterm med tre eller fler tecken @@ -32,7 +33,6 @@ Valda: %s - Uppgiftsdetaljer Inlämningstyper @@ -1046,7 +1046,6 @@ - Vald rubrik: %s Vald brödtext: %s Vald fotnot: %s @@ -1183,7 +1182,6 @@ Välkommen! Dina ämnen visas här. Du har inga ämnen för närvarande. - Elementary-vy Kräver omstart av appen Välj Välj omdömesperiod @@ -1197,6 +1195,17 @@ Omdömen är inte tillgängliga Fjärrundervisningsrum + Vy för fjärrundervisningsrum + Viktiga länkar + Studentansökningar + Kontaktuppgifter för personal + Välj en kurs + Viktiga länkar + Lärare + Lärarassistent + Dina resurser visas här. + Det gick inte att läsa in resurser + Det gick inte att uppdatera resurser Öppna en mer tillgänglig alternativ vy Mottagare diff --git a/libs/pandares/src/main/res/values-th/strings.xml b/libs/pandares/src/main/res/values-th/strings.xml index 5a8d184b1b..0a2d079022 100644 --- a/libs/pandares/src/main/res/values-th/strings.xml +++ b/libs/pandares/src/main/res/values-th/strings.xml @@ -15,6 +15,7 @@ ~ --> + ไม่พบไฟล์ ค้นหาไฟล์ กรอกคำค้นหาความยาวสามตัวอักษรขึ้นไป @@ -32,7 +33,6 @@ ที่เลือก: %s - รายละเอียดภารกิจ ประเภทการจัดส่ง @@ -1046,7 +1046,6 @@ - หัวที่เลือก: %s ลำดับที่เลือก: %s เท้าที่เลือก: %s @@ -1183,7 +1182,6 @@ ยินดีต้อนรับ! วิชาของคุณจะปรากฏขึ้นที่นี่ ปัจจุบันคุณไม่มีวิชาใด ๆ - มุมมองระดับประถมศึกษา ต้องรีสตาร์ทแอพ เลือก เลือกระยะเวลาการให้เกรด @@ -1197,6 +1195,17 @@ ไม่มีเกรด โฮมรูม + มุมมองโฮมรูม + ลิงค์ที่สำคัญ + แอพพลิเคชั่นของผู้เรียน + ข้อมูลติดต่อบุคลากร + เลือกบทเรียน + ลิงค์ที่สำคัญ + ผู้สอน + ผู้ช่วยสอน + ทรัพยากรของคุณจะปรากฏขึ้นที่นี่ + ไม่สามารถโหลดทรัพยากรได้ + ไม่สามารถรีเฟรชทรัพยากรได้ เปิดมุมมองเผื่อเลือกที่สามารถเข้าถึงได้มากกว่า ผู้รับ diff --git a/libs/pandares/src/main/res/values-zh-rHK/strings.xml b/libs/pandares/src/main/res/values-zh-rHK/strings.xml index 8541995c98..2300ba721c 100644 --- a/libs/pandares/src/main/res/values-zh-rHK/strings.xml +++ b/libs/pandares/src/main/res/values-zh-rHK/strings.xml @@ -15,6 +15,7 @@ ~ --> + 找不到檔案 搜尋檔案 輸入三個或更多字元的搜尋字詞 @@ -31,7 +32,6 @@ 已選擇:%s - 作業詳情 提交類型 @@ -1033,7 +1033,6 @@ - 選擇的頁首:%s 選擇的正文:%s 選擇的頁尾:%s @@ -1169,7 +1168,6 @@ 歡迎! 您的主題在此顯示。 您目前沒有任何主題。 - 小學版檢視 需要重新啟動應用程式 選擇 選擇評分期 @@ -1183,6 +1181,17 @@ 不提供成績 主教室 + 主教室檢視 + 重要連結 + 學生應用程式 + 員工聯絡資料 + 選擇一個課程 + 重要連結 + 教師 + 助教 + 您的資源在此顯示。 + 無法載入資源 + 無法重新整理資源 開啟更容易存取的替代視圖 收件人 diff --git a/libs/pandares/src/main/res/values-zh/strings.xml b/libs/pandares/src/main/res/values-zh/strings.xml index d5ead1d1c5..07c0fdf329 100644 --- a/libs/pandares/src/main/res/values-zh/strings.xml +++ b/libs/pandares/src/main/res/values-zh/strings.xml @@ -15,6 +15,7 @@ ~ --> + 找不到文件 搜索文件 输入三个或更多字符的搜索词 @@ -31,7 +32,6 @@ 已选择:%s - 作业详情 提交项类型 @@ -1033,7 +1033,6 @@ - 已选头部:%s 已选身体:%s 已选脚部:%s @@ -1169,7 +1168,6 @@ 欢迎! 您的科目显示在这里。 您目前没有科目。 - 基本视图 要求重启 app 选择 选择评分周期 @@ -1183,6 +1181,17 @@ 评分不可用 指导教室 + 教室视图 + 重要链接 + 学生申请 + 员工联系信息 + 选择课程 + 重要链接 + 教师 + 助教 + 您的资源显示在此处。 + 无法加载资源 + 无法刷新资源 打开一个更加方便访问的备选视图 收件人 diff --git a/libs/pandares/src/main/res/values/strings.xml b/libs/pandares/src/main/res/values/strings.xml index e3e40c0ad9..e18df11006 100644 --- a/libs/pandares/src/main/res/values/strings.xml +++ b/libs/pandares/src/main/res/values/strings.xml @@ -1220,4 +1220,8 @@ Unsupported Submission Type Submission cannot be displayed, because Student Annotation is currently not supported on mobile. You\'ve marked it as done. + Cannot change the due date when due in a closed grading period. + Jump to Today + %1$s, %2$s + send message diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/ElementaryDashboardPagerAdapter.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/ElementaryDashboardPagerAdapter.kt index 48127790aa..17a811b23d 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/ElementaryDashboardPagerAdapter.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/ElementaryDashboardPagerAdapter.kt @@ -19,25 +19,13 @@ package com.instructure.pandautils.features.elementary import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter -import com.instructure.canvasapi2.models.CanvasContext -import com.instructure.pandautils.features.elementary.grades.GradesFragment import com.instructure.pandautils.features.elementary.homeroom.HomeroomFragment -import com.instructure.pandautils.features.elementary.resources.ResourcesFragment -import com.instructure.pandautils.features.elementary.schedule.ScheduleFragment -import com.instructure.pandautils.features.elementary.schedule.pager.SchedulePagerFragment class ElementaryDashboardPagerAdapter( - private val canvasContext: CanvasContext, + private val fragments: List, fragmentManager: FragmentManager ) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { - private val fragments = listOf( - HomeroomFragment.newInstance(), - SchedulePagerFragment.newInstance(), - GradesFragment.newInstance(), - ResourcesFragment.newInstance() - ) - override fun getItem(position: Int): Fragment { return fragments[position] } diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleFragment.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleFragment.kt index e7eab25fa6..f536821b61 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleFragment.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleFragment.kt @@ -22,7 +22,10 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.instructure.pandautils.databinding.FragmentScheduleBinding +import com.instructure.pandautils.features.elementary.schedule.pager.SchedulePagerFragment import com.instructure.pandautils.utils.StringArg import dagger.hilt.android.AndroidEntryPoint import kotlinx.android.synthetic.main.fragment_schedule.* @@ -40,11 +43,21 @@ class ScheduleFragment : Fragment() { private var startDateString by StringArg() + private var recyclerView: RecyclerView? = null + + private val onScrollListener = object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + checkFirstPosition() + } + } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val binding = FragmentScheduleBinding.inflate(layoutInflater, container, false) binding.lifecycleOwner = this binding.viewModel = viewModel binding.adapter = adapter + recyclerView = binding.scheduleRecyclerView viewModel.getDataForDate(startDateString) @@ -57,6 +70,16 @@ class ScheduleFragment : Fragment() { return binding.root } + override fun onResume() { + super.onResume() + recyclerView?.addOnScrollListener(onScrollListener) + } + + override fun onPause() { + super.onPause() + recyclerView?.removeOnScrollListener(onScrollListener) + } + private fun handleAction(action: ScheduleAction) { when (action) { is ScheduleAction.OpenCourse -> scheduleRouter.openCourse(action.course) @@ -72,11 +95,40 @@ class ScheduleFragment : Fragment() { scheduleRouter.openDiscussion(action.canvasContext, action.id, action.title) } is ScheduleAction.JumpToToday -> { - scheduleRecyclerView.scrollToPosition(action.position) + jumpToToday() } } } + fun jumpToToday() { + if (recyclerView?.layoutManager is LinearLayoutManager) { + (recyclerView?.layoutManager as LinearLayoutManager).scrollToPositionWithOffset( + viewModel.todayPosition, + 0 + ) + } + } + + override fun setMenuVisibility(menuVisible: Boolean) { + if (menuVisible) { + checkFirstPosition() + } + super.setMenuVisibility(menuVisible) + } + + fun checkFirstPosition() { + val firstItemPosition = + (scheduleRecyclerView.layoutManager as LinearLayoutManager).findFirstCompletelyVisibleItemPosition() + val todayRange = viewModel.getTodayRange() + if (todayRange != null) { + toggleJumpToTodayButton(firstItemPosition !in todayRange) + } + } + + private fun toggleJumpToTodayButton(visible: Boolean) { + (requireParentFragment() as SchedulePagerFragment).setTodayButtonVisibility(visible) + } + companion object { fun newInstance(startDate: String) = ScheduleFragment().apply { startDateString = startDate } diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleRecyclerViewAdapter.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleRecyclerViewAdapter.kt index 31ff2396f8..2f02fca717 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleRecyclerViewAdapter.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleRecyclerViewAdapter.kt @@ -46,7 +46,11 @@ class ScheduleRecyclerViewAdapter : BindableRecyclerViewAdapter(), StickyHeaderI return headerPosition } - override fun getHeaderBinding(headerPosition: Int, parent: RecyclerView, hasChildInContact: Boolean): ViewDataBinding { + override fun getHeaderBinding( + headerPosition: Int, + parent: RecyclerView, + hasChildInContact: Boolean + ): ViewDataBinding { val binding = ItemScheduleDayHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false) binding.setVariable(BR.itemViewModel, itemViewModels[headerPosition]) binding.hasDivider = hasChildInContact diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewData.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewData.kt index 0eb8f3b5a8..49ea8ca8d8 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewData.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewData.kt @@ -42,6 +42,7 @@ data class SchedulePlannerItemData( val points: String?, val dueDate: String?, val openable: Boolean, + val contentDescription: String, val chips: List ) @@ -60,7 +61,8 @@ data class ScheduleMissingItemData( val points: String?, val type: PlannerItemType, val courseName: String?, - val courseColor: String + val courseColor: String, + val contentDescription: String ) enum class PlannerItemType(@DrawableRes val iconRes: Int) { @@ -99,5 +101,5 @@ sealed class ScheduleAction { data class OpenCalendarEvent(val canvasContext: CanvasContext, val scheduleItemId: Long) : ScheduleAction() data class OpenQuiz(val canvasContext: CanvasContext, val htmlUrl: String) : ScheduleAction() data class OpenDiscussion(val canvasContext: CanvasContext, val id: Long, val title: String) : ScheduleAction() - data class JumpToToday(val position: Int) : ScheduleAction() + object JumpToToday : ScheduleAction() } \ No newline at end of file diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewModel.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewModel.kt index 4f1269962d..66002aa8b5 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewModel.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/ScheduleViewModel.kt @@ -17,6 +17,7 @@ package com.instructure.pandautils.features.elementary.schedule import android.content.res.Resources +import android.util.Range import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -66,9 +67,10 @@ class ScheduleViewModel @Inject constructor( private lateinit var coursesMap: Map private var todayHeader: ScheduleDayGroupItemViewModel? = null - private var todayPosition: Int = -1 private val simpleDateFormat = SimpleDateFormat("hh:mm aa", Locale.getDefault()) + var todayPosition: Int = -1 + val state: LiveData get() = _state private val _state = MutableLiveData() @@ -94,7 +96,7 @@ class ScheduleViewModel @Inject constructor( private fun jumpToToday() { if (todayPosition != -1) { - _events.postValue(Event(ScheduleAction.JumpToToday(todayPosition))) + _events.postValue(Event(ScheduleAction.JumpToToday)) } } @@ -175,17 +177,18 @@ class ScheduleViewModel @Inject constructor( val missingItems = missingSubmissions.map { assignment -> ScheduleMissingItemViewModel( data = ScheduleMissingItemData( - assignment.name, - assignment.dueDate?.let { + title = assignment.name, + dueString = assignment.dueDate?.let { resources.getString( R.string.schedule_due_text, simpleDateFormat.format(it) ) }, - getPointsText(assignment.pointsPossible), - if (assignment.discussionTopicHeader != null) PlannerItemType.DISCUSSION else PlannerItemType.ASSIGNMENT, - coursesMap[assignment.courseId]?.name, - getCourseColor(coursesMap[assignment.courseId]) + points = getPointsText(assignment.pointsPossible), + type = if (assignment.discussionTopicHeader != null) PlannerItemType.DISCUSSION else PlannerItemType.ASSIGNMENT, + courseName = coursesMap[assignment.courseId]?.name, + courseColor = getCourseColor(coursesMap[assignment.courseId]), + contentDescription = createMissingItemContentDescription(assignment) ), open = { val course = coursesMap[assignment.courseId] @@ -211,6 +214,20 @@ class ScheduleViewModel @Inject constructor( return ScheduleMissingItemsGroupItemViewModel(missingItemsPrefs = missingItemsPrefs, items = missingItems) } + private fun createMissingItemContentDescription(assignment: Assignment): String { + val typeContentDescription = if (assignment.discussionTopicHeader != null) resources.getString(R.string.a11y_discussion_topic) else resources.getString(R.string.a11y_assignment) + val pointsContentDescription = resources.getQuantityString(R.plurals.a11y_schedule_points, assignment.pointsPossible.toInt(), assignment.pointsPossible) + val dueContentDescription = assignment.dueDate?.let { + resources.getString( + R.string.schedule_due_text, + simpleDateFormat.format(it) + ) + } + val courseContentDescription = resources.getString(R.string.a11y_schedule_course_header_content_description, coursesMap[assignment.courseId]?.name) + + return "$typeContentDescription ${assignment.name} $courseContentDescription $pointsContentDescription $dueContentDescription" + } + private fun createDayHeader(date: Date, items: List): ScheduleDayGroupItemViewModel { return ScheduleDayGroupItemViewModel( getTitleForDate(date), @@ -239,23 +256,23 @@ class ScheduleViewModel @Inject constructor( val courseViewModels = coursePlannerMap.entries .sortedBy { it.key?.name } .map { entry -> - val scheduleViewData = ScheduleCourseViewData( - entry.key?.name ?: resources.getString(R.string.schedule_todo_title), - entry.key != null, - getCourseColor(entry.key), - entry.key?.imageUrl ?: "", - entry.value.map { - createPlannerItemViewModel(it) - } - ) - ScheduleCourseItemViewModel( - scheduleViewData - ) { - entry.key?.let { course -> - _events.postValue(Event(ScheduleAction.OpenCourse(course))) + val scheduleViewData = ScheduleCourseViewData( + entry.key?.name ?: resources.getString(R.string.schedule_todo_title), + entry.key != null, + getCourseColor(entry.key), + entry.key?.imageUrl ?: "", + entry.value.map { + createPlannerItemViewModel(it) + } + ) + ScheduleCourseItemViewModel( + scheduleViewData + ) { + entry.key?.let { course -> + _events.postValue(Event(ScheduleAction.OpenCourse(course))) + } } } - } return if (courseViewModels.isEmpty()) { listOf( @@ -323,6 +340,7 @@ class ScheduleViewModel @Inject constructor( getPointsText(plannerItem.plannable.pointsPossible), getDueText(plannerItem), isPlannableOpenable(plannerItem), + createContentDescription(plannerItem), createChips(plannerItem) ), plannerItem.plannerOverride?.markedComplete ?: false || plannerItem.submissionState?.submitted ?: false, @@ -337,6 +355,30 @@ class ScheduleViewModel @Inject constructor( ) } + private fun createContentDescription(plannerItem: PlannerItem): String { + val typeContentDescription = createTypeContentDescription(plannerItem.plannableType) + val dateContentDescription = getDueText(plannerItem) + val markedAsDoneContentDescription = + if (plannerItem.plannerOverride?.markedComplete == true || plannerItem.submissionState?.submitted == true) resources.getString(R.string.a11y_marked_as_done) else resources.getString( + R.string.a11y_not_marked_as_done + ) + + return "$typeContentDescription ${plannerItem.plannable.title} $dateContentDescription $markedAsDoneContentDescription" + } + + private fun createTypeContentDescription(plannableType: PlannableType): String { + return when (plannableType) { + PlannableType.ANNOUNCEMENT -> resources.getString(R.string.a11y_announcement) + PlannableType.DISCUSSION_TOPIC -> resources.getString(R.string.a11y_discussion_topic) + PlannableType.CALENDAR_EVENT -> resources.getString(R.string.a11y_calendar_event) + PlannableType.ASSIGNMENT -> resources.getString(R.string.a11y_assignment) + PlannableType.PLANNER_NOTE -> resources.getString(R.string.a11y_planner_note) + PlannableType.QUIZ -> resources.getString(R.string.a11y_quiz) + PlannableType.TODO -> resources.getString(R.string.a11y_todo) + PlannableType.WIKI_PAGE -> resources.getString(R.string.a11y_page) + } + } + private fun updatePlannerOverride( plannerItem: PlannerItem, itemViewModel: SchedulePlannerItemViewModel, @@ -520,4 +562,11 @@ class ScheduleViewModel @Inject constructor( else -> TODO_COLOR } } + + fun getTodayRange(): Range? { + todayHeader?.let { + return Range(todayPosition, todayPosition + getGroupOpenChildCount(it)) + } + return null + } } \ No newline at end of file diff --git a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/pager/SchedulePagerFragment.kt b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/pager/SchedulePagerFragment.kt index f8b1af2833..5a1a5a9442 100644 --- a/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/pager/SchedulePagerFragment.kt +++ b/libs/pandautils/src/main/java/com/instructure/pandautils/features/elementary/schedule/pager/SchedulePagerFragment.kt @@ -20,12 +20,16 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.constraintlayout.widget.ConstraintSet import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.instructure.pandautils.databinding.FragmentSchedulePagerBinding import com.instructure.pandautils.features.elementary.schedule.ScheduleFragment +import com.instructure.pandautils.utils.isAccessibilityEnabled import dagger.hilt.android.AndroidEntryPoint import kotlinx.android.synthetic.main.fragment_schedule_pager.* @@ -34,6 +38,10 @@ class SchedulePagerFragment : Fragment() { private val viewModel: SchedulePagerViewModel by viewModels() + private val todayButtonLiveData = MutableLiveData() + + private var todayFragment: ScheduleFragment? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -52,7 +60,14 @@ class SchedulePagerFragment : Fragment() { schedulePager.adapter = object : FragmentStateAdapter(this) { override fun getItemCount(): Int = it.pageStartDates.size - override fun createFragment(position: Int): Fragment = ScheduleFragment.newInstance(it.pageStartDates[position]) + override fun createFragment(position: Int): Fragment { + val fragment = ScheduleFragment.newInstance(it.pageStartDates[position]) + if (position == THIS_WEEKS_POSITION) { + todayFragment = fragment + } + return fragment + } + } } }) @@ -66,6 +81,10 @@ class SchedulePagerFragment : Fragment() { schedulePager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position) + if (position != THIS_WEEKS_POSITION) { + setTodayButtonVisibility(true) + } + if (position == 0) { previousWeekButton.visibility = View.GONE } else if (position == schedulePager.childCount - 1) { @@ -76,6 +95,22 @@ class SchedulePagerFragment : Fragment() { } } }) + + if (isAccessibilityEnabled(requireContext())) { + movePagerControlToTop() + } + } + + private fun movePagerControlToTop() { + val constraintSet = ConstraintSet() + constraintSet.clone(schedulePage) + constraintSet.clear(controls.id, ConstraintSet.BOTTOM) + constraintSet.clear(schedulePager.id, ConstraintSet.BOTTOM) + constraintSet.clear(schedulePager.id, ConstraintSet.TOP) + constraintSet.connect(controls.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP) + constraintSet.connect(schedulePager.id, ConstraintSet.TOP, controls.id, ConstraintSet.BOTTOM) + constraintSet.connect(schedulePager.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM) + constraintSet.applyTo(schedulePage) } private fun handleAction(action: SchedulePagerAction) { @@ -86,6 +121,19 @@ class SchedulePagerFragment : Fragment() { } } + fun getTodayButtonVisibility(): LiveData { + return todayButtonLiveData + } + + fun setTodayButtonVisibility(visible: Boolean) { + todayButtonLiveData.postValue(visible) + } + + fun jumpToToday() { + schedulePager.setCurrentItem(THIS_WEEKS_POSITION, true) + todayFragment?.jumpToToday() + } + companion object { fun newInstance() = SchedulePagerFragment() } diff --git a/libs/pandautils/src/main/res/layout-sw720dp/item_schedule_course.xml b/libs/pandautils/src/main/res/layout-sw720dp/item_schedule_course.xml index 60b58cc6fc..da60b5f0a7 100644 --- a/libs/pandautils/src/main/res/layout-sw720dp/item_schedule_course.xml +++ b/libs/pandautils/src/main/res/layout-sw720dp/item_schedule_course.xml @@ -44,6 +44,7 @@ android:layout_weight="1" android:background="?android:selectableItemBackground" android:clickable="@{itemViewModel.data.openable}" + android:importantForAccessibility="yes" android:minHeight="80dp" android:onClick="@{() -> itemViewModel.onHeaderClick.invoke()}" app:layout_constraintEnd_toStartOf="@+id/plannerItems"> @@ -53,6 +54,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:importantForAccessibility="no" android:lineSpacingExtra="2sp" android:paddingStart="8dp" android:paddingTop="4dp" @@ -74,6 +76,7 @@ android:layout_marginStart="1.5dp" android:layout_marginBottom="1.5dp" android:background="@{ColorUtils.parseColor(itemViewModel.data.courseColor)}" + android:importantForAccessibility="no" android:scaleType="centerCrop" app:imageUrl="@{itemViewModel.data.imageUrl}" app:layout_constraintBottom_toBottomOf="parent" diff --git a/libs/pandautils/src/main/res/layout/item_contact_info.xml b/libs/pandautils/src/main/res/layout/item_contact_info.xml index 3268c1b949..87a15f0fac 100644 --- a/libs/pandautils/src/main/res/layout/item_contact_info.xml +++ b/libs/pandautils/src/main/res/layout/item_contact_info.xml @@ -31,8 +31,11 @@ android:id="@+id/contactInfoLayout" android:layout_width="match_parent" android:layout_height="wrap_content" + android:contentDescription="@{@string/a11y_contact_info_content_description(itemViewModel.data.name, itemViewModel.data.description)}" android:foreground="?selectableItemBackground" - android:onClick="@{() -> itemViewModel.onClick.invoke()}"> + android:importantForAccessibility="yes" + android:onClick="@{() -> itemViewModel.onClick.invoke()}" + app:accessibilityClickDescription="@{@string/a11y_contact_info_click_description}"> diff --git a/libs/pandautils/src/main/res/layout/item_schedule_course.xml b/libs/pandautils/src/main/res/layout/item_schedule_course.xml index e0ee8cb0d1..7f168e699b 100644 --- a/libs/pandautils/src/main/res/layout/item_schedule_course.xml +++ b/libs/pandautils/src/main/res/layout/item_schedule_course.xml @@ -42,9 +42,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:selectableItemBackground" - android:drawableEnd="@{itemViewModel.data.openable ? @drawable/ic_open_arrow : null}" android:clickable="@{itemViewModel.data.openable}" + android:contentDescription="@{@string/a11y_schedule_course_header_content_description(itemViewModel.data.courseName)}" + android:drawableEnd="@{itemViewModel.data.openable ? @drawable/ic_open_arrow : null}" android:gravity="center_vertical" + android:importantForAccessibility="yes" android:lineSpacingExtra="2sp" android:minHeight="48dp" android:onClick="@{() -> itemViewModel.onHeaderClick.invoke()}" diff --git a/libs/pandautils/src/main/res/layout/item_schedule_day_header.xml b/libs/pandautils/src/main/res/layout/item_schedule_day_header.xml index e26191340d..d31897a28d 100644 --- a/libs/pandautils/src/main/res/layout/item_schedule_day_header.xml +++ b/libs/pandautils/src/main/res/layout/item_schedule_day_header.xml @@ -29,18 +29,20 @@ - + tools:text="July 2" /> diff --git a/libs/pandautils/src/main/res/layout/item_schedule_missing_item.xml b/libs/pandautils/src/main/res/layout/item_schedule_missing_item.xml index ff8b1c4233..c1cacda5d8 100644 --- a/libs/pandautils/src/main/res/layout/item_schedule_missing_item.xml +++ b/libs/pandautils/src/main/res/layout/item_schedule_missing_item.xml @@ -33,6 +33,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" + android:contentDescription="@{itemViewModel.data.contentDescription}" + android:importantForAccessibility="yes" android:onClick="@{() -> itemViewModel.open.invoke()}"> diff --git a/libs/pandautils/src/main/res/layout/item_schedule_planner_item.xml b/libs/pandautils/src/main/res/layout/item_schedule_planner_item.xml index e8369ae2ce..cb5e00b919 100644 --- a/libs/pandautils/src/main/res/layout/item_schedule_planner_item.xml +++ b/libs/pandautils/src/main/res/layout/item_schedule_planner_item.xml @@ -32,14 +32,16 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:animateLayoutChanges="true" - android:orientation="vertical"> + android:orientation="vertical" + android:importantForAccessibility="no"> + android:paddingEnd="1.5dp" + android:importantForAccessibility="no"/> + android:paddingBottom="8dp" + android:importantForAccessibility="yes" + android:contentDescription="@{itemViewModel.data.contentDescription}"> + app:layout_constraintTop_toTopOf="parent" + android:importantForAccessibility="yes" + android:contentDescription="@{itemViewModel.completed ? @string/a11y_mark_as_done : @string/a11y_mark_as_not_done}"/> + tools:src="@drawable/ic_announcement" + android:importantForAccessibility="no"/> + app:layout_constraintTop_toTopOf="parent" + android:importantForAccessibility="no"> + tools:text="Causes of the Revolutionary War I." + android:importantForAccessibility="no"/> + android:visibility="@{itemViewModel.completed ? View.VISIBLE : View.GONE}" + android:importantForAccessibility="no"/> %s pt %s pts + + %.1f points + %.1f point + %.1f points + All Day Missing Previous Week Next Week + %1$s, %2$s + Course %s + Announcement + Discussion + Calendar event + Assignment + Planner note + Quiz + To Do + Page + Marked as done + Not marked as done + Mark as done + mark_as_not_done