Skip to content

Implementation of HomeScreen Design#4

Open
Gregor-Guerrier wants to merge 3 commits intomainfrom
gregor/homescreen
Open

Implementation of HomeScreen Design#4
Gregor-Guerrier wants to merge 3 commits intomainfrom
gregor/homescreen

Conversation

@Gregor-Guerrier
Copy link
Copy Markdown
Collaborator

@Gregor-Guerrier Gregor-Guerrier commented Apr 8, 2026

Overview

Design Implementation of the Home Screen

Changes Made

Altered ChimesPerformanceCard.kt
Altered HomeScreen.kt to mimic the figma designs
Altered Type.kt

Test Coverage

Samsung S23
image

Summary by CodeRabbit

  • New Features

    • Added song input field to the home screen
    • Added "Send Kudos" section with interactive emoji buttons
    • Added "Today's Performance" section displaying performance metrics
  • UI/Style

    • Updated typography with Montserrat font
    • Enforced portrait orientation for all screens
    • Enhanced visual design with new gradient overlays and decorative graphics

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 8, 2026

📝 Walkthrough

Walkthrough

This PR introduces new Jetpack Compose UI components (ChimeCard, ChimeKudos, ChimePerformanceCard, Slope), integrates Google Fonts (Montserrat), expands HomeScreen with input fields and performance display sections, adds vector drawable resources, constrains MainActivity to portrait orientation, and extends Gradle dependencies for Room and Compose UI libraries.

Changes

Cohort / File(s) Summary
Build Configuration
app/build.gradle.kts, gradle/libs.versions.toml
Added dependencies for androidx.room3.runtime, androidx.room.ktx, androidx.ui.graphics, and androidx.compose.ui.text.google.fonts; defined corresponding version entries and library definitions in version catalog.
Manifest & Activity Configuration
app/src/main/AndroidManifest.xml
Constrained MainActivity to portrait orientation via android:screenOrientation="portrait" attribute.
New Compose UI Components
app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeCard.kt, ChimeKudos.kt, ChimePerformanceCard.kt, Slope.kt
Introduced four new composable components: ChimeCard (container with gradient background and shadow), ChimeKudos (circular emoji button), ChimePerformanceCard (time period/range display), and Slope (layered background with gradient overlay effects).
Updated Compose Components
app/src/main/java/com/cornellappdev/chimes/ui/components/HeaderButton.kt, app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt
HeaderButton refactored shadow implementation from custom drawing to Modifier.shadow, changed button color to white; HomeScreen significantly expanded with scrollable layout, ChimeCard with BasicTextField input, ChimeKudos and ChimePerformanceCard sections, and revised spacing/padding.
Typography & Theme
app/src/main/java/com/cornellappdev/chimes/ui/theme/Type.kt
Integrated Google Fonts provider and Montserrat FontFamily; updated Typography styles (bodyLarge, titleLarge, labelSmall) to use Montserrat instead of default font.
Vector Drawable Resources
app/src/main/res/drawable/ic_music_notes.xml, ic_navigation.xml, ic_trees_back.xml, ic_trees_front.xml
Added four new vector drawable assets with custom path data and fill colors for UI decoration and icons.
Font Certificate Resources
app/src/main/res/values/font_certs.xml
Added Google Fonts certificate configuration defining provider certificates for secure font downloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • AndrewCheung360

Poem

🐰 Hops of joy through Compose trees,
Montserrat fonts on the breeze,
Cards and kudos, slopes so grand,
Portrait screens across the land! 🎨✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Implementation of HomeScreen Design' accurately reflects the primary focus of the changeset, which is redesigning and implementing the HomeScreen UI component with new visual elements and layout.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch gregor/homescreen

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (12)
app/src/main/java/com/cornellappdev/chimes/ui/components/Slope.kt (1)

43-44: Current absolute positioning is device-fragile.

The fixed offsets/sizes at Lines 43-83 are likely to misalign on small/large screens. Consider constraint- or proportion-based placement (BoxWithConstraints, fillMaxWidth(fraction), computed offsets from maxWidth/maxHeight) for consistent rendering beyond Samsung S23.

Also applies to: 49-50, 58-59, 77-78, 82-83

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/Slope.kt` around
lines 43 - 44, The absolute Modifier.offset calls in Slope.kt (e.g.,
Modifier.offset(x = 32.dp, y = 181.dp) and the similar offsets at the other
noted lines) are device-fragile; replace them with responsive layout logic using
BoxWithConstraints or size/align/fillMaxWidth(fraction) and computed offsets
derived from maxWidth/maxHeight so positions scale with screen size. Locate the
composables in Slope.kt that use Modifier.offset (and any fixed dp sizes) and
change them to measure parent constraints via BoxWithConstraints, compute
fractional offsets or use Modifier.align/Modifier.fillMaxWidth with appropriate
fractions, or use with(LocalDensity.current) to compute dp from percentages so
the elements maintain relative placement across devices. Ensure you update all
instances referenced in the comment (the offset occurrences and fixed sizes) to
the same constraint- or proportion-based approach.
app/src/main/res/drawable/ic_navigation.xml (1)

8-8: Use a color resource instead of a hardcoded icon color.

At Line 8, #757575 is fixed and won’t adapt to theme changes. Prefer @color/... (or a theme attr) for better dark-mode consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/res/drawable/ic_navigation.xml` at line 8, The SVG drawable uses
a hardcoded color in the android:fillColor attribute
(android:fillColor="#757575") which won't follow theme or dark mode; update the
drawable (ic_navigation.xml) to reference a color resource or theme attribute
instead (e.g., android:fillColor="@color/your_icon_color" or
android:fillColor="?attr/colorOnSurface") and add/update the corresponding color
resource(s) in colors.xml (or theme attrs) so the icon adapts to light/dark
themes.
app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt (4)

4-4: Remove incorrect import.

android.view.RoundedCorner is unrelated to Compose and unused. The code correctly uses androidx.compose.foundation.shape.RoundedCornerShape (line 23).

-import android.view.RoundedCorner
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt` at line
4, Remove the incorrect unused import android.view.RoundedCorner from
HomeScreen.kt; the Compose code already uses
androidx.compose.foundation.shape.RoundedCornerShape (used in the HomeScreen
composable), so delete the android.view.RoundedCorner import to avoid confusion
and unused import warnings.

77-77: Hardcoded user name should be parameterized.

Consider passing the user name as a parameter to HomeScreen or fetching it from a ViewModel to support dynamic user data.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt` at line
77, The greeting text is hardcoded ("Hi, Arielle ☀️") in HomeScreen; change
HomeScreen to accept a dynamic user name (e.g., add a parameter userName:
String) or obtain it from a ViewModel (e.g., HomeViewModel.userName) and use
that value in the Text composable instead of the literal; update any callers of
HomeScreen to pass the userName (or wire the ViewModel into HomeScreen) so the
greeting becomes dynamic and testable.

30-32: Remove unused Material3 TextField imports.

TextField, TextFieldColors, and TextFieldDefaults are imported but the code uses BasicTextField instead.

-import androidx.compose.material3.TextField
-import androidx.compose.material3.TextFieldColors
-import androidx.compose.material3.TextFieldDefaults
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt` around
lines 30 - 32, Remove the unused Material3 imports TextField, TextFieldColors,
and TextFieldDefaults from HomeScreen.kt since the implementation uses
BasicTextField; locate the import block at the top of the file, delete the three
unused symbols, and run a quick build or IDE auto-organize imports to ensure no
remaining unused import warnings.

238-240: Performance data is hardcoded.

These time slots should come from a data source or ViewModel. For now this is acceptable for UI scaffolding, but consider adding a TODO comment to track this.

💡 Suggested TODO
+                        // TODO: Replace hardcoded performance data with ViewModel/Repository data
                         ChimePerformanceCard("Morning", "7:45 AM - 8:00 AM")
                         ChimePerformanceCard("Noon", "1:10 PM - 1:25 PM")
                         ChimePerformanceCard("Evening", "6:00 PM - 6:15 PM")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt` around
lines 238 - 240, The three hardcoded ChimePerformanceCard calls in HomeScreen
(e.g., ChimePerformanceCard("Morning", "7:45 AM - 8:00 AM")) should be driven by
a data source/ViewModel instead of inline literals; update HomeScreen to iterate
over a list provided by the ViewModel (e.g., a List<ChimeSlot> from
HomeViewModel) and render ChimePerformanceCard for each item, and if you’re
keeping the hardcoded values temporarily add a TODO comment near these calls
(TODO: replace hardcoded slots with ViewModel-driven data) to track the work.
app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeKudos.kt (2)

35-36: Consider using Modifier.size() for square dimensions.

When width and height are equal, size() is more concise.

♻️ Suggested simplification
-        .height(64.dp)
-        .width(64.dp),
+        .size(64.dp),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeKudos.kt`
around lines 35 - 36, In the ChimeKudos composable replace the Modifier chain
that sets equal height and width (.height(64.dp).width(64.dp)) with the more
concise Modifier.size(64.dp); locate the modifier usage in the ChimeKudos UI
code and swap the two calls for a single size(...) call to simplify and clarify
the square dimension intent.

3-3: Remove unused android.R import.

This import is unused and can shadow the app's own R class (com.cornellappdev.chimes.R) if both are imported, potentially causing confusing compilation errors.

-import android.R
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeKudos.kt` at
line 3, The file ChimeKudos.kt contains an unused import "import android.R"
which can shadow your app's R class; remove the "import android.R" line so the
module uses your app's R (com.cornellappdev.chimes.R) or explicit resource
references, and recompile to ensure no unresolved references remain.
app/src/main/java/com/cornellappdev/chimes/ui/components/ChimePerformanceCard.kt (1)

28-30: Fixed dimensions may not adapt to different screen sizes.

Hardcoding 351.dp width limits responsiveness. Consider using fillMaxWidth() with horizontal padding, or accepting width as a parameter.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimePerformanceCard.kt`
around lines 28 - 30, The fixed 351.dp width in the Modifier for
ChimePerformanceCard makes the component non-responsive; update
ChimePerformanceCard to use a flexible width (e.g., Modifier.fillMaxWidth() with
appropriate horizontal padding) or add a width parameter (e.g., cardWidth: Dp =
...) so callers can control sizing; adjust the Modifier usage in the composable
(the existing Modifier.width(351.dp).height(51.dp) call) to use
fillMaxWidth()/padding or the passed-in width and keep the height as needed.
app/src/main/java/com/cornellappdev/chimes/ui/theme/Type.kt (1)

18-20: Consider adding multiple font weights to the FontFamily.

The current definition only includes the default weight. However, HomeScreen.kt uses FontWeight.SemiBold and FontWeight.Medium with Montserrat. Without explicit weight definitions, Android will synthesize (fake) these weights, which may look suboptimal.

♻️ Suggested enhancement for multiple weights
 val Montserrat = FontFamily(
-    Font(googleFont = GoogleFont("Montserrat"), fontProvider = GoogleFontsProvider)
+    Font(googleFont = GoogleFont("Montserrat"), fontProvider = GoogleFontsProvider, weight = FontWeight.Normal),
+    Font(googleFont = GoogleFont("Montserrat"), fontProvider = GoogleFontsProvider, weight = FontWeight.Medium),
+    Font(googleFont = GoogleFont("Montserrat"), fontProvider = GoogleFontsProvider, weight = FontWeight.SemiBold),
+    Font(googleFont = GoogleFont("Montserrat"), fontProvider = GoogleFontsProvider, weight = FontWeight.Bold)
 )
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/theme/Type.kt` around lines 18
- 20, The Montserrat FontFamily currently defines only a single Font, causing
Android to synthesize FontWeight.Medium and FontWeight.SemiBold; update the
Montserrat FontFamily to include explicit Font entries for the weights you use
(e.g., FontWeight.W400, FontWeight.W500 (Medium), FontWeight.W600 (SemiBold)) by
adding additional Font(...) items with the same GoogleFont("Montserrat") and
GoogleFontsProvider and the appropriate weight parameter so HomeScreen.kt's
FontWeight.Medium and FontWeight.SemiBold map to real font files.
app/src/main/java/com/cornellappdev/chimes/ui/components/HeaderButton.kt (2)

42-42: Simplify the onClick callback.

The lambda wrapper is unnecessary since onClick is already a function reference.

♻️ Suggested simplification
-            onClick = { onClick() },
+            onClick = onClick,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/HeaderButton.kt` at
line 42, In HeaderButton (HeaderButton.kt) remove the unnecessary lambda wrapper
around the onClick prop and pass the function reference directly; replace the
current onClick = { onClick() } with onClick = onClick so the composable uses
the provided function reference (parameter name: onClick) directly.

3-28: Remove unused imports.

Several imports are no longer used after removing the custom shadow drawing logic. The following imports appear to be dead code:

  • background (line 5) - newly added but unused
  • border (line 6)
  • drawWithCache (line 15)
  • Brush (line 17)
  • ClipOp (line 18)
  • Path (line 20)
  • addOutline (line 21)
  • asAndroidPath (line 22)
  • clipPath (line 23)
  • drawIntoCanvas (line 24)
  • nativeCanvas (line 25)
  • toArgb (line 26)
♻️ Suggested cleanup
 package com.cornellappdev.chimes.ui.components
 
 import android.os.Build
 import androidx.annotation.RequiresApi
-import androidx.compose.foundation.background
-import androidx.compose.foundation.border
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
 import androidx.compose.material3.Icon
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.drawWithCache
 import androidx.compose.ui.draw.shadow
-import androidx.compose.ui.graphics.Brush
-import androidx.compose.ui.graphics.ClipOp
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.Path
-import androidx.compose.ui.graphics.addOutline
-import androidx.compose.ui.graphics.asAndroidPath
-import androidx.compose.ui.graphics.drawscope.clipPath
-import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
-import androidx.compose.ui.graphics.nativeCanvas
-import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.unit.dp
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/HeaderButton.kt`
around lines 3 - 28, The HeaderButton composable file still contains leftover
imports from the removed custom shadow logic; remove the unused imports to clean
up the file: background, border, drawWithCache, Brush, ClipOp, Path, addOutline,
asAndroidPath, clipPath, drawIntoCanvas, nativeCanvas, and toArgb; keep only the
imports actually used by HeaderButton (e.g., Composable, Modifier, Button,
ButtonDefaults, Icon, painterResource, size, PaddingValues, CircleShape, dp,
RequiresApi, Build, and any others referenced in the HeaderButton function) so
the file compiles without dead imports.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/build.gradle.kts`:
- Around line 50-52: Remove the duplicate graphics dependency by keeping only
one implementation(libs.androidx.ui.graphics) entry (consolidate/remove the
redundant androidx-compose-ui-graphics/androidx-ui-graphics mapping) and then
correct the Room catalog key/mapping: replace or update
implementation(libs.androidx.room3.runtime) so it uses the standard
androidx.room group (e.g., libs.androidx.room.runtime) or fix the
version-catalog entry that maps androidx.room3:room3-runtime to point to
androidx.room:room-runtime; ensure the build.gradle.kts references the corrected
catalog key.

In
`@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimePerformanceCard.kt`:
- Line 44: The Spacer with a border in ChimePerformanceCard.kt won't render a
visible divider; replace the Spacer(modifier =
Modifier.fillMaxHeight().width((1f).dp).border((0.5f).dp, Color(0x4D635858)))
with a composable that actually paints pixels (e.g., use Box(modifier =
Modifier.fillMaxHeight().width(0.5.dp).background(Color(0x4D635858))) or
Material's VerticalDivider) so the vertical line is visible; update the modifier
values to use dp (not (1f).dp) and ensure the composable is placed where the
Spacer was to maintain layout.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/Slope.kt`:
- Line 42: Replace empty-string content descriptions with null for decorative
images in the Slope composable so screen readers skip them; locate the
Image/ImageVector usages within the Slope composable (the parameters currently
using contentDescription = "") and change those properties to contentDescription
= null for each decorative asset (the occurrences around the Image calls in
Slope.kt).

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt`:
- Around line 54-55: Remove the unnecessary API-level restriction by deleting
the `@RequiresApi`(Build.VERSION_CODES.S) annotation from the HomeScreen
composable; also remove the unused android.view.RoundedCorner import if present
and ensure the code uses androidx.compose.foundation.shape.RoundedCornerShape
(not android.view.RoundedCorner), so the composable no longer forces API 31.

In `@app/src/main/res/values/font_certs.xml`:
- Around line 1-19: The app uses the Google Fonts provider (authority
"com.google.android.gms.fonts" configured in Type.kt) but the AndroidManifest is
missing a <queries> entry, which prevents package visibility on Android 11+; fix
by adding a <queries> element inside the manifest that declares the package
"com.google.android.gms" so the system allows visibility to the Google Play
Services fonts provider.

In `@gradle/libs.versions.toml`:
- Line 18: The placeholder version for the library identifier uiTextGoogleFonts
in libs.versions.toml is invalid and will break Gradle resolution; replace the
value "<version>" with the actual version string "1.10.6" (the latest compatible
release) so the line reads uiTextGoogleFonts = "1.10.6".

---

Nitpick comments:
In `@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeKudos.kt`:
- Around line 35-36: In the ChimeKudos composable replace the Modifier chain
that sets equal height and width (.height(64.dp).width(64.dp)) with the more
concise Modifier.size(64.dp); locate the modifier usage in the ChimeKudos UI
code and swap the two calls for a single size(...) call to simplify and clarify
the square dimension intent.
- Line 3: The file ChimeKudos.kt contains an unused import "import android.R"
which can shadow your app's R class; remove the "import android.R" line so the
module uses your app's R (com.cornellappdev.chimes.R) or explicit resource
references, and recompile to ensure no unresolved references remain.

In
`@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimePerformanceCard.kt`:
- Around line 28-30: The fixed 351.dp width in the Modifier for
ChimePerformanceCard makes the component non-responsive; update
ChimePerformanceCard to use a flexible width (e.g., Modifier.fillMaxWidth() with
appropriate horizontal padding) or add a width parameter (e.g., cardWidth: Dp =
...) so callers can control sizing; adjust the Modifier usage in the composable
(the existing Modifier.width(351.dp).height(51.dp) call) to use
fillMaxWidth()/padding or the passed-in width and keep the height as needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/HeaderButton.kt`:
- Line 42: In HeaderButton (HeaderButton.kt) remove the unnecessary lambda
wrapper around the onClick prop and pass the function reference directly;
replace the current onClick = { onClick() } with onClick = onClick so the
composable uses the provided function reference (parameter name: onClick)
directly.
- Around line 3-28: The HeaderButton composable file still contains leftover
imports from the removed custom shadow logic; remove the unused imports to clean
up the file: background, border, drawWithCache, Brush, ClipOp, Path, addOutline,
asAndroidPath, clipPath, drawIntoCanvas, nativeCanvas, and toArgb; keep only the
imports actually used by HeaderButton (e.g., Composable, Modifier, Button,
ButtonDefaults, Icon, painterResource, size, PaddingValues, CircleShape, dp,
RequiresApi, Build, and any others referenced in the HeaderButton function) so
the file compiles without dead imports.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/Slope.kt`:
- Around line 43-44: The absolute Modifier.offset calls in Slope.kt (e.g.,
Modifier.offset(x = 32.dp, y = 181.dp) and the similar offsets at the other
noted lines) are device-fragile; replace them with responsive layout logic using
BoxWithConstraints or size/align/fillMaxWidth(fraction) and computed offsets
derived from maxWidth/maxHeight so positions scale with screen size. Locate the
composables in Slope.kt that use Modifier.offset (and any fixed dp sizes) and
change them to measure parent constraints via BoxWithConstraints, compute
fractional offsets or use Modifier.align/Modifier.fillMaxWidth with appropriate
fractions, or use with(LocalDensity.current) to compute dp from percentages so
the elements maintain relative placement across devices. Ensure you update all
instances referenced in the comment (the offset occurrences and fixed sizes) to
the same constraint- or proportion-based approach.

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt`:
- Line 4: Remove the incorrect unused import android.view.RoundedCorner from
HomeScreen.kt; the Compose code already uses
androidx.compose.foundation.shape.RoundedCornerShape (used in the HomeScreen
composable), so delete the android.view.RoundedCorner import to avoid confusion
and unused import warnings.
- Line 77: The greeting text is hardcoded ("Hi, Arielle ☀️") in HomeScreen;
change HomeScreen to accept a dynamic user name (e.g., add a parameter userName:
String) or obtain it from a ViewModel (e.g., HomeViewModel.userName) and use
that value in the Text composable instead of the literal; update any callers of
HomeScreen to pass the userName (or wire the ViewModel into HomeScreen) so the
greeting becomes dynamic and testable.
- Around line 30-32: Remove the unused Material3 imports TextField,
TextFieldColors, and TextFieldDefaults from HomeScreen.kt since the
implementation uses BasicTextField; locate the import block at the top of the
file, delete the three unused symbols, and run a quick build or IDE
auto-organize imports to ensure no remaining unused import warnings.
- Around line 238-240: The three hardcoded ChimePerformanceCard calls in
HomeScreen (e.g., ChimePerformanceCard("Morning", "7:45 AM - 8:00 AM")) should
be driven by a data source/ViewModel instead of inline literals; update
HomeScreen to iterate over a list provided by the ViewModel (e.g., a
List<ChimeSlot> from HomeViewModel) and render ChimePerformanceCard for each
item, and if you’re keeping the hardcoded values temporarily add a TODO comment
near these calls (TODO: replace hardcoded slots with ViewModel-driven data) to
track the work.

In `@app/src/main/java/com/cornellappdev/chimes/ui/theme/Type.kt`:
- Around line 18-20: The Montserrat FontFamily currently defines only a single
Font, causing Android to synthesize FontWeight.Medium and FontWeight.SemiBold;
update the Montserrat FontFamily to include explicit Font entries for the
weights you use (e.g., FontWeight.W400, FontWeight.W500 (Medium),
FontWeight.W600 (SemiBold)) by adding additional Font(...) items with the same
GoogleFont("Montserrat") and GoogleFontsProvider and the appropriate weight
parameter so HomeScreen.kt's FontWeight.Medium and FontWeight.SemiBold map to
real font files.

In `@app/src/main/res/drawable/ic_navigation.xml`:
- Line 8: The SVG drawable uses a hardcoded color in the android:fillColor
attribute (android:fillColor="#757575") which won't follow theme or dark mode;
update the drawable (ic_navigation.xml) to reference a color resource or theme
attribute instead (e.g., android:fillColor="@color/your_icon_color" or
android:fillColor="?attr/colorOnSurface") and add/update the corresponding color
resource(s) in colors.xml (or theme attrs) so the icon adapts to light/dark
themes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 588d232f-f87a-43f0-93f1-a2ccf9baf8a5

📥 Commits

Reviewing files that changed from the base of the PR and between 21e6fc3 and b071472.

⛔ Files ignored due to path filters (1)
  • app/src/main/res/drawable/ic_clocktower_day.png is excluded by !**/*.png
📒 Files selected for processing (15)
  • app/build.gradle.kts
  • app/src/main/AndroidManifest.xml
  • app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeCard.kt
  • app/src/main/java/com/cornellappdev/chimes/ui/components/ChimeKudos.kt
  • app/src/main/java/com/cornellappdev/chimes/ui/components/ChimePerformanceCard.kt
  • app/src/main/java/com/cornellappdev/chimes/ui/components/HeaderButton.kt
  • app/src/main/java/com/cornellappdev/chimes/ui/components/Slope.kt
  • app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt
  • app/src/main/java/com/cornellappdev/chimes/ui/theme/Type.kt
  • app/src/main/res/drawable/ic_music_notes.xml
  • app/src/main/res/drawable/ic_navigation.xml
  • app/src/main/res/drawable/ic_trees_back.xml
  • app/src/main/res/drawable/ic_trees_front.xml
  • app/src/main/res/values/font_certs.xml
  • gradle/libs.versions.toml

Comment on lines +50 to +52
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.room3.runtime)
implementation(libs.androidx.room.ktx)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find the version catalog
CATALOG="$(fd -a 'libs.versions.toml' | head -n1)"
echo "Using catalog: ${CATALOG}"

# Show relevant library entries
echo "---- Potentially related entries ----"
rg -n "ui-graphics|room.*runtime|room-ktx|google.*fonts|compose.*ui.*graphics" "$CATALOG"

# Parse TOML and print modules that can conflict
python - <<'PY'
import tomllib, pathlib, re
p = next(pathlib.Path('.').rglob('libs.versions.toml'))
data = tomllib.loads(p.read_text())
libs = data.get("libraries", {})
print("\nResolved library modules containing graphics/room/fonts:")
for name, cfg in libs.items():
    if not isinstance(cfg, dict):
        continue
    module = cfg.get("module", "")
    if any(k in module for k in ["ui-graphics", "androidx.room:", "google.fonts"]):
        print(f"{name} -> {module} | version={cfg.get('version.ref', cfg.get('version'))}")
PY

Repository: cuappdev/chimes-android

Length of output: 762


Remove duplicate graphics dependency and verify nonstandard room group.

Line 50 (libs.androidx.ui.graphics) duplicates an existing graphics dependency—both androidx-compose-ui-graphics and androidx-ui-graphics resolve to the same module androidx.compose.ui:ui-graphics. Remove one or consolidate the imports.

Line 51 uses a nonstandard library group: androidx-room3-runtime maps to androidx.room3:room3-runtime, but the correct androidx.room group is androidx.room, not androidx.room3. Verify this is intentional or correct the version catalog entry.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/build.gradle.kts` around lines 50 - 52, Remove the duplicate graphics
dependency by keeping only one implementation(libs.androidx.ui.graphics) entry
(consolidate/remove the redundant
androidx-compose-ui-graphics/androidx-ui-graphics mapping) and then correct the
Room catalog key/mapping: replace or update
implementation(libs.androidx.room3.runtime) so it uses the standard
androidx.room group (e.g., libs.androidx.room.runtime) or fix the
version-catalog entry that maps androidx.room3:room3-runtime to point to
androidx.room:room-runtime; ensure the build.gradle.kts references the corrected
catalog key.

fontFamily = Montserrat,
modifier = Modifier.width(75.dp)
)
Spacer(modifier = Modifier.fillMaxHeight().width((1f).dp).border((0.5f).dp, Color(0x4D635858)))
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Spacer with border won't render a visible divider.

Spacer has no intrinsic content, so applying a border modifier to it won't produce a visible line. Use a Box with a background color or Material's VerticalDivider instead.

🐛 Proposed fix using Box
-            Spacer(modifier = Modifier.fillMaxHeight().width((1f).dp).border((0.5f).dp, Color(0x4D635858)))
+            Box(
+                modifier = Modifier
+                    .fillMaxHeight()
+                    .width(1.dp)
+                    .background(Color(0x4D635858))
+            )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Spacer(modifier = Modifier.fillMaxHeight().width((1f).dp).border((0.5f).dp, Color(0x4D635858)))
Box(
modifier = Modifier
.fillMaxHeight()
.width(1.dp)
.background(Color(0x4D635858))
)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@app/src/main/java/com/cornellappdev/chimes/ui/components/ChimePerformanceCard.kt`
at line 44, The Spacer with a border in ChimePerformanceCard.kt won't render a
visible divider; replace the Spacer(modifier =
Modifier.fillMaxHeight().width((1f).dp).border((0.5f).dp, Color(0x4D635858)))
with a composable that actually paints pixels (e.g., use Box(modifier =
Modifier.fillMaxHeight().width(0.5.dp).background(Color(0x4D635858))) or
Material's VerticalDivider) so the vertical line is visible; update the modifier
values to use dp (not (1f).dp) and ensure the composable is placed where the
Spacer was to maintain layout.

)
Image(
painter = painterResource(R.drawable.ic_music_notes),
contentDescription = "",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Mark decorative images as non-accessibility elements.

At Lines 42/47/53/75/81, use contentDescription = null instead of "" so screen readers skip purely decorative assets cleanly.

Suggested patch
-            contentDescription = "",
+            contentDescription = null,

Also applies to: 47-47, 53-53, 75-75, 81-81

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/components/Slope.kt` at line
42, Replace empty-string content descriptions with null for decorative images in
the Slope composable so screen readers skip them; locate the Image/ImageVector
usages within the Slope composable (the parameters currently using
contentDescription = "") and change those properties to contentDescription =
null for each decorative asset (the occurrences around the Image calls in
Slope.kt).

Comment on lines 54 to 55
@RequiresApi(Build.VERSION_CODES.S)
@Composable
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for Android 12+ specific APIs in HomeScreen.kt
fd -t f "HomeScreen.kt" --exec cat {} \; | grep -iE "(RoundedCorner|SplashScreen|BlurMask|RenderEffect)"

Repository: cuappdev/chimes-android

Length of output: 450


🏁 Script executed:

fd -t f "HomeScreen.kt" --exec wc -l {} \;

Repository: cuappdev/chimes-android

Length of output: 140


🏁 Script executed:

cat -n ./app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt

Repository: cuappdev/chimes-android

Length of output: 13688


Remove the @RequiresApi(Build.VERSION_CODES.S) annotation. The composable uses only Jetpack Compose APIs that are available on lower API levels. While android.view.RoundedCorner is imported (which requires API 31), it is never used—only RoundedCornerShape from androidx.compose.foundation.shape is used, which has no such requirement. Keeping this annotation unnecessarily restricts the app's minimum API level.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/cornellappdev/chimes/ui/screens/HomeScreen.kt` around
lines 54 - 55, Remove the unnecessary API-level restriction by deleting the
`@RequiresApi`(Build.VERSION_CODES.S) annotation from the HomeScreen composable;
also remove the unused android.view.RoundedCorner import if present and ensure
the code uses androidx.compose.foundation.shape.RoundedCornerShape (not
android.view.RoundedCorner), so the composable no longer forces API 31.

Comment on lines +1 to +19
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="com_google_android_gms_fonts_certs">
<item>@array/com_google_android_gms_fonts_certs_dev</item>
<item>@array/com_google_android_gms_fonts_certs_prod</item>
</array>

<string-array name="com_google_android_gms_fonts_certs_dev">
<item>
MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UEChMKR29vZ2xlIEluYzEUMBIGA1UECxMLRW5naW5lZXJpbmcxFTATBgNVBAMTDGlubmVyLWtleXMtMTAeFw0xNjA1MDIwMjAxNTVaFw00MzA5MTgwMjAxNTVaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UEChMKR29vZ2xlIEluYzEUMBIGA1UECxMLRW5naW5lZXJpbmcxFTATBgNVBAMTDGlubmVyLWtleXMtMQ==
</item>
</string-array>

<string-array name="com_google_android_gms_fonts_certs_prod">
<item>
MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjERMA8GA1UECxMISW5mb1NlYzEQMA4GA1UEAxMHcm9vdENBMB4XDTE2MDIwMzA2MDYwN1oXDTI2MDEzMTA2MDYwN1owgYExCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjERMA8GA1UECxMISW5mb1NlYzEQMA4GA1UEAxMHcm9vdENB
</item>
</string-array>
</resources> No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if AndroidManifest.xml has the required queries element for Google Fonts
fd -t f "AndroidManifest.xml" --exec grep -l "queries" {} \; || echo "No <queries> element found in manifest files"
fd -t f "AndroidManifest.xml" --exec cat {} \;

Repository: cuappdev/chimes-android

Length of output: 1169


🏁 Script executed:

# Find build.gradle files and check minSdkVersion
fd -t f "build.gradle" -o "build.gradle.kts" --exec grep -H "minSdk" {} \;

Repository: cuappdev/chimes-android

Length of output: 218


🏁 Script executed:

# Search for Google Fonts provider usage in the codebase
rg "com\.google\.android\.gms\.fonts|GoogleFonts|fonts\s+provider" -i

Repository: cuappdev/chimes-android

Length of output: 872


🏁 Script executed:

# Find build.gradle files and check minSdkVersion
fd -t f "build.gradle" --exec grep -H "minSdk" {} \;

Repository: cuappdev/chimes-android

Length of output: 109


🏁 Script executed:

# Check targetSdk version
fd -t f "build.gradle.kts" --exec grep -H "targetSdk" {} \;

Repository: cuappdev/chimes-android

Length of output: 112


Add <queries> element to AndroidManifest.xml for Android 11+ package visibility compatibility.

The font_certs.xml configuration is correct. However, since the app actively uses the Google Fonts provider (configured in Type.kt with authority com.google.android.gms.fonts) and targets Android 15 (targetSdk 36), the AndroidManifest.xml must include a <queries> element to comply with Android 11+ package visibility restrictions. Without it, font loading will fail on Android 11+ devices.

Add the following to the <manifest> element in AndroidManifest.xml:

Required AndroidManifest.xml change
<queries>
    <package android:name="com.google.android.gms" />
</queries>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/res/values/font_certs.xml` around lines 1 - 19, The app uses the
Google Fonts provider (authority "com.google.android.gms.fonts" configured in
Type.kt) but the AndroidManifest is missing a <queries> entry, which prevents
package visibility on Android 11+; fix by adding a <queries> element inside the
manifest that declares the package "com.google.android.gms" so the system allows
visibility to the Google Play Services fonts provider.

material3AdaptiveNav3 = "1.3.0-alpha09"
room3Runtime = "3.0.0-alpha01"
roomKtx = "2.8.4"
uiTextGoogleFonts = "<version>"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

What is the latest version of androidx.compose.ui:ui-text-google-fonts?

💡 Result:

The latest published version of androidx.compose.ui:ui-text-google-fonts is 1.10.6 (released March 25, 2026). [1] [2]


🏁 Script executed:

fd -n "libs.versions.toml" --type f

Repository: cuappdev/chimes-android

Length of output: 297


🏁 Script executed:

fd "libs.versions.toml" --type f

Repository: cuappdev/chimes-android

Length of output: 92


🏁 Script executed:

cat -n gradle/libs.versions.toml | head -30

Repository: cuappdev/chimes-android

Length of output: 1751


Placeholder version will cause build failure.

The version "<version>" is not a valid version string and will fail Gradle resolution. Replace with an actual version number. The latest available version is 1.10.6 (released March 25, 2026), which is compatible with your Compose BOM version.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@gradle/libs.versions.toml` at line 18, The placeholder version for the
library identifier uiTextGoogleFonts in libs.versions.toml is invalid and will
break Gradle resolution; replace the value "<version>" with the actual version
string "1.10.6" (the latest compatible release) so the line reads
uiTextGoogleFonts = "1.10.6".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant