# Quest App Launcher

[![Build](https://github.com/HooverHigh/QuestAppLauncher/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/HooverHigh/QuestAppLauncher/actions/workflows/build.yml)

A VR home-screen replacement for Meta Quest 2, built in Unity by [oxmc](https://github.com/oxmc) for Hoover High School. Replaces the default Quest shell with a fully configurable app grid — custom icons, renamed apps, user-defined tabs, and automatic asset updates from any HTTP or GitHub source.

## Features

- Scrollable grid of all installed apps, configurable rows × columns
- Auto-categorized tabs (Quest / 2D) and user-defined custom tabs
- App name overrides and custom icons via JSON or zip icon packs
- Asset auto-update from GitHub releases or any plain HTTP endpoint — not just one source, any number of repos can be configured
- Sort by alphabetical or most recently used
- Configurable background skybox
- Managed policy support for IT/MDM deployments (hidden apps, name overrides, wallpaper, disable settings)
- Memory-efficient lazy icon loading — textures are loaded/unloaded based on scroll position

## Requirements

- Meta Quest 2
- Unity (see `ProjectSettings/ProjectVersion.txt` for version)
- Meta XR SDK (included via Package Manager)

## Building

Builds are handled entirely by GitHub Actions — there is no local build command.

- **`build.yml`** — runs tests (on master), builds the Android APK, uploads to GitHub Releases as `HooverHighQuestAppLauncher.apk`
- **`activation.yml`** — manual trigger to request a Unity license activation file

## Source Structure

| Path | Description |
|------|-------------|
| `Assets/Scenes/QuestAppLauncher.unity` | Main scene |
| `Assets/Plugins/Android/AppInfo.java` | Android plugin: enumerates installed apps, extracts icons, reads usage stats via JNI |
| `Assets/Scripts/` | C# scripts: grid layout, app processing, settings, downloads |
| `Assets/OVRInputSelection/` | Controller ray input and pointer visualization |
| `.github/workflows/` | CI build and license activation workflows |

## Configuration

Settings are stored in `config.json` in the app's persistent data path on-device. The file is created with defaults on first run and can be pushed via `adb`:

```bash
adb push config.json /sdcard/Android/data/dev.oxmc.QuestAppLauncher/files/
```

Key settings:

- **Grid size** — rows × columns (1–10 each)
- **Sort mode** — `az` (alphabetical) or `mostRecent`
- **Show 2D apps** — toggle non-VR apps on or off
- **Auto category** — places Quest / 2D apps into auto tabs; position: `top`, `left`, `right`, or `off`
- **Custom category** — user-defined tabs from `appnames.json`; same position options
- **Background** — path to a skybox image, or `"default"`
- **Auto update** — checks configured repos for new icon packs and app name files on startup
- **Download repos** — list of asset sources; supports GitHub releases (`type: "github"`) and any plain HTTP manifest endpoint (`type: "http"`) — multiple sources can be combined

### Custom app names and icons

Place `appnames.json` (or `appnames*.json`) in the persistent data path to rename apps and assign them to tabs. Place `iconpack*.zip` files (containing `<packageName>.jpg` entries) or individual `<packageName>.jpg` files to override icons.

See [docs.md](docs.md) for the full format reference, all config fields, managed policy details, and useful `adb` commands.

## Credits

- [tverona1](https://github.com/tverona1) — original creator
- noxx — original app icon
