Skip to content

Commit 522c193

Browse files
committed
Merge branch 'staging' of https://github.com/Mentra-Community/MentraOS into staging
2 parents 595f9f3 + 2641bb0 commit 522c193

File tree

4 files changed

+62
-43
lines changed

4 files changed

+62
-43
lines changed

mobile/src/app/(tabs)/glasses.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, {useRef, PropsWithChildren, useState, useEffect} from "react"
22
import {Animated, ScrollView} from "react-native"
33
import {Header, Screen} from "@/components/ignite"
44
import {ConnectDeviceButton, ConnectedGlasses} from "@/components/misc/ConnectedDeviceInfo"
5+
import {useCoreStatus} from "@/contexts/CoreStatusProvider"
56
import ConnectedSimulatedGlassesInfo from "@/components/misc/ConnectedSimulatedGlassesInfo"
67
import CloudConnection from "@/components/misc/CloudConnection"
78

@@ -14,7 +15,8 @@ import {SETTINGS_KEYS, useSetting} from "@/stores/settings"
1415

1516
export default function Homepage() {
1617
const {theme} = useAppTheme()
17-
const [defaultWearable, setDefaultWearable] = useSetting(SETTINGS_KEYS.default_wearable)
18+
const [defaultWearable] = useSetting(SETTINGS_KEYS.default_wearable)
19+
const {status} = useCoreStatus()
1820

1921
const formatGlassesTitle = (title: string) => title.replace(/_/g, " ").replace(/\b\w/g, char => char.toUpperCase())
2022
let pageTitle
@@ -32,8 +34,12 @@ export default function Homepage() {
3234
style={{marginRight: -theme.spacing.md, paddingRight: theme.spacing.md}}
3335
contentInsetAdjustmentBehavior="automatic">
3436
<CloudConnection />
35-
{defaultWearable && glassesFeatures[defaultWearable].display && <ConnectedSimulatedGlassesInfo />}
36-
{defaultWearable && !glassesFeatures[defaultWearable].display && <ConnectedGlasses showTitle={false} />}
37+
{defaultWearable && status.glasses_info?.model_name && glassesFeatures[defaultWearable].display && (
38+
<ConnectedSimulatedGlassesInfo />
39+
)}
40+
{defaultWearable && status.glasses_info?.model_name && !glassesFeatures[defaultWearable].display && (
41+
<ConnectedGlasses showTitle={false} />
42+
)}
3743
<Spacer height={theme.spacing.lg} />
3844
<ConnectDeviceButton />
3945
<DeviceSettings />

mobile/src/components/glasses/DeviceSettings.tsx

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ export default function DeviceSettings() {
9090
const slideAnim = useRef(new Animated.Value(-50)).current
9191
const {theme, themed} = useAppTheme()
9292
const {status} = useCoreStatus()
93+
const isGlassesConnected = Boolean(status.glasses_info?.model_name)
9394
const [defaultWearable, setDefaultWearable] = useSetting(SETTINGS_KEYS.default_wearable)
9495
const [buttonMode, setButtonMode] = useSetting(SETTINGS_KEYS.button_mode)
9596
const [preferredMic, setPreferredMic] = useSetting(SETTINGS_KEYS.preferred_mic)
@@ -221,53 +222,60 @@ export default function DeviceSettings() {
221222
)}
222223

223224
{/* Battery Status Section */}
224-
{status.glasses_info?.battery_level !== undefined && status.glasses_info.battery_level !== -1 && (
225-
<View style={themed($settingsGroup)}>
226-
<Text style={[themed($subtitle), {marginBottom: theme.spacing.xs}]}>Battery Status</Text>
227-
{/* Glasses Battery */}
228-
{status.glasses_info.battery_level !== -1 && (
229-
<View
230-
style={{flexDirection: "row", alignItems: "center", justifyContent: "space-between", paddingVertical: 4}}>
231-
<View style={{flexDirection: "row", alignItems: "center"}}>
232-
<GlassesIcon size={20} isDark={theme.isDark} />
233-
<Text style={{color: theme.colors.text, marginLeft: theme.spacing.xs}}>Glasses</Text>
234-
</View>
235-
<View style={{flexDirection: "row", alignItems: "center"}}>
236-
<Icon icon="battery" size={16} color={theme.colors.text} />
237-
<Text style={{color: theme.colors.text, marginLeft: 4, fontWeight: "500"}}>
238-
{status.glasses_info.battery_level}%
239-
</Text>
240-
</View>
241-
</View>
242-
)}
243-
244-
{/* Case Battery */}
245-
{status.glasses_info.case_battery_level !== undefined &&
246-
status.glasses_info.case_battery_level !== -1 &&
247-
!status.glasses_info.case_removed && (
225+
{isGlassesConnected &&
226+
status.glasses_info?.battery_level !== undefined &&
227+
status.glasses_info.battery_level !== -1 && (
228+
<View style={themed($settingsGroup)}>
229+
<Text style={[themed($subtitle), {marginBottom: theme.spacing.xs}]}>Battery Status</Text>
230+
{/* Glasses Battery */}
231+
{status.glasses_info.battery_level !== -1 && (
248232
<View
249233
style={{
250234
flexDirection: "row",
251235
alignItems: "center",
252236
justifyContent: "space-between",
253-
paddingVertical: theme.spacing.xs,
237+
paddingVertical: 4,
254238
}}>
255239
<View style={{flexDirection: "row", alignItems: "center"}}>
256-
<CaseIcon size={20} isCharging={status.glasses_info.case_charging} isDark={theme.isDark} />
257-
<Text style={{color: theme.colors.text, marginLeft: theme.spacing.xxs}}>
258-
Case {status.glasses_info.case_charging ? "(Charging)" : ""}
259-
</Text>
240+
<GlassesIcon size={20} isDark={theme.isDark} />
241+
<Text style={{color: theme.colors.text, marginLeft: theme.spacing.xs}}>Glasses</Text>
260242
</View>
261243
<View style={{flexDirection: "row", alignItems: "center"}}>
262244
<Icon icon="battery" size={16} color={theme.colors.text} />
263-
<Text style={{color: theme.colors.text, marginLeft: theme.spacing.xxs, fontWeight: "500"}}>
264-
{status.glasses_info.case_battery_level}%
245+
<Text style={{color: theme.colors.text, marginLeft: 4, fontWeight: "500"}}>
246+
{status.glasses_info.battery_level}%
265247
</Text>
266248
</View>
267249
</View>
268250
)}
269-
</View>
270-
)}
251+
252+
{/* Case Battery */}
253+
{status.glasses_info.case_battery_level !== undefined &&
254+
status.glasses_info.case_battery_level !== -1 &&
255+
!status.glasses_info.case_removed && (
256+
<View
257+
style={{
258+
flexDirection: "row",
259+
alignItems: "center",
260+
justifyContent: "space-between",
261+
paddingVertical: theme.spacing.xs,
262+
}}>
263+
<View style={{flexDirection: "row", alignItems: "center"}}>
264+
<CaseIcon size={20} isCharging={status.glasses_info.case_charging} isDark={theme.isDark} />
265+
<Text style={{color: theme.colors.text, marginLeft: theme.spacing.xxs}}>
266+
Case {status.glasses_info.case_charging ? "(Charging)" : ""}
267+
</Text>
268+
</View>
269+
<View style={{flexDirection: "row", alignItems: "center"}}>
270+
<Icon icon="battery" size={16} color={theme.colors.text} />
271+
<Text style={{color: theme.colors.text, marginLeft: theme.spacing.xxs, fontWeight: "500"}}>
272+
{status.glasses_info.case_battery_level}%
273+
</Text>
274+
</View>
275+
</View>
276+
)}
277+
</View>
278+
)}
271279

272280
{hasGallery(defaultWearable) && (
273281
<RouteButton
@@ -277,7 +285,7 @@ export default function DeviceSettings() {
277285
/>
278286
)}
279287

280-
{hasBrightness(defaultWearable) && (
288+
{hasBrightness(defaultWearable) && isGlassesConnected && (
281289
<View style={themed($settingsGroup)}>
282290
<ToggleSetting
283291
label="Auto Brightness"
@@ -461,7 +469,7 @@ export default function DeviceSettings() {
461469
)}
462470

463471
{/* Show device info for glasses */}
464-
{defaultWearable && (
472+
{defaultWearable && isGlassesConnected && (
465473
<InfoSection
466474
title="Device Information"
467475
items={[
@@ -473,7 +481,7 @@ export default function DeviceSettings() {
473481
)}
474482

475483
{/* OTA Progress Section - Only show for Mentra Live glasses */}
476-
{defaultWearable && defaultWearable.toLowerCase().includes("live") && (
484+
{defaultWearable && isGlassesConnected && defaultWearable.toLowerCase().includes("live") && (
477485
<OtaProgressSection otaProgress={status.ota_progress} />
478486
)}
479487

@@ -483,7 +491,7 @@ export default function DeviceSettings() {
483491
onPress={() => push("/settings/dashboard")}
484492
/>
485493

486-
{defaultWearable && defaultWearable !== "Simulated Glasses" && (
494+
{defaultWearable && isGlassesConnected && defaultWearable !== "Simulated Glasses" && (
487495
<ActionButton
488496
label={translate("settings:disconnectGlasses")}
489497
variant="destructive"

mobile/src/components/misc/ConnectedDeviceInfo.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ export const ConnectDeviceButton = () => {
146146
)
147147
}
148148

149-
if (!defaultWearable) {
149+
if (!status.glasses_info?.model_name) {
150150
return (
151151
<Button
152152
textStyle={[{marginLeft: spacing.xxl}]}
@@ -318,6 +318,10 @@ export function DeviceToolbar() {
318318
return null
319319
}
320320

321+
if (!status.glasses_info?.model_name) {
322+
return null
323+
}
324+
321325
// don't show if simulated glasses
322326
if (status.glasses_info?.model_name?.toLowerCase().includes("simulated")) {
323327
return null

mobile/src/components/misc/GlassesDisplayMirror.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,10 @@ const GlassesDisplayMirror: React.FC<GlassesDisplayMirrorProps> = ({
9595
// if text contains $GBATT$, replace with battery level
9696
if (text.includes("$GBATT$")) {
9797
const batteryLevel = status.glasses_info?.battery_level
98-
if (batteryLevel) {
99-
return text.replace("$GBATT$", batteryLevel.toString() + "%")
98+
if (typeof batteryLevel === "number" && batteryLevel >= 0) {
99+
return text.replace("$GBATT$", `${batteryLevel}%`)
100100
}
101+
return text.replace("$GBATT$", "")
101102
}
102103
return text
103104
}

0 commit comments

Comments
 (0)