Skip to content

Commit 55fb847

Browse files
malysclaude
andcommitted
refactor: rename MG4SwipeLauncher to EVSwipe
Rename the app and its package (com.mg4.launcher.swipe -> com.evsuite.swipe) as part of the suite-wide move away from the vehicle-specific MG4 prefix. Note for release notes: the application ID changes, so an existing install is not upgraded in place. The new build installs alongside the old one, does not inherit its configuration, and has to be picked again as the home app. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent d7b4f5a commit 55fb847

63 files changed

Lines changed: 427 additions & 465 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/ISSUE_TEMPLATE/bug_report.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ body:
6161
label: "Steps to Reproduce"
6262
description: "Exact steps to reproduce the bug"
6363
placeholder: |
64-
1. Enable MG4SwipeLauncher overlay
64+
1. Enable EVSwipe overlay
6565
2. Configure right-edge strip
6666
3. Swipe from very edge of screen (last 5–10 pixels)
6767
4. Observe: gesture not recognized

‎.github/ISSUE_TEMPLATE/config.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ contact_links:
33
- name: Security vulnerability
44
url: ../../security/advisories/new
55
about: Report privately, never in a public issue. This app holds an accessibility service and an overlay.
6-
- name: Upstream project (Tommasov/MG4_Swipe_Launcher)
7-
url: https://github.com/Tommasov/MG4_Swipe_Launcher
6+
- name: Upstream project (Tommasov/EV_Swipe_Launcher)
7+
url: https://github.com/Tommasov/EV_Swipe_Launcher
88
about: This repo is a fork. Anything that also happens on the original belongs there.
9-
- name: MG4Control (the bridge / vehicle layer)
10-
url: ../../../MG4Control
9+
- name: EVProfile (the bridge / vehicle layer)
10+
url: ../../../EVProfile
1111
about: This app holds no vehicle privileges. Anything about reading or writing the car belongs there.

‎.github/ISSUE_TEMPLATE/feature_request.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ body:
1212
1313
Have an idea to improve the swipe launcher? We'd love to hear it!
1414
15-
**Before requesting:** Please check if a similar feature has been requested in [Discussions](https://github.com/malys/MG4SwipeLauncher/discussions).
15+
**Before requesting:** Please check if a similar feature has been requested in [Discussions](https://github.com/malys/EVSwipe/discussions).
1616
1717
- type: checkboxes
1818
id: checks
@@ -22,7 +22,7 @@ body:
2222
options:
2323
- label: I've checked existing issues/discussions and found no duplicate
2424
required: true
25-
- label: This feature is for swipe overlay (not vehicle control — that's MG4Control/MG4Tasker)
25+
- label: This feature is for swipe overlay (not vehicle control — that's EVProfile/EVTasker)
2626
required: true
2727
- label: This does not require accessibility service to read window content
2828
required: true

‎.github/ISSUE_TEMPLATE/security.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ body:
8080
attributes:
8181
label: "Affected Versions"
8282
description: "Which versions are affected?"
83-
placeholder: "MG4SwipeLauncher < 1.1.0 (all builds)"
83+
placeholder: "EVSwipe < 1.1.0 (all builds)"
8484
validations:
8585
required: true
8686

‎.github/PULL_REQUEST_TEMPLATE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Pull Request: MG4SwipeLauncher
1+
# Pull Request: EVSwipe
22

33
## 📝 What and Why
44

@@ -45,7 +45,7 @@
4545

4646
**Permissions & Privileges:**
4747
- [ ] No new `uses-permission` added (or added to `.github/security/permission-allowlist.txt` with justification)
48-
- [ ] No vehicle privileges (no `android.car.*`, no `sharedUserId`, no MG4Control IPC)
48+
- [ ] No vehicle privileges (no `android.car.*`, no `sharedUserId`, no EVProfile IPC)
4949
- [ ] App does NOT attempt to self-grant overlay or accessibility at runtime
5050
- [ ] No network code in `src/main/` (OTA stays in `src/unstable/` behind `BuildConfig.OTA_ENABLED`)
5151

‎.github/security/permission-allowlist.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Allowed permissions for MG4 Swipe Launcher.
1+
# Allowed permissions for EVSwipe.
22
# Any uses-permission in a manifest NOT listed here FAILS the CI.
33
# Why: this app holds an accessibility service and draws over other apps — the classic
44
# Android malware pairing. Every new permission widens that surface and must be reviewed

‎.github/workflows/release.yml‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Release
22

33
# Tag push only — publishing the APK that becomes the car's home screen is a human decision.
44
#
5-
# Signed with the SAME platform key as the rest of the MG4 suite. The launcher needs no
5+
# Signed with the SAME platform key as the rest of the EVSuite. The launcher needs no
66
# privileged permission of its own; the shared key is what makes the suite one installable
77
# set, and it is what an unstable build's OTA signature check compares against.
88
on:
@@ -19,7 +19,7 @@ jobs:
1919
name: Build and publish APK
2020
runs-on: ubuntu-latest
2121
env:
22-
MG4_KEYSTORE_BASE64: ${{ secrets.MG4_KEYSTORE_BASE64 }}
22+
EV_KEYSTORE_BASE64: ${{ secrets.EV_KEYSTORE_BASE64 }}
2323
steps:
2424
- uses: actions/checkout@v4
2525

@@ -32,16 +32,16 @@ jobs:
3232
uses: gradle/actions/setup-gradle@v4
3333

3434
- name: Decode platform keystore
35-
if: ${{ env.MG4_KEYSTORE_BASE64 != '' }}
35+
if: ${{ env.EV_KEYSTORE_BASE64 != '' }}
3636
run: |
3737
# Tolerate newlines/spaces in the secret; printf avoids a stray trailing newline.
38-
printf '%s' "$MG4_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
38+
printf '%s' "$EV_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
3939
# A PKCS12/JKS keystore starts with 0x30 (DER SEQUENCE); anything else is corrupt.
4040
if [ "$(head -c1 "$RUNNER_TEMP/platform.keystore" | od -An -tx1 | tr -d ' ')" != "30" ]; then
41-
echo "::error::MG4_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore"
41+
echo "::error::EV_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore"
4242
exit 1
4343
fi
44-
echo "MG4_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
44+
echo "EV_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
4545
4646
- name: Run checks before publishing
4747
run: |
@@ -51,21 +51,21 @@ jobs:
5151
5252
- name: Build release APK
5353
env:
54-
MG4_KEYSTORE_PASSWORD: ${{ secrets.MG4_KEYSTORE_PASSWORD }}
55-
MG4_KEY_ALIAS: ${{ secrets.MG4_KEY_ALIAS }}
56-
MG4_KEY_PASSWORD: ${{ secrets.MG4_KEY_PASSWORD }}
54+
EV_KEYSTORE_PASSWORD: ${{ secrets.EV_KEYSTORE_PASSWORD }}
55+
EV_KEY_ALIAS: ${{ secrets.EV_KEY_ALIAS }}
56+
EV_KEY_PASSWORD: ${{ secrets.EV_KEY_PASSWORD }}
5757
run: ./gradlew assembleStableRelease --no-daemon
5858

5959
- name: Collect APK
6060
run: |
6161
mkdir -p dist
6262
ver=$(grep -oE 'versionName = "[^"]+"' app/build.gradle.kts | head -1 | sed -E 's/.*"([^"]+)"/\1/')
63-
find app/build/outputs/apk -name "app-stable-release.apk" -exec cp {} "dist/MG4SwipeLauncher-stable-${ver}.apk" \;
63+
find app/build/outputs/apk -name "app-stable-release.apk" -exec cp {} "dist/EVSwipe-stable-${ver}.apk" \;
6464
ls -la dist/
6565
6666
- uses: actions/upload-artifact@v4
6767
with:
68-
name: mg4swipelauncher-apk
68+
name: evswipe-apk
6969
path: dist/*.apk
7070

7171
- name: Publish GitHub Release
@@ -76,7 +76,7 @@ jobs:
7676
prerelease: false
7777
files: dist/*.apk
7878
body: |
79-
## MG4 Swipe Launcher ${{ github.ref_name }}
79+
## EVSwipe ${{ github.ref_name }}
8080
8181
Manual, offline installation. This build embeds **no auto-updater** and
8282
contacts no server: the stable flavor has neither the updater code nor the
@@ -87,6 +87,6 @@ jobs:
8787
as the default home from Android settings.
8888
8989
### Note
90-
Signed with the MG4 suite platform key. If you are coming from a build signed
90+
Signed with the EVSuite platform key. If you are coming from a build signed
9191
with the old author key, uninstall the previous version first — Android refuses
9292
an in-place update across a key change.

‎.github/workflows/security.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jobs:
6969
if: always()
7070
run: |
7171
{
72-
echo "# MG4 Swipe Launcher security report"
72+
echo "# EVSwipe security report"
7373
echo "_$(date -u)_"
7474
echo
7575
echo "## mobsfscan"
@@ -100,7 +100,7 @@ jobs:
100100
if: ${{ env.NVD_API_KEY != '' }}
101101
uses: dependency-check/Dependency-Check_Action@main
102102
with:
103-
project: MG4_Swipe_Launcher
103+
project: EV_Swipe_Launcher
104104
path: "."
105105
format: "SARIF"
106106
args: --nvdApiKey ${{ env.NVD_API_KEY }}

‎.github/workflows/unstable.yml‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
name: Build and publish unstable APK
1616
runs-on: ubuntu-latest
1717
env:
18-
MG4_KEYSTORE_BASE64: ${{ secrets.MG4_KEYSTORE_BASE64 }}
18+
EV_KEYSTORE_BASE64: ${{ secrets.EV_KEYSTORE_BASE64 }}
1919
steps:
2020
- uses: actions/checkout@v4
2121
with: { fetch-depth: 1 }
@@ -29,14 +29,14 @@ jobs:
2929
uses: gradle/actions/setup-gradle@v4
3030

3131
- name: Decode platform keystore
32-
if: ${{ env.MG4_KEYSTORE_BASE64 != '' }}
32+
if: ${{ env.EV_KEYSTORE_BASE64 != '' }}
3333
run: |
34-
printf '%s' "$MG4_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
34+
printf '%s' "$EV_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
3535
if [ "$(head -c1 "$RUNNER_TEMP/platform.keystore" | od -An -tx1 | tr -d ' ')" != "30" ]; then
36-
echo "::error::MG4_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore"
36+
echo "::error::EV_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore"
3737
exit 1
3838
fi
39-
echo "MG4_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
39+
echo "EV_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
4040
4141
- name: Run checks
4242
run: |
@@ -52,9 +52,9 @@ jobs:
5252
5353
- name: Build unstable release APK
5454
env:
55-
MG4_KEYSTORE_PASSWORD: ${{ secrets.MG4_KEYSTORE_PASSWORD }}
56-
MG4_KEY_ALIAS: ${{ secrets.MG4_KEY_ALIAS }}
57-
MG4_KEY_PASSWORD: ${{ secrets.MG4_KEY_PASSWORD }}
55+
EV_KEYSTORE_PASSWORD: ${{ secrets.EV_KEYSTORE_PASSWORD }}
56+
EV_KEY_ALIAS: ${{ secrets.EV_KEY_ALIAS }}
57+
EV_KEY_PASSWORD: ${{ secrets.EV_KEY_PASSWORD }}
5858
run: ./gradlew assembleUnstableRelease -PunstableBuild=${{ github.run_number }} --no-daemon
5959

6060
- name: Collect APK
@@ -63,7 +63,7 @@ jobs:
6363
# The release tag is the fixed string "unstable", so the version lives in the asset
6464
# name: the updater matches ".apk" + "unstable" and reads the version from it.
6565
find app/build/outputs/apk -name "app-unstable-release.apk" \
66-
-exec cp {} "dist/MG4SwipeLauncher-unstable-${{ steps.version.outputs.value }}.apk" \;
66+
-exec cp {} "dist/EVSwipe-unstable-${{ steps.version.outputs.value }}.apk" \;
6767
ls -la dist/
6868
6969
- name: Build timestamp
@@ -98,7 +98,7 @@ jobs:
9898
the same certificate as the running app — otherwise it deletes the file. Install
9999
is still a manual tap.
100100
101-
The unstable id is `com.mg4.launcher.swipe.unstable`, so it installs beside a
101+
The unstable id is `com.evsuite.swipe.unstable`, so it installs beside a
102102
stable build. Both cannot be the default home at once — pick one in Android
103103
settings.
104104

‎AGENTS.md‎

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
# AGENTS.md — MG4 Swipe Launcher
1+
# AGENTS.md — EVSwipe
22

3-
Swipe-up-from-the-bottom app launcher for the SAIC MG4 head unit. Part of **MG4Suite**
4-
alongside [MG4Control](../MG4Control), [MG4Tasker](../MG4Tasker),
5-
[MG4ABRPUploader](../MG4ABRPUploader) and [MG4 Simple Launcher](../MG4SimpleLauncher).
3+
Swipe-up-from-the-bottom app launcher for the SAIC MG4 head unit. Part of **EVSuite**
4+
alongside [EVProfile](../EVProfile), [EVTasker](../EVTasker),
5+
[EVABRPUploader](../EVABRPUploader) and [EVLauncher](../EVLauncher).
66

77
The workspace `AGENTS.md` and normative workspace `DESIGN.md` apply; this file contains
88
only launcher-specific additions.
99

10-
Fork of [Tommasov/MG4_Swipe_Launcher](https://github.com/Tommasov/MG4_Swipe_Launcher) —
10+
Fork of [Tommasov/EV_Swipe_Launcher](https://github.com/Tommasov/EV_Swipe_Launcher) —
1111
see [`LICENSE.md`](LICENSE.md), the licence situation is not the usual one.
1212

1313
Commit author: malys.training@gmail.com
@@ -29,24 +29,25 @@ Widening either declaration is a security change: justify it in the PR and updat
2929
[`SECURITY.md`](SECURITY.md).
3030

3131
**It never touches the vehicle.** No `android.car.*` permission, no `sharedUserId`, no IPC
32-
to MG4Control. Vehicle reads and writes belong in MG4Control; automation in MG4Tasker.
32+
to EVProfile. Vehicle reads and writes belong in EVProfile; automation in EVTasker.
3333

3434
## Two channels, separated by source set
3535

3636
| | stable | unstable |
3737
|---|---|---|
38-
| Application id | `com.mg4.launcher.swipe` | `com.mg4.launcher.swipe.unstable` |
38+
| Application id | `com.evsuite.swipe` | `com.evsuite.swipe.unstable` |
3939
| Published by | `v*` tag → `release.yml` | push to `master` → `unstable.yml`, rolling `unstable` tag |
4040
| `INTERNET` | absent from the manifest | declared in `src/unstable/AndroidManifest.xml` |
41-
| `BuildConfig.OTA_ENABLED` | `false` | `true` |
42-
| Updater | `src/stable/.../UpdateHook.kt` — a no-op | `src/unstable/.../{UpdateHook,OtaUpdater,ApkSignature}.kt` |
41+
| `BuildConfig.OTA_ENABLED` | `false` | `true` (hook audit-suspended) |
42+
| Updater | `src/stable/.../UpdateHook.kt` — a no-op | policy code retained; `UpdateHook` inert during audit |
4343

4444
`UpdateHook` is the flavour-aware seam: `MainActivity` calls it without knowing which
4545
channel it was built into, and the stable variant does nothing. The stable APK is fully
4646
offline — the updater code is not in it. Keep it that way: nothing network-shaped in
4747
`src/main/`.
4848

49-
The unstable OTA path is automatic: it downloads into app-private `cacheDir`, validates
49+
The unstable OTA trigger is suspended while the suite safety and legal audit is open. Its
50+
retained policy downloads into app-private `cacheDir`, validates
5051
`https` plus the GitHub allowlist at every redirect, verifies the APK against the running
5152
app certificate, then runs `/system/bin/pm install -r`. Success requires both exit code 0
5253
and `Success` in the command output; the APK is always deleted afterwards. The unstable
@@ -77,12 +78,12 @@ picker.
7778

7879
## Reference patterns (shared with the suite)
7980

80-
- **Signing**: the MG4 suite platform key, path + passwords from env vars (CI) or
81+
- **Signing**: the EVSuite platform key, path + passwords from env vars (CI) or
8182
`gradle.properties` (local); the `signingConfig` is created only if the keystore file
8283
exists. Never a literal secret in a build file.
8384
- **Security CI**: `.github/workflows/security.yml` — blocking permission-drift gate +
8485
gitleaks, plus informational SARIF from mobsfscan / semgrep / dependency-check.
85-
- **Theme**: dark Material 3 on the shared `mg4_*` colour and spacing tokens, 64 dp touch
86+
- **Theme**: dark Material 3 on the shared `ev_*` colour and spacing tokens, 64 dp touch
8687
targets. Dark is imposed, not system-following — glare on a windscreen at night.
8788
- **Language**: English by default (code, comments, commits, docs).
8889

@@ -91,7 +92,7 @@ picker.
9192
`mise run build | build-unstable | test | check | permissions | run`. JDK 17, AGP 8.6,
9293
Gradle 8.7, `minSdk 28` / `targetSdk 34`. Emulator: `mise run emulator-setup` then
9394
`emulator-screen` (API 28 at panel geometry) or `emulator-car` (API 33 Automotive); AVDs
94-
are named `mg4swipe-*`, per-repo like the sibling projects. Overlay and accessibility are
95+
are named `evswipe-*`, per-repo like the sibling projects. Overlay and accessibility are
9596
special permissions that `adb install -g` does not grant — `mise run grant-permissions`
9697
sets them on a throwaway emulator, and nothing in the app should ever attempt the same at
9798
runtime.

0 commit comments

Comments
 (0)