Android Auto display and encoder are not installed on this build. Projection setup is unavailable.
Starting the Android Auto service. Pairing is unavailable until it is ready.
You do not install an Android app on the comma. Galaxy imports the information needed to connect to your car and checks that it is usable.
@@ -384,8 +385,9 @@ export const AndroidAutoPage = {
Package verified and ready.
Selected: {{ packageFile.name }} ({{ Math.ceil(packageFile.size / 1048576) }} MB).
diff --git a/openpilot/starpilot/galaxy/web/js/app.js b/openpilot/starpilot/galaxy/web/js/app.js
index 475e76336c..8db78b2a91 100644
--- a/openpilot/starpilot/galaxy/web/js/app.js
+++ b/openpilot/starpilot/galaxy/web/js/app.js
@@ -1,3 +1,4 @@
+import { BottomNav, NAV, primaryTab } from "./bottom-nav.js"
import { GalaxyLoading } from "./loading-screen.js"
import { GxNotice } from "./notice.js"
import { createApp, reactive, defineAsyncComponent } from "../vendor/vue/vue.esm-browser.js"
@@ -31,7 +32,6 @@ const OnroadLayoutPage = page(() => import("./onroad-layout.js").then((module) =
const GalaxyPage = page(() => import("./galaxy.js").then((module) => module.GalaxyPage))
import { DevicePicker } from "./device-picker.js"
import { DeviceState } from "./device-state.js"
-import { InstallApp } from "./install-app.js"
import { spawnAmbientStars } from "./ambient-stars.js"
function page(loader) {
@@ -65,19 +65,15 @@ const authState = reactive({ status: "checking", error: "", localAccess: false,
const authForm = reactive({ password: "" })
const auth = new LocalAuth({ publish: (update) => Object.assign(authState, update) })
-const NAV = [
- { name: "Home", path: "/", icon: "bi-house-fill" },
- { name: "Toggles", path: "/settings", icon: "bi-toggle-on" },
- { name: "Tools", path: "/tools", icon: "bi-tools" },
- { name: "Recordings", path: "/recordings", icon: "bi-camera-reels" },
-]
+
createApp({
- components: { GalaxyLoading, Home, Tools, Logs, SoftwarePage, NavigationPage, ModelsPage, LaboratoryPage, SettingsPage, ToggleSearch, PlotsPage, FlmPage, LocalRecordingsPage, CamerasPage, SentryEventsPage, VasmPage, PipPage, DrivingPage, DevicePreferencesPage, BluetoothPage, AndroidAutoPage, LongitudinalCurvesPage, VehicleControlsPage, OnroadLayoutPage, GalaxyPage, DevicePicker, DeviceState, InstallApp, MenuTile },
- data: () => ({ state, authState, authForm, route, NAV }),
+ components: { BottomNav, GalaxyLoading, Home, Tools, Logs, SoftwarePage, NavigationPage, ModelsPage, LaboratoryPage, SettingsPage, ToggleSearch, PlotsPage, FlmPage, LocalRecordingsPage, CamerasPage, SentryEventsPage, VasmPage, PipPage, DrivingPage, DevicePreferencesPage, BluetoothPage, AndroidAutoPage, LongitudinalCurvesPage, VehicleControlsPage, OnroadLayoutPage, GalaxyPage, DevicePicker, DeviceState, MenuTile },
+ data: () => ({ state, authState, authForm, route, NAV, routeDirection: 1 }),
computed: {
visibleTools() { return state.tools.filter(tool => tool.visibility !== "authenticated" ||
- (state.monitorMode === "local" && authState.status === "authenticated")) },
+ (state.monitorMode === "local" && authState.status === "authenticated")).sort((a, b) =>
+ Number(a.path === "/galaxy") - Number(b.path === "/galaxy")) },
currentTool() { return state.tools.find((tool) => route.path === tool.path || route.path.startsWith(tool.path + "/")) },
drivingSettingsPage() { return drivingPage(route.path) },
deviceSettingsPage() { return devicePage(route.path) },
@@ -93,13 +89,16 @@ createApp({
},
},
errorCaptured() { state.pageError = "This page could not finish loading."; return false },
- watch: { 'route.path'() { state.pageError = "" } },
+ watch: { 'route.path'(path, previous) {
+ state.pageError = ""
+ this.routeDirection = primaryTab(path) < primaryTab(previous) ? -1 : 1
+ } },
methods: {
+ setPageActive(element, active) { element.inert = !active; element.setAttribute("aria-hidden", String(!active)) },
reloadPage() { location.reload() },
go(path) { navigate(path, () => { state.drawerOpen = false; state.searchPage = "" }) },
openSearchHit(hit) { navigate("/settings", () => { state.drawerOpen = false; state.searchPage = hit.page }) },
returnFromSearch() { state.searchPage = "" },
- returnToCameras() { this.go("/cameras") },
returnToDriving() { this.go("/driving") },
returnToDevice() { this.go("/device-preferences") },
routeBack() { state.drawerOpen = false; navigateBack() },
@@ -157,13 +156,15 @@ createApp({