Conversation
📝 WalkthroughWalkthroughThis PR adds class end-time storage and weekly notifications, a calendar date picker for tasks, decorative icon overlays across tab pages, Appwrite and type updates, dependency bumps, and new IntelliJ project files. ChangesClass Notifications, Task Calendar, and Decorative UI Refresh
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Comment |
There was a problem hiding this comment.
Actionable comments posted: 11
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
app/(taps)/_layout.tsx (1)
22-24:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winReturn the redirect in the unauthenticated branch.
At lines 22-24, the
Redirectelement is created but never returned, allowing signed-out users to proceed to the tabs layout instead of being redirected to the sign-in screen.Suggested fix
if (!isSignedIn) { - <Redirect href={{ pathname: "/(auth)/sign-in" as any }} /> + return <Redirect href={{ pathname: "/(auth)/sign-in" as any }} />; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/`(taps)/_layout.tsx around lines 22 - 24, The unauthenticated branch currently instantiates a Redirect but does not return it, so when isSignedIn is false users continue into the tabs layout; update the conditional to return the Redirect component instance (the Redirect element created with href={{ pathname: "/(auth)/sign-in" as any }}) when isSignedIn is false so the function/component exits early and unauthenticated users are actually redirected..env (1)
1-10:⚠️ Potential issue | 🟠 Major | ⚡ Quick winSecrets committed to version control.
This
.envfile contains API keys and sensitive configuration values (Clerk publishable key, PostHog API key, Appwrite project ID). Committing secrets to version control is a security risk - they can be exposed in repository history even after removal.Consider:
- Adding
.envto.gitignore- Using
.env.examplewith placeholder values for documentation- Distributing actual secrets through secure channels
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.env around lines 1 - 10, Remove the committed secrets from the repository history and stop tracking the .env file: delete the sensitive values from this .env (keys like EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY, EXPO_PUBLIC_POSTHOG_API_KEY, EXPO_PUBLIC_APPWRITE_PROJECT_ID, etc.), add .env to .gitignore, and replace the committed file with a non-sensitive .env.example that contains placeholder values and descriptions for those keys; additionally rotate/revoke the exposed API keys/secrets immediately and distribute new credentials via a secure secrets manager or encrypted channel rather than committing them to the repo.
🧹 Nitpick comments (5)
.idea/.gitignore (1)
1-3: ⚡ Quick winConsider excluding the entire
.idea/directory at the root.gitignore.IDE configuration files are typically user/machine-specific and can cause merge conflicts. The standard practice is to add
.idea/to the root.gitignorerather than selectively committing IDE files. This is especially important given that cache files likedeviceStreaming.xmlhave been committed in this PR.📝 Proposed change
Add this line to your root
.gitignore:+.idea/Then remove all
.idea/files from the repository:git rm -r --cached .idea/🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.idea/.gitignore around lines 1 - 3, Add the entire .idea/ directory to the root .gitignore and remove all tracked .idea files from the repository so IDE-specific files (like deviceStreaming.xml) are no longer committed; update the root .gitignore to include ".idea/" and then remove the tracked .idea entries from the Git index (leaving local files intact) and commit the removal and updated .gitignore.app.json (1)
23-26: ⚡ Quick winAdaptive icon layers should not be identical unless intentionally designed that way.
foregroundImage,backgroundImage, andmonochromeImageall reference the same file and are byte-identical. Per Expo adaptive icon guidelines, these should typically be separate assets: foreground with transparency/detail, background with solid color/pattern, and monochrome for themed icons. Confirm this is intentional or provide separate assets for each layer.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app.json` around lines 23 - 26, The adaptive icon configuration currently uses the same file for foregroundImage, backgroundImage, and monochromeImage (and thus byte-identical assets); update the app.json entries so each adaptive icon layer points to the correct separate asset: provide a transparent/detailed image for foregroundImage (e.g. ./assets/icons/adaptive-foreground.png), a solid/pattern background for backgroundImage (e.g. ./assets/icons/adaptive-background.png) and a simplified single-color asset for monochromeImage (e.g. ./assets/icons/adaptive-monochrome.png), or explicitly document that using the same file is intentional by leaving a comment and changing only backgroundColor if needed; ensure the file names referenced by foregroundImage, backgroundImage, and monochromeImage are unique and match the actual asset files.components/Addclass.tsx (2)
47-49: 💤 Low valueRemove unused state and computed value.
brightnessstate andadjustedColorare defined but never used in the component. If color brightness adjustment is planned for a future feature, consider removing these until needed.Proposed fix
const [color, setColor] = useState("#f5c542"); - const [brightness, setBrightness] = useState(1); const [editingIndex, setEditingIndex] = useState<number | null>(null); - const adjustedColor = tinycolor(color).lighten((brightness - 1) * 50).toString();Also remove the unused
Sliderandtinycolorimports at lines 25-26.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@components/Addclass.tsx` around lines 47 - 49, Remove the unused brightness state and its setter (brightness, setBrightness) and the unused computed adjustedColor value from the Addclass component; also delete the unused tinycolor import and the Slider import mentioned in the review so there are no orphaned variables or imports (search for brightness, setBrightness, adjustedColor, tinycolor, and Slider in Addclass.tsx to locate and remove them).
2-2: 💤 Low valueRemove unused import.
TASKSis imported but never used in this file.Proposed fix
-import { CLASSES, TASKS } from "@/constants/data"; +import { CLASSES } from "@/constants/data";🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@components/Addclass.tsx` at line 2, The import statement in Addclass.tsx includes an unused symbol TASKS; remove TASKS from the import so it only imports CLASSES (i.e., change the import that currently reads "import { CLASSES, TASKS } from ..." to import only CLASSES) to eliminate the unused import warning and keep imports minimal.app/(taps)/tasks.tsx (1)
21-21: 💤 Low valueRemove unnecessary variable alias.
seticonsis just an alias foriconswith no transformation. Useiconsdirectly throughout the component.Proposed fix
- const seticons = iconsThen replace
seticons.idk,seticons.youtube, etc. withicons.idk,icons.youtube, etc.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/`(taps)/tasks.tsx at line 21, The variable seticons is an unnecessary alias for icons; remove the declaration "const seticons = icons" and replace all usages of seticons (e.g. seticons.idk, seticons.youtube, etc.) with icons.idk, icons.youtube, etc., ensuring any imports or references still use the original icons identifier (update JSX/logic in the component where seticons is used and delete the alias line).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.env:
- Line 6: Remove the surrounding double quotes from the
EXPO_PUBLIC_APPWRITE_PROJECT_NAME environment value so the variable is set to
URSApp (not "URSApp"); locate the EXPO_PUBLIC_APPWRITE_PROJECT_NAME entry in the
.env and edit its value to drop the quotes to avoid the QuoteCharacter issue.
In @.idea/caches/deviceStreaming.xml:
- Around line 1-1760: Remove the committed IDE cache file deviceStreaming.xml
(the .idea/caches/deviceStreaming.xml entry) from the repository and stop
tracking it: remove it from git (git rm) and add the IDE cache directory (e.g.,
.idea/ or .idea/caches/) to .gitignore so it won’t be committed again; then
commit the removal and updated .gitignore.
In @.idea/misc.xml:
- Line 3: The ProjectRootManager entry hardcodes languageLevel="JDK_26" and
project-jdk-name="Android API 36.1, extension level 20 Platform"; update the
.idea configuration so it does not embed local SDK versions: remove or replace
the languageLevel and project-jdk-name attributes in the component named
"ProjectRootManager" with a neutral/team-consistent setting (e.g., use the
project default or leave attributes out) or switch to a portable placeholder
that your build/gradle files control; ensure team members can rely on the
repository-managed SDK settings rather than local, machine-specific values.
In `@app/`(auth)/sign-in.tsx:
- Line 254: The JSX text node "Don't have an account?" in app/(auth)/sign-in.tsx
triggers react/no-unescaped-entities; locate that string in the SignIn component
(or the JSX rendering for the sign-in page) and escape the apostrophe—either
replace the literal apostrophe with ' or wrap the string in a JS expression
(e.g. {"Don't have an account?"}) or use a typographic apostrophe (’); ensure
the JSX text node no longer contains an unescaped ' character.
In `@app/`(auth)/sign-up.tsx:
- Line 63: The ScrollView currently lacks keyboard persistence causing the first
tap to only dismiss the keyboard instead of triggering button handlers
(affecting the "Sign up"/"Verify" onPress flows); update the ScrollView
component to include the prop keyboardShouldPersistTaps="handled" so taps on
interactive elements (e.g., the Sign up and Verify button onPress handlers) are
delivered while the keyboard is open.
In `@components/Addclass.tsx`:
- Around line 194-220: The code schedules one notification per weekday but only
stores/cancels a single notificationId; update the data model and save flow so
all notification IDs are tracked and cleaned up: modify the Classes type to have
notificationIds: string[] (or rename to notificationIds), update where
newClasses are transformed (scheduleClassAlarm maps) to collect an array of IDs
(reference functions/vars: scheduleClassAlarm, classesWithNotifications,
notificationId, newClasses) and persist classesWithNotifications into CLASSES
instead of discarding it; also change the edit/delete cleanup (where
editingIndex and CLASSES[editingIndex] are used) to iterate over
CLASSES[editingIndex].notificationIds and call
Notifications.cancelScheduledNotificationAsync for each id. Ensure downstream
code that reads notificationId uses the new notificationIds array.
- Around line 76-84: The permission request (requestPermissions) is currently
inside the useEffect block scoped to if (item.endDate) so notifications
permissions are not requested when creating or editing classes without an
endDate; remove the requestPermissions declaration and its call from the
useEffect, and instead invoke the same permission-request flow at the start of
handleSave (before scheduling notifications) mirroring Addtask.tsx's
scheduleTaskAlarm pattern—ensure you call
Notifications.requestPermissionsAsync() and check status !== 'granted' with
Alert.alert before scheduling notifications so permissions are always requested
when saving.
In `@global.css`:
- Around line 67-68: The .test CSS rule currently lacks a blank line before the
second declaration which violates declaration-empty-line-before; open the .test
rule (the block containing "@apply text-2xl text-subprimary;" and "font-family:
var(--font-Coopbl);") and insert a single empty line between the `@apply`
declaration and the font-family declaration so there is a blank line before
"font-family".
- Around line 6-10: Stylelint is flagging the Tailwind v4 `@theme` at-rule as
unknown; update your Stylelint config (.stylelintrc.json) to allow
Tailwind-specific at-rules by adding an ignore list for at-rules (e.g., add
"scss/at-rule-no-unknown": [true, { "ignoreAtRules": ["theme", "apply",
"screen", "variants", ...] }] or install/configure a Tailwind-aware Stylelint
plugin) so the `@theme` rule in global.css is accepted; modify the rule in
.stylelintrc.json and/or add the Tailwind plugin to the config to avoid false
positives.
In `@lib/appwrite.js`:
- Around line 158-171: The TablesDB calls are using positional args for listRows
and createRow which will cause runtime errors; update all calls to match the
react-native-appwrite API by passing an object: change listRows(databaseId,
tableId, queries) to listRows({ databaseId: APPWRITE_DATABASE_ID, tableId:
APPWRITE_CLASSES_TABLE_ID, queries }) and change createRow(databaseId, tableId,
documentId, data) to createRow({ databaseId: APPWRITE_DATABASE_ID, tableId:
APPWRITE_CLASSES_TABLE_ID, rowId: documentId, data }); leave updateRow({
databaseId, tableId, rowId, data }) and deleteRow({ databaseId, tableId, rowId
}) as-is.
In `@package.json`:
- Around line 14-15: Remove the deprecated dependency "@clerk/clerk-expo" from
package.json (the entry "@clerk/clerk-expo": "^2.3.0") and keep only
"@clerk/expo": "^3.0.0"; after removing the entry, run your package manager (npm
install / yarn install / pnpm install) to update the lockfile and node_modules,
and verify there are no imports/usages of "@clerk/clerk-expo" and that app.json
still references "@clerk/expo".
---
Outside diff comments:
In @.env:
- Around line 1-10: Remove the committed secrets from the repository history and
stop tracking the .env file: delete the sensitive values from this .env (keys
like EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY, EXPO_PUBLIC_POSTHOG_API_KEY,
EXPO_PUBLIC_APPWRITE_PROJECT_ID, etc.), add .env to .gitignore, and replace the
committed file with a non-sensitive .env.example that contains placeholder
values and descriptions for those keys; additionally rotate/revoke the exposed
API keys/secrets immediately and distribute new credentials via a secure secrets
manager or encrypted channel rather than committing them to the repo.
In `@app/`(taps)/_layout.tsx:
- Around line 22-24: The unauthenticated branch currently instantiates a
Redirect but does not return it, so when isSignedIn is false users continue into
the tabs layout; update the conditional to return the Redirect component
instance (the Redirect element created with href={{ pathname: "/(auth)/sign-in"
as any }}) when isSignedIn is false so the function/component exits early and
unauthenticated users are actually redirected.
---
Nitpick comments:
In @.idea/.gitignore:
- Around line 1-3: Add the entire .idea/ directory to the root .gitignore and
remove all tracked .idea files from the repository so IDE-specific files (like
deviceStreaming.xml) are no longer committed; update the root .gitignore to
include ".idea/" and then remove the tracked .idea entries from the Git index
(leaving local files intact) and commit the removal and updated .gitignore.
In `@app.json`:
- Around line 23-26: The adaptive icon configuration currently uses the same
file for foregroundImage, backgroundImage, and monochromeImage (and thus
byte-identical assets); update the app.json entries so each adaptive icon layer
points to the correct separate asset: provide a transparent/detailed image for
foregroundImage (e.g. ./assets/icons/adaptive-foreground.png), a solid/pattern
background for backgroundImage (e.g. ./assets/icons/adaptive-background.png) and
a simplified single-color asset for monochromeImage (e.g.
./assets/icons/adaptive-monochrome.png), or explicitly document that using the
same file is intentional by leaving a comment and changing only backgroundColor
if needed; ensure the file names referenced by foregroundImage, backgroundImage,
and monochromeImage are unique and match the actual asset files.
In `@app/`(taps)/tasks.tsx:
- Line 21: The variable seticons is an unnecessary alias for icons; remove the
declaration "const seticons = icons" and replace all usages of seticons (e.g.
seticons.idk, seticons.youtube, etc.) with icons.idk, icons.youtube, etc.,
ensuring any imports or references still use the original icons identifier
(update JSX/logic in the component where seticons is used and delete the alias
line).
In `@components/Addclass.tsx`:
- Around line 47-49: Remove the unused brightness state and its setter
(brightness, setBrightness) and the unused computed adjustedColor value from the
Addclass component; also delete the unused tinycolor import and the Slider
import mentioned in the review so there are no orphaned variables or imports
(search for brightness, setBrightness, adjustedColor, tinycolor, and Slider in
Addclass.tsx to locate and remove them).
- Line 2: The import statement in Addclass.tsx includes an unused symbol TASKS;
remove TASKS from the import so it only imports CLASSES (i.e., change the import
that currently reads "import { CLASSES, TASKS } from ..." to import only
CLASSES) to eliminate the unused import warning and keep imports minimal.
🪄 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 Plus
Run ID: ae1bbc85-cf46-4d41-b650-1aa4a356847c
⛔ Files ignored due to path filters (17)
assets/icons/Vector.pngis excluded by!**/*.pngassets/icons/adaptive-icon.pngis excluded by!**/*.pngassets/icons/icon-black.pngis excluded by!**/*.pngassets/icons/icons8-amazon-100.pngis excluded by!**/*.pngassets/icons/icons8-discord-new-100.pngis excluded by!**/*.pngassets/icons/icons8-facebook-100.pngis excluded by!**/*.pngassets/icons/icons8-telegram-100.pngis excluded by!**/*.pngassets/icons/icons8-twitter-bird-100.pngis excluded by!**/*.pngassets/icons/icons8-windows-8-100.pngis excluded by!**/*.pngassets/icons/icons8-youtube-100.pngis excluded by!**/*.pngassets/icons/idk.pngis excluded by!**/*.pngassets/icons/ios-dark.pngis excluded by!**/*.pngassets/icons/ios-light.pngis excluded by!**/*.pngassets/icons/ios-tinted.pngis excluded by!**/*.pngassets/icons/splash-icon-dark.pngis excluded by!**/*.pngassets/icons/splash-icon-light.pngis excluded by!**/*.pngpackage-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (24)
.env.idea/.gitignore.idea/ORB.iml.idea/caches/deviceStreaming.xml.idea/markdown.xml.idea/misc.xml.idea/modules.xml.idea/vcs.xmlapp.jsonapp/(auth)/sign-in.tsxapp/(auth)/sign-up.tsxapp/(taps)/_layout.tsxapp/(taps)/index.tsxapp/(taps)/schudule.tsxapp/(taps)/settings.tsxapp/(taps)/tasks.tsxapp/_layout.tsxcomponents/Addclass.tsxcomponents/Addtask.tsxconstants/icons.tsglobal.csslib/appwrite.jspackage.jsontype.d.ts
| EXPO_PUBLIC_APPWRITE_PROJECT_ID=69f8a9b10028abe91f1d | ||
| EXPO_PUBLIC_APPWRITE_PROJECT_NAME=URSApp | ||
| EXPO_PUBLIC_APPWRITE_PLATFORM=com.hamza.urs | ||
| EXPO_PUBLIC_APPWRITE_PROJECT_NAME="URSApp" |
There was a problem hiding this comment.
Remove quotes from environment variable value.
The quotes around "URSApp" will be interpreted literally in many environments, resulting in the value being "URSApp" (with quotes) instead of URSApp. This can cause unexpected behavior when the value is compared or used.
As per static analysis, the QuoteCharacter warning indicates this issue.
Proposed fix
-EXPO_PUBLIC_APPWRITE_PROJECT_NAME="URSApp"
+EXPO_PUBLIC_APPWRITE_PROJECT_NAME=URSApp📝 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.
| EXPO_PUBLIC_APPWRITE_PROJECT_NAME="URSApp" | |
| EXPO_PUBLIC_APPWRITE_PROJECT_NAME=URSApp |
🧰 Tools
🪛 dotenv-linter (4.0.0)
[warning] 6-6: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 6-6: [UnorderedKey] The EXPO_PUBLIC_APPWRITE_PROJECT_NAME key should go before the EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY key
(UnorderedKey)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.env at line 6, Remove the surrounding double quotes from the
EXPO_PUBLIC_APPWRITE_PROJECT_NAME environment value so the variable is set to
URSApp (not "URSApp"); locate the EXPO_PUBLIC_APPWRITE_PROJECT_NAME entry in the
.env and edit its value to drop the quotes to avoid the QuoteCharacter issue.
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="DeviceStreaming"> | ||
| <option name="deviceSelectionList"> | ||
| <list> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="Sony" /> | ||
| <option name="codename" value="A402SO" /> | ||
| <option name="id" value="A402SO" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Sony" /> | ||
| <option name="name" value="Xperia 10 VI" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2520" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="27" /> | ||
| <option name="brand" value="DOCOMO" /> | ||
| <option name="codename" value="F01L" /> | ||
| <option name="id" value="F01L" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="FUJITSU" /> | ||
| <option name="name" value="F-01L" /> | ||
| <option name="screenDensity" value="360" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1280" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="OnePlus" /> | ||
| <option name="codename" value="OP535DL1" /> | ||
| <option name="id" value="OP535DL1" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="OnePlus" /> | ||
| <option name="name" value="Nord CE 2 Lite 5G" /> | ||
| <option name="screenDensity" value="401" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2412" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="OnePlus" /> | ||
| <option name="codename" value="OP5552L1" /> | ||
| <option name="id" value="OP5552L1" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="OnePlus" /> | ||
| <option name="name" value="10T 5G" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2412" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="OPPO" /> | ||
| <option name="codename" value="OP573DL1" /> | ||
| <option name="id" value="OP573DL1" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="OPPO" /> | ||
| <option name="name" value="A79 5G" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="OPPO" /> | ||
| <option name="codename" value="OP5759L1" /> | ||
| <option name="id" value="OP5759L1" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="OPPO" /> | ||
| <option name="name" value="A38" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1612" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="realme" /> | ||
| <option name="codename" value="RE58C2" /> | ||
| <option name="id" value="RE58C2" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="realme" /> | ||
| <option name="name" value="C53" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="realme" /> | ||
| <option name="codename" value="RMX3231" /> | ||
| <option name="id" value="RMX3231" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="realme" /> | ||
| <option name="name" value="RMX3231" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="SC-53C" /> | ||
| <option name="id" value="SC-53C" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A53 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="28" /> | ||
| <option name="brand" value="DOCOMO" /> | ||
| <option name="codename" value="SH-01L" /> | ||
| <option name="id" value="SH-01L" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="SHARP" /> | ||
| <option name="name" value="AQUOS sense2 SH-01L" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2160" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="Lenovo" /> | ||
| <option name="codename" value="TB330FU" /> | ||
| <option name="formFactor" value="Tablet" /> | ||
| <option name="id" value="TB330FU" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Lenovo" /> | ||
| <option name="name" value="Tab M11" /> | ||
| <option name="screenDensity" value="240" /> | ||
| <option name="screenX" value="1200" /> | ||
| <option name="screenY" value="1920" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a03su" /> | ||
| <option name="id" value="a03su" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A03s" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a05s" /> | ||
| <option name="id" value="a05s" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A05s" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a06" /> | ||
| <option name="id" value="a06" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A06" /> | ||
| <option name="screenDensity" value="300" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a13" /> | ||
| <option name="id" value="a13" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A13" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2408" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a14m" /> | ||
| <option name="id" value="a14m" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A14" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2408" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a14xmsq" /> | ||
| <option name="id" value="a14xmsq" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A14 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2408" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a14xmtfn" /> | ||
| <option name="id" value="a14xmtfn" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A14 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2408" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a15" /> | ||
| <option name="id" value="a15" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A15" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a15x" /> | ||
| <option name="id" value="a15x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A15 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a15x" /> | ||
| <option name="id" value="a15x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A15 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a15xtfn" /> | ||
| <option name="id" value="a15xtfn" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A15 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a16" /> | ||
| <option name="id" value="a16" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A16" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a16x" /> | ||
| <option name="id" value="a16x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A16 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a16x" /> | ||
| <option name="id" value="a16x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A16 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a16xeea" /> | ||
| <option name="id" value="a16xeea" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A16 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="31" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a21" /> | ||
| <option name="id" value="a21" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A21" /> | ||
| <option name="screenDensity" value="300" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a26x" /> | ||
| <option name="id" value="a26x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A26 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a34x" /> | ||
| <option name="id" value="a34x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A34 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a35x" /> | ||
| <option name="id" value="a35x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A35 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a35x" /> | ||
| <option name="id" value="a35x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A35 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a35x" /> | ||
| <option name="id" value="a35x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A35 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a36xq" /> | ||
| <option name="id" value="a36xq" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A36 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a36xq" /> | ||
| <option name="id" value="a36xq" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A36 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="a56x" /> | ||
| <option name="id" value="a56x" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy A56 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="akita" /> | ||
| <option name="id" value="akita" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 8a" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="akita" /> | ||
| <option name="id" value="akita" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 8a" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="arcfox" /> | ||
| <option name="id" value="arcfox" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="razr plus 2024" /> | ||
| <option name="screenDensity" value="360" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="1272" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="aruba" /> | ||
| <option name="id" value="aruba" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto e20" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="austin" /> | ||
| <option name="id" value="austin" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g 5G (2022)" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="b0q" /> | ||
| <option name="id" value="b0q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S22 Ultra" /> | ||
| <option name="screenDensity" value="600" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3088" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="b0q" /> | ||
| <option name="id" value="b0q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S22 Ultra" /> | ||
| <option name="screenDensity" value="600" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3088" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="b5qsqw" /> | ||
| <option name="id" value="b5qsqw" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Z Flip5" /> | ||
| <option name="screenDensity" value="340" /> | ||
| <option name="screenX" value="748" /> | ||
| <option name="screenY" value="720" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="b6q" /> | ||
| <option name="id" value="b6q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Z Flip6" /> | ||
| <option name="screenDensity" value="340" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2640" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="b6qsqw" /> | ||
| <option name="id" value="b6qsqw" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Z Flip6" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2640" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="blazer" /> | ||
| <option name="default" value="true" /> | ||
| <option name="id" value="blazer" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 10 Pro" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2410" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="dda-default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="32" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="bluejay" /> | ||
| <option name="id" value="bluejay" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 6a" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="c1q" /> | ||
| <option name="id" value="c1q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Note20 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="c1qksw" /> | ||
| <option name="id" value="c1qksw" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Note20 5G" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="c2q" /> | ||
| <option name="id" value="c2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Note20 Ultra 5G" /> | ||
| <option name="screenDensity" value="560" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3088" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="caiman" /> | ||
| <option name="id" value="caiman" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9 Pro" /> | ||
| <option name="screenDensity" value="360" /> | ||
| <option name="screenX" value="960" /> | ||
| <option name="screenY" value="2142" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="caiman" /> | ||
| <option name="id" value="caiman" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9 Pro" /> | ||
| <option name="screenDensity" value="360" /> | ||
| <option name="screenX" value="960" /> | ||
| <option name="screenY" value="2142" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="comet" /> | ||
| <option name="id" value="comet" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9 Pro Fold" /> | ||
| <option name="screenDensity" value="390" /> | ||
| <option name="screenX" value="2076" /> | ||
| <option name="screenY" value="2152" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="comet" /> | ||
| <option name="id" value="comet" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9 Pro Fold" /> | ||
| <option name="screenDensity" value="390" /> | ||
| <option name="screenX" value="2076" /> | ||
| <option name="screenY" value="2152" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="cuscoi" /> | ||
| <option name="id" value="cuscoi" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g96 5G" /> | ||
| <option name="screenDensity" value="400" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="dm1q" /> | ||
| <option name="id" value="dm1q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="dm1q-SM-S911U" /> | ||
| <option name="id" value="dm1q-SM-S911U" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="dm1qcsx" /> | ||
| <option name="id" value="dm1qcsx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="dm2q" /> | ||
| <option name="id" value="dm2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="dm3q" /> | ||
| <option name="id" value="dm3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23 Ultra" /> | ||
| <option name="screenDensity" value="600" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3088" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="dubai" /> | ||
| <option name="id" value="dubai" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="edge 30" /> | ||
| <option name="screenDensity" value="405" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e1q" /> | ||
| <option name="id" value="e1q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e1q" /> | ||
| <option name="id" value="e1q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e1s" /> | ||
| <option name="id" value="e1s" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e2q" /> | ||
| <option name="id" value="e2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e2s" /> | ||
| <option name="id" value="e2s" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e3q" /> | ||
| <option name="id" value="e3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24 Ultra" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3120" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e3q" /> | ||
| <option name="id" value="e3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24 Ultra" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3120" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e3qcsx" /> | ||
| <option name="id" value="e3qcsx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24 Ultra" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3120" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="e3qksx" /> | ||
| <option name="id" value="e3qksx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S24 Ultra" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3120" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="eos" /> | ||
| <option name="id" value="eos" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Eos" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="384" /> | ||
| <option name="screenY" value="384" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="felix" /> | ||
| <option name="id" value="felix" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel Fold" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="2208" /> | ||
| <option name="screenY" value="1840" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="felix" /> | ||
| <option name="id" value="felix" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel Fold" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="2208" /> | ||
| <option name="screenY" value="1840" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="felix_camera" /> | ||
| <option name="id" value="felix_camera" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel Fold (Camera-enabled)" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="2208" /> | ||
| <option name="screenY" value="1840" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="fogona" /> | ||
| <option name="id" value="fogona" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g play - 2024" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="fogorow" /> | ||
| <option name="id" value="fogorow" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g24" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1612" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="fogos" /> | ||
| <option name="id" value="fogos" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g34 5G" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="fogos" /> | ||
| <option name="id" value="fogos" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g34 5G" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="frankel" /> | ||
| <option name="default" value="true" /> | ||
| <option name="id" value="frankel" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 10" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2424" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="dda-default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="g0q" /> | ||
| <option name="id" value="g0q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S22+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="g0q" /> | ||
| <option name="id" value="g0q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S22+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="gnevan" /> | ||
| <option name="id" value="gnevan" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g stylus (2023)" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gta9pwifi" /> | ||
| <option name="id" value="gta9pwifi" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab A9+" /> | ||
| <option name="screenDensity" value="240" /> | ||
| <option name="screenX" value="1200" /> | ||
| <option name="screenY" value="1920" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gts7lwifi" /> | ||
| <option name="id" value="gts7lwifi" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab S7" /> | ||
| <option name="screenDensity" value="340" /> | ||
| <option name="screenX" value="1600" /> | ||
| <option name="screenY" value="2560" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gts7xllite" /> | ||
| <option name="id" value="gts7xllite" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab S7 FE 5G" /> | ||
| <option name="screenDensity" value="340" /> | ||
| <option name="screenX" value="1600" /> | ||
| <option name="screenY" value="2560" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gts8uwifi" /> | ||
| <option name="formFactor" value="Tablet" /> | ||
| <option name="id" value="gts8uwifi" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab S8 Ultra" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="1848" /> | ||
| <option name="screenY" value="2960" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gts8wifi" /> | ||
| <option name="formFactor" value="Tablet" /> | ||
| <option name="id" value="gts8wifi" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab S8" /> | ||
| <option name="screenDensity" value="274" /> | ||
| <option name="screenX" value="1600" /> | ||
| <option name="screenY" value="2560" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gts9fe" /> | ||
| <option name="id" value="gts9fe" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab S9 FE 5G" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="2304" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="gts9wifi" /> | ||
| <option name="id" value="gts9wifi" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Tab S9" /> | ||
| <option name="screenDensity" value="340" /> | ||
| <option name="screenX" value="1600" /> | ||
| <option name="screenY" value="2560" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="guamna" /> | ||
| <option name="id" value="guamna" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g play (2021)" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="guamp" /> | ||
| <option name="id" value="guamp" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g(9) play" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="husky" /> | ||
| <option name="id" value="husky" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 8 Pro" /> | ||
| <option name="screenDensity" value="390" /> | ||
| <option name="screenX" value="1008" /> | ||
| <option name="screenY" value="2244" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="husky" /> | ||
| <option name="id" value="husky" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 8 Pro" /> | ||
| <option name="screenDensity" value="390" /> | ||
| <option name="screenX" value="1008" /> | ||
| <option name="screenY" value="2244" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="java" /> | ||
| <option name="id" value="java" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="G20" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="kansas" /> | ||
| <option name="id" value="kansas" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g - 2025" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1604" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="komodo" /> | ||
| <option name="id" value="komodo" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9 Pro XL" /> | ||
| <option name="screenDensity" value="360" /> | ||
| <option name="screenX" value="1008" /> | ||
| <option name="screenY" value="2244" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="komodo" /> | ||
| <option name="id" value="komodo" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9 Pro XL" /> | ||
| <option name="screenDensity" value="360" /> | ||
| <option name="screenX" value="1008" /> | ||
| <option name="screenY" value="2244" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="lamul" /> | ||
| <option name="id" value="lamul" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g05" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1604" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="lion" /> | ||
| <option name="id" value="lion" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g04" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1612" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="lynx" /> | ||
| <option name="id" value="lynx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 7a" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="lyriq" /> | ||
| <option name="id" value="lyriq" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="edge 40" /> | ||
| <option name="screenDensity" value="400" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="m2q" /> | ||
| <option name="id" value="m2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S26+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="manaus" /> | ||
| <option name="id" value="manaus" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="edge 40 neo" /> | ||
| <option name="screenDensity" value="400" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="motorola" /> | ||
| <option name="codename" value="maui" /> | ||
| <option name="id" value="maui" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Motorola" /> | ||
| <option name="name" value="moto g play - 2023" /> | ||
| <option name="screenDensity" value="280" /> | ||
| <option name="screenX" value="720" /> | ||
| <option name="screenY" value="1600" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="mustang" /> | ||
| <option name="default" value="true" /> | ||
| <option name="id" value="mustang" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 10 Pro XL" /> | ||
| <option name="screenDensity" value="390" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2404" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="dda-default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="o1q" /> | ||
| <option name="id" value="o1q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21 5G" /> | ||
| <option name="screenDensity" value="421" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="o1q" /> | ||
| <option name="id" value="o1q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21 5G" /> | ||
| <option name="screenDensity" value="421" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="31" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="oriole" /> | ||
| <option name="id" value="oriole" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 6" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="p3q" /> | ||
| <option name="id" value="p3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21 Ultra 5G" /> | ||
| <option name="screenDensity" value="600" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3200" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="p3s" /> | ||
| <option name="id" value="p3s" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21 Ultra 5G" /> | ||
| <option name="screenDensity" value="600" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3200" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="pa2q" /> | ||
| <option name="id" value="pa2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S25+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="pa2qxxx" /> | ||
| <option name="id" value="pa2qxxx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S25+" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="pa3q" /> | ||
| <option name="default" value="true" /> | ||
| <option name="id" value="pa3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S25 Ultra" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="dda-default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="pa3q" /> | ||
| <option name="default" value="true" /> | ||
| <option name="id" value="pa3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S25 Ultra" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="dda-default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="panther" /> | ||
| <option name="id" value="panther" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 7" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="psq" /> | ||
| <option name="id" value="psq" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S25 Edge" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3120" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="q5q" /> | ||
| <option name="id" value="q5q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Z Fold5" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1812" /> | ||
| <option name="screenY" value="2176" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="q5qksx" /> | ||
| <option name="id" value="q5qksx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Z Fold5" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1812" /> | ||
| <option name="screenY" value="2176" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="q6q" /> | ||
| <option name="id" value="q6q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy Z Fold6" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1856" /> | ||
| <option name="screenY" value="2160" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r0q" /> | ||
| <option name="id" value="r0q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S22" /> | ||
| <option name="screenDensity" value="425" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r0qcsx" /> | ||
| <option name="id" value="r0qcsx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S22" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="r11" /> | ||
| <option name="formFactor" value="Wear OS" /> | ||
| <option name="id" value="r11" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel Watch" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="384" /> | ||
| <option name="screenY" value="384" /> | ||
| <option name="type" value="WEAR_OS" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r11q" /> | ||
| <option name="id" value="r11q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23 FE" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r11s" /> | ||
| <option name="id" value="r11s" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S23 FE" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r8q" /> | ||
| <option name="id" value="r8q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S20 FE 5G" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r8qksx" /> | ||
| <option name="id" value="r8qksx" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S20 FE 5G" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r9q" /> | ||
| <option name="id" value="r9q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21 FE 5G" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="r9q-SM-G990U" /> | ||
| <option name="id" value="r9q-SM-G990U" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21 FE 5G" /> | ||
| <option name="screenDensity" value="480" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="rango" /> | ||
| <option name="default" value="true" /> | ||
| <option name="id" value="rango" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 10 Pro Fold" /> | ||
| <option name="screenDensity" value="390" /> | ||
| <option name="screenX" value="2076" /> | ||
| <option name="screenY" value="2152" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="dda-default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="30" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="redfin" /> | ||
| <option name="id" value="redfin" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 5" /> | ||
| <option name="screenDensity" value="440" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2340" /> | ||
| <option name="tags"> | ||
| <list> | ||
| <option value="default" /> | ||
| </list> | ||
| </option> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="shiba" /> | ||
| <option name="id" value="shiba" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 8" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="shiba" /> | ||
| <option name="id" value="shiba" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 8" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="t2q" /> | ||
| <option name="id" value="t2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21+ 5G" /> | ||
| <option name="screenDensity" value="394" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="t2q" /> | ||
| <option name="id" value="t2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S21+ 5G" /> | ||
| <option name="screenDensity" value="394" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2400" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="tangorpro" /> | ||
| <option name="formFactor" value="Tablet" /> | ||
| <option name="id" value="tangorpro" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel Tablet" /> | ||
| <option name="screenDensity" value="320" /> | ||
| <option name="screenX" value="1600" /> | ||
| <option name="screenY" value="2560" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="tegu" /> | ||
| <option name="id" value="tegu" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9a" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2424" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="tokay" /> | ||
| <option name="id" value="tokay" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2424" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="35" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="tokay" /> | ||
| <option name="id" value="tokay" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2424" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="36" /> | ||
| <option name="brand" value="google" /> | ||
| <option name="codename" value="tokay" /> | ||
| <option name="id" value="tokay" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Google" /> | ||
| <option name="name" value="Pixel 9" /> | ||
| <option name="screenDensity" value="420" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2424" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="34" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="xcover7" /> | ||
| <option name="id" value="xcover7" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy XCover7" /> | ||
| <option name="screenDensity" value="450" /> | ||
| <option name="screenX" value="1080" /> | ||
| <option name="screenY" value="2408" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="y2q" /> | ||
| <option name="id" value="y2q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S20+ 5G" /> | ||
| <option name="screenDensity" value="600" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3200" /> | ||
| </PersistentDeviceSelectionData> | ||
| <PersistentDeviceSelectionData> | ||
| <option name="api" value="33" /> | ||
| <option name="brand" value="samsung" /> | ||
| <option name="codename" value="z3q" /> | ||
| <option name="id" value="z3q" /> | ||
| <option name="labId" value="google" /> | ||
| <option name="manufacturer" value="Samsung" /> | ||
| <option name="name" value="Galaxy S20 Ultra 5G" /> | ||
| <option name="screenDensity" value="560" /> | ||
| <option name="screenX" value="1440" /> | ||
| <option name="screenY" value="3200" /> | ||
| </PersistentDeviceSelectionData> | ||
| </list> | ||
| </option> | ||
| </component> | ||
| </project> No newline at end of file |
There was a problem hiding this comment.
Critical: Cache file should not be committed to version control.
deviceStreaming.xml is a cache file (located under .idea/caches/) containing 1,760 lines of user-specific device streaming preferences. Cache files are:
- Automatically regenerated by the IDE
- User/machine-specific
- Prone to frequent changes and merge conflicts
- Never intended for version control
This file should be removed from the repository immediately.
🗑️ Remove the cache file
# Remove from repository
git rm .idea/caches/deviceStreaming.xml
# Ensure it's ignored
echo ".idea/" >> .gitignore🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.idea/caches/deviceStreaming.xml around lines 1 - 1760, Remove the committed
IDE cache file deviceStreaming.xml (the .idea/caches/deviceStreaming.xml entry)
from the repository and stop tracking it: remove it from git (git rm) and add
the IDE cache directory (e.g., .idea/ or .idea/caches/) to .gitignore so it
won’t be committed again; then commit the removal and updated .gitignore.
| @@ -0,0 +1,6 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <project version="4"> | |||
| <component name="ProjectRootManager" version="2" languageLevel="JDK_26" project-jdk-name="Android API 36.1, extension level 20 Platform" project-jdk-type="Android SDK"> | |||
There was a problem hiding this comment.
Hardcoded JDK and Android API versions may not match team environments.
Line 3 specifies JDK_26 and Android API 36.1 which are specific to your local setup. Other developers may use different versions, causing IDE configuration conflicts or build issues.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.idea/misc.xml at line 3, The ProjectRootManager entry hardcodes
languageLevel="JDK_26" and project-jdk-name="Android API 36.1, extension level
20 Platform"; update the .idea configuration so it does not embed local SDK
versions: remove or replace the languageLevel and project-jdk-name attributes in
the component named "ProjectRootManager" with a neutral/team-consistent setting
(e.g., use the project default or leave attributes out) or switch to a portable
placeholder that your build/gradle files control; ensure team members can rely
on the repository-managed SDK settings rather than local, machine-specific
values.
| </Pressable> | ||
| <View className="auth-link-row"> | ||
| <Text className="auth-link-copy"> | ||
| Don't have an account? |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Find and examine the sign-in file
find . -name "sign-in.tsx" -o -name "sign-in.ts" -o -name "sign-in.jsx" | head -20Repository: Hal716/ORB
Length of output: 79
🏁 Script executed:
# Check if the file exists at the expected location
if [ -f "app/(auth)/sign-in.tsx" ]; then
wc -l "app/(auth)/sign-in.tsx"
else
echo "File not found at app/(auth)/sign-in.tsx, searching..."
find . -path "*/auth*" -name "*sign-in*" 2>/dev/null
fiRepository: Hal716/ORB
Length of output: 81
🏁 Script executed:
# List ESLint config files to understand rule configuration
fd -t f "eslint" -e json -e js -e yml | head -20Repository: Hal716/ORB
Length of output: 71
🏁 Script executed:
# Read the file around line 254 with context
sed -n '240,267p' "app/(auth)/sign-in.tsx" | cat -nRepository: Hal716/ORB
Length of output: 1307
🏁 Script executed:
# Read the ESLint config to understand react rules
cat eslint.config.jsRepository: Hal716/ORB
Length of output: 291
🏁 Script executed:
# Check package.json for ESLint and React dependencies
cat package.json | head -50Repository: Hal716/ORB
Length of output: 1641
🏁 Script executed:
# Search for any ESLint rule overrides or disables related to unescaped-entities
rg "no-unescaped-entities" --type json --type jsRepository: Hal716/ORB
Length of output: 36
🏁 Script executed:
# Search for other potential unescaped entities in the file (apostrophes and quotes)
rg "(['\"]).*\1" "app/(auth)/sign-in.tsx" | head -20Repository: Hal716/ORB
Length of output: 240
🏁 Script executed:
# Check if there are other instances of unescaped apostrophes in JSX text
grep -n "Don't\|can't\|won't\|it's\|that's" "app/(auth)/sign-in.tsx"Repository: Hal716/ORB
Length of output: 103
Fix unescaped apostrophe to clear lint error.
Line 254 triggers react/no-unescaped-entities. Escape the apostrophe in the JSX text node.
Suggested fix
- Don't have an account?
+ Don't have an account?📝 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.
| Don't have an account? | |
| Don't have an account? |
🧰 Tools
🪛 ESLint
[error] 254-254: ' can be escaped with ', ‘, ', ’.
(react/no-unescaped-entities)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/`(auth)/sign-in.tsx at line 254, The JSX text node "Don't have an
account?" in app/(auth)/sign-in.tsx triggers react/no-unescaped-entities; locate
that string in the SignIn component (or the JSX rendering for the sign-in page)
and escape the apostrophe—either replace the literal apostrophe with ' or
wrap the string in a JS expression (e.g. {"Don't have an account?"}) or use a
typographic apostrophe (’); ensure the JSX text node no longer contains an
unescaped ' character.
|
|
||
| return ( | ||
| <SafeAreaView className="auth-screen"> | ||
| <ScrollView> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's check if the file exists and read around line 63
fd -t f "sign-up.tsx" | head -5Repository: Hal716/ORB
Length of output: 77
🏁 Script executed:
# Also search for ScrollView usage in the file
rg -n "ScrollView" "app/(auth)/sign-up.tsx" -A 2 -B 2Repository: Hal716/ORB
Length of output: 560
🏁 Script executed:
# Check the current state of the file to see keyboardShouldPersistTaps
cat -n "app/(auth)/sign-up.tsx" | sed -n '55,75p'Repository: Hal716/ORB
Length of output: 862
🏁 Script executed:
# Let's see the full form structure to find TextInput and button elements
cat -n "app/(auth)/sign-up.tsx" | sed -n '63,150p'Repository: Hal716/ORB
Length of output: 3819
🏁 Script executed:
# Check if there are any Pressable/button elements that could be affected
rg -n "Pressable|onPress" "app/(auth)/sign-up.tsx" | head -20Repository: Hal716/ORB
Length of output: 586
🌐 Web query:
React Native ScrollView keyboardShouldPersistTaps behavior documentation
💡 Result:
React Native ScrollView keyboardShouldPersistTaps (as documented) controls whether the on-screen keyboard stays visible after the user taps while a TextInput is focused. Supported values (string enum) and behavior: - Default: 'never' — tapping outside the focused TextInput when the keyboard is up dismisses the keyboard, and the ScrollView’s children will not receive the tap.[1] - 'always' — the keyboard will not dismiss automatically, and the ScrollView will not catch taps; children of the ScrollView can catch taps.[1] - 'handled' — the keyboard will not dismiss automatically when the tap was handled by the ScrollView’s children (or captured by an ancestor).[1] Deprecated boolean forms: - false is deprecated in favor of 'never'.[1] - true is deprecated in favor of 'always'.[1] Reference: the official ScrollView docs describe keyboardShouldPersistTaps under the ScrollView props section (default 'never', values 'always' | 'never' | 'handled', and deprecation of boolean false/true).[1][2]
Citations:
Add keyboardShouldPersistTaps="handled" to ScrollView to ensure form buttons work with keyboard open.
At Line 63, ScrollView without keyboardShouldPersistTaps defaults to 'never', causing the first tap when the keyboard is open to dismiss the keyboard instead of firing the button's onPress handler (affecting "Sign up"/"Verify" actions).
Suggested fix
- <ScrollView>
+ <ScrollView keyboardShouldPersistTaps="handled">📝 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.
| <ScrollView> | |
| <ScrollView keyboardShouldPersistTaps="handled"> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/`(auth)/sign-up.tsx at line 63, The ScrollView currently lacks keyboard
persistence causing the first tap to only dismiss the keyboard instead of
triggering button handlers (affecting the "Sign up"/"Verify" onPress flows);
update the ScrollView component to include the prop
keyboardShouldPersistTaps="handled" so taps on interactive elements (e.g., the
Sign up and Verify button onPress handlers) are delivered while the keyboard is
open.
| if (editingIndex !== null && CLASSES[editingIndex]?.notificationId) { | ||
| await Notifications.cancelScheduledNotificationAsync( | ||
| CLASSES[editingIndex].notificationId | ||
| ); | ||
| } | ||
|
|
||
| const daysToSave = selectedDays.length > 0 ? selectedDays : [dayjs().day()]; | ||
| const newClasses = daysToSave.map((weekdayValue: number) => ({ | ||
| const daysToSave = | ||
| selectedDays.length > 0 ? selectedDays : [dayjs().day()]; | ||
|
|
||
| const newClasses = daysToSave.map((weekdayValue) => ({ | ||
| name: name.trim(), | ||
| instructor: instructor.trim(), | ||
| classroom: classroom.trim(), | ||
| date: buildDateForWeekday(weekdayValue), | ||
| endDate: buildEndDateForWeekday(weekdayValue), | ||
| color: color.trim() || "#f5c542", | ||
| })); | ||
|
|
||
| const classesWithNotifications = await Promise.all( | ||
| newClasses.map(async (item) => { | ||
| const notificationId = await scheduleClassAlarm(item); | ||
|
|
||
| return { | ||
| ...item, | ||
| notificationId, | ||
| }; | ||
| }), | ||
| ); |
There was a problem hiding this comment.
Multiple notification IDs not properly tracked or cancelled.
When a class spans multiple weekdays, scheduleClassAlarm is called for each day (line 213), creating multiple notification IDs. However:
- The
Classestype only has a singlenotificationId?: stringfield - Line 194-198 only cancels one notification ID when editing
classesWithNotificationsis computed but never used - the notifications are scheduled but the IDs are discarded
This means:
- Only the last scheduled notification ID would be stored (if it were being stored)
- When editing, only one notification gets cancelled while others remain scheduled
Consider either storing an array of notification IDs or restructuring to one notification per class entry.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@components/Addclass.tsx` around lines 194 - 220, The code schedules one
notification per weekday but only stores/cancels a single notificationId; update
the data model and save flow so all notification IDs are tracked and cleaned up:
modify the Classes type to have notificationIds: string[] (or rename to
notificationIds), update where newClasses are transformed (scheduleClassAlarm
maps) to collect an array of IDs (reference functions/vars: scheduleClassAlarm,
classesWithNotifications, notificationId, newClasses) and persist
classesWithNotifications into CLASSES instead of discarding it; also change the
edit/delete cleanup (where editingIndex and CLASSES[editingIndex] are used) to
iterate over CLASSES[editingIndex].notificationIds and call
Notifications.cancelScheduledNotificationAsync for each id. Ensure downstream
code that reads notificationId uses the new notificationIds array.
| /* 211B03 */ | ||
| @theme { | ||
| --color-background: #fff9e3; | ||
| --color-dark: #211B03; | ||
| --color-taps: #918BCD; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Stylelint config files =="
fd -HI --glob '.stylelintrc*' --glob 'stylelint.config.*'
echo
echo "== Rules related to unknown at-rules and Tailwind support =="
fd -HI --glob '.stylelintrc*' --glob 'stylelint.config.*' \
| xargs -r rg -n -C2 'at-rule-no-unknown|scss/at-rule-no-unknown|ignoreAtRules|tailwind|@theme'Repository: Hal716/ORB
Length of output: 207
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Searching for stylelint config files =="
find . -maxdepth 2 -type f \( -name '.stylelintrc*' -o -name 'stylelint.config.*' \) 2>/dev/null || echo "No stylelint config found at top level"
echo
echo "== Checking package.json for stylelint config =="
if [ -f "package.json" ]; then
echo "File exists: package.json"
head -50 package.json
fi
echo
echo "== Searching for `@theme` in global.css =="
if [ -f "global.css" ]; then
cat -n global.css | head -20
fiRepository: Hal716/ORB
Length of output: 2534
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Content of .stylelintrc.json =="
cat -n .stylelintrc.json
echo
echo "== Checking if any linting is actually happening =="
if [ -f "package.json" ]; then
echo "Linting script from package.json:"
rg -n '"lint"' package.json || echo "No lint script found"
fi
echo
echo "== Searching for any stylelint errors or reports in the repo =="
find . -maxdepth 2 -type f \( -name '.stylelintignore' -o -name 'stylelint-report*' \) 2>/dev/null || echo "No stylelint report files found"Repository: Hal716/ORB
Length of output: 1894
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== Checking stylelint-config-standard-scss defaults =="
rg -n 'at-rule-no-unknown' . --type json --type js --type ts 2>/dev/null || echo "Rule not explicitly configured in repo"
echo
echo "== Verifying the actual `@theme` block syntax in global.css =="
sed -n '6,20p' global.css
echo
echo "== Checking if Tailwind CSS is in dependencies =="
rg -n 'tailwindcss' package.jsonRepository: Hal716/ORB
Length of output: 745
Configure Stylelint to allow Tailwind v4's @theme at-rule.
The @theme at-rule at line 7 is valid for Tailwind CSS v4.2.4 (which is installed), but Stylelint's default scss/at-rule-no-unknown rule will flag it as invalid since the config does not explicitly allow Tailwind-specific at-rules. Add ignoreAtRules to .stylelintrc.json rules or update the configuration to include a Tailwind-aware Stylelint plugin.
Note: Your package.json uses expo lint (ESLint), not Stylelint directly, so this may not block CI currently. However, developers running Stylelint locally or in pre-commit hooks would encounter the error.
🧰 Tools
🪛 Stylelint (17.10.0)
[error] 7-7: Unexpected unknown at-rule "@theme" (scss/at-rule-no-unknown)
(scss/at-rule-no-unknown)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@global.css` around lines 6 - 10, Stylelint is flagging the Tailwind v4 `@theme`
at-rule as unknown; update your Stylelint config (.stylelintrc.json) to allow
Tailwind-specific at-rules by adding an ignore list for at-rules (e.g., add
"scss/at-rule-no-unknown": [true, { "ignoreAtRules": ["theme", "apply",
"screen", "variants", ...] }] or install/configure a Tailwind-aware Stylelint
plugin) so the `@theme` rule in global.css is accepted; modify the rule in
.stylelintrc.json and/or add the Tailwind plugin to the config to avoid false
positives.
| @apply text-2xl text-subprimary; | ||
| font-family: var(--font-Coopbl); |
There was a problem hiding this comment.
Add the missing empty line before font-family in .test.
Line 68 currently violates declaration-empty-line-before from your static analysis output.
Proposed fix
.test {
`@apply` text-2xl text-subprimary;
+
font-family: var(--font-Coopbl);
padding-top: 8px;
}📝 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.
| @apply text-2xl text-subprimary; | |
| font-family: var(--font-Coopbl); | |
| `@apply` text-2xl text-subprimary; | |
| font-family: var(--font-Coopbl); |
🧰 Tools
🪛 Stylelint (17.10.0)
[error] 68-68: Expected empty line before declaration (declaration-empty-line-before)
(declaration-empty-line-before)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@global.css` around lines 67 - 68, The .test CSS rule currently lacks a blank
line before the second declaration which violates declaration-empty-line-before;
open the .test rule (the block containing "@apply text-2xl text-subprimary;" and
"font-family: var(--font-Coopbl);") and insert a single empty line between the
`@apply` declaration and the font-family declaration so there is a blank line
before "font-family".
| return tablesDB.updateRow({ | ||
| databaseId: APPWRITE_DATABASE_ID, | ||
| tableId: APPWRITE_CLASSES_TABLE_ID, | ||
| rowId, | ||
| data: { | ||
| name, | ||
| instructor, | ||
| date, | ||
| endDate, | ||
| classroom, | ||
| color, | ||
| color: color ?? "#f5c542", | ||
| userid: userId, | ||
| }, | ||
| }); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Search for TablesDB usage patterns in the codebase
rg -n "tablesDB\." --type js --type ts -C2Repository: Hal716/ORB
Length of output: 1871
🏁 Script executed:
# Read the appwrite.js file to see all tablesDB method calls and their signatures
cat -n lib/appwrite.js | sed -n '80,130p'Repository: Hal716/ORB
Length of output: 1382
🏁 Script executed:
# Also check the initialization and documentation of tablesDB
cat -n lib/appwrite.js | sed -n '1,80p'Repository: Hal716/ORB
Length of output: 2825
🏁 Script executed:
# Check all tablesDB method signatures in one view
rg -n "tablesDB\.(listRows|createRow|updateRow|deleteRow)" -A3 lib/appwrite.jsRepository: Hal716/ORB
Length of output: 1149
🌐 Web query:
react-native-appwrite TablesDB API documentation listRows createRow updateRow deleteRow signatures
💡 Result:
Appwrite TablesDB (react-native-appwrite) method signatures 1) listRows Signature (JS/TS): await tablesDB.listRows({ databaseId: string, tableId: string, queries?: string[], transactionId?: string, total?: boolean }); [1] 2) createRow Signature (JS/TS): await tablesDB.createRow({ databaseId: string, tableId: string, rowId?: string, data?: Record<string, any>, permissions?: string[], transactionId?: string }); [1] 3) updateRow Signature (JS/TS): await tablesDB.updateRow({ databaseId: string, tableId: string, rowId: string, data: Record<string, any>, transactionId?: string }); [2] 4) deleteRow Signature (JS/TS): await tablesDB.deleteRow({ databaseId: string, tableId: string, rowId: string, transactionId?: string }); [3] Notes on rowId When calling createRow, rowId is optional; you can generate one with ID.unique. [1]
Citations:
- 1: https://appwrite.io/docs/references/cloud/client-react-native/tablesDB
- 2: https://www.appwrite.io/docs/products/databases/rows
- 3: https://appwrite.io/docs/tutorials/react-native/step-6
Fix incorrect TablesDB API calls - will cause runtime errors.
According to the react-native-appwrite documentation, all TablesDB methods (listRows, createRow, updateRow, deleteRow) require object parameters, not positional parameters.
The code currently uses:
listRows(databaseId, tableId, queries)❌ Should belistRows({ databaseId, tableId, queries })createRow(databaseId, tableId, documentId, data)❌ Should becreateRow({ databaseId, tableId, rowId: documentId, data })updateRow({ databaseId, tableId, rowId, data })✓ CorrectdeleteRow({ databaseId, tableId, rowId })✓ Correct
Lines 85–88 and 124–127 need to be updated to use object parameters, otherwise they will fail at runtime.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@lib/appwrite.js` around lines 158 - 171, The TablesDB calls are using
positional args for listRows and createRow which will cause runtime errors;
update all calls to match the react-native-appwrite API by passing an object:
change listRows(databaseId, tableId, queries) to listRows({ databaseId:
APPWRITE_DATABASE_ID, tableId: APPWRITE_CLASSES_TABLE_ID, queries }) and change
createRow(databaseId, tableId, documentId, data) to createRow({ databaseId:
APPWRITE_DATABASE_ID, tableId: APPWRITE_CLASSES_TABLE_ID, rowId: documentId,
data }); leave updateRow({ databaseId, tableId, rowId, data }) and deleteRow({
databaseId, tableId, rowId }) as-is.
| "@clerk/clerk-expo": "^2.3.0", | ||
| "@clerk/expo": "^3.0.0", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check actual Clerk package imports across the repo
rg -n --type=ts --type=tsx --type=js --type=jsx '@clerk/clerk-expo|@clerk/expo'Repository: Hal716/ORB
Length of output: 82
🏁 Script executed:
#!/bin/bash
# Search for Clerk package imports with corrected syntax
rg -n "@clerk/(clerk-)?expo" -t js -t jsonRepository: Hal716/ORB
Length of output: 1792
Remove @clerk/clerk-expo from dependencies—it's deprecated.
The @clerk/clerk-expo package is marked as deprecated in npm registry with the message "This package is no longer supported. Please use @clerk/expo instead." The codebase only uses @clerk/expo (referenced in app.json), and no source code imports @clerk/clerk-expo directly. Keeping it adds unnecessary dependency surface and technical debt.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@package.json` around lines 14 - 15, Remove the deprecated dependency
"@clerk/clerk-expo" from package.json (the entry "@clerk/clerk-expo": "^2.3.0")
and keep only "@clerk/expo": "^3.0.0"; after removing the entry, run your
package manager (npm install / yarn install / pnpm install) to update the
lockfile and node_modules, and verify there are no imports/usages of
"@clerk/clerk-expo" and that app.json still references "@clerk/expo".
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
components/Addclass.tsx (1)
237-241:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winNotification IDs are discarded—scheduled notifications cannot be cancelled.
classesWithNotifications(lines 212-221) correctly collects the notification IDs fromscheduleClassAlarm, but lines 238 and 240 splice/pushnewClassesinstead, which lacks thenotificationIdfield. The IDs are computed and then thrown away.This means:
- Notifications are scheduled but their IDs are never stored
- When editing, line 195-198 tries to cancel a non-existent ID
- Orphaned notifications will fire indefinitely
Use
classesWithNotificationsinstead ofnewClasseswhen updatingCLASSES.Proposed fix
if (editingIndex !== null) { - CLASSES.splice(editingIndex, 1, ...newClasses); + CLASSES.splice(editingIndex, 1, ...classesWithNotifications); } else { - CLASSES.push(...newClasses); + CLASSES.push(...classesWithNotifications); }Also update subsequent usages of
newClasses(lines 235, 276, 289, 298) to referenceclassesWithNotificationsor adjust logic accordingly.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@components/Addclass.tsx` around lines 237 - 241, The code schedules notifications via scheduleClassAlarm and builds classesWithNotifications containing notificationId values, but the update/insert logic currently uses newClasses (losing IDs); change the CLASSES update to use classesWithNotifications when inserting or splicing (e.g., where editingIndex is checked) and ensure all subsequent uses of newClasses in this component (the places near the existing uses around the CLASSES update and at the later references you noted) instead reference classesWithNotifications or are adjusted to preserve/propagate notificationId; keep the editingIndex/CLASSES.splice(...)/CLASSES.push(...) logic but supply classesWithNotifications so scheduled notification IDs are stored and cancel flows can find them.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/`(taps)/index.tsx:
- Line 90: The current keyExtractor uses item.date which can produce duplicate
keys; update the keyExtractor prop (the keyExtractor function) to return a
stable unique id for each item such as item.appwriteRowId, or a deterministic
composite string (e.g., `${item.appwriteRowId || item.id ||
item.date}-${item.name}-${item.instructor}`) so keys are unique and stable
across renders; locate the keyExtractor usage in the component where the list is
rendered and replace item.date with the chosen unique identifier(s).
In `@app/`(taps)/settings.tsx:
- Around line 149-150: The Settings UI contains a typo in the user-facing label:
update the Text node that currently renders "GitHup" inside the Link with href
"https://github.com/Hal716" (the Text element with className
"font-Sans-ExtraBold text-taps") to read "GitHub" so the displayed label is
correct.
- Around line 72-102: The absolute Image elements (e.g., the Image nodes using
seticons.idk, seticons.facebook, seticons.twiter, seticons.claude,
seticons.telegram in settings.tsx) can block touch events; wrap each Image in a
View with pointerEvents="none" and move the positioning (style and
className/absolute) onto that wrapper so the decorative images remain visible
but do not intercept touches; keep resizeMode on the Image itself and ensure the
wrapper preserves the same absolute layout.
- Around line 64-66: The deleteAccount function currently calls user?.delete()
without error handling and always proceeds to navigate; wrap the deletion in a
try/catch inside deleteAccount (and the calling handler) so you catch and
log/display errors, return a boolean success value from deleteAccount, add an
isDeleting state flag to disable the delete control while in progress and
prevent double taps, and only trigger the navigation to the sign-in flow when
deleteAccount returns true; reference the deleteAccount function and the
user.delete() call and ensure the caller checks the boolean before calling
router.push/signOut.
In `@components/Addclass.tsx`:
- Around line 25-26: Remove or finish the incomplete color-brightness feature in
the Addclass component: either delete the unused Slider import and tinycolor
usage and remove the brightness state and adjustedColor computation (references:
Slider import, brightness state/setBrightness, adjustedColor) or implement the
feature by rendering the Slider component, wiring its onValueChange to
setBrightness, and using adjustedColor in the JSX where the color should reflect
brightness; update or remove tinycolor import accordingly so no unused imports
or dead variables remain.
---
Outside diff comments:
In `@components/Addclass.tsx`:
- Around line 237-241: The code schedules notifications via scheduleClassAlarm
and builds classesWithNotifications containing notificationId values, but the
update/insert logic currently uses newClasses (losing IDs); change the CLASSES
update to use classesWithNotifications when inserting or splicing (e.g., where
editingIndex is checked) and ensure all subsequent uses of newClasses in this
component (the places near the existing uses around the CLASSES update and at
the later references you noted) instead reference classesWithNotifications or
are adjusted to preserve/propagate notificationId; keep the
editingIndex/CLASSES.splice(...)/CLASSES.push(...) logic but supply
classesWithNotifications so scheduled notification IDs are stored and cancel
flows can find them.
🪄 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 Plus
Run ID: bc6e3ecb-d291-468a-90b6-800e8db1aa1e
⛔ Files ignored due to path filters (3)
assets/icons/aa.jpgis excluded by!**/*.jpgassets/icons/icons8-web-96.pngis excluded by!**/*.pngpackage-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (10)
.idea/caches/deviceStreaming.xml.idea/deviceManager.xml.idea/misc.xmlapp.jsonapp/(taps)/index.tsxapp/(taps)/settings.tsxcomponents/Addclass.tsxconstants/icons.tsglobal.csspackage.json
✅ Files skipped from review due to trivial changes (3)
- .idea/deviceManager.xml
- .idea/misc.xml
- .idea/caches/deviceStreaming.xml
🚧 Files skipped from review as they are similar to previous changes (3)
- constants/icons.ts
- app.json
- package.json
| dayjs(item.date).isSame(dayjs(), "day") | ||
| )} | ||
| renderItem={({ item }) => <HomeSchudule {...item} />} | ||
| keyExtractor={(item) => item.date} |
There was a problem hiding this comment.
keyExtractor may produce duplicate keys.
Using item.date as the key works only if no two classes share the exact same start time. If a user creates multiple classes at the same time (different names/instructors), React will warn about duplicate keys and may exhibit rendering issues.
Consider using a unique identifier like appwriteRowId or combining fields:
Proposed fix
- keyExtractor={(item) => item.date}
+ keyExtractor={(item) => item.appwriteRowId ?? `${item.date}-${item.name}`}📝 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.
| keyExtractor={(item) => item.date} | |
| keyExtractor={(item) => item.appwriteRowId ?? `${item.date}-${item.name}`} |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/`(taps)/index.tsx at line 90, The current keyExtractor uses item.date
which can produce duplicate keys; update the keyExtractor prop (the keyExtractor
function) to return a stable unique id for each item such as item.appwriteRowId,
or a deterministic composite string (e.g., `${item.appwriteRowId || item.id ||
item.date}-${item.name}-${item.instructor}`) so keys are unique and stable
across renders; locate the keyExtractor usage in the component where the list is
rendered and replace item.date with the chosen unique identifier(s).
| const deleteAccount = async () => { | ||
| await user?.delete(); | ||
| }; |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
In @clerk/expov3, doesuser.delete() reject on failure, and does successful deletion automatically terminate the active session?
💡 Result:
In @clerk/expo v3, user.delete() rejects on failure, because it returns a Promise (and the docs/SDK patterns for Clerk API calls are await-able and can be caught with try/catch). The specific method signature for user deletion in Clerk is promise-based (e.g., deleteUser(userId): Promise<User> on the Backend API), and the account deletion flows in the JS SDK are treated the same way by awaiting the operation and handling errors via exceptions. On success, successful account deletion does not merely delete the user record; it signs the user out and ends the active session for the client (i.e., the session’s tokens are revoked/cleared). Clerk’s Session.end()/remove() semantics describe terminating/deactivating a session and revoking tokens, and Clerk’s internal changes explicitly mention clearing/terminating session state after account deletion (“Clear session after deleting an account”). Caveat: I could confirm the general promise-based / error handling and the session-ending behavior from Clerk’s docs and Clerk JS implementation notes, but I did not find a single official @clerk/expo v3 user-delete reference page that explicitly states both of your questions in one sentence (failure->reject, success->terminate active session) for @clerk/expo v3’s frontend User.delete() method specifically.
Citations:
- 1: https://clerk.com/docs/reference/backend/user/delete-user
- 2: https://clerk.com/docs/users/deleting-users
- 3: https://clerk.com/docs/js-frontend/reference/objects/session
- 4: https://clerk.com/docs/expo/reference/objects/session
- 5: fix(clerk-js): Clear session after deleting an account clerk/javascript#3628
🏁 Script executed:
cat -n app/'(taps)'/settings.tsx | sed -n '50,80p'Repository: Hal716/ORB
Length of output: 1031
🏁 Script executed:
cat -n app/'(taps)'/settings.tsx | sed -n '150,175p'Repository: Hal716/ORB
Length of output: 1253
Handle delete failures explicitly and only navigate on confirmed success.
The deleteAccount function lacks error handling and always navigates to sign-in regardless of deletion outcome. If user.delete() fails, the unhandled rejection breaks the UX and navigation still occurs. Add try/catch to handle errors, return a success boolean, and conditionally navigate only on success. Also add an isDeleting loading state to prevent repeated destructive taps.
Proposed fix
+ const [isDeleting, setIsDeleting] = useState(false);
+
const deleteAccount = async () => {
- await user?.delete();
+ if (!user) return false;
+ try {
+ setIsDeleting(true);
+ await user.delete();
+ return true;
+ } catch (error) {
+ Alert.alert("Error", "Failed to delete account. Please try again.");
+ console.error(error);
+ return false;
+ } finally {
+ setIsDeleting(false);
+ }
}; {
text: "Delete Account",
style: "destructive",
onPress: async () => {
- await deleteAccount();
- router.replace({ pathname: "/(auth)/sign-in" as any });
+ const deleted = await deleteAccount();
+ if (deleted) {
+ router.replace({ pathname: "/(auth)/sign-in" as any });
+ }
},
},- <Pressable className="auth-button"
+ <Pressable className="auth-button" disabled={isDeleting}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/`(taps)/settings.tsx around lines 64 - 66, The deleteAccount function
currently calls user?.delete() without error handling and always proceeds to
navigate; wrap the deletion in a try/catch inside deleteAccount (and the calling
handler) so you catch and log/display errors, return a boolean success value
from deleteAccount, add an isDeleting state flag to disable the delete control
while in progress and prevent double taps, and only trigger the navigation to
the sign-in flow when deleteAccount returns true; reference the deleteAccount
function and the user.delete() call and ensure the caller checks the boolean
before calling router.push/signOut.
| <Image | ||
| source={seticons.idk} | ||
| className="absolute opacity-5" | ||
| style={{ top: -180, right: -300, }} | ||
| resizeMode="contain" | ||
| /> | ||
| <StatusBar style="dark" /> | ||
| <Image | ||
| source={seticons.facebook} | ||
| className="absolute w-24 h-24 opacity-10" | ||
| style={{ bottom: 120, left: 20, transform: [{ rotate: '10deg' }] }} | ||
| resizeMode="contain" | ||
| /> | ||
| <Image | ||
| source={seticons.twiter} | ||
| className="absolute w-20 h-20 opacity-10" | ||
| style={{ bottom: 80, left: 110, transform: [{ rotate: '10deg' }] }} | ||
| resizeMode="contain" | ||
| /> | ||
| <Image | ||
| source={seticons.claude} | ||
| className="absolute w-18 h-18 opacity-10" | ||
| style={{ bottom: 120, right: 0, transform: [{ rotate: '10deg' }] }} | ||
| resizeMode="contain" | ||
| /> | ||
| <Image | ||
| source={seticons.telegram} | ||
| className="absolute w-26 h-26 opacity-10" | ||
| style={{ bottom: 60, right: 80, transform: [{ rotate: '-25deg' }] }} | ||
| resizeMode="contain" | ||
| /> |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
In React Native 0.81, do absolutely-positioned Imageelements participate in hit-testing by default, and ispointerEvents="none" the recommended way to make decorative overlays ignore touches?
💡 Result:
Yes, absolutely-positioned Image elements in React Native 0.81 participate in hit-testing by default, intercepting touches even if they are decorative overlays. The Image component does not directly support the pointerEvents prop[1][2][3], so it behaves like a View with the default 'auto' pointerEvents behavior, blocking touches to underlying elements[4]. This is particularly noticeable with position: 'absolute' overlays, where touches are captured regardless of zIndex or transparency[5][6][7]. The recommended way to make decorative Image overlays ignore touches is to wrap the Image in a View with pointerEvents="none"[3][2][8]. This makes the entire subtree (including the Image) ignore touch events, allowing touches to pass through to elements behind it. Example: <View pointerEvents="none"> <Image source={...} style={{ position: 'absolute', ... }} /> </View> Directly applying pointerEvents="none" to Image does not work reliably, especially on Android[3]. No changes to this behavior are noted in React Native 0.81 release notes or docs[9][1][4].
Citations:
- 1: https://reactnative.dev/docs/0.81/image
- 2: [Image] pointerEvents prop for Image component? react/react-native#9834
- 3: pointerEvents={'none'} does not work on Android react/react-native#25644
- 4: https://reactnative.dev/docs/0.81/view
- 5: Touch events in nested absolute positioned views not working on Android react/react-native#27333
- 6: https://stackoverflow.com/questions/52556296/react-native-touch-events-are-passing-through-absolute-view
- 7: Android hit-testing rejects touches for children positioned outside parent bounds when view flattening is disabled (Reanimated) react/react-native#54659
- 8: https://stackoverflow.com/questions/36068392/set-userinteractionenabled-false-in-react-native
- 9: https://reactnative.dev/blog/2025/08/12/react-native-0.81
Prevent decorative overlays from intercepting touch input.
Absolutely-positioned Image elements participate in hit-testing by default. However, Image does not directly support the pointerEvents prop. Instead, wrap each Image in a View with pointerEvents="none" to prevent touch blocking:
Proposed fix
+ <View pointerEvents="none">
<Image
source={seticons.idk}
className="absolute opacity-5"
style={{ top: -180, right: -300, }}
resizeMode="contain"
/>
+ </View>
+ <View pointerEvents="none">
<Image
source={seticons.facebook}
className="absolute w-24 h-24 opacity-10"
style={{ bottom: 120, left: 20, transform: [{ rotate: '10deg' }] }}
resizeMode="contain"
/>
+ </View>
+ <View pointerEvents="none">
<Image
source={seticons.twiter}
className="absolute w-20 h-20 opacity-10"
style={{ bottom: 80, left: 110, transform: [{ rotate: '10deg' }] }}
resizeMode="contain"
/>
+ </View>
+ <View pointerEvents="none">
<Image
source={seticons.claude}
className="absolute w-18 h-18 opacity-10"
style={{ bottom: 120, right: 0, transform: [{ rotate: '10deg' }] }}
resizeMode="contain"
/>
+ </View>
+ <View pointerEvents="none">
<Image
source={seticons.telegram}
className="absolute w-26 h-26 opacity-10"
style={{ bottom: 60, right: 80, transform: [{ rotate: '-25deg' }] }}
resizeMode="contain"
/>
+ </View>📝 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.
| <Image | |
| source={seticons.idk} | |
| className="absolute opacity-5" | |
| style={{ top: -180, right: -300, }} | |
| resizeMode="contain" | |
| /> | |
| <StatusBar style="dark" /> | |
| <Image | |
| source={seticons.facebook} | |
| className="absolute w-24 h-24 opacity-10" | |
| style={{ bottom: 120, left: 20, transform: [{ rotate: '10deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| <Image | |
| source={seticons.twiter} | |
| className="absolute w-20 h-20 opacity-10" | |
| style={{ bottom: 80, left: 110, transform: [{ rotate: '10deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| <Image | |
| source={seticons.claude} | |
| className="absolute w-18 h-18 opacity-10" | |
| style={{ bottom: 120, right: 0, transform: [{ rotate: '10deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| <Image | |
| source={seticons.telegram} | |
| className="absolute w-26 h-26 opacity-10" | |
| style={{ bottom: 60, right: 80, transform: [{ rotate: '-25deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| <View pointerEvents="none"> | |
| <Image | |
| source={seticons.idk} | |
| className="absolute opacity-5" | |
| style={{ top: -180, right: -300, }} | |
| resizeMode="contain" | |
| /> | |
| </View> | |
| <StatusBar style="dark" /> | |
| <View pointerEvents="none"> | |
| <Image | |
| source={seticons.facebook} | |
| className="absolute w-24 h-24 opacity-10" | |
| style={{ bottom: 120, left: 20, transform: [{ rotate: '10deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| </View> | |
| <View pointerEvents="none"> | |
| <Image | |
| source={seticons.twiter} | |
| className="absolute w-20 h-20 opacity-10" | |
| style={{ bottom: 80, left: 110, transform: [{ rotate: '10deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| </View> | |
| <View pointerEvents="none"> | |
| <Image | |
| source={seticons.claude} | |
| className="absolute w-18 h-18 opacity-10" | |
| style={{ bottom: 120, right: 0, transform: [{ rotate: '10deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| </View> | |
| <View pointerEvents="none"> | |
| <Image | |
| source={seticons.telegram} | |
| className="absolute w-26 h-26 opacity-10" | |
| style={{ bottom: 60, right: 80, transform: [{ rotate: '-25deg' }] }} | |
| resizeMode="contain" | |
| /> | |
| </View> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/`(taps)/settings.tsx around lines 72 - 102, The absolute Image elements
(e.g., the Image nodes using seticons.idk, seticons.facebook, seticons.twiter,
seticons.claude, seticons.telegram in settings.tsx) can block touch events; wrap
each Image in a View with pointerEvents="none" and move the positioning (style
and className/absolute) onto that wrapper so the decorative images remain
visible but do not intercept touches; keep resizeMode on the Image itself and
ensure the wrapper preserves the same absolute layout.
| <Link href={"https://github.com/Hal716"}><Text className="font-Sans-ExtraBold text-taps">GitHup</Text> | ||
| </Link> |
There was a problem hiding this comment.
Fix typo in user-facing label (“GitHup” → “GitHub”).
Small polish, but this is directly visible in the Settings UI.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/`(taps)/settings.tsx around lines 149 - 150, The Settings UI contains a
typo in the user-facing label: update the Text node that currently renders
"GitHup" inside the Link with href "https://github.com/Hal716" (the Text element
with className "font-Sans-ExtraBold text-taps") to read "GitHub" so the
displayed label is correct.
| import Slider from '@react-native-community/slider'; | ||
| import tinycolor from 'tinycolor2'; |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win
Unused imports and dead code.
Slideris imported (line 25) but never rendered in the component.brightnessstate (line 47) is initialized but never updated—no calls tosetBrightness.adjustedColor(line 49) is computed but never used anywhere in the JSX.
This appears to be incomplete feature work. Either remove the dead code or complete the implementation.
If not needed, remove dead code:
-import Slider from '@react-native-community/slider';
-import tinycolor from 'tinycolor2';- const [brightness, setBrightness] = useState(1);
const [editingIndex, setEditingIndex] = useState<number | null>(null);
- const adjustedColor = tinycolor(color).lighten((brightness - 1) * 50).toString();Also applies to: 47-47, 49-49
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@components/Addclass.tsx` around lines 25 - 26, Remove or finish the
incomplete color-brightness feature in the Addclass component: either delete the
unused Slider import and tinycolor usage and remove the brightness state and
adjustedColor computation (references: Slider import, brightness
state/setBrightness, adjustedColor) or implement the feature by rendering the
Slider component, wiring its onValueChange to setBrightness, and using
adjustedColor in the JSX where the color should reflect brightness; update or
remove tinycolor import accordingly so no unused imports or dead variables
remain.
Summary by CodeRabbit
New Features
UI/UX Improvements