Skip to content

Commit 605e68a

Browse files
committed
• Added an initial implementation of searchFragment, supports searching by name, artist, album, or album artist
• Added an option in settings to switch app icon style (non-dynamic one only) • Added a small info Pill in PlayerUI to display song mimeType, Sample Rate and Bitrate • Added an option in settings to make PlayerUI screen to use app colors instead of song cover's • Added a refresh ability to refresh songs list without restarting the app (uses SwipeRefreshLayout) • Added a new SplashScreen Animation • Fixed a lot of bugs and crashes, especially the ones related to Lyrics • Fully rebased LyricView to use Canvas and ScrollingView2 (by @nift4) instead of RecyclerView and TextView • Made Colors Interpolation on song switch much smoother • Added a shuffle button in notification • now notification buttons state is saved across app launches • Fixed issues with FAB positioning • Now telegram APKs will use preview flavor for better performance and faster app launches • A lot more! check GitHub commits for more! 👀
1 parent c545e0a commit 605e68a

100 files changed

Lines changed: 7218 additions & 1156 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.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
name: Bug report
3+
about: Report a bug in the app
4+
title: "[Bug] "
5+
labels: bug
6+
---
7+
8+
## Bug report
9+
10+
**• Summary : **
11+
[Short and clear description of the issue.]
12+
13+
## Device Info:
14+
15+
**• Device name : **
16+
**• Current OS :** [Specify which QPR if it's PixelUI or a Custom ROM)]
17+
18+
## App info:
19+
20+
**• App version :** [Version code] | [Version Name]
21+
**• Build type :** [debug / release/ preview]
22+
23+
**• Steps to reproduce :**
24+
1.
25+
2.
26+
3.
27+
4.
28+
29+
**• Expected behavior :**
30+
[What should have happened?]
31+
32+
**• Actual behavior :**
33+
[What actually happens?]
34+
35+
**• Frequency :**
36+
[Always / Often / Sometimes / Once]
37+
38+
**• Screenshots / screen recording : **
39+
[Attaching a screenshot / screen record regarding the issue is highly appreciated]
40+
41+
**• Logs / crash report :**
42+
[Paste logs here if available]
43+
44+
**• Additional context :**
45+
[Anything else that helps understand or reproduce the issue]
46+
47+
(Optional but recommended)
48+
**• Severity :**
49+
[Low / Medium / High / Critical]
50+
51+
## Checklist (required)
52+
[ ] This report describes one issue only
53+
[ ] I have searched existing issues and confirmed this is not a duplicate
54+
[ ] I filled out the template properly
55+
[ ] I understand that issues not following this format may be closed without discussion
56+
[ ] I understand that low-effort or vague reports may be closed

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Questions or support
4+
url: https://t.me/yourlink
5+
about: Ask questions here. Issues are for bugs only.

.github/workflows/main.yml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ jobs:
5858
- name: Validate Gradle wrapper
5959
uses: gradle/actions/wrapper-validation@v4
6060

61-
- name: Build both ABIs
61+
- name: Build Preview build for both ABIs
6262
if: github.event_name != 'pull_request'
6363
run: | # Use the pipe for multi-line commands
64-
./gradlew assembleDebug \
64+
./gradlew assemblePreview \
6565
-DLOG_CHAT_ID="${{ secrets.LOG_CHAT_ID }}" \
6666
-DTG_BOT_TOKEN="${{ secrets.BOT_TOKEN }}" \
6767
-DTG_CHAT_ID="${{ secrets.CHAT_ID }}" \
@@ -74,37 +74,37 @@ jobs:
7474
- name: Rename APKs with commit hash
7575
run: |
7676
HASH=${GITHUB_SHA::8}
77-
mv app/build/outputs/apk/debug/debug-arm64-v8a.apk app/build/outputs/apk/debug/debug-arm64-v8a-${HASH}.apk
78-
mv app/build/outputs/apk/debug/debug-armeabi-v7a.apk app/build/outputs/apk/debug/debug-armeabi-v7a-${HASH}.apk
77+
mv app/build/outputs/apk/debug/preview-arm64-v8a.apk app/build/outputs/apk/debug/preview-arm64-v8a-${HASH}.apk
78+
mv app/build/outputs/apk/debug/preview-armeabi-v7a.apk app/build/outputs/apk/debug/preview-armeabi-v7a-${HASH}.apk
7979
80-
- name: Upload debug arm64 apk
80+
- name: Upload preview arm64 apk
8181
uses: actions/upload-artifact@v4
8282
with:
83-
name: debug-arm64
84-
path: app/build/outputs/apk/debug/debug-arm64-v8a-*.apk
83+
name: preview-arm64
84+
path: app/build/outputs/apk/preview/preview-arm64-v8a-*.apk
8585

86-
- name: Upload debug armeabi apk
86+
- name: Upload preview armeabi apk
8787
uses: actions/upload-artifact@v4
8888
with:
89-
name: debug-armeabi
90-
path: app/build/outputs/apk/debug/debug-armeabi-v7a-*.apk
89+
name: preview-armeabi
90+
path: app/build/outputs/apk/preview/preview-armeabi-v7a-*.apk
9191

9292
send_debug_apks:
93-
name: Send Debug APKs
93+
name: Send Preview APKs
9494
runs-on: ubuntu-latest
95-
needs: build_debug_apk
95+
needs: build_preview_apk
9696
environment: Release
9797
steps:
9898
- name: Download arm64 apk
9999
uses: actions/download-artifact@v4
100100
with:
101-
name: debug-arm64
101+
name: preview-arm64
102102
path: .
103103

104104
- name: Download armeabi apk
105105
uses: actions/download-artifact@v4
106106
with:
107-
name: debug-armeabi
107+
name: preview-armeabi
108108
path: .
109109

110110
- name: Send arm64 APK to Telegram
@@ -115,7 +115,7 @@ jobs:
115115
curl -X POST "https://api.telegram.org/bot${{ secrets.BOT_TOKEN }}/sendDocument" \
116116
-F chat_id="${{ secrets.CHAT_ID }}" \
117117
-F message_thread_id="4" \
118-
-F document=@"debug-arm64-v8a-${HASH}.apk" \
118+
-F document=@"preview-arm64-v8a-${HASH}.apk" \
119119
-F caption="arm64-v8a Build"
120120
121121
- name: Send armeabi APK to Telegram
@@ -126,5 +126,5 @@ jobs:
126126
curl -X POST "https://api.telegram.org/bot${{ secrets.BOT_TOKEN }}/sendDocument" \
127127
-F chat_id="${{ secrets.CHAT_ID }}" \
128128
-F message_thread_id="4" \
129-
-F document=@"debug-armeabi-v7a-${HASH}.apk" \
129+
-F document=@"preview-armeabi-v7a-${HASH}.apk" \
130130
-F caption="armeabi-v7a Build"

app/build.gradle

Lines changed: 73 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,15 @@ plugins {
33
}
44

55
android {
6+
namespace "com.xapps.media.xmusic"
67
compileSdk 36
78

8-
99
defaultConfig {
1010
applicationId "com.xapps.media.xmusic"
11-
namespace "com.xapps.media.xmusic"
12-
minSdkVersion 26
13-
targetSdkVersion 36
14-
versionCode 22
15-
versionName "0.22 Alpha"
16-
17-
android.buildFeatures.buildConfig true
11+
minSdk 26
12+
targetSdk 36
13+
versionCode 24
14+
versionName "0.24 Alpha"
1815

1916
def localProps = new Properties()
2017
def localPropsFile = rootProject.file("local.properties")
@@ -33,6 +30,19 @@ android {
3330
buildConfigField "String", "LOG_CHAT_ID", "\"${getSecret('LOG_CHAT_ID')}\""
3431
}
3532

33+
buildFeatures {
34+
viewBinding true
35+
// compose true
36+
buildConfig true
37+
}
38+
39+
40+
41+
compileOptions {
42+
sourceCompatibility JavaVersion.VERSION_17
43+
targetCompatibility JavaVersion.VERSION_17
44+
}
45+
3646
signingConfigs {
3747
def localProps = new Properties()
3848
def localPropsFile = rootProject.file("local.properties")
@@ -49,46 +59,20 @@ android {
4959
release {
5060
def base64Key = getSecret("KEYSTORE_BASE64")
5161
def tmpFile = file("$buildDir/tmp_keystore.jks")
52-
if (base64Key) {
53-
tmpFile.parentFile.mkdirs()
54-
tmpFile.bytes = Base64.decoder.decode(base64Key)
55-
storeFile = tmpFile
56-
} else {
57-
throw new GradleException("KEYSTORE_BASE64 is missing.")
58-
}
62+
tmpFile.parentFile.mkdirs()
63+
tmpFile.bytes = Base64.decoder.decode(base64Key)
64+
storeFile tmpFile
5965
storePassword getSecret("KEYSTORE_PASSWORD")
6066
keyAlias getSecret("KEY_ALIAS")
6167
keyPassword getSecret("ALIAS_PASSWORD")
6268
}
63-
69+
6470
debug {
65-
def base64Key = getSecret("KEYSTORE_BASE64")
66-
def tmpFile = file("$buildDir/tmp_keystore.jks")
67-
if (base64Key) {
68-
tmpFile.parentFile.mkdirs()
69-
tmpFile.bytes = Base64.decoder.decode(base64Key)
70-
storeFile = tmpFile
71-
} else {
72-
throw new GradleException("KEYSTORE_BASE64 is missing.")
73-
}
74-
storePassword getSecret("KEYSTORE_PASSWORD")
75-
keyAlias getSecret("KEY_ALIAS")
76-
keyPassword getSecret("ALIAS_PASSWORD")
71+
initWith release
7772
}
78-
73+
7974
preview {
80-
def base64Key = getSecret("KEYSTORE_BASE64")
81-
def tmpFile = file("$buildDir/tmp_keystore.jks")
82-
if (base64Key) {
83-
tmpFile.parentFile.mkdirs()
84-
tmpFile.bytes = Base64.decoder.decode(base64Key)
85-
storeFile = tmpFile
86-
} else {
87-
throw new GradleException("KEYSTORE_BASE64 is missing.")
88-
}
89-
storePassword getSecret("KEYSTORE_PASSWORD")
90-
keyAlias getSecret("KEY_ALIAS")
91-
keyPassword getSecret("ALIAS_PASSWORD")
75+
initWith release
9276
}
9377
}
9478

@@ -97,46 +81,32 @@ android {
9781
debuggable true
9882
minifyEnabled false
9983
shrinkResources false
84+
signingConfig signingConfigs.debug
10085
}
10186

10287
preview {
103-
initWith release
10488
debuggable false
10589
minifyEnabled false
10690
shrinkResources false
10791
signingConfig signingConfigs.preview
10892
}
10993

11094
release {
111-
signingConfig signingConfigs.release
11295
debuggable false
11396
minifyEnabled true
11497
shrinkResources true
115-
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
98+
signingConfig signingConfigs.release
99+
//proguardFiles
100+
// getDefaultProguardFile("proguard-android-optimize.txt"),
101+
// "proguard-rules.pro"
116102
}
117103
}
118104

119-
lintOptions {
120-
checkReleaseBuilds false
105+
lint {
121106
abortOnError false
107+
checkReleaseBuilds false
122108
}
123109

124-
buildFeatures {
125-
viewBinding true
126-
}
127-
128-
compileOptions {
129-
sourceCompatibility JavaVersion.VERSION_17
130-
targetCompatibility JavaVersion.VERSION_17
131-
}
132-
133-
/*tasks.withType(JavaCompile).configureEach {
134-
options.compilerArgs += [
135-
"-Xlint:deprecation",
136-
"-Xlint:unchecked"
137-
]
138-
}*/
139-
140110
splits {
141111
abi {
142112
enable true
@@ -158,35 +128,49 @@ android {
158128

159129
repositories {
160130
flatDir {
161-
dirs 'libs'
131+
dirs "libs"
162132
}
163133
}
164134

165135
dependencies {
166-
implementation 'com.github.bumptech.glide:glide:5.0.3'
167-
implementation 'com.google.code.gson:gson:2.13.1'
168-
implementation 'com.google.android.material:material:1.14.0-alpha06'
169-
implementation 'androidx.transition:transition:1.6.0'
170-
implementation 'androidx.fragment:fragment:1.8.9'
171-
implementation 'androidx.palette:palette:1.0.0'
172-
implementation 'androidx.media3:media3-common:1.8.0'
173-
implementation 'androidx.media3:media3-exoplayer:1.8.0'
174-
implementation 'androidx.media3:media3-session:1.8.0'
175-
implementation 'androidx.core:core-splashscreen:1.2.0'
176-
implementation 'androidx.activity:activity:1.11.0'
177-
implementation 'androidx.media:media:1.7.1'
178-
implementation 'androidx.customview:customview-poolingcontainer:1.0.0'
179-
implementation 'androidx.recyclerview:recyclerview:1.4.0'
180-
implementation 'androidx.lifecycle:lifecycle-process:2.10.0'
181-
implementation 'org.jellyfin.media3:media3-ffmpeg-decoder:1.8.0+1'
182-
implementation 'com.github.rtugeek:colorseekbar:2.0.3'
183-
implementation 'androidx.graphics:graphics-shapes:1.1.0'
184-
implementation 'androidx.preference:preference:1.2.1'
185-
implementation 'io.github.chayanforyou:marquee:1.0.0'
186-
implementation 'com.github.Adonai:jaudiotagger:2.3.14'
187-
implementation 'com.airbnb.android:lottie:6.7.1'
188-
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0'
189-
implementation(name: 'fastscroller', ext: 'aar')
190-
implementation(name: 'roundedimageview', ext: 'aar')
191-
implementation project(':vumeterlibrary')
136+
137+
// =======================
138+
// Compose
139+
// =======================
140+
// implementation platform("androidx.compose:compose-bom:2026.01.01")
141+
// implementation "androidx.compose.ui:ui"
142+
// implementation "androidx.compose.material3:material3"
143+
// implementation "androidx.activity:activity-compose"
144+
// implementation 'com.tencent:mmkv-static:1.3.5'
145+
// implementation "com.github.FunnySaltyFish.ComposeDataSaver:data-saver:1.1.9"
146+
147+
implementation "com.github.bumptech.glide:glide:5.0.3"
148+
implementation "com.google.code.gson:gson:2.13.1"
149+
implementation "com.google.android.material:material:1.14.0-alpha06"
150+
implementation "androidx.transition:transition:1.6.0"
151+
implementation "androidx.fragment:fragment:1.8.9"
152+
implementation "androidx.palette:palette:1.0.0"
153+
154+
implementation "androidx.media3:media3-common:1.8.0"
155+
implementation "androidx.media3:media3-exoplayer:1.8.0"
156+
implementation "androidx.media3:media3-session:1.8.0"
157+
158+
implementation "androidx.core:core-splashscreen:1.2.0"
159+
implementation "androidx.activity:activity:1.11.0"
160+
implementation "androidx.media:media:1.7.1"
161+
implementation "androidx.customview:customview-poolingcontainer:1.0.0"
162+
implementation "androidx.recyclerview:recyclerview:1.4.0"
163+
implementation "androidx.lifecycle:lifecycle-process:2.10.0"
164+
165+
implementation "org.jellyfin.media3:media3-ffmpeg-decoder:1.8.0+1"
166+
implementation "com.github.rtugeek:colorseekbar:2.0.3"
167+
implementation "androidx.graphics:graphics-shapes:1.1.0"
168+
implementation "androidx.preference:preference:1.2.1"
169+
implementation "io.github.chayanforyou:marquee:1.0.0"
170+
implementation "com.github.Adonai:jaudiotagger:2.3.14"
171+
implementation "com.airbnb.android:lottie:6.7.1"
172+
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0"
173+
174+
implementation(name: "fastscroller", ext: "aar")
175+
implementation(name: "roundedimageview", ext: "aar")
192176
}

0 commit comments

Comments
 (0)