diff --git a/app/MusicPlayer.jks b/app/MusicPlayer.jks new file mode 100644 index 0000000..792f9cd Binary files /dev/null and b/app/MusicPlayer.jks differ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8d9d4c6..79ebc32 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,7 @@ +import java.util.Date +import java.text.SimpleDateFormat + + plugins { id("com.android.application") // id("org.jetbrains.kotlin.android") @@ -5,6 +9,8 @@ plugins { id("io.objectbox") } +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) + android { namespace = "com.hi.music.player" compileSdk = 34 @@ -16,13 +22,14 @@ android { targetSdk = 34 versionCode = 1 versionName = "1.0.0" - + setProperty("archivesBaseName", "Music Player" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -44,9 +51,9 @@ android { dependencies { implementation("androidx.appcompat:appcompat:1.7.0") - implementation("com.google.android.material:material:1.11.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.activity:activity:1.9.1") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.2.0") + implementation("androidx.activity:activity:1.9.3") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.2.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") @@ -71,7 +78,7 @@ dependencies { implementation ("androidx.palette:palette:1.0.0") //动画 - implementation ("com.airbnb.android:lottie:5.2.0") + implementation ("com.airbnb.android:lottie:6.5.0") //----------media3 implementation("androidx.media3:media3-exoplayer:1.4.1") diff --git a/app/keystore.properties b/app/keystore.properties new file mode 100644 index 0000000..e447842 --- /dev/null +++ b/app/keystore.properties @@ -0,0 +1,6 @@ +app_name=Music Player +package_name=com.hi.music.player.test +keystoreFile=app/MusicPlayer.jks +key_alias=MusicPlayerkey0 +key_store_password=MusicPlayer +key_password=MusicPlayer \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb43..11cd65a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,18 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keep class com.hi.music.player.javabean.A_data.AudioItem { *; } + +# 保持 Context、Intent 和权限相关的公共方法 +-keep class android.content.Context { *; } +-keep class android.content.Intent { *; } +-keep class android.content.pm.PackageManager { *; } +-keep class android.net.Uri { *; } + +-keep class com.google.gson.** { *; } +-keepattributes Signature +-keep class com.google.gson.reflect.TypeToken { *; } +-keep class * extends com.google.gson.reflect.TypeToken +-keepattributes AnnotationDefault,RuntimeVisibleAnnotations diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java index ca26528..0fca300 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_PlayActivity.java @@ -5,10 +5,17 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; +import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; import android.os.Looper; +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicBlur; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -17,7 +24,13 @@ import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.graphics.drawable.DrawableCompat; + import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.hi.music.player.R; import com.hi.music.player.databinding.ActivityAplayBinding; @@ -62,7 +75,7 @@ public class A_PlayActivity extends BaseActivity { // 更新播放按钮状态 private void updatePlayButton(Boolean isPlaying) { if (isPlaying != null) { - vb.playButton.setBackgroundResource(isPlaying ? R.drawable.pause : R.drawable.play); + vb.playButton.setBackgroundResource(isPlaying ? R.drawable.pause_green : R.drawable.play_green); if (isPlaying) { musicService.resumeTimer(); } else { @@ -97,15 +110,68 @@ public class A_PlayActivity extends BaseActivity { Glide.with(this) .load("file:///android_asset/" + audioItem.getImage()) - .placeholder(R.mipmap.default_image) // 默认图片 + .placeholder(R.mipmap.playing_background) // 默认图片 .into(vb.recordImage); // 加载专辑图片 + Glide.with(this) + .asBitmap() + .load("file:///android_asset/" + audioItem.getImage()) + .into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + // 对图片进行高斯模糊处理 + Bitmap blurredBitmap = blurBitmap(A_PlayActivity.this, resource,5); + + // 将模糊后的图片作为背景设置到 vb.topContainer + Drawable blurredDrawable = new BitmapDrawable(getResources(), blurredBitmap); + vb.topContainer.setBackground(blurredDrawable); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + // 可选:处理图片加载被清除的情况 + } + }); + + startMusicService(audioItem); // 启动音乐服务 setupPlayButtonClickListener(); // 设置播放按钮的点击事件 } + + public Bitmap blurBitmap(Context context, Bitmap originalBitmap, int iterations) { + // 创建 RenderScript 对象 + RenderScript renderScript = RenderScript.create(context); + + // 创建 Allocation 对象 + Allocation input = Allocation.createFromBitmap(renderScript, originalBitmap); + Allocation output = Allocation.createTyped(renderScript, input.getType()); + + // 创建模糊脚本对象 + ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); + + // 设置模糊半径 + blurScript.setRadius(25); // 设置最大模糊半径 + + // 执行多次模糊操作 + for (int i = 0; i < iterations; i++) { + blurScript.setInput(input); + blurScript.forEach(output); + // 将结果复制到输入 Allocation + input.copyFrom(output); + } + + // 将模糊后的结果写入到 Bitmap 中 + output.copyTo(originalBitmap); + + renderScript.destroy(); // 释放 RenderScript 对象 + + return originalBitmap; + } + + @Override protected void onInitClick() { vb.songSeekbar.setOnSeekBarChangeListener(new SeekBarListener()); // 设置进度条监听 @@ -166,22 +232,54 @@ public class A_PlayActivity extends BaseActivity { // 切换背景 private void toggleBackground() { isBackground = !isBackground; // 切换背景状态 + + // 根据背景状态设置背景和控件的样式 if (isBackground) { - vb.rootLayout.setBackgroundResource(R.color.dark_music); // 切换为暗色背景 - vb.backButton.setImageResource(R.drawable.arrow_left); - setTextColor(Color.WHITE); // 设置文字颜色为白色 - vb.prevButton.setImageResource(R.drawable.sleep); - vb.repeatButton.setImageResource(R.drawable.timing); + setDarkTheme(); // 暗色主题 } else { - vb.rootLayout.setBackgroundResource(R.color.white); // 切换为亮色背景 - vb.backButton.setImageResource(R.drawable.arrow_left_black); - setTextColor(Color.BLACK); // 设置文字颜色为黑色 - vb.prevButton.setImageResource(R.drawable.light); - vb.repeatButton.setImageResource(R.drawable.timing_drak); + setLightTheme(); // 亮色主题 } + saveBackgroundPreference(); // 保存当前背景状态 } + private void setDarkTheme() { + vb.topContainer.setBackgroundResource(R.mipmap.blur); + vb.bottomContainer.setBackgroundResource(R.color.black); +// vb.recordImage.setBackgroundResource(R.mipmap.playing_background); + setTextColor(Color.WHITE); + vb.prevButton.setImageResource(R.drawable.sleep); + vb.repeatButton.setImageResource(R.drawable.timing); + updateSeekBarColor(Color.WHITE, Color.parseColor("#4DFFFFFF")); + } + + private void setLightTheme() { + vb.topContainer.setBackgroundColor(Color.WHITE); + vb.bottomContainer.setBackgroundColor(Color.WHITE); + vb.backButton.setImageResource(R.drawable.arrow_left_black); +// vb.recordImage.setBackgroundResource(R.mipmap.playing_background_light); + setTextColor(Color.BLACK); + vb.prevButton.setImageResource(R.drawable.light); + vb.repeatButton.setImageResource(R.drawable.timing_drak); + updateSeekBarColor(Color.parseColor("#2680F988"), Color.parseColor("#2680F988")); + } + + private void updateSeekBarColor(int thumbColor, int progressColor) { + Drawable thumbDrawable = vb.songSeekbar.getThumb(); + if (thumbDrawable != null) { + DrawableCompat.setTint(thumbDrawable, thumbColor); + vb.songSeekbar.setThumb(thumbDrawable); + } + + Drawable progressDrawable = vb.songSeekbar.getProgressDrawable(); + if (progressDrawable != null) { + DrawableCompat.setTint(progressDrawable, progressColor); + vb.songSeekbar.setProgressDrawable(progressDrawable); + } + } + + + // 保存背景状态到SharedPreferences private void saveBackgroundPreference() { SharedPreferences sharedPreferences = getSharedPreferences("AppPreferences", MODE_PRIVATE); @@ -231,7 +329,7 @@ public class A_PlayActivity extends BaseActivity { musicService.stopTimer(); time.setText("Timing off"); isTimerOff = true; // 设置标志位为 true - Toast.makeText(getApplicationContext(), "定时关闭已取消", Toast.LENGTH_SHORT).show(); +// Toast.makeText(getApplicationContext(), "定时关闭已取消", Toast.LENGTH_SHORT).show(); } else if (checkedId == R.id.radio10) { duration = 10 * 60 * 1000; // 10分钟 isTimerOff = false; @@ -249,7 +347,7 @@ public class A_PlayActivity extends BaseActivity { isTimerOff = false; } if (duration > 0) { - Toast.makeText(getApplicationContext(), "定时设置为 " + (duration / 60000) + " 分钟", Toast.LENGTH_SHORT).show(); +// Toast.makeText(getApplicationContext(), "定时设置为 " + (duration / 60000) + " 分钟", Toast.LENGTH_SHORT).show(); musicService.startTimer(duration); } diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java index 8094c78..67b8d08 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/A_ImportFragment.java @@ -58,7 +58,7 @@ public class A_ImportFragment extends BaseFragment { adapter = new A_ImportFragmentAdapter(requireContext()); setupRecyclerView(); - observeAudioFiles(); +// observeAudioFiles(); initEvent(); } @@ -138,7 +138,7 @@ public class A_ImportFragment extends BaseFragment { confirm.setOnClickListener(view -> { String newName = inputField.getText().toString(); adapter.updateTitle(position, newName); - Toast.makeText(requireContext(), "新名称: " + newName + ", 项目: " + position, Toast.LENGTH_SHORT).show(); +// Toast.makeText(requireContext(), "新名称: " + newName + ", 项目: " + position, Toast.LENGTH_SHORT).show(); subDialog.dismiss(); }); @@ -149,7 +149,7 @@ public class A_ImportFragment extends BaseFragment { private void deleteAudioFile(int position, String filePath, PopupWindow popupWindow) { viewModel.markAudioAsDeleted(filePath); - Toast.makeText(requireContext(), "删除按钮被点击, 项目: " + position, Toast.LENGTH_SHORT).show(); +// Toast.makeText(requireContext(), "删除按钮被点击, 项目: " + position, Toast.LENGTH_SHORT).show(); popupWindow.dismiss(); } diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMImport.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMImport.java index 01fb1cb..969c998 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMImport.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/viewmodel/A_VMImport.java @@ -1,10 +1,12 @@ package com.hi.music.player.ui.fragmnt.viewmodel; import android.app.Application; -import android.database.Cursor; +import android.content.Context; +import android.content.SharedPreferences; import android.media.MediaMetadataRetriever; import android.net.Uri; -import android.provider.MediaStore; +import android.util.Log; +import android.widget.Toast; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.MutableLiveData; @@ -19,11 +21,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -import android.content.SharedPreferences; -import android.content.Context; -import android.util.Log; -import android.widget.Toast; - public class A_VMImport extends AndroidViewModel { private static final String PREFS_NAME = "audio_files_prefs"; diff --git a/app/src/main/res/drawable/custom_seekbar_progress.xml b/app/src/main/res/drawable/custom_seekbar_progress.xml new file mode 100644 index 0000000..f2ad467 --- /dev/null +++ b/app/src/main/res/drawable/custom_seekbar_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/custom_seekbar_thumb.xml b/app/src/main/res/drawable/custom_seekbar_thumb.xml new file mode 100644 index 0000000..e369d05 --- /dev/null +++ b/app/src/main/res/drawable/custom_seekbar_thumb.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/app/src/main/res/drawable/gradientdrawable.xml b/app/src/main/res/drawable/gradientdrawable.xml new file mode 100644 index 0000000..aadcf07 --- /dev/null +++ b/app/src/main/res/drawable/gradientdrawable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/light.xml b/app/src/main/res/drawable/light.xml index 186b778..2c2a6f8 100644 --- a/app/src/main/res/drawable/light.xml +++ b/app/src/main/res/drawable/light.xml @@ -1,12 +1,9 @@ + android:width="18dp" + android:height="24dp" + android:viewportWidth="18" + android:viewportHeight="24"> - + android:pathData="M8.842,1.659C12.703,1.659 15.776,4.732 15.776,8.592C15.776,11.035 14.436,13.32 12.309,14.58C11.836,14.896 11.521,15.368 11.521,15.92V17.968C11.521,18.047 11.443,18.126 11.364,18.126H6.242C6.164,18.126 6.085,18.047 6.085,17.968V15.92C6.085,15.368 5.77,14.817 5.297,14.58C3.17,13.32 1.83,11.035 1.83,8.592C1.909,4.811 4.982,1.659 8.842,1.659ZM8.842,0.083C4.115,0.083 0.333,3.865 0.333,8.592C0.333,11.744 2.067,14.502 4.588,15.92V17.968C4.588,18.914 5.376,19.701 6.321,19.701H11.443C12.388,19.701 13.176,18.914 13.176,17.968V15.92C15.697,14.423 17.43,11.744 17.43,8.592C17.352,3.865 13.57,0.083 8.842,0.083ZM11.994,23.089H5.691C5.218,23.089 4.903,22.774 4.903,22.302C4.903,21.829 5.218,21.514 5.691,21.514H11.994C12.467,21.514 12.782,21.829 12.782,22.302C12.782,22.774 12.467,23.089 11.994,23.089Z" + android:fillColor="#000000"/> diff --git a/app/src/main/res/drawable/pause_green.xml b/app/src/main/res/drawable/pause_green.xml new file mode 100644 index 0000000..5051914 --- /dev/null +++ b/app/src/main/res/drawable/pause_green.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/drawable/play_green.xml b/app/src/main/res/drawable/play_green.xml new file mode 100644 index 0000000..fabc4bd --- /dev/null +++ b/app/src/main/res/drawable/play_green.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/rounded_dark.xml b/app/src/main/res/drawable/rounded_dark.xml new file mode 100644 index 0000000..cc79da2 --- /dev/null +++ b/app/src/main/res/drawable/rounded_dark.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/rounded_light.xml b/app/src/main/res/drawable/rounded_light.xml new file mode 100644 index 0000000..ca6a66d --- /dev/null +++ b/app/src/main/res/drawable/rounded_light.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_ahome.xml b/app/src/main/res/layout/activity_ahome.xml index b48ba79..4bfc5db 100644 --- a/app/src/main/res/layout/activity_ahome.xml +++ b/app/src/main/res/layout/activity_ahome.xml @@ -5,7 +5,7 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/home_background" + android:background="@mipmap/bg_profile" tools:context=".ui.activity.A_HomeActivity"> - + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/top_container"> - + - + + + + + + + + + - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/top_container" /> - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_asetting.xml b/app/src/main/res/layout/activity_asetting.xml index 1a0c1bb..88a19a2 100644 --- a/app/src/main/res/layout/activity_asetting.xml +++ b/app/src/main/res/layout/activity_asetting.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#001c0e" + android:background="@mipmap/bg_profile" android:orientation="vertical" android:padding="16dp"> @@ -11,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" + android:layout_marginTop="4dp" android:orientation="horizontal"> @@ -140,6 +142,7 @@ android:layout_height="wrap_content" android:clickable="true" android:focusable="true" + android:visibility="gone" android:orientation="horizontal" android:padding="16dp"> @@ -171,6 +174,7 @@ android:clickable="true" android:focusable="true" android:orientation="horizontal" + android:visibility="gone" android:padding="16dp"> @@ -14,6 +15,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:layout_marginTop="4dp" android:padding="16dp"> @@ -25,7 +26,7 @@ android:layout_marginTop="32sp" android:layout_marginEnd="16dp" android:background="@drawable/rounded" - android:padding="5dp" + android:padding="10dp" android:src="@drawable/category" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -45,6 +46,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="127dp" android:src="@drawable/add" + android:layout_marginEnd="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/item_a_import.xml b/app/src/main/res/layout/item_a_import.xml index 394417d..7dc0606 100644 --- a/app/src/main/res/layout/item_a_import.xml +++ b/app/src/main/res/layout/item_a_import.xml @@ -52,8 +52,8 @@