Skip to content

Commit a14db71

Browse files
malysclaude
andcommitted
refactor: rename MG4Tasker to EVTasker
Rename the app and its package (com.mg4.tasker -> com.evsuite.tasker) as part of the suite-wide move away from the vehicle-specific MG4 prefix, and point the vendored library at the consolidated EVHardware. The catalogue work that had only ever existed in this copy of the library (ASK_CONFIRM and its localised strings) is now upstream in EVHardware, so the vendored copy no longer diverges. 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 and does not inherit its rules or permissions. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 9e0868f commit a14db71

173 files changed

Lines changed: 2472 additions & 1839 deletions

File tree

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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ body:
9797
- Firmware: SWI133
9898
- Android Automotive: v9
9999
- App Version: 1.0.0
100-
- MG4Control: Connected/Version X.Y.Z
100+
- EVProfile: Connected/Version X.Y.Z
101101
- Number of rules: 5
102102
- Active triggers: speed, time, location
103103
rows: 5
@@ -173,9 +173,9 @@ body:
173173
required: true
174174

175175
- type: dropdown
176-
id: mg4control_bridge
176+
id: evprofile_bridge
177177
attributes:
178-
label: "MG4Control Bridge"
178+
label: "EVProfile Bridge"
179179
description: "Connection status shown in Diagnostic tab"
180180
options:
181181
- "Connected"

‎.github/ISSUE_TEMPLATE/config.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ contact_links:
33
- name: Security vulnerability
44
url: ../../security/advisories/new
55
about: Report privately, never in a public issue.
6-
- name: MG4Control (the bridge / vehicle layer)
7-
url: ../../../MG4Control
6+
- name: EVProfile (the bridge / vehicle layer)
7+
url: ../../../EVProfile
88
about: Anything about how the car is actually read or written belongs there.

‎.github/ISSUE_TEMPLATE/feature_request.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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 is an automation/rule feature (not vehicle control — that's MG4Control)
25+
- label: This is an automation/rule feature (not vehicle control — that's EVProfile)
2626
required: true
2727
- label: I understand this feature must have no safety issues
2828
required: true

‎.github/ISSUE_TEMPLATE/security.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ body:
3131
- label: "State corruption (rule state becomes inconsistent)"
3232
- label: "Condition bypass (gate condition ignored)"
3333
- label: "Unauthorized vehicle action (unintended profile/setting change)"
34-
- label: "MG4Control bridge exploitation (improper IPC validation)"
34+
- label: "EVProfile bridge exploitation (improper IPC validation)"
3535
- label: "Data exfiltration (personal data leaked via rule log/export)"
3636
- label: "Privilege escalation or permission abuse"
3737
- label: "Code execution vulnerability"
@@ -83,7 +83,7 @@ body:
8383
attributes:
8484
label: "Affected Versions"
8585
description: "Which versions are affected?"
86-
placeholder: "MG4Tasker < 1.0.0 (all builds)"
86+
placeholder: "EVTasker < 1.0.0 (all builds)"
8787
validations:
8888
required: true
8989

‎.github/PULL_REQUEST_TEMPLATE.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Pull Request: MG4Tasker
1+
# Pull Request: EVTasker
22

33
## 📝 What and Why
44

@@ -25,8 +25,8 @@
2525
- [ ] No race conditions when two rules fire simultaneously
2626
- [ ] State transitions correctly (e.g., entry/exit geofence)
2727

28-
**Vehicle Safety (if any MG4Control interaction added):**
29-
- [ ] All vehicle writes go through MG4Control (never direct access)
28+
**Vehicle Safety (if any EVProfile interaction added):**
29+
- [ ] All vehicle writes go through EVProfile (never direct access)
3030
- [ ] Speed gate enforced before any vehicle write (0 km/h only)
3131
- [ ] ADAS/safety-critical actions require explicit user confirmation
3232
- [ ] Unreadable conditions make rule **not evaluable** (fail closed, not default-fire)
@@ -51,8 +51,8 @@
5151
- [ ] State corruption impossible (consistent before/after rule execution)
5252

5353
**Permissions & IPC:**
54-
- [ ] MG4Tasker holds no vehicle privileges (no `android.car.*`, no `sharedUserId`)
55-
- [ ] MG4Control bridge properly authenticated (calls validated)
54+
- [ ] EVTasker holds no vehicle privileges (no `android.car.*`, no `sharedUserId`)
55+
- [ ] EVProfile bridge properly authenticated (calls validated)
5656
- [ ] No new `uses-permission` (or added to allowlist with justification)
5757
- [ ] App does NOT self-grant permissions at runtime
5858

@@ -73,7 +73,7 @@ If you'd like Claude AI to help review this PR, include this checklist:
7373
```
7474
Please review this automation PR for:
7575
1. Task sequencing correctness (atomicity, no race conditions)
76-
2. Vehicle safety (MG4Control interaction, speed gate, ADAS handling)
76+
2. Vehicle safety (EVProfile interaction, speed gate, ADAS handling)
7777
3. Input validation (prompt injection, task injection, bounds)
7878
4. State machine consistency (no corruption)
7979
5. Offline operation verification

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
# Allowed permissions for MG4Tasker.
1+
# Allowed permissions for EVTasker.
22
# Any uses-permission in a manifest NOT listed here FAILS the CI.
33
# Why: this app decides when settings get written to a car, and now writes them directly
44
# (system app). Every new permission widens what a rule can reach and must be reviewed here.
55
#
66
# One line = one full permission name. '#' = comment.
77

88
# --- Vehicle access (system app) ---
9-
# MG4Tasker reads and writes the vehicle directly through MG4Hardware. These car
9+
# EVTasker reads and writes the vehicle directly through EVHardware. These car
1010
# permissions are signature|privileged and are granted because the app is signed with the
11-
# ROM platform key and declares sharedUserId="android.uid.system" (same as MG4Control).
11+
# ROM platform key and declares sharedUserId="android.uid.system" (same as EVProfile).
1212
android.car.permission.CAR_ENERGY
1313
android.car.permission.CAR_POWERTRAIN
1414
android.car.permission.CAR_VENDOR_EXTENSION
1515
android.car.permission.CONTROL_CAR_CLIMATE
1616
android.permission.WRITE_SETTINGS
1717

1818
# --- Own vehicle service ---
19-
# A persistent foreground service inits MG4Hardware and listens for ignition; it starts at
19+
# A persistent foreground service inits EVHardware and listens for ignition; it starts at
2020
# boot to catch the first ignition without the app being opened.
2121
android.permission.FOREGROUND_SERVICE
2222
android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE
@@ -37,13 +37,13 @@ android.permission.BLUETOOTH_PRIVILEGED
3737
# publishes the paired phone's explicitly shared phone book through ContactsContract.
3838
android.permission.READ_CONTACTS
3939

40-
# Signature permission defined by MG4Tasker to reject forged OEM hard-key broadcasts.
41-
com.mg4.tasker.permission.RECEIVE_HARDKEY
40+
# Signature permission defined by EVTasker to reject forged OEM hard-key broadcasts.
41+
com.evsuite.tasker.permission.RECEIVE_HARDKEY
4242

43-
# --- Optional MG4Control bridge (profile action only) ---
43+
# --- Optional EVProfile bridge (profile action only) ---
4444
# Signature-level, obtained solely because both APKs share the platform key. Used only to
45-
# apply an MG4Control profile when MG4Control is installed.
46-
com.mg4.control.permission.CONTROL_PROFILES
45+
# apply an EVProfile profile when EVProfile is installed.
46+
com.evsuite.profile.permission.CONTROL_PROFILES
4747

4848
# --- Position ---
4949
# The "near a place" condition, and nothing else. Last known fix only (no live request), read

‎.github/workflows/release.yml‎

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

33
# Tag push only — publishing an APK that automates a car is a human decision.
44
#
5-
# La signature utilise la MÊME clé plateforme que MG4Control, et ce n'est pas un détail
5+
# La signature utilise la MÊME clé plateforme que EVProfile, et ce n'est pas un détail
66
# d'organisation : la permission signature qui protège le pont n'est accordée que si les
7-
# deux APK partagent la clé. Un MG4Tasker signé autrement s'installe et ne fait rien.
7+
# deux APK partagent la clé. Un EVTasker signé autrement s'installe et ne fait rien.
88
on:
99
push:
1010
tags:
@@ -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
with:
@@ -34,16 +34,16 @@ jobs:
3434
uses: gradle/actions/setup-gradle@v4
3535

3636
- name: Decode platform keystore
37-
if: ${{ env.MG4_KEYSTORE_BASE64 != '' }}
37+
if: ${{ env.EV_KEYSTORE_BASE64 != '' }}
3838
run: |
3939
# Tolerate newlines/spaces in the secret; printf avoids a stray trailing newline.
40-
printf '%s' "$MG4_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
40+
printf '%s' "$EV_KEYSTORE_BASE64" | tr -d '[:space:]' | base64 -d > "$RUNNER_TEMP/platform.keystore"
4141
# A PKCS12/JKS keystore starts with 0x30 (DER SEQUENCE); anything else is corrupt.
4242
if [ "$(head -c1 "$RUNNER_TEMP/platform.keystore" | od -An -tx1 | tr -d ' ')" != "30" ]; then
43-
echo "::error::MG4_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore"
43+
echo "::error::EV_KEYSTORE_BASE64 is invalid. Recreate the secret with: base64 -w0 platform.keystore"
4444
exit 1
4545
fi
46-
echo "MG4_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
46+
echo "EV_KEYSTORE=$RUNNER_TEMP/platform.keystore" >> "$GITHUB_ENV"
4747
4848
- name: Run checks before publishing
4949
run: |
@@ -53,22 +53,22 @@ jobs:
5353
5454
- name: Build release APK
5555
env:
56-
MG4_KEYSTORE_PASSWORD: ${{ secrets.MG4_KEYSTORE_PASSWORD }}
57-
MG4_KEY_ALIAS: ${{ secrets.MG4_KEY_ALIAS }}
58-
MG4_KEY_PASSWORD: ${{ secrets.MG4_KEY_PASSWORD }}
56+
EV_KEYSTORE_PASSWORD: ${{ secrets.EV_KEYSTORE_PASSWORD }}
57+
EV_KEY_ALIAS: ${{ secrets.EV_KEY_ALIAS }}
58+
EV_KEY_PASSWORD: ${{ secrets.EV_KEY_PASSWORD }}
5959
run: ./gradlew assembleStableRelease --no-daemon
6060

6161
- name: Collect APK
6262
run: |
6363
mkdir -p dist
6464
# AGP 9 emits app-release.apk; rename to the published convention.
6565
ver=$(grep -oE 'versionName = "[^"]+"' app/build.gradle.kts | head -1 | sed -E 's/.*"([^"]+)"/\1/')
66-
find app/build/outputs/apk -name "app-stable-release.apk" -exec cp {} "dist/MG4Tasker-stable-${ver}.apk" \;
66+
find app/build/outputs/apk -name "app-stable-release.apk" -exec cp {} "dist/EVTasker-stable-${ver}.apk" \;
6767
ls -la dist/
6868
6969
- uses: actions/upload-artifact@v4
7070
with:
71-
name: mg4tasker-apk
71+
name: evtasker-apk
7272
path: dist/*.apk
7373

7474
- name: Publish GitHub Release
@@ -79,15 +79,15 @@ jobs:
7979
prerelease: false
8080
files: dist/*.apk
8181
body: |
82-
## MG4Tasker ${{ github.ref_name }}
82+
## EVTasker ${{ github.ref_name }}
8383
8484
Installation manuelle. Cette application n'embarque **aucun auto-updater** et
8585
ne contacte aucun serveur.
8686
8787
### Prérequis
88-
- **MG4Control installé**, signé avec la même clé plateforme. Sans lui,
89-
MG4Tasker démarre mais n'a accès à rien : l'onglet Diagnostic affichera
90-
« Pont MG4Control : injoignable ».
88+
- **EVProfile installé**, signé avec la même clé plateforme. Sans lui,
89+
EVTasker démarre mais n'a accès à rien : l'onglet Diagnostic affichera
90+
« Pont EVProfile : injoignable ».
9191
- R8 est activé sur cette build. **Vérifiez sur véhicule** avant de vous y
9292
fier : le code du pont est résolu par nom au moment de la liaison.
9393

‎.github/workflows/security.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ jobs:
7373
if: always()
7474
run: |
7575
{
76-
echo "# MG4Tasker security report"
76+
echo "# EVTasker security report"
7777
echo "_$(date -u)_"
7878
echo
7979
echo "## mobsfscan"
@@ -106,7 +106,7 @@ jobs:
106106
if: ${{ env.NVD_API_KEY != '' }}
107107
uses: dependency-check/Dependency-Check_Action@main
108108
with:
109-
project: MG4Tasker
109+
project: EVTasker
110110
path: "."
111111
format: "SARIF"
112112
args: --nvdApiKey ${{ env.NVD_API_KEY }}

‎.github/workflows/unstable.yml‎

Lines changed: 11 additions & 11 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, submodules: recursive }
@@ -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/MG4Tasker-unstable-${{ steps.version.outputs.value }}.apk" \;
66+
-exec cp {} "dist/EVTasker-unstable-${{ steps.version.outputs.value }}.apk" \;
6767
ls -la dist/
6868
6969
- name: Build timestamp
@@ -99,8 +99,8 @@ jobs:
9999
the same certificate as the running app — otherwise it deletes the file. Install
100100
is still a manual tap.
101101
102-
Requires MG4Control installed and signed with the same platform key. The unstable
103-
id is `com.mg4.tasker.unstable` (installs beside stable); it does not receive the
102+
Requires EVProfile installed and signed with the same platform key. The unstable
103+
id is `com.evsuite.tasker.unstable` (installs beside stable); it does not receive the
104104
auto ignition trigger — use "Test now" to run rules.
105105
106106
Commit: ${{ github.sha }}

‎.gitmodules‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
[submodule "MG4Hardware"]
2-
path = MG4Hardware
3-
url = https://github.com/malys/MG4Hardware
1+
[submodule "EVHardware"]
2+
path = EVHardware
3+
url = https://github.com/malys/EVHardware

0 commit comments

Comments
 (0)