Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
5d56d79
Add Gradle wrapper files and update settings for Android project
Kief5555 May 14, 2026
f97710e
feat: Enhance streaming experience and UI updates
Kief5555 May 16, 2026
d0771a6
feat: Enhance session proxy settings and ad playback functionality
Kief5555 May 16, 2026
36149af
feat: Implement QR code generation and enhance streaming stats
Kief5555 May 16, 2026
97b644e
feat: Add functionality to remove completed ads from session state an…
Kief5555 May 16, 2026
02a7bfe
Refactor UI colors and enhance device login experience
Kief5555 May 16, 2026
05e8eff
feat: Enhance device code login support and improve session handling
Kief5555 May 16, 2026
fbd669d
feat: Replace loading skeleton with pulsing animation for game images
Kief5555 May 16, 2026
2eed4bd
feat: Enhance OpenNowViewModel with account switching and stream retu…
Kief5555 May 17, 2026
d2036a5
Potential fix for pull request finding
Kief5555 May 17, 2026
d525803
feat: Enhance stream resolution options and implement membership tier…
Kief5555 May 17, 2026
3b7d1c1
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 May 17, 2026
49f6847
feat: Remove release artifacts and update .gitignore for cleaner builds
Kief5555 May 17, 2026
380a69a
feat: Update minimum SDK version and increment version code; enhance …
Kief5555 May 17, 2026
5963880
feat: Refactor token management to use milliseconds for refresh windo…
Kief5555 May 18, 2026
c722a8f
feat: Enhance WebRTC codec handling and input channel management
Kief5555 May 23, 2026
3837fae
feat: Refactor mouse capture handling and enhance stream settings adj…
Kief5555 May 24, 2026
d9cbf2c
feat: Implement display refresh rate management and enhance stream se…
Kief5555 May 31, 2026
556bdfe
Add vector drawable icons for various game stores and implement unit …
Kief5555 Jun 14, 2026
4898a2e
feat: Add HDR support and enhance haptic feedback for gamepad control…
Kief5555 Jun 15, 2026
c0a866d
feat: Enhance sorting and filtering UI with improved layout and funct…
Kief5555 Jun 15, 2026
b81beaa
feat: Implement settings reset and cache clearing functionality; enha…
Kief5555 Jun 16, 2026
6bc4504
Add new strings for empty search states and filters; enhance tests fo…
Kief5555 Jun 22, 2026
82a146c
feat: Implement Android update functionality
Kief5555 Jun 23, 2026
6ead986
Add unit test for OpenNow analytics configuration
Kief5555 Jun 26, 2026
e5d36e6
feat: Update versioning, enhance stream settings, and improve UI/UX
Kief5555 Jun 27, 2026
9e8d0ca
feat: Add donation section and debug event logging
Kief5555 Jun 27, 2026
97e839c
Implement persistent storage management and game store connectors for…
Kief5555 Jun 29, 2026
f4f736c
Fix(android): add storage addon filter and connector state/token fixe…
Kief5555 Jun 29, 2026
6dc97ac
feat: Update version and enhance audio cue functionality
Kief5555 Jun 29, 2026
3845723
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Jun 29, 2026
8204694
Add in-app store connector connect/disconnect actions (#548)
Kief5555 Jun 29, 2026
41a95d2
feat(android): update version code to 16 and version name to 0.6.1
Kief5555 Jun 29, 2026
1353777
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Jun 29, 2026
5f808f7
Fix Android account linking and add missing Steam provider (#550)
Kief5555 Jun 29, 2026
859d909
Fix Android connector refresh polling (#553)
Kief5555 Jun 29, 2026
9f091fc
Fix account-link ALS 401 error and add toasts (#554)
Kief5555 Jun 29, 2026
b702052
Fix Android ALS endpoint and client ID to match desktop (#559)
Kief5555 Jun 29, 2026
0be6ebc
feat: Add settings screen with various configuration options
Kief5555 Jun 30, 2026
2af413a
feat: Add Android update notice handling and improve codec negotiation
Kief5555 Jul 1, 2026
6abb5fa
chore: Remove unused Kotlin compiler session file
Kief5555 Jul 1, 2026
26c0aa5
feat: Enhance storage usage progress indicator with dynamic height an…
Kief5555 Jul 1, 2026
36b311f
feat: Enhance stream resolution handling and gamepad input support
Kief5555 Jul 1, 2026
e5eb361
feat: Add play time stats panel and enhance session management
Kief5555 Jul 3, 2026
405fcda
feat: Implement APK update support and enhance update management for …
Kief5555 Jul 4, 2026
f695e88
feat: Enhance settings UI with descriptions and add account provider …
Kief5555 Jul 5, 2026
0a3b94c
feat: Enhance diagnostic logging and redaction for sensitive information
Kief5555 Jul 5, 2026
7ed7106
Refactor OpenNowViewModel for improved debugging and diagnostics
Kief5555 Jul 5, 2026
b19868b
feat: Refactor SDP handling to improve candidate endpoint resolution …
Kief5555 Jul 5, 2026
3c95f3f
Refactor code structure for improved readability and maintainability
Kief5555 Jul 6, 2026
bc48bc4
feat: Enhance streaming settings and diagnostics
Kief5555 Jul 8, 2026
4496299
Refactor mouse assist functionality and update related tests
Kief5555 Jul 9, 2026
9b56102
Refactor catalog background image handling and improve haptics parsing
Kief5555 Jul 10, 2026
ff2d029
feat: Update version code and name, enhance controller navigation han…
Kief5555 Jul 11, 2026
9bac3cb
feat: Update version code to 34 and name to 0.7.9; enhance streaming …
Kief5555 Jul 11, 2026
1944eb4
feat: Update version code to 35 and name to 0.8.0; improve SurfaceVie…
Kief5555 Jul 11, 2026
b2c7b28
feat: Implement nextSessionAdId function and refactor queue ad handli…
Kief5555 Jul 12, 2026
c619185
feat: Update version code to 36 and name to 0.8.1
Kief5555 Jul 12, 2026
4153ed6
feat: Add appCategory to manifest and adjust windowSoftInputMode in M…
Kief5555 Jul 12, 2026
a2e6168
Add unit tests for AndroidStreamKeepAliveNotifier and CellularNetwork…
Kief5555 Jul 12, 2026
b1e5831
feat(android): redesign virtual touch controller, secure auth storage…
Chizuui Jul 12, 2026
28b7f10
Merge pull request #634 from Chizuui/android-native
Kief5555 Jul 13, 2026
01e58c5
feat(android): implement multi-style touch overlay, unified sliding D…
Chizuui Jul 14, 2026
f279685
Merge pull request #641 from Chizuui/dev-android-native
Kief5555 Jul 15, 2026
f5f9cd3
Improve Android auth refresh and stream recovery
Kief5555 Jul 15, 2026
5fd8ede
Add tests for launch errors, ownership, stream settings, and local TV…
Kief5555 Jul 16, 2026
59aef68
Refactor stream handling and improve artwork logic
Kief5555 Jul 16, 2026
9eeb55b
fix(android): improve virtual stick pointer handling and state manage…
Kief5555 Jul 16, 2026
714a0c5
fix(android): resolve input thread lag, TV controller navigation, hal…
Chizuui Jul 16, 2026
26f3ec6
Merge pull request #646 from Chizuui/dev-android-native-pr
Kief5555 Jul 16, 2026
d5c8d22
fix(android): fix virtual stick getting stuck on release outside stic…
Chizuui Jul 17, 2026
d3268b8
fix(android): fix analog stick held state not cleared when touch rele…
Chizuui Jul 17, 2026
d87e837
Merge pull request #647 from Chizuui/android-native
Kief5555 Jul 17, 2026
9e153f4
fix(android): update version code and name, enhance game card scaling…
Kief5555 Jul 17, 2026
f90b3ec
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Jul 17, 2026
6e55d55
feat: TV and input experience improvements
Chizuui Jul 17, 2026
49b6b2a
Merge pull request #648 from Chizuui/pr-tv-input-improvements
Kief5555 Jul 17, 2026
a6cb5d4
Refactor settings UI and enhance controller focus handling
Kief5555 Jul 18, 2026
d743870
feat: Update version and enhance HDR support
Kief5555 Jul 18, 2026
7b88bad
feat: Add microphone support and bug reporting functionality
Kief5555 Jul 19, 2026
bf01a98
feat: Enhance resolution handling for 1440p streams and add correspon…
Kief5555 Jul 19, 2026
0b27de5
feat: Update version code to 47 and version name to 0.9.2
Kief5555 Jul 19, 2026
40b2194
feat: add native low latency video decoder wrapper with MediaTek support
Chizuui Jul 19, 2026
086d9c9
Refactor streaming settings and performance warnings
Kief5555 Jul 20, 2026
aa44fa1
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Jul 20, 2026
fb02a34
feat: implement Android controller slot management and enhance input …
Kief5555 Jul 20, 2026
fb72c35
feat: update version code to 49 and version name to 0.9.4; add pinch …
Kief5555 Jul 20, 2026
fac02fd
feat: update version code to 51 and version name to 0.9.6; refactor G…
Kief5555 Jul 20, 2026
19d848e
Refactor and enhance session reporting and stream settings tests
Kief5555 Jul 21, 2026
bd8e482
feat: Enhance AV1 support and performance tuning
Kief5555 Jul 22, 2026
9e29e0d
feat: update version code to 55 and version name to 1.0.0
Kief5555 Jul 22, 2026
48d57b6
Add bug report preflight diagnostics and input diagnostics tracking
Kief5555 Jul 26, 2026
21e371a
fix(android): resolve direct click cursor position drift after app pa…
Chizuui Jul 22, 2026
a719ecb
fix(android): resolve RtpSender disposed crash and optimize Snapdrago…
Chizuui Jul 22, 2026
9dabf5a
fix(input): sync virtual cursor position directly to target touch coo…
Chizuui Jul 22, 2026
df2de8b
fix(input): reset direct click tracking state when switching in and o…
Chizuui Jul 22, 2026
160e439
feat(touch/ui): implement native touch and UI redesign on Android client
Chizuui Jul 29, 2026
144c01b
fix(touch/ui): resolve compile errors after rebase
Chizuui Jul 29, 2026
5f17baa
feat: update version code to 60 and version name to 1.0.5; refactor C…
Kief5555 Jul 31, 2026
8588395
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Jul 31, 2026
709c520
Refactor controller navigation handling and enhance bug report functi…
Kief5555 Jul 31, 2026
4a0b5c4
Refactor settings UI and improve touch input handling
Kief5555 Aug 1, 2026
9d4246a
feat: Enhance HDR settings and session report features
Kief5555 Aug 1, 2026
21c355f
Fix native touch + ultrawide resolution for games like NTE
Chizuui Aug 1, 2026
053b19a
fix(input): overhaul direct click to eliminate cursor drift
Chizuui Aug 2, 2026
0a62d30
Refactor Android service command handling and improve stability
Kief5555 Aug 2, 2026
e6ff898
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Aug 2, 2026
b051fa3
Fix GFN library ownership and free launches
Kief5555 Aug 2, 2026
fe68243
feat: update version to 1.1.0 and enhance native touch support with b…
Kief5555 Aug 2, 2026
8d509fe
fix(input): overhaul direct click to eliminate cursor drift
Chizuui Aug 2, 2026
f70c4cf
feat: live bitrate with overlay indicator, TV input fixes, haptics re…
Chizuui Aug 6, 2026
3b64dc9
Add unit tests for various components in the OpenNow application
Kief5555 Aug 6, 2026
b0e911f
Merge android-native (3b64dc91) into android-native-live-features
Chizuui Aug 6, 2026
c760acd
Merge pull request #710 from Chizuui/android-native-live-features
Kief5555 Aug 7, 2026
e1c1f83
feat: enhance CPU profiling and diagnostics with new sampling and rep…
Kief5555 Aug 7, 2026
722c7fc
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Aug 7, 2026
25d31a0
feat: update version to 1.1.5 and enhance signaling failure handling …
Kief5555 Aug 7, 2026
2f46c7b
feat: Implement diagnostic snapshot persistence and history management
Kief5555 Aug 9, 2026
4b13959
Implement external mouse pointer lock feature
Kief5555 Aug 10, 2026
5eaf64f
feat: Add SDP tools and signaling client for improved media handling
Kief5555 Aug 10, 2026
d826f37
Fix low-speed Android mouse precision
zortos293 Aug 10, 2026
ec31fbe
Merge latest android-native into mouse precision fix
zortos293 Aug 10, 2026
e388e6f
feat: Update version to 1.2.0 and enhance queue ready notification ha…
Kief5555 Aug 11, 2026
edfb0fa
Merge branch 'android-native' into capy/android-mouse-precision
Kief5555 Aug 11, 2026
7920d73
Merge pull request #738 from OpenCloudGaming/capy/android-mouse-preci…
Kief5555 Aug 11, 2026
01bad77
Refactor stream session recovery and enhance input diagnostics
Kief5555 Aug 11, 2026
ec5068d
Merge branch 'android-native' of https://github.com/OpenCloudGaming/O…
Kief5555 Aug 11, 2026
cf5d20c
Add Turkish localization and network profile tests
Kief5555 Aug 12, 2026
03c1505
feat: Update Android app version and enhance touch aiming functionality
Kief5555 Aug 12, 2026
e8c9667
feat: Enhance touch controller behavior for Finger Mouse and add corr…
Kief5555 Aug 12, 2026
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
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ native/opennow-streamer/bin/*/*
.serena/
*.xcuserstate
xcuserdata/

.logs/
# Xcode build outputs
DerivedData/

Expand All @@ -44,6 +44,8 @@ gfn_tokens.json

# Test files
test/
!android/app/src/test/
!android/app/src/test/**

package-lock.json
opennow-stable/package-lock.json
Expand All @@ -56,3 +58,6 @@ release-notes.md
result
.deriveddata/
.deriveddata-device/

/android/app/.cxx
/android/app/release
8 changes: 8 additions & 0 deletions android/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.gradle/
.idea/
build/
local.properties
captures/
*.iml
app/build/
app/release/
164 changes: 164 additions & 0 deletions android/BUG_REPORT_API.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
# Android bug-report API contract

The Android client sends a pseudonymous, installation-scoped `reporterId` with every bug report.
Use that value as the lookup key for report throttles or blocks. It is a namespaced SHA-256 digest;
the raw GFN device ID, account ID, and email address are not sent.

`reporterId` is useful for ordinary abuse control, but it is not a hardware-backed identity. Clearing
app data or reinstalling can create a new identifier, and a modified client can forge one. If stronger
enforcement is needed, combine it server-side with rate limits or authenticated account signals that
the service already has instead of asking the app to upload raw hardware identifiers.

## Custom rejection shown by the app

Return HTTP `403` with this JSON when the reporter is blocked:

```json
{
"ok": false,
"error": {
"code": "REPORTER_BANNED",
"message": "Bug reporting is disabled for this installation. Contact support if you believe this is a mistake.",
"retryable": false
}
}
```

The Android app displays `error.message` in its existing bug-report error panel. It normalizes
whitespace and limits the public message to 320 characters. It never displays an unstructured HTML
or proxy error body.

Use HTTP `429` and `code: "REPORT_RATE_LIMITED"` for a temporary throttle. Set `retryable` to `true`
and write the retry instruction in `message`.

## OpenAPI 3.1 schema

```yaml
openapi: 3.1.0
info:
title: OpenNOW Android bug reports
version: 1.0.0
paths:
/releases/opennow/bug-reports:
post:
operationId: createOpenNowAndroidBugReport
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- title
- description
- versionName
- versionCode
- platform
- reporterId
- metadata
properties:
title:
type: string
minLength: 1
description:
type: string
minLength: 50
versionName:
type: string
versionCode:
type: string
platform:
type: string
const: android
reporterId:
type: string
pattern: '^br1_[0-9a-f]{64}$'
description: Pseudonymous installation key used for abuse prevention.
metadata:
type: string
contentMediaType: application/json
description: A JSON object serialized as a multipart text field.
files:
type: array
maxItems: 5
items:
type: string
contentMediaType: application/octet-stream
maxLength: 10485760
responses:
'201':
description: Report accepted.
content:
application/json:
schema:
$ref: '#/components/schemas/BugReportAccepted'
'400':
description: Invalid report.
content:
application/json:
schema:
$ref: '#/components/schemas/BugReportRejected'
'403':
description: This reporter is blocked.
content:
application/json:
schema:
$ref: '#/components/schemas/BugReportRejected'
'429':
description: This reporter is temporarily rate-limited.
content:
application/json:
schema:
$ref: '#/components/schemas/BugReportRejected'
components:
schemas:
BugReportAccepted:
type: object
required: [ok, reportId]
properties:
ok:
type: boolean
const: true
reportId:
type: string
BugReportRejected:
type: object
required: [ok, error]
properties:
ok:
type: boolean
const: false
error:
type: object
required: [code, message, retryable]
properties:
code:
type: string
maxLength: 80
message:
type: string
minLength: 1
maxLength: 320
retryable:
type: boolean
```

## Server-side block record

A minimal persistent record can use this shape:

```json
{
"reporterId": "br1_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"enabled": true,
"publicMessage": "Bug reporting is disabled for this installation.",
"internalReason": "Repeated reports without actionable evidence",
"createdAt": "2026-08-05T20:00:00Z",
"expiresAt": null
}
```

Before accepting files, validate `reporterId`, load the enabled non-expired block, and return the
structured `403` response using `publicMessage`. Keep `internalReason` server-only. Store the
`reporterId` beside accepted reports so an administrator can copy it from a report into the block
table. Check the block before persisting attachments to avoid unnecessary storage and processing.
37 changes: 37 additions & 0 deletions android/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# OpenNOW Native Android

This folder is a standalone Android Studio project for the native Kotlin / Jetpack Compose OpenNOW target.

Open it from Android Studio with **File > Open > `OpenNOW/android`**. Android Studio will install/use the required Gradle, Android SDK, CMake, and NDK components from the project configuration.

## Build Targets

- `:app:assembleDebug` builds a debug APK.
- `:app:assembleRelease` builds the direct-distribution release APK with APK update support.
- `:app:bundleRelease` builds the Google Play Android App Bundle. This task removes `REQUEST_INSTALL_PACKAGES` and disables APK self-updates so Play installs use Google Play's update mechanism.

Release and debug builds include `arm64-v8a`, `armeabi-v7a`, and `x86_64`. The `armeabi-v7a` slice supports 32-bit ARM phones and 32-bit Android TV firmware. OpenNOW recommends 720p/30 FPS/12 Mbps for 32-bit processes and memory-constrained TVs, and warns when a custom profile exceeds that recommendation without overriding the user's selection.

## APK Update Manifest

APK and debug builds check `https://api.printedwaste.com/releases/opennow/latest` and can download the returned APK. App Bundle builds installed from Google Play detect `com.android.vending` as the install source and do not check, download, or install APK updates. The manifest should look like this:

```json
{
"versionCode": 7,
"versionName": "0.5.2",
"apkUrl": "https://api.printedwaste.com/release-files/opennow/app-release.apk",
"artifactUrl": "https://api.printedwaste.com/release-files/opennow/app-release.apk",
"sha256": "optional lowercase apk checksum",
"releaseNotes": "Short notes shown in Settings\nSecond line"
}
```

`apkUrl`, `artifactUrl`, or `url` may point at the APK. `releaseNotes` may use real newlines or literal `\n` separators. The app compares `versionCode` against its installed build and asks Android's package installer to confirm the downloaded APK.

## Runtime Notes

- UI is native Compose.
- GFN auth, catalog, subscription, CloudMatch session creation/polling/claim/stop, signaling, and input packet behavior are implemented in Kotlin from the Electron project contracts.
- Streaming uses Android WebRTC plus hardware MediaCodec probing. The bundled `opennow_native` JNI library exposes native runtime diagnostics and keeps the NDK/CMake path wired for media-sensitive code.
- Queue ad metadata is preserved in `SessionInfo`; ad playback can use the included Media3 dependency when the server returns an ad media URL.
Loading
Loading