Skip to content

Commit a16ddf3

Browse files
committed
Primary changes towards v0.40
1 parent 20a2b12 commit a16ddf3

61 files changed

Lines changed: 3039 additions & 3328 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/build.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ android {
2727
defaultConfig {
2828
applicationId "com.xapps.media.xmusic"
2929
minSdk 26
30-
targetSdk 36
31-
versionCode 35
32-
versionName "0.35 Alpha"
30+
targetSdk 37
31+
versionCode 40
32+
versionName '0.40 Alpha'
3333
}
3434

3535
buildFeatures {
@@ -120,6 +120,7 @@ dependencies {
120120
implementation libs.transition
121121
implementation libs.fragment
122122
implementation libs.palette
123+
implementation libs.coordinatorlayout
123124

124125
implementation libs.media3.exoplayer
125126
implementation libs.media3.session

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <application android:name=".application.XApplication" android:allowBackup="true" android:requestLegacyExternalStorage="true" android:label="@string/app_name" android:appCategory="audio" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:enableOnBackInvokedCallback="true" android:theme="@style/AppTheme"> <profileable android:shell="true" /> <activity android:name=".activity.MainActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustNothing" android:exported="true"> </activity> <activity android:name=".activity.RootActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustNothing" android:exported="true"> </activity> <activity android:name=".activity.SplashActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/Theme.XMusic.SplashScreen" android:windowSoftInputMode="adjustPan" android:exported="true"> </activity> <activity android:name=".activity.WelcomeActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustPan" android:exported="true"> </activity> <activity android:name=".activity.CrashReportActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustPan" android:exported="false"> </activity> <activity-alias android:name=".LauncherDefault" android:enabled="true" android:exported="true" android:icon="@mipmap/ic_launcher" android:targetActivity=".activity.SplashActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity-alias android:name=".LauncherAlt" android:enabled="false" android:exported="true" android:icon="@mipmap/ic_launcher_alt" android:targetActivity=".activity.SplashActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <service android:name="com.xapps.media.xmusic.service.XPlayerService" android:enabled="true" android:exported="true" android:foregroundServiceType="mediaPlayback"> <intent-filter> <action android:name="androidx.media3.session.MediaSessionService"/> <action android:name="androidx.media3.session.MediaLibraryService" /> <action android:name="android.media.browse.MediaBrowserService"/> </intent-filter> </service> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> <receiver android:name="androidx.media3.session.MediaButtonReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> </application></manifest>
1+
<manifest xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="AllFilesAccessPolicy,ScopedStorage" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <application android:name=".application.XApplication" android:allowBackup="true" android:requestLegacyExternalStorage="true" android:label="@string/app_name" android:appCategory="audio" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true" android:enableOnBackInvokedCallback="true" android:theme="@style/AppTheme"> <profileable android:shell="true" /> <activity android:name=".activity.RootActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/Theme.XMusic.SplashScreen" android:windowSoftInputMode="adjustNothing" android:exported="true"> </activity> <activity android:name=".activity.SplashActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/Theme.XMusic.SplashScreen" android:windowSoftInputMode="adjustPan" android:exported="true"> </activity> <activity android:name=".activity.WelcomeActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustPan" android:exported="true"> </activity> <activity android:name=".activity.CrashReportActivity" android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout" android:hardwareAccelerated="true" android:supportsPictureInPicture="true" android:screenOrientation="portrait" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustPan" android:exported="false"> </activity> <activity-alias android:name=".LauncherDefault" android:enabled="true" android:exported="true" android:icon="@mipmap/ic_launcher" android:targetActivity=".activity.RootActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity-alias android:name=".LauncherAlt" android:enabled="false" android:exported="true" android:icon="@mipmap/ic_launcher_alt" android:targetActivity=".activity.RootActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <service android:name="com.xapps.media.xmusic.service.XPlayerService" android:enabled="true" android:exported="true" android:foregroundServiceType="mediaPlayback"> <intent-filter> <action android:name="androidx.media3.session.MediaSessionService"/> <action android:name="androidx.media3.session.MediaLibraryService" /> <action android:name="android.media.browse.MediaBrowserService"/> </intent-filter> </service> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> <receiver android:name="androidx.media3.session.MediaButtonReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> </application></manifest>

app/src/main/java/com/xapps/media/xmusic/LauncherAlt.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

app/src/main/java/com/xapps/media/xmusic/LauncherDefault.java

Lines changed: 0 additions & 4 deletions
This file was deleted.

app/src/main/java/com/xapps/media/xmusic/activity/RootActivity.java

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import android.content.res.Configuration;
55
import android.graphics.Color;
66
import android.os.*;
7-
import android.os.Trace;
87

98
import androidx.activity.EdgeToEdge;
109
import androidx.activity.SystemBarStyle;
@@ -21,6 +20,7 @@
2120
import com.xapps.media.xmusic.callback.CallbackInterface;
2221
import com.xapps.media.xmusic.common.SongLoadListener;
2322
import com.xapps.media.xmusic.data.DataManager;
23+
import com.xapps.media.xmusic.data.RuntimeData;
2424
import com.xapps.media.xmusic.databinding.ActivityRootBinding;
2525
import com.xapps.media.xmusic.helper.SongMetadataHelper;
2626
import com.xapps.media.xmusic.models.Song;
@@ -36,25 +36,30 @@ public class RootActivity extends BaseActivity implements ActivityCallback {
3636
private LogicManager logicManager;
3737
private MediaController mediaController;
3838

39+
private boolean isReady = true;
40+
3941
@Override
4042
protected void onCreate(Bundle savedInstanceState) {
41-
Trace.beginSection("RA:onCreate");
42-
try {
43-
EdgeToEdge.enable(this,
44-
SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
45-
SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT)
46-
);
47-
XUtils.applyDynamicColors(this, DataManager.isOledThemeEnabled());
48-
if (XUtils.isDarkMode(this) && DataManager.isOledThemeEnabled())getTheme().applyStyle(R.style.ThemeOverlay_XMusic_OLED, true);
49-
MaterialColorUtils.initColors(this);
50-
super.onCreate(savedInstanceState);
51-
binding = ActivityRootBinding.inflate(getLayoutInflater());
52-
passData();
53-
setContentView(binding.getRoot());
54-
init();
55-
} finally {
56-
Trace.endSection();
57-
}
43+
SplashScreen.installSplashScreen(this).setKeepOnScreenCondition(() -> isReady);
44+
new Handler(Looper.getMainLooper()).postDelayed(() -> {
45+
if (!XUtils.areAllPermsGranted(this)) {
46+
startActivity(new Intent(this, WelcomeActivity.class));
47+
finish();
48+
}
49+
isReady = false;
50+
}, savedInstanceState == null? 800 : 1);
51+
EdgeToEdge.enable(this,
52+
SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
53+
SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT)
54+
);
55+
XUtils.applyDynamicColors(this, DataManager.isOledThemeEnabled());
56+
if (XUtils.isDarkMode(this) && DataManager.isOledThemeEnabled())getTheme().applyStyle(R.style.ThemeOverlay_XMusic_OLED, true);
57+
MaterialColorUtils.initColors(this);
58+
super.onCreate(savedInstanceState);
59+
binding = ActivityRootBinding.inflate(getLayoutInflater());
60+
passData();
61+
setContentView(binding.getRoot());
62+
init();
5863
}
5964

6065
@Override
@@ -73,13 +78,8 @@ public void onStart() {
7378

7479
@Override
7580
public void onResume() {
76-
Trace.beginSection("RA:onResume");
77-
try {
78-
super.onResume();
79-
uiManager.updateContent(-1, true);
80-
} finally {
81-
Trace.endSection();
82-
}
81+
super.onResume();
82+
if (!RuntimeData.songs.isEmpty()) uiManager.updateContent(-1, true);
8383
}
8484

8585
@Override
@@ -98,7 +98,7 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
9898
public void onDestroy() {
9999
super.onDestroy();
100100
CallbackInterface.clearActivityCallback(this);
101-
mediaController.release();
101+
if (mediaController != null) mediaController.release();
102102
mediaController = null;
103103
}
104104

@@ -142,12 +142,7 @@ public void updateSongsQueue(ArrayList<Song> songs) {
142142
}
143143

144144
public void restoreStateIfPossible() {
145-
Trace.beginSection("RA:restoreStateIfPossible");
146-
try {
147-
uiManager.maybeRestoreUIState();
148-
} finally {
149-
Trace.endSection();
150-
}
145+
uiManager.maybeRestoreUIState();
151146
}
152147

153148
public void loadSettings() {
@@ -161,12 +156,11 @@ public void onColorsChanged() {
161156

162157
@Override
163158
public void onSongChanged(int position) {
164-
runOnUiThread(
165-
() -> {
166-
uiManager.updateContent(position, false);
167-
});
168-
if (CallbackInterface.mlFrag() != null) CallbackInterface.mlFrag().updateActiveItem(position);
169-
if (CallbackInterface.srFrag() != null) CallbackInterface.srFrag().updateActiveItem(position);
159+
runOnUiThread(() -> {
160+
uiManager.updateContent(position, false);
161+
});
162+
if (CallbackInterface.mlFrag() != null) CallbackInterface.mlFrag().updateActiveItem(position);
163+
if (CallbackInterface.srFrag() != null) CallbackInterface.srFrag().updateActiveItem(position);
170164
}
171165

172166
@Override
@@ -176,11 +170,17 @@ public void onProgressChanged(long progress) {
176170

177171
@Override
178172
public void updateState() {
179-
uiManager.saveState();
173+
runOnUiThread(() -> {
174+
uiManager.saveState();
175+
});
180176
}
181177

182178
@Override
183179
public void passData() {
184180
if (CallbackInterface.subFrag() != null) CallbackInterface.subFrag().onBindingReady(binding);
185181
}
182+
183+
public void updateLyrics() {
184+
uiManager.updateLyrics();
185+
}
186186
}
Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,36 @@
11
package com.xapps.media.xmusic.activity;
22

3+
import android.annotation.SuppressLint;
34
import android.content.Intent;
45
import android.os.Build;
56
import android.os.Bundle;
6-
import android.view.View;
7-
87
import androidx.appcompat.app.AppCompatActivity;
98
import androidx.core.splashscreen.SplashScreen;
10-
import androidx.recyclerview.widget.ConcatAdapter;
11-
import androidx.transition.TransitionManager;
12-
13-
import com.google.android.material.transition.MaterialSharedAxis;
14-
import com.xapps.media.xmusic.activity.MainActivity;
159
import com.xapps.media.xmusic.common.SongLoadListener;
16-
import com.xapps.media.xmusic.data.DataManager;
17-
import com.xapps.media.xmusic.data.RuntimeData;
18-
import com.xapps.media.xmusic.fragment.MusicListFragment;
1910
import com.xapps.media.xmusic.helper.SongMetadataHelper;
20-
import com.xapps.media.xmusic.helper.SongSorter;
2111
import com.xapps.media.xmusic.models.Song;
2212
import com.xapps.media.xmusic.utils.XUtils;
23-
2413
import java.util.ArrayList;
14+
import java.util.concurrent.ExecutorService;
15+
import java.util.concurrent.Executors;
2516

17+
@SuppressLint("CustomSplashScreen")
2618
public class SplashActivity extends AppCompatActivity {
2719
@Override
2820
protected void onCreate(Bundle savedInstanceState) {
29-
super.onCreate(savedInstanceState);
3021
if (Build.VERSION.SDK_INT >= 31) SplashScreen.installSplashScreen(this);
31-
32-
SongMetadataHelper.getAllSongs(this, new SongLoadListener() {
22+
super.onCreate(savedInstanceState);
23+
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
24+
executor.execute(() -> SongMetadataHelper.getAllSongs(this, new SongLoadListener() {
3325
@Override
3426
public void onComplete(ArrayList<Song> list) {
3527
if (!XUtils.areAllPermsGranted(SplashActivity.this)) {
3628
startActivity(new Intent(SplashActivity.this, WelcomeActivity.class));
3729
} else {
3830
startActivity(new Intent(SplashActivity.this, RootActivity.class));
3931
}
32+
finish();
4033
}
41-
});
42-
finish();
34+
}));
4335
}
4436
}

0 commit comments

Comments
 (0)