Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
db454bc
Add Japanese translations
daedaevibin Jun 24, 2026
7e927c0
Add MultiLangRomanizer functions for Thai, Arabic, Greek, Hebrew, and…
daedaevibin Jun 24, 2026
f53d857
Add romanization and language detection for Cyrillic and Vietnamese
daedaevibin Jun 24, 2026
d74f593
Fix 21 pre-existing lint errors
daedaevibin Jun 24, 2026
2580e86
Add new app languages and update locale configuration
daedaevibin Jun 24, 2026
5a90005
Add LYRICS settings category and restructure settings screens
daedaevibin Jun 24, 2026
a88c9a1
Update CI workflows and build config
daedaevibin Jun 24, 2026
4940904
Misc fixes: AI max tokens and lyrics loading priority
daedaevibin Jun 24, 2026
0f4045b
Add ServerUrlUtils, Vietnamese/Traditional Chinese translations, and …
daedaevibin Jun 24, 2026
54dca07
Merge remote-tracking branch 'upstream/master'
daedaevibin Jun 24, 2026
b98c567
chore(deps): bump the github-actions group with 2 updates
dependabot[bot] Jun 24, 2026
dce462d
chore(deps): bump the gradle-dependencies group with 2 updates
dependabot[bot] Jun 24, 2026
2bfbd3b
Merge pull request #45 from Veridian-Zenith/dependabot/github_actions…
daedaevibin Jun 25, 2026
b6b2096
Merge pull request #46 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jun 25, 2026
8607ca0
File cleanup
daedaevibin Jun 25, 2026
ea72d88
chore(deps): bump the gradle-dependencies group across 1 directory wi…
dependabot[bot] Jun 26, 2026
66be53c
perf: defer legacy migrations and non-critical loads out of init hot …
VoidX3D Jun 28, 2026
b4689a6
perf: serialize library data loading to avoid I/O contention on slow …
VoidX3D Jun 28, 2026
37ef4d2
perf: derive isLibraryContentEmpty from in-memory state instead of Ro…
VoidX3D Jun 28, 2026
7b9407d
perf: eliminate loading state flapping during sequential library load
VoidX3D Jun 28, 2026
898f756
perf: add distinctUntilChanged to playerUiState combine collectors
VoidX3D Jun 28, 2026
80fb3bf
feat(ai): add LYRICS prompt type for proper logging of translation re…
VoidX3D Jun 28, 2026
d799cd9
feat(settings): split AI settings into AI Provider tab and Generation…
VoidX3D Jun 28, 2026
08e941e
feat(ai): add SearchableProviderSelector with descriptions and live s…
VoidX3D Jun 28, 2026
b10358a
i18n: add generation parameters strings to all 11 locale files
VoidX3D Jun 28, 2026
5b0444c
cleanup: remove unused hasGeminiApiKey, songCountFlow, and repository…
VoidX3D Jun 28, 2026
273f6d9
fix: add missing LYRICS and GENERATION_PARAMETERS branches in when ex…
VoidX3D Jun 28, 2026
61702e2
fix: add missing @OptIn for ExperimentalMaterial3Api on SearchablePro…
VoidX3D Jun 28, 2026
51209dc
fix: use file-level @OptIn for ExperimentalMaterial3Api in SettingsCo…
VoidX3D Jun 28, 2026
8eac816
Merge pull request #48 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jun 28, 2026
e3e1b19
fix(ai): add live status feedback and fix toast buffer for AI generation
VoidX3D Jun 28, 2026
86422df
fix(wear): add error_prone_annotations dependency for Dagger 2.60 gen…
daedaevibin Jun 28, 2026
c8c06db
fix(search): eliminate tab-switch lag by decoupling from monolithic p…
VoidX3D Jun 28, 2026
b516f83
feat(ai): update all provider names, descriptions, endpoints, and def…
VoidX3D Jun 28, 2026
1d83e43
fix(ai): clean up stale error propagation using ConcurrentHashMap for…
VoidX3D Jun 28, 2026
c0d0614
fix: add missing import for kotlinx.coroutines.flow.first
VoidX3D Jun 28, 2026
fa9f499
fix(ai): update AI client creation to support configurable base URLs …
VoidX3D Jun 28, 2026
2b509c2
fix(ai): strip markdown formatting from lyrics responses and dynamica…
VoidX3D Jun 28, 2026
a10cfe5
chore(deps): bump the gradle-dependencies group with 6 updates
dependabot[bot] Jun 29, 2026
a44b927
Merge pull request #50 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jun 30, 2026
b6517b9
chore(deps): bump the gradle-dependencies group across 1 directory wi…
dependabot[bot] Jul 2, 2026
6071439
Merge VoidX3D PR #2497 into review-pr-2497
daedaevibin Jul 5, 2026
523c8f9
Fix: CJK token scaling, embedded lyrics reading, local .lrc Unicode m…
daedaevibin Jul 5, 2026
1a0361d
fix: suppress NonObservableLocale lint in AiUsage date format
daedaevibin Jul 5, 2026
f774525
fix: lyrics translation cutoff, false already-translated, search dial…
daedaevibin Jul 6, 2026
acd1ce7
Fix #58, #64, #67: Shared AI OkHttpClient, FLAC fallback, provider de…
daedaevibin Jul 6, 2026
2f1df76
Fix compilation: add TimeUnit import, rename httpClient param to client
daedaevibin Jul 6, 2026
4658ca3
Fix compilation errors, Song.id type safety, dead code removal, and c…
daedaevibin Jul 6, 2026
c297256
Add opencode workflow for testing and extra analysis
daedaevibin Jul 7, 2026
ea42498
chore(deps): bump actions/checkout in the github-actions group
dependabot[bot] Jul 7, 2026
8a8b18e
chore(deps): bump the gradle-dependencies group across 1 directory wi…
dependabot[bot] Jul 7, 2026
82ab444
update opencode workflow
daedaevibin Jul 8, 2026
f73beee
Merge pull request #69 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jul 8, 2026
c9b99a0
Merge pull request #70 from Veridian-Zenith/dependabot/github_actions…
daedaevibin Jul 8, 2026
bc1fbf9
Remove opencode yaml
daedaevibin Jul 10, 2026
b786378
chore(deps): bump the gradle-dependencies group across 1 directory wi…
dependabot[bot] Jul 14, 2026
07c0bd5
Merge remote-tracking branch 'upstream/master'
daedaevibin Jul 15, 2026
6e38b63
Merge branch 'master' into dependabot/gradle/gradle-dependencies-5a7a…
daedaevibin Jul 15, 2026
c6c61e7
Merge pull request #73 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jul 15, 2026
c7f5afa
chore(deps): bump androidx.compose.material3:material3
dependabot[bot] Jul 15, 2026
d56e11c
chore: re-add missing aboutlibraries dependency
daedaevibin Jul 15, 2026
57434a9
Merge pull request #74 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jul 15, 2026
6a52fc7
bump the gradle-dependencies group with 4 updates
dependabot[bot] Jul 16, 2026
2b331f7
Merge pull request #75 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jul 17, 2026
4e828c3
fix: move @OptIn(ExperimentalMaterial3Api) to function level to fix r…
daedaevibin Jul 17, 2026
c10f743
chore(deps): bump the gradle-dependencies group across 1 directory wi…
dependabot[bot] Jul 23, 2026
457e6b6
Merge pull request #77 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jul 28, 2026
9ac48f6
feat(i18n): add Japanese, Vietnamese, Traditional Chinese translation…
daedaevibin Jul 28, 2026
24679c4
perf: optimize library loading, player, and data layer
daedaevibin Jul 28, 2026
96e4b67
fix(lyrics): fix translation cutoff, CJK matching, and UI
daedaevibin Jul 28, 2026
ef7c4da
feat(ai): AI overhaul - providers, prompts, settings, romanization
daedaevibin Jul 28, 2026
ffbd810
fix(lint): address pre-existing lint errors and manifest/compilation fix
daedaevibin Jul 28, 2026
8696965
feat(settings): restructure settings, UI improvements
daedaevibin Jul 28, 2026
557030a
chore: ignore message.txt build log output
daedaevibin Jul 28, 2026
0b31a4e
chore(deps): update netty to latest stable 4.2.16.Final
daedaevibin Jul 28, 2026
a0856f2
feat(i18n): complete translations - fix vi, zh-rTW, add missing keys,…
daedaevibin Jul 29, 2026
3e5492d
Merge branch 'feat/i18n'
daedaevibin Jul 29, 2026
350b7d5
Merge branch 'fix/compilation'
daedaevibin Jul 29, 2026
9001186
Merge branch 'fix/lyrics'
daedaevibin Jul 29, 2026
cefe1f7
Merge branch 'feat/settings'
daedaevibin Jul 29, 2026
ec0c584
Merge branch 'master' into feat/ai
daedaevibin Jul 29, 2026
55746f6
fix(ai): fix Ollama config - no API key required, correct default URL
daedaevibin Jul 29, 2026
92987c2
Merge branch 'master' into perf
daedaevibin Jul 29, 2026
cc36421
fix(perf): remove dead code (PlatformUtils.kt), merge master for all …
daedaevibin Jul 29, 2026
1c89619
chore(deps): bump the gradle-dependencies group with 3 updates
dependabot[bot] Jul 29, 2026
faf32a8
Merge pull request #78 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Jul 29, 2026
a26c3f8
chore(deps): bump the github-actions group across 1 directory with 2 …
dependabot[bot] Jul 31, 2026
98bc357
Merge pull request #80 from Veridian-Zenith/dependabot/github_actions…
daedaevibin Aug 1, 2026
9be3422
chore(deps): bump the github-actions group across 1 directory with 2 …
dependabot[bot] Aug 4, 2026
b2447ed
chore(deps): bump the gradle-dependencies group across 1 directory wi…
dependabot[bot] Aug 6, 2026
afa9701
Merge pull request #83 from Veridian-Zenith/dependabot/github_actions…
daedaevibin Aug 8, 2026
917f9d9
Merge pull request #84 from Veridian-Zenith/dependabot/gradle/gradle-…
daedaevibin Aug 8, 2026
ba1b293
chore(deps): bump netty from 4.2.16.Final to 4.2.17.Final
dependabot[bot] Aug 8, 2026
23c23bf
fix(security): remove hardcoded Telegram API key defaults
daedaevibin Aug 8, 2026
a764dd0
Merge branch 'fix/remove-hardcoded-telegram-credentials'
daedaevibin Aug 8, 2026
16aec16
Merge pull request #85 from Veridian-Zenith/dependabot/gradle/netty-4…
daedaevibin Aug 8, 2026
545fd8f
refactor(service): extract PlaybackSnapshotManager and WidgetArtworkR…
daedaevibin Aug 8, 2026
7c02f1b
refactor(service): extract SleepTimerController, HeadsetReconnectMoni…
daedaevibin Aug 8, 2026
62e4de4
refactor(service): extract CountedPlayController from MusicService
daedaevibin Aug 8, 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
25 changes: 11 additions & 14 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,37 +21,34 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Set up JDK 21
uses: actions/setup-java@v5
uses: actions/setup-java@v5.7.0
with:
distribution: 'temurin'
java-version: '21'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
with:
cache-provider: 'enhanced'

- name: Pin Kotlin version for CodeQL compatibility
run: |
# More robust sed pattern that handles various formats
sed -i 's/kotlin = "[^"]*"/kotlin = "2.3.20"/g' gradle/libs.versions.toml

# Verify the change was made
grep 'kotlin = "2.3.20"' gradle/libs.versions.toml


- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
with:
cache-provider: 'enhanced'

- name: Initialize CodeQL
uses: github/codeql-action/init@v4
uses: github/codeql-action/init@v4.37.4
with:
languages: java-kotlin
build-mode: manual

- name: Build with Gradle
run: ${{ github.workspace }}/gradlew :app:assembleDebug :wear:assembleDebug --no-daemon
run: ${{ github.workspace }}/gradlew :app:assembleDebug :wear:assembleDebug --no-daemon --no-build-cache

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
uses: github/codeql-action/analyze@v4.37.4
with:
category: "/language:java-kotlin"
8 changes: 4 additions & 4 deletions .github/workflows/nightly-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,10 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Set up JDK 21
uses: actions/setup-java@v5
uses: actions/setup-java@v5.7.0
with:
distribution: temurin
java-version: '21'
Expand All @@ -98,7 +98,7 @@ jobs:

- name: Cache nightly keystore
id: cache-keystore
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: vz-pixelplay.jks
key: ${{ runner.os }}-nightly-keystore-vz-pixelplay
Expand All @@ -117,7 +117,7 @@ jobs:
echo "keyPassword=994273" >> keystore.properties

- name: Build Phone nightly release APKs
run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true
run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true --no-build-cache

- name: Verify Phone nightly split APKs
run: |
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/phone-debug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Set up JDK 21
uses: actions/setup-java@v5
uses: actions/setup-java@v5.7.0
with:
distribution: temurin
java-version: '21'
Expand All @@ -30,7 +30,7 @@ jobs:
uses: gradle/actions/setup-gradle@v6

- name: Build Phone debug APK
run: gradle :app:assembleDebug -Ppixelplay.enableAbiSplits=true
run: gradle :app:assembleDebug -Ppixelplay.enableAbiSplits=true --no-build-cache

- name: Verify Phone split APKs
run: |
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/phone-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Set up JDK 21
uses: actions/setup-java@v5
uses: actions/setup-java@v5.7.0
with:
distribution: temurin
java-version: '21'
Expand All @@ -31,7 +31,7 @@ jobs:

- name: Cache keystore
id: cache-keystore
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: vz-pixelplay.jks
key: ${{ runner.os }}-keystore-vz-pixelplay
Expand All @@ -52,7 +52,7 @@ jobs:
echo "keyPassword=994273" >> keystore.properties

- name: Build Phone release APK
run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true
run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true --no-build-cache

- name: Verify Phone split APKs
run: |
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/wearos-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Set up JDK 21
uses: actions/setup-java@v5
uses: actions/setup-java@v5.7.0
with:
distribution: temurin
java-version: '21'
Expand All @@ -30,7 +30,7 @@ jobs:
uses: gradle/actions/setup-gradle@v6

- name: Build Wear OS debug APK
run: gradle :wear:assembleDebug
run: gradle :wear:assembleDebug --no-build-cache

- name: Upload Wear OS APK artifact
uses: actions/upload-artifact@v7.0.1
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,4 @@ markdown.xml
**/.env
**/.env.*
!**/.env.example
message.txt
5 changes: 2 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ android {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

val telegramApiId = localProperties.getProperty("TELEGRAM_API_ID")?.ifEmpty { null }
?: "2040"
?: error("TELEGRAM_API_ID not found in local.properties. Add TELEGRAM_API_ID=<your_id> to local.properties.")
val telegramApiHash = localProperties.getProperty("TELEGRAM_API_HASH")?.ifEmpty { null }
?: "b18441a1ff607e10a989891a5462e627"
?: error("TELEGRAM_API_HASH not found in local.properties. Add TELEGRAM_API_HASH=<your_hash> to local.properties.")
buildConfigField("int", "TELEGRAM_API_ID", telegramApiId)
buildConfigField("String", "TELEGRAM_API_HASH", "\"$telegramApiHash\"")
}
Expand Down Expand Up @@ -325,7 +325,6 @@ dependencies {

// UI Utilities & Extra
implementation(libs.timber)
implementation(libs.generativeai)
implementation(libs.smooth.corner.rect.android.compose)
implementation(libs.reorderables)
implementation(libs.codeview)
Expand Down
20 changes: 20 additions & 0 deletions app/lint.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Translation completeness cannot be enforced without native speakers -->
<issue id="MissingTranslation" severity="warning" />
<issue id="ExtraTranslation" severity="warning" />
<issue id="MissingQuantity" severity="warning" />
<issue id="ImpliedQuantity" severity="warning" />

<!-- Intentional use of Material Design 3 internal color APIs for dynamic theme -->
<issue id="RestrictedApi" severity="warning" />

<!-- Media3 APIs marked @UnstableApi are used intentionally throughout -->
<issue id="UnsafeOptInUsageError" severity="warning" />

<!-- Compose resource access via LocalContext.current is accepted pattern -->
<issue id="LocalContextGetResourceValueCall" severity="warning" />

<!-- Missing default resource -- resolved by adding declarations to base values/ -->
<issue id="MissingDefaultResource" severity="error" />
</lint>
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@
<action android:name="com.theveloper.pixelplay.action.OPEN_PLAYER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ class ExternalPlayerActivity : ComponentActivity() {
return intent.data
}

@Suppress("WrongConstant")
private fun persistUriPermissionIfNeeded(intent: Intent, uri: Uri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
val hasPersistablePermission = intent.flags and Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION != 0
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/theveloper/pixelplay/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import android.content.Context
import android.content.ComponentName
import android.content.Intent
import android.os.Build
import androidx.annotation.RequiresApi
import android.graphics.RenderEffect as AndroidRenderEffect
import android.graphics.Shader as AndroidShader
import androidx.compose.ui.graphics.asComposeRenderEffect
Expand Down Expand Up @@ -944,6 +945,7 @@ class MainActivity : ComponentActivity() {
val expansionFractionProvider = remember(playerViewModel.playerContentExpansionFraction) {
{ playerViewModel.playerContentExpansionFraction.value }
}
@Suppress("NewApi")
val blurEffectCache = remember { BlurEffectCache() }

Box(
Expand Down Expand Up @@ -1153,10 +1155,12 @@ class MainActivity : ComponentActivity() {
* blur every animation frame. The radius is quantized at the call site, so this
* only rebuilds ~25 times across the whole expand animation instead of 60+/sec.
*/
@RequiresApi(Build.VERSION_CODES.S)
private class BlurEffectCache {
private var lastRadiusPx: Float = Float.NaN
private var cached: androidx.compose.ui.graphics.RenderEffect? = null

@RequiresApi(Build.VERSION_CODES.S)
fun get(radiusPx: Float): androidx.compose.ui.graphics.RenderEffect? {
if (radiusPx <= 0f) {
lastRadiusPx = 0f
Expand Down
Loading
Loading