Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
android:permission="android.permission.BIND_VPN_SERVICE">
<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="User-configured per-app VPN tunnel" />
android:value="User-initiated and always-on VPN tunnel that continuously routes selected apps or all device traffic through user-configured proxy profiles" />
<intent-filter>
<action android:name="android.net.VpnService" />
</intent-filter>
Expand Down
Binary file not shown.
56 changes: 56 additions & 0 deletions docs/google-play/foreground-service-declaration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Foreground service declaration

This document contains the text and supporting video for the Google Play
foreground service declaration of MegaProxy.

## Foreground service type

`specialUse`

Manifest subtype:

> User-initiated and always-on VPN tunnel that continuously routes selected
> apps or all device traffic through user-configured proxy profiles.

## Play Console description

MegaProxy provides a user-configured VPN tunnel, which is the app's core
functionality. The foreground service starts only after the user taps Connect,
when Android starts the configured Always-on VPN, or during a user-initiated
connection test.

The service continuously processes network traffic through Android's
`VpnService` tunnel. This work must start immediately and remain active for the
entire VPN session: delaying, suspending, or terminating it would immediately
interrupt the network connection that the user explicitly enabled.

While the tunnel is active, MegaProxy displays a persistent, low-priority
notification titled "MegaProxy is active". The Android VPN indicator and the
main screen also show that the VPN is connected. The user can stop a manually
started session by tapping Disconnect. An Always-on VPN session is controlled
through MegaProxy or Android's VPN settings. MegaProxy does not keep the
foreground service running after the VPN session has stopped.

## Video

[Foreground service demonstration](assets/foreground-service-demo.mp4)

The video uses an Android emulator and a non-sensitive profile label. It does
not display proxy endpoints, credentials, or private configuration values.

- `00:00` — MegaProxy is disconnected; the user starts the VPN with Connect.
- `00:20` — the main screen reports Connected and Android shows the VPN icon.
- `00:31` — the notification shade shows the ongoing notification
"MegaProxy is active — Connected".
- `00:38` — the app remains connected after the notification shade is closed.

## Reviewer notes

- The foreground service is visible and directly associated with the user's
active VPN session.
- It performs continuous, user-expected networking rather than deferrable
background work.
- The service uses `android.permission.BIND_VPN_SERVICE` and is not exported to
other apps.
- `POST_NOTIFICATIONS` is requested on supported Android versions so the
persistent status notification is visible to the user.
7 changes: 7 additions & 0 deletions fastlane/metadata/android/en-US/images/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Google Play listing images for MegaProxy.

- `icon.png`: 512 x 512 store icon.
- `featureGraphic.png`: 1024 x 500 feature graphic.
- `phoneScreenshots/`: portrait screenshots captured from the app with demo-only data.

Do not place real proxy hosts, credentials, keys, IP addresses, or other personal data in these assets.
Binary file modified fastlane/metadata/android/en-US/images/featureGraphic.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified fastlane/metadata/android/en-US/images/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified fastlane/metadata/android/ru-RU/images/featureGraphic.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified fastlane/metadata/android/ru-RU/images/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.