diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ddbf027..c04e3c3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,7 +11,7 @@ android { } defaultConfig { - applicationId = "com.sound.prankparty.test" + applicationId = "com.sound.prankparty" minSdk = 23 targetSdk = 34 versionCode = 1 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b78b330..3755472 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,13 +38,13 @@ - + android:exported="false" /> + diff --git a/app/src/main/java/com/sound/prankparty/Activity/NewRecordActivity.java b/app/src/main/java/com/sound/prankparty/Activity/NewRecordActivity.java index cd01ece..4b9b3fc 100644 --- a/app/src/main/java/com/sound/prankparty/Activity/NewRecordActivity.java +++ b/app/src/main/java/com/sound/prankparty/Activity/NewRecordActivity.java @@ -80,7 +80,7 @@ public class NewRecordActivity extends AppCompatActivity { toggleRecording(); } else { // 权限被拒绝,通知用户 - Toast.makeText(this, "录音权限被拒绝,请在设置中启用权限", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "The recording permission is denied. Enable the permission in the Settings", Toast.LENGTH_SHORT).show(); } } } diff --git a/app/src/main/java/com/sound/prankparty/Activity/SaveRecordActivity.java b/app/src/main/java/com/sound/prankparty/Activity/SaveRecordActivity.java index c31acfd..1078f59 100644 --- a/app/src/main/java/com/sound/prankparty/Activity/SaveRecordActivity.java +++ b/app/src/main/java/com/sound/prankparty/Activity/SaveRecordActivity.java @@ -40,6 +40,8 @@ public class SaveRecordActivity extends AppCompatActivity { private AppDatabase appDatabase; private SaveSoundsDao saveSoundsDao; private int duration; + // 添加一个布尔变量来标记是否保存 + private boolean isSaved = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -51,10 +53,20 @@ public class SaveRecordActivity extends AppCompatActivity { // 获取传递过来的录音文件路径 audioFilePath = getIntent().getStringExtra("audioFilePath"); if (audioFilePath == null) { - Toast.makeText(this, "音频文件路径无效", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "The audio file path is invalid", Toast.LENGTH_SHORT).show(); return; } - Log.d("SaveRecordActivity", audioFilePath); + + // 检查文件是否存在 + File audioFile = new File(audioFilePath); + if (!audioFile.exists()) { + Toast.makeText(this, "Audio file does not exist", Toast.LENGTH_SHORT).show(); + Log.e("SaveRecordActivity", "Audio file does not exist at path: " + audioFilePath); + finish(); // 结束活动 + return; + } + + Log.d("SaveRecordActivity", "Audio file path: " + audioFilePath); // 初始化数据库和 DAO appDatabase = AppDatabase.getDatabase(this); @@ -101,7 +113,7 @@ public class SaveRecordActivity extends AppCompatActivity { inputText = binding.saveRecordName.getText().toString(); //检测是否输入为空字符串 if (inputText.trim().isEmpty()) { - Toast.makeText(getApplicationContext(), "名称不能为空", Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), "The name cannot be empty", Toast.LENGTH_SHORT).show(); return; } @@ -110,6 +122,9 @@ public class SaveRecordActivity extends AppCompatActivity { new Thread(() -> { saveSoundsDao.insertSound(new SaveSounds(inputText, audioFilePath, datePart, timePart, formatTime(duration))); + // 设置isSaved为true,表示文件已保存 + isSaved = true; + runOnUiThread(() -> { Intent intent = new Intent(SaveRecordActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); @@ -130,9 +145,17 @@ public class SaveRecordActivity extends AppCompatActivity { File file = new File(audioFilePath); if (file.exists()) { boolean deleted = file.delete(); + if (deleted) { + Log.d("SaveRecordActivity", "Deleted audio file: " + audioFilePath); + } else { + Log.e("SaveRecordActivity", "Failed to delete audio file: " + audioFilePath); + } + } else { + Log.e("SaveRecordActivity", "Audio file does not exist, cannot delete: " + audioFilePath); } } + private void clearFocusFromAllChildren(ViewGroup parent) { for (int i = 0; i < parent.getChildCount(); i++) { View child = parent.getChildAt(i); @@ -150,6 +173,7 @@ public class SaveRecordActivity extends AppCompatActivity { private void displayAudioDuration() { if (audioFilePath != null) { + Log.d("SaveRecordActivity", "Attempting to display audio duration for: " + audioFilePath); mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(audioFilePath); @@ -157,41 +181,49 @@ public class SaveRecordActivity extends AppCompatActivity { duration = mediaPlayer.getDuration(); binding.saveRecordTime.setText(formatTime(duration)); + Log.d("SaveRecordActivity", "Audio duration: " + formatTime(duration)); } catch (IOException e) { e.printStackTrace(); - Toast.makeText(this, "无法加载音频", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Unable to load audio", Toast.LENGTH_SHORT).show(); + Log.e("SaveRecordActivity", "IOException: " + e.getMessage()); } } else { - Toast.makeText(this, "音频文件路径无效", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "The audio file path is invalid", Toast.LENGTH_SHORT).show(); } } + private void playOrPauseAudio() { if (isPlaying) { mediaPlayer.pause(); binding.saveRecordPlay.setImageResource(R.drawable.playback); // 更新按钮为播放图标 isPlaying = false; + Log.d("SaveRecordActivity", "Audio paused."); } else { if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(audioFilePath); mediaPlayer.prepare(); + Log.d("SaveRecordActivity", "Prepared media player for audio file: " + audioFilePath); } catch (IOException e) { e.printStackTrace(); - Toast.makeText(this, "无法播放音频", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Unable to play audio", Toast.LENGTH_SHORT).show(); + Log.e("SaveRecordActivity", "IOException: " + e.getMessage()); return; } } mediaPlayer.start(); binding.saveRecordPlay.setImageResource(R.drawable.pause); // 更新按钮为暂停图标 isPlaying = true; + Log.d("SaveRecordActivity", "Audio started playing."); mediaPlayer.setOnCompletionListener(mp -> { - Toast.makeText(this, "播放完成", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Play completed", Toast.LENGTH_SHORT).show(); binding.saveRecordPlay.setImageResource(R.drawable.playback); // 恢复播放图标 isPlaying = false; + Log.d("SaveRecordActivity", "Audio playback completed."); }); } } @@ -206,7 +238,10 @@ public class SaveRecordActivity extends AppCompatActivity { mediaPlayer.release(); mediaPlayer = null; } - deleteRecordingFile(); +// 检查isSaved标志,如果为false则删除文件 + if (!isSaved) { + deleteRecordingFile(); + } } @SuppressLint("DefaultLocale") diff --git a/app/src/main/java/com/sound/prankparty/Adapter/SoundRecyclerViewAdapter.java b/app/src/main/java/com/sound/prankparty/Adapter/SoundRecyclerViewAdapter.java index 71247d1..50844bc 100644 --- a/app/src/main/java/com/sound/prankparty/Adapter/SoundRecyclerViewAdapter.java +++ b/app/src/main/java/com/sound/prankparty/Adapter/SoundRecyclerViewAdapter.java @@ -76,26 +76,23 @@ public class SoundRecyclerViewAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(context, AirHornActivity.class); - intent.putExtra("color", currentColor); // 添加颜色值到 Intent - intent.putExtra("123",category); - context.startActivity(intent); - }); - } + holder.imageView.setOnClickListener(v -> { + Intent intent = new Intent(context, AirHornActivity.class); + intent.putExtra("color", currentColor); // 添加颜色值到 Intent + intent.putExtra("123",category); + context.startActivity(intent); + }); } diff --git a/app/src/main/java/com/sound/prankparty/Application/MainApplication.java b/app/src/main/java/com/sound/prankparty/Application/MainApplication.java deleted file mode 100644 index 9bc0508..0000000 --- a/app/src/main/java/com/sound/prankparty/Application/MainApplication.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sound.prankparty.Application; - -import android.app.Application; -import android.content.Context; - -public class MainApplication extends Application { - /** - * 全局的上下文 - */ - private static Context mContext; - - @Override - public void onCreate() { - super.onCreate(); - //获取应用的上下文并赋值给 mContext - mContext = getApplicationContext(); - } - - /** - * 获取context - * @return - */ - public static Context getContext(){ - return mContext; - } - - //重写 onLowMemory 方法,在系统内存不足时调用。这里只是调用了父类的 onLowMemory 方法,没有做其他处理 - @Override - public void onLowMemory() { - super.onLowMemory(); - } - -} diff --git a/app/src/main/java/com/sound/prankparty/FirstFragment/AirHornActivity.java b/app/src/main/java/com/sound/prankparty/FirstFragment/AirHornActivity.java deleted file mode 100644 index 8b4d3bc..0000000 --- a/app/src/main/java/com/sound/prankparty/FirstFragment/AirHornActivity.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sound.prankparty.FirstFragment; - -import android.os.Bundle; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.sound.prankparty.JSON.Category; -import com.sound.prankparty.JSON.SoundItem; -import com.sound.prankparty.R; -import com.sound.prankparty.Utils.ItemDecoration; - -import java.util.List; - -public class AirHornActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_airhonr); - - RecyclerView recyclerView = findViewById(R.id.air_horn_recyclerview); - recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); - - // 接收传递的 List 对象 - Category categories = (Category) getIntent().getSerializableExtra("123"); - - if (categories == null) { - // 处理 categories 为 null 的情况 - return; - } - List soundItemList = categories.getSoundItemList(); - - recyclerView.setAdapter(new AirHornRecyclerViewAdapter(this, soundItemList)); - - // 为 RecyclerView 添加自定义的间距装饰。 - ItemDecoration itemDecoration = new ItemDecoration(16, 19, 10); - recyclerView.addItemDecoration(itemDecoration); - - } -} diff --git a/app/src/main/java/com/sound/prankparty/FirstFragment/AirHornRecyclerViewAdapter.java b/app/src/main/java/com/sound/prankparty/FirstFragment/AirHornRecyclerViewAdapter.java deleted file mode 100644 index 49618d0..0000000 --- a/app/src/main/java/com/sound/prankparty/FirstFragment/AirHornRecyclerViewAdapter.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.sound.prankparty.FirstFragment; - -import android.content.Context; -import android.content.Intent; -import android.graphics.Typeface; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.resource.bitmap.CenterCrop; -import com.sound.prankparty.Application.MainApplication; -import com.sound.prankparty.JSON.SoundItem; -import com.sound.prankparty.R; - -import java.util.List; - -public class AirHornRecyclerViewAdapter extends RecyclerView.Adapter { - - private Context context; - private List soundItemList; - - public AirHornRecyclerViewAdapter(Context context, List soundItemList) { - this.context = context; - this.soundItemList = soundItemList; - } - - @NonNull - @Override - public AirhonrViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sound, parent, false); - return new AirHornRecyclerViewAdapter.AirhonrViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull AirhonrViewHolder holder, int position) { - - SoundItem soundItem = soundItemList.get(position); - - String originalName = soundItem.getTitle(); - // 检查名称是否为空,以避免空指针异常 - if (originalName != null && !originalName.isEmpty()) { -// // 将首字母大写 -// String capitalizedName = originalName.substring(0, 1).toUpperCase() + originalName.substring(1); - // 设置文本字体 - holder.textView.setTypeface(Typeface.createFromAsset(context.getAssets(), "FrancoisOne-Regular.ttf")); - //设置文本 - holder.textView.setText(originalName); - } else { - // 如果名称为空,可以设置一个默认值或者不设置 - holder.textView.setText(""); - } - - if (soundItem != null) { - Glide.with(MainApplication.getContext()) - //指定加载的资源类型为Drawable - .asDrawable() - //设置跳过内存缓存,即加载的图片不会存储在内存缓存中 - .skipMemoryCache(true) - //设置磁盘缓存策略为DiskCacheStrategy.ALL,即缓存原始图片和转换后的图片 - .diskCacheStrategy(DiskCacheStrategy.ALL) - .load(soundItem.getPreUrl()) - .transform(new CenterCrop()) - .into(holder.imageView); - - holder.imageView.setOnClickListener(v -> { - Intent intent = new Intent(context, PlaySoundActivity.class); - intent.putExtra("1234", soundItem); - context.startActivity(intent); - }); - } - - } - - @Override - public int getItemCount() { - return soundItemList.size(); - } - - static class AirhonrViewHolder extends RecyclerView.ViewHolder { - - ImageView imageView; - TextView textView; - - public AirhonrViewHolder(@NonNull View itemView) { - super(itemView); - imageView = itemView.findViewById(R.id.item_imageview_sound); - textView = itemView.findViewById(R.id.item_textview_sound); - } - } - -} diff --git a/app/src/main/java/com/sound/prankparty/FirstFragment/PlaySoundActivity.java b/app/src/main/java/com/sound/prankparty/FirstFragment/PlaySoundActivity.java deleted file mode 100644 index a09d1dc..0000000 --- a/app/src/main/java/com/sound/prankparty/FirstFragment/PlaySoundActivity.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.sound.prankparty.FirstFragment; - -import android.content.Context; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.os.Bundle; -import android.view.View; -import android.widget.ImageView; -import android.widget.SeekBar; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.resource.bitmap.CenterCrop; -import com.sound.prankparty.Application.MainApplication; -import com.sound.prankparty.JSON.SoundItem; -import com.sound.prankparty.R; -import com.sound.prankparty.Room.AppDatabase; -import com.sound.prankparty.Room.FavoriteSounds; -import com.sound.prankparty.Room.FavoriteSoundsDao; - -import java.io.IOException; - -public class PlaySoundActivity extends AppCompatActivity { - - private MediaPlayer mediaPlayer; - private ImageView playBack; - private SoundItem soundItemList; - private ImageView imageView; - private SeekBar seekBar; - private AudioManager audioManager; - private boolean isPlaying = false; // 默认未播放 - private ImageView loop; - private boolean isLooping = false; // 默认不循环 - private TextView textView; - private AppDatabase appDatabase; - private FavoriteSoundsDao favoriteSoundsDao; - private ImageView favorite; - private boolean isFavorite = false; //默认不收藏 - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_play_sound); - - // 获取音频管理器 - audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); - - // 获取控件实例 - imageView = findViewById(R.id.image); - playBack = findViewById(R.id.playback); - seekBar = findViewById(R.id.progress); - loop = findViewById(R.id.loop); - textView = findViewById(R.id.text); - favorite = findViewById(R.id.favorite); - - appDatabase = AppDatabase.getDatabase(this); - favoriteSoundsDao = appDatabase.favoriteSoundsDao(); - - // 接收传递的 SoundItem 对象 - soundItemList = (SoundItem) getIntent().getSerializableExtra("1234"); - if (soundItemList == null) { - return; - } - - textView.setText(soundItemList.getTitle()); - - // 检查数据库中是否存在该音频的收藏记录 - checkFavoriteStatus(); - - //设置收藏点击事件 - favorite.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - isFavorite = !isFavorite; - updateFavoriteIcon(); - updateDatabase(); - } - }); - - // 设置循环图标的点击事件 - loop.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - isLooping = !isLooping; - loop.setImageResource(isLooping ? R.drawable.true_loop : R.drawable.loop); - if (mediaPlayer != null) { - mediaPlayer.setLooping(isLooping); - } - } - }); - - // 设置播放/暂停图标的点击事件 - playBack.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - playAudio(); - } - }); - - // 获取设备的最大音量值 - int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); - // 设置SeekBar的最大值 - seekBar.setMax(maxVolume); - - // 获取当前音量值 - int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); - // 设置SeekBar的初始进度 - seekBar.setProgress(currentVolume); - - // 设置SeekBar监听器 - seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - // 调整音量 - audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - // 用户开始拖动进度条时执行的操作 - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - // 用户停止拖动进度条时执行的操作 - } - }); - - // 使用 Glide 加载图片 - Glide.with(MainApplication.getContext()) - .asDrawable() - .skipMemoryCache(true) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .load(soundItemList.getPreUrl()) - .transform(new CenterCrop()) - .into(imageView); - } - - private void checkFavoriteStatus() { - new Thread(new Runnable() { - @Override - public void run() { - // 检查数据库中是否存在该音频的收藏记录 - FavoriteSounds favoriteSound = favoriteSoundsDao.getByPath(soundItemList.getMp3Url()); - isFavorite = favoriteSound != null; - runOnUiThread(new Runnable() { - @Override - public void run() { - updateFavoriteIcon(); - } - }); - } - }).start(); - } - - private void updateFavoriteIcon() { - favorite.setImageResource(isFavorite ? R.drawable.favorite : R.drawable.unfavorite); - } - - private void updateDatabase() { - new Thread(new Runnable() { - @Override - public void run() { - // 判断是否收藏 - if (isFavorite) { - // 插入数据到数据库 - FavoriteSounds favoriteSound = new FavoriteSounds( - soundItemList.getTitle(), - soundItemList.getMp3Url(), - soundItemList.getPreUrl() - ); - favoriteSoundsDao.insertSound(favoriteSound); - } else { - // 从数据库删除数据,先根据路径检索出要删除的对象 - FavoriteSounds favoriteSound = favoriteSoundsDao.getByPath(soundItemList.getMp3Url()); - if (favoriteSound != null) { - favoriteSoundsDao.delete(favoriteSound); - } - } - } - }).start(); - } - - - private void playAudio() { - String audioUrl = soundItemList.getMp3Url(); // 获取音频的URL - - if (mediaPlayer == null) { - // 如果MediaPlayer对象为空,则创建一个新的MediaPlayer对象 - mediaPlayer = new MediaPlayer(); - mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置音频流类型为音乐 - - try { - mediaPlayer.setDataSource(audioUrl); // 设置音频数据源 - mediaPlayer.prepareAsync(); // 异步准备MediaPlayer - - // 设置MediaPlayer准备完成监听器 - mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - mediaPlayer.start(); // 开始播放音频 - playBack.setImageResource(R.drawable.pause); // 播放时显示暂停图标 - isPlaying = true; // 设置播放状态为正在播放 - mediaPlayer.setLooping(isLooping); // 设置是否循环播放 - } - }); - - // 设置MediaPlayer错误监听器 - mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { - @Override - public boolean onError(MediaPlayer mp, int what, int extra) { - Toast.makeText(PlaySoundActivity.this, "Error playing audio", Toast.LENGTH_SHORT).show(); // 显示错误提示 - return false; - } - }); - - // 设置MediaPlayer播放完成监听器 - mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(MediaPlayer mp) { - if (!isLooping) { - playBack.setImageResource(R.drawable.playback); // 播放完成时显示播放图标 - isPlaying = false; // 设置播放状态为未播放 - } - } - }); - - } catch (IOException e) { - e.printStackTrace(); // 打印异常堆栈信息 - Toast.makeText(PlaySoundActivity.this, "Error setting data source", Toast.LENGTH_SHORT).show(); // 显示错误提示 - } - } else { - // 如果MediaPlayer对象已经存在 - if (isPlaying) { - mediaPlayer.pause(); // 暂停播放 - playBack.setImageResource(R.drawable.playback); // 暂停时显示播放图标 - } else { - mediaPlayer.start(); // 继续播放 - playBack.setImageResource(R.drawable.pause); // 播放时显示暂停图标 - } - isPlaying = !isPlaying; // 切换播放状态 - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - if (mediaPlayer != null) { - mediaPlayer.release(); - mediaPlayer = null; - } - } -} diff --git a/app/src/main/java/com/sound/prankparty/FirstFragment/SoundFragment.java b/app/src/main/java/com/sound/prankparty/FirstFragment/SoundFragment.java deleted file mode 100644 index 503336e..0000000 --- a/app/src/main/java/com/sound/prankparty/FirstFragment/SoundFragment.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.sound.prankparty.FirstFragment; - -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.sound.prankparty.JSON.Category; -import com.sound.prankparty.R; -import com.sound.prankparty.SecondFragment.NewRecordActivity; -import com.sound.prankparty.Utils.ItemDecoration; -import com.sound.prankparty.Utils.JsonParser; -import com.sound.prankparty.Utils.LoadJSON; -import com.google.android.material.bottomsheet.BottomSheetDialog; - -import java.util.List; - - -public class SoundFragment extends Fragment { - - ImageView btnBack; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - View view = inflater.inflate(R.layout.fragment_sound, container, false); - - RecyclerView recyclerView = view.findViewById(R.id.sound_recyclerview); - recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); - - btnBack = view.findViewById(R.id.fragment_sound_setting); - - // 从assets文件夹中读取JSON文件 - String jsonString = LoadJSON.loadJSONFromAsset("prank.json"); - //解析读取的String - List categories = JsonParser.parseJson(jsonString); - - recyclerView.setAdapter(new SoundRecyclerViewAdapter(getContext(), categories)); - - // 为 RecyclerView 添加自定义的间距装饰。 - ItemDecoration itemDecoration = new ItemDecoration(16, 19, 10); - recyclerView.addItemDecoration(itemDecoration); - - btnBack.setOnClickListener(v -> showCustomBottomSheetDialog()); - - return view; - } - - private void showCustomBottomSheetDialog() { - BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(requireContext()); - View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.setting_dialog, null); - //禁止点击其他页面取消 - bottomSheetDialog.setCanceledOnTouchOutside(false); - - dialogView.findViewById(R.id.privacy).setOnClickListener(v -> { - // 处理选项 1 - Intent intent = new Intent(getActivity(), NewRecordActivity.class); - startActivity(intent); - //销毁BottomSheetDialog对象 - bottomSheetDialog.dismiss(); - }); - - dialogView.findViewById(R.id.share).setOnClickListener(v -> { - // 处理选项 2 - bottomSheetDialog.dismiss(); - }); - - dialogView.findViewById(R.id.version).setOnClickListener(v -> { - // 处理取消按钮 - bottomSheetDialog.dismiss(); - }); - - bottomSheetDialog.setContentView(dialogView); - bottomSheetDialog.show(); - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/sound/prankparty/FirstFragment/SoundRecyclerViewAdapter.java b/app/src/main/java/com/sound/prankparty/FirstFragment/SoundRecyclerViewAdapter.java deleted file mode 100644 index 3ebac16..0000000 --- a/app/src/main/java/com/sound/prankparty/FirstFragment/SoundRecyclerViewAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.sound.prankparty.FirstFragment; - -import android.content.Context; -import android.content.Intent; -import android.graphics.Typeface; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.resource.bitmap.CenterCrop; -import com.sound.prankparty.Application.MainApplication; -import com.sound.prankparty.JSON.Category; -import com.sound.prankparty.R; - -import java.util.List; - -public class SoundRecyclerViewAdapter extends RecyclerView.Adapter { - - private Context context; - private List categoryList; - private final int[] colors; - - public SoundRecyclerViewAdapter(Context context, List categoryList) { - this.context = context; - this.categoryList = categoryList; - - colors = new int[]{ - ContextCompat.getColor(context, R.color.color4), - ContextCompat.getColor(context, R.color.color2), - ContextCompat.getColor(context, R.color.color3) - // 添加更多颜色 - }; - - } - - @NonNull - @Override - public SoundViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sound, parent, false); - return new SoundViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull SoundViewHolder holder, int position) { - - Category category = categoryList.get(position); - - // 使用取模运算来循环使用颜色 - holder.imageView.setBackgroundColor(colors[position % colors.length]); - - String originalName = category.getCategoryName(); - // 检查名称是否为空,以避免空指针异常 - if (originalName != null && !originalName.isEmpty()) { -// // 将首字母大写 -// String capitalizedName = originalName.substring(0, 1).toUpperCase() + originalName.substring(1); - // 设置文本字体 - holder.textView.setTypeface(Typeface.createFromAsset(context.getAssets(), "FrancoisOne-Regular.ttf")); - //设置文本 - holder.textView.setText(originalName); - } else { - // 如果名称为空,可以设置一个默认值或者不设置 - holder.textView.setText(""); - } - - if (category != null) { - Glide.with(MainApplication.getContext()) - //指定加载的资源类型为Drawable - .asDrawable() - //设置跳过内存缓存,即加载的图片不会存储在内存缓存中 - .skipMemoryCache(true) - //设置磁盘缓存策略为DiskCacheStrategy.ALL,即缓存原始图片和转换后的图片 - .diskCacheStrategy(DiskCacheStrategy.ALL) - .load(category.getCategoryUrl()) - .transform(new CenterCrop()) - .into(holder.imageView); - - holder.imageView.setOnClickListener(v -> { - Intent intent = new Intent(context, AirHornActivity.class); - intent.putExtra("123",category); - context.startActivity(intent); - }); - } - - } - - @Override - public int getItemCount() { - return categoryList.size(); - } - - static class SoundViewHolder extends RecyclerView.ViewHolder { - - ImageView imageView; - TextView textView; - - public SoundViewHolder(@NonNull View itemView) { - super(itemView); - imageView = itemView.findViewById(R.id.item_imageview_sound); - textView = itemView.findViewById(R.id.item_textview_sound); - } - } - - -} diff --git a/app/src/main/java/com/sound/prankparty/Fragment/RadioFragment.java b/app/src/main/java/com/sound/prankparty/Fragment/RadioFragment.java index 58229cc..ff0773f 100644 --- a/app/src/main/java/com/sound/prankparty/Fragment/RadioFragment.java +++ b/app/src/main/java/com/sound/prankparty/Fragment/RadioFragment.java @@ -139,7 +139,6 @@ public class RadioFragment extends Fragment { } // 处理权限请求结果 - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -152,7 +151,6 @@ public class RadioFragment extends Fragment { } } // 打开音频选择器 - private void openAudioPicker() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); // 改为 ACTION_OPEN_DOCUMENT intent.setType("audio/*"); // 设置 MIME 类型为音频 @@ -161,7 +159,6 @@ public class RadioFragment extends Fragment { } // 处理 Activity 结果 - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -190,7 +187,7 @@ public class RadioFragment extends Fragment { if (count > 0) { // 在主线程中显示文件已经存在的提示 requireActivity().runOnUiThread(() -> - Toast.makeText(requireContext(), "该文件已经导入过,不能重复导入", Toast.LENGTH_LONG).show()); + Toast.makeText(requireContext(), "This file has been imported and cannot be imported again", Toast.LENGTH_LONG).show()); } else { // 插入新记录 saveSoundsDao.insertSound(new SaveSounds(fileName, audioUri.toString(), lastModifiedDateTime[0], lastModifiedDateTime[1], formatDuration(finalDuration))); @@ -199,7 +196,7 @@ public class RadioFragment extends Fragment { e.printStackTrace(); // 在主线程中显示错误信息 requireActivity().runOnUiThread(() -> - Toast.makeText(requireContext(), "插入数据库失败: " + e.getMessage(), Toast.LENGTH_LONG).show()); + Toast.makeText(requireContext(), "Failed to insert database: " + e.getMessage(), Toast.LENGTH_LONG).show()); } }).start(); } diff --git a/app/src/main/java/com/sound/prankparty/Main/MainActivity.java b/app/src/main/java/com/sound/prankparty/Main/MainActivity.java deleted file mode 100644 index 3f0b729..0000000 --- a/app/src/main/java/com/sound/prankparty/Main/MainActivity.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.sound.prankparty.Main; - -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.viewpager2.widget.ViewPager2; - -import com.sound.prankparty.R; -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -public class MainActivity extends AppCompatActivity { - - private ViewPager2 viewPager2; - private TabLayout tabLayout; - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - viewPager2 = findViewById(R.id.main_viewpager); - tabLayout = findViewById(R.id.main_tablayout); - - MainViewPager2Adapter adapter = new MainViewPager2Adapter(this); - viewPager2.setAdapter(adapter); - -// viewPager2.setUserInputEnabled(false); //true:滑动,false:禁止滑动 - - new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> { - View customView = LayoutInflater.from(this).inflate(R.layout.main_tab_item_custom, null); - tab.setCustomView(customView); - - ImageView tabIcon = customView.findViewById(R.id.icon_custom); - if (tabIcon != null) { - if (position == 0) { - tabIcon.setImageResource(R.drawable.main_sound_select); - } else if (position == 1) { - tabIcon.setImageResource(R.drawable.main_radio_unselect); - } else { - tabIcon.setImageResource(R.drawable.main_favorite_unselect); - } - } - - }).attach(); - - - //设置标签选中事件 - tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { - @Override - public void onTabSelected(TabLayout.Tab tab) { - View customView = tab.getCustomView(); - if (customView != null) { - ImageView tabIcon = customView.findViewById(R.id.icon_custom); - if (tabIcon != null) { - if (tab.getPosition() == 0) { - tabIcon.setImageResource(R.drawable.main_sound_select); - } else if (tab.getPosition() == 1) { - tabIcon.setImageResource(R.drawable.main_radio_select); - } else { - tabIcon.setImageResource(R.drawable.main_favorite_select); - } - } - } - } - - @Override - public void onTabUnselected(TabLayout.Tab tab) { - View customView = tab.getCustomView(); - if (customView != null) { - ImageView tabIcon = customView.findViewById(R.id.icon_custom); - if (tabIcon != null) { - if (tab.getPosition() == 0) { - tabIcon.setImageResource(R.drawable.main_sound_unselect); - } else if (tab.getPosition() == 1) { - tabIcon.setImageResource(R.drawable.main_radio_unselect); - } else { - tabIcon.setImageResource(R.drawable.main_favorite_unselect); - } - } - } - } - - @Override - public void onTabReselected(TabLayout.Tab tab) { - // 处理Tab重新选中事件 - } - }); - - } - - //处理返回的flag,返回当前fragment - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - if ((intent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { - // 返回到ViewPager2的当前Fragment - viewPager2.setCurrentItem(viewPager2.getCurrentItem()); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/sound/prankparty/Main/MainViewPager2Adapter.java b/app/src/main/java/com/sound/prankparty/Main/MainViewPager2Adapter.java deleted file mode 100644 index 8f25179..0000000 --- a/app/src/main/java/com/sound/prankparty/Main/MainViewPager2Adapter.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sound.prankparty.Main; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.viewpager2.adapter.FragmentStateAdapter; - -import com.sound.prankparty.FirstFragment.SoundFragment; -import com.sound.prankparty.SecondFragment.RadioFragment; -import com.sound.prankparty.ThirdFragment.FavoriteFragment; - -import java.util.ArrayList; -import java.util.List; - -public class MainViewPager2Adapter extends FragmentStateAdapter { - - private List fragmentList; - - public MainViewPager2Adapter(@NonNull FragmentActivity fragmentActivity) { - super(fragmentActivity); - // 初始化fragmentList并添加Fragment对象 - fragmentList = new ArrayList<>(); - fragmentList.add(new SoundFragment()); - fragmentList.add(new RadioFragment()); - fragmentList.add(new FavoriteFragment()); - } - - @NonNull - @Override - public Fragment createFragment(int position) { - // 根据位置返回相应的Fragment - return fragmentList.get(position); - } - - @Override - public int getItemCount() { - // 返回Fragment列表的大小 - return fragmentList.size(); - } -} diff --git a/app/src/main/java/com/sound/prankparty/MainApplication.java b/app/src/main/java/com/sound/prankparty/MainApplication.java deleted file mode 100644 index 44edc16..0000000 --- a/app/src/main/java/com/sound/prankparty/MainApplication.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sound; - -import android.app.Application; -import android.content.Context; - -public class MainApplication extends Application { - /** - * 全局的上下文 - */ - private static Context mContext; - - @Override - public void onCreate() { - super.onCreate(); - //获取应用的上下文并赋值给 mContext - mContext = getApplicationContext(); - } - - /** - * 获取context - * @return - */ - public static Context getContext(){ - return mContext; - } - - //重写 onLowMemory 方法,在系统内存不足时调用。这里只是调用了父类的 onLowMemory 方法,没有做其他处理 - @Override - public void onLowMemory() { - super.onLowMemory(); - } - -} diff --git a/app/src/main/java/com/sound/prankparty/SecondFragment/NewRecordActivity.java b/app/src/main/java/com/sound/prankparty/SecondFragment/NewRecordActivity.java deleted file mode 100644 index fe075f4..0000000 --- a/app/src/main/java/com/sound/prankparty/SecondFragment/NewRecordActivity.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.sound.prankparty.SecondFragment; - -import android.Manifest; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.media.MediaRecorder; -import android.os.Bundle; -import android.os.Handler; -import android.view.View; -import android.widget.ImageButton; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - -import com.airbnb.lottie.LottieAnimationView; -import com.sound.prankparty.R; - -import java.io.File; -import java.io.IOException; - -public class NewRecordActivity extends AppCompatActivity { - - private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200; - - private ImageButton button; - private Boolean isStarted = false; - private LottieAnimationView animationView; - private TextView timeTextView; - private Handler handler = new Handler(); - private long startTime; - private MediaRecorder mediaRecorder; - private File outputFile; - private Runnable updateTimeTask = new Runnable() { - @Override - public void run() { - long currentTime = System.currentTimeMillis(); - long elapsedTime = currentTime - startTime; - timeTextView.setText(formatTime(elapsedTime)); - handler.postDelayed(this, 1000); - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_new_record); - - animationView = findViewById(R.id.animation_view); - button = findViewById(R.id.new_record_record); - timeTextView = findViewById(R.id.new_record_time); - - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // 检查是否授予了RECORD_AUDIO权限 - if (ContextCompat.checkSelfPermission(NewRecordActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { - // 如果未被授予,则请求该权限 - ActivityCompat.requestPermissions(NewRecordActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_AUDIO_PERMISSION); - } else { - // 如果获得权限,就开始录音 - toggleRecording(); - } - } - }); - } - - private void toggleRecording() { - if (isStarted) { - // 停止录音 - stopRecording(); - } else { - // 开始录音 - startRecording(); - } - isStarted = !isStarted; // 切换录音状态 - - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // 获得许可,开始录音 - toggleRecording(); - } else { - // 权限被拒绝,通知用户 - Toast.makeText(this, "录音权限被拒绝,请在设置中启用权限", Toast.LENGTH_SHORT).show(); - } - } - } - - private void startRecording() { - try { - // 初始化MediaRecorder - mediaRecorder = new MediaRecorder(); - mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); - mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); - mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); - - // 设置输出文件路径 - String fileName = "recording_" + System.currentTimeMillis() + ".m4a"; - outputFile = new File(getFilesDir(), fileName); - mediaRecorder.setOutputFile(outputFile.getAbsolutePath()); - - // 准备并开始录音 - mediaRecorder.prepare(); - mediaRecorder.start(); - - // 更新UI - startTime = System.currentTimeMillis(); - handler.post(updateTimeTask); - animationView.playAnimation(); - - } catch (IOException e) { - e.printStackTrace(); - // 处理异常 - } - } - - private void stopRecording() { - // 停止录音并释放MediaRecorder - if (mediaRecorder != null) { - mediaRecorder.stop(); - mediaRecorder.release(); - mediaRecorder = null; - } - - // 更新UI - handler.removeCallbacks(updateTimeTask); - animationView.cancelAnimation(); - animationView.setFrame(0); - timeTextView.setText("00:00:00"); - - Intent intent = new Intent(NewRecordActivity.this, SaveRecordActivity.class); - intent.putExtra("audioFilePath", outputFile.getAbsolutePath()); - startActivity(intent); - } - - private String formatTime(long elapsedTime) { - int seconds = (int) (elapsedTime / 1000) % 60; - int minutes = (int) ((elapsedTime / (1000 * 60)) % 60); - int hours = (int) ((elapsedTime / (1000 * 60 * 60)) % 24); - return String.format("%02d:%02d:%02d", hours, minutes, seconds); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - handler.removeCallbacks(updateTimeTask); - } -} diff --git a/app/src/main/java/com/sound/prankparty/SecondFragment/RadioFragment.java b/app/src/main/java/com/sound/prankparty/SecondFragment/RadioFragment.java deleted file mode 100644 index 599527c..0000000 --- a/app/src/main/java/com/sound/prankparty/SecondFragment/RadioFragment.java +++ /dev/null @@ -1,326 +0,0 @@ -package com.sound.prankparty.SecondFragment; - -import static android.app.Activity.RESULT_OK; - -import android.Manifest; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.media.MediaMetadataRetriever; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.provider.MediaStore; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.bottomsheet.BottomSheetDialog; -import com.sound.prankparty.FirstFragment.PlaySoundActivity; -import com.sound.prankparty.R; -import com.sound.prankparty.Room.AppDatabase; -import com.sound.prankparty.Room.FavoriteSoundsDao; -import com.sound.prankparty.Room.SaveSounds; -import com.sound.prankparty.Room.SaveSoundsDao; -import com.sound.prankparty.Utils.MyItemTouchHelperCallback; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Objects; - -public class RadioFragment extends Fragment { - - private RecyclerView recyclerView; - private RadioRecyclerViewAdapter radioRecyclerViewAdapter; - private ImageView add; - private ImageView backgroundTitle; - private SaveSoundsDao saveSoundsDao; - private MyItemTouchHelperCallback myItemTouchHelperCallback; - private ItemTouchHelper itemTouchHelper; - private Uri audioUri; - private String fileName; - private AppDatabase appDatabase; - private FavoriteSoundsDao favoriteSoundsDao; - private List saveSoundsList; - private static final int REQUEST_CODE_READ_MEDIA_AUDIO = 1001; - private static final int REQUEST_CODE_PICK_AUDIO = 1002; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // 初始化视图 - View view = inflater.inflate(R.layout.fragment_radio, container, false); - - // 初始化数据库 - appDatabase = AppDatabase.getDatabase(requireContext()); - saveSoundsDao = appDatabase.saveSoundsDao(); - favoriteSoundsDao = appDatabase.favoriteSoundsDao(); - - // 初始化视图组件 - add = view.findViewById(R.id.fragment_radio_add); - backgroundTitle = view.findViewById(R.id.empty_radio_image); - recyclerView = view.findViewById(R.id.radio_recyclerview); - - // 设置RecyclerView的布局管理器 - recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 1)); - - // 初始化适配器 - radioRecyclerViewAdapter = new RadioRecyclerViewAdapter(requireContext(), this, favoriteSoundsDao); - recyclerView.setAdapter(radioRecyclerViewAdapter); - - // 初始化 MyItemTouchHelperCallback - myItemTouchHelperCallback = new MyItemTouchHelperCallback(this); - itemTouchHelper = new ItemTouchHelper(myItemTouchHelperCallback); - itemTouchHelper.attachToRecyclerView(recyclerView); - -// itemTouchHelper.setSwipeEnabled(false); - - - // 设置添加按钮的点击事件 - add.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - showCustomBottomSheetDialog(); - } - }); - - - recyclerView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - playSound(); - } - }); - - // 刷新数据 - refreshData(); - - return view; - } - - @Override - public void onResume() { - super.onResume(); - refreshData(); - } - - // 显示自定义底部弹窗 - private void showCustomBottomSheetDialog() { - BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(requireContext()); - View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_dialog, null); - - bottomSheetDialog.setCanceledOnTouchOutside(false); - - // 设置选项1的点击事件 - dialogView.findViewById(R.id.option1).setOnClickListener(v -> { - // 处理选项 1 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - openAudioPicker(); - } else { - if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(requireActivity(), - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - REQUEST_CODE_READ_MEDIA_AUDIO); - } else { - openAudioPicker(); - } - } - // 销毁BottomSheetDialog对象 - bottomSheetDialog.dismiss(); - }); - - // 设置选项2的点击事件 - dialogView.findViewById(R.id.option2).setOnClickListener(v -> { - // 处理选项 2 - Intent intent = new Intent(getActivity(), NewRecordActivity.class); - startActivity(intent); - bottomSheetDialog.dismiss(); - }); - - // 设置取消按钮的点击事件 - dialogView.findViewById(R.id.cancel_button).setOnClickListener(v -> { - // 处理取消按钮 - bottomSheetDialog.dismiss(); - }); - - bottomSheetDialog.setContentView(dialogView); - bottomSheetDialog.show(); - } - - // 处理权限请求结果 - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == REQUEST_CODE_READ_MEDIA_AUDIO) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - openAudioPicker(); - } else { - Toast.makeText(requireContext(), "Permission denied", Toast.LENGTH_SHORT).show(); - } - } - } - - // 打开音频选择器 - private void openAudioPicker() { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("audio/*"); - startActivityForResult(intent, REQUEST_CODE_PICK_AUDIO); - } - - // 处理Activity结果 - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_CODE_PICK_AUDIO && resultCode == RESULT_OK) { - if (data != null) { - audioUri = data.getData(); - assert audioUri != null; - fileName = getFileName(audioUri); - long duration = 0; - try { - duration = getAudioDuration(audioUri); - } catch (IOException e) { - throw new RuntimeException(e); - } - String[] currentDateTime = getCurrentDateTime(); - - long finalDuration = duration; - new Thread(new Runnable() { - @Override - public void run() { - try { - saveSoundsDao.insertSound(new SaveSounds(fileName, audioUri.toString(), currentDateTime[0], currentDateTime[1], formatDuration(finalDuration))); - } catch (Exception e) { - e.printStackTrace(); - // 在主线程中显示错误信息 - requireActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(requireContext(), "插入数据库失败: " + e.getMessage(), Toast.LENGTH_LONG).show(); - } - }); - } - } - }).start(); - } - } - } - - private void playSound(){ - -// SoundItem soundItem = new SoundItem(audioUri.toString(),"https://resource-sg-public.lux-ad.com/prank/7f35214ab21c8edb7afd193442126aca.png","Baby Sneeze 1"); - - String ine = "un"; - Log.d("dskod",ine); - Intent intent = new Intent(requireActivity(), PlaySoundActivity.class); -// intent.putExtra("1234", soundItem); - requireActivity().startActivity(intent); - - } - - - // 获取文件名 - private String getFileName(Uri uri) { - String result = null; - if (Objects.equals(uri.getScheme(), "content")) { - try (Cursor cursor = requireActivity().getContentResolver().query(uri, null, null, null, null)) { - if (cursor != null && cursor.moveToFirst()) { - int displayNameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); - if (displayNameIndex != -1) { - result = cursor.getString(displayNameIndex); - } - } - } - } - if (result == null) { - result = uri.getPath(); - assert result != null; - int cut = result.lastIndexOf('/'); - if (cut != -1) { - result = result.substring(cut + 1); - } - } - return result; - } - - // 获取音频时长 - private long getAudioDuration(Uri uri) throws IOException { - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(requireContext(), uri); - String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); - retriever.release(); - return duration != null ? Long.parseLong(duration) : 0; - } - - // 格式化时长 - private String formatDuration(long duration) { - long minutes = (duration / 1000) / 60; - long seconds = (duration / 1000) % 60; - return String.format(Locale.getDefault(), "%d:%02d", minutes, seconds); - } - - // 获取当前日期和时间 - public static String[] getCurrentDateTime() { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); - SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); - Date now = new Date(); - String currentDate = dateFormat.format(now); - String currentTime = timeFormat.format(now); - return new String[]{currentDate, currentTime}; - } - - // 刷新数据 - public void refreshData() { - new Thread(() -> { - saveSoundsList = saveSoundsDao.getAllSounds(); - requireActivity().runOnUiThread(() -> { - ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) add.getLayoutParams(); - if (saveSoundsList.isEmpty()) { - recyclerView.setVisibility(View.GONE); - backgroundTitle.setVisibility(View.VISIBLE); - - // 清除与底部对齐的约束 - layoutParams.topToBottom = ConstraintLayout.LayoutParams.UNSET; - layoutParams.bottomToTop = ConstraintLayout.LayoutParams.UNSET; - - // 将add移动到屏幕中央 - layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; - layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID; - layoutParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID; - layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID; - } else { - recyclerView.setVisibility(View.VISIBLE); - backgroundTitle.setVisibility(View.GONE); - - // 清除与中央对齐的约束 - layoutParams.topToTop = ConstraintLayout.LayoutParams.UNSET; - layoutParams.bottomToTop = ConstraintLayout.LayoutParams.UNSET; - - // 将add移动到屏幕底部 - layoutParams.topToBottom = R.id.radio_recyclerview; - layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID; - layoutParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID; - layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID; - } - - add.setLayoutParams(layoutParams); - radioRecyclerViewAdapter.updateData(saveSoundsList); - }); - }).start(); - } -} diff --git a/app/src/main/java/com/sound/prankparty/SecondFragment/RadioRecyclerViewAdapter.java b/app/src/main/java/com/sound/prankparty/SecondFragment/RadioRecyclerViewAdapter.java deleted file mode 100644 index 11885b5..0000000 --- a/app/src/main/java/com/sound/prankparty/SecondFragment/RadioRecyclerViewAdapter.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.sound.prankparty.SecondFragment; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.RecyclerView; - -import com.sound.prankparty.R; -import com.sound.prankparty.Room.FavoriteSounds; -import com.sound.prankparty.Room.FavoriteSoundsDao; -import com.sound.prankparty.Room.SaveSounds; - -import java.util.List; -import java.util.concurrent.Executors; - -public class RadioRecyclerViewAdapter extends RecyclerView.Adapter { - - private List saveSoundsList; - private Context context; - private Fragment fragment; - private FavoriteSoundsDao favoriteSoundsDao; - - public RadioRecyclerViewAdapter(Context context, Fragment fragment, FavoriteSoundsDao favoriteSoundsDao) { - this.context = context; - this.fragment = fragment; - this.favoriteSoundsDao = favoriteSoundsDao; - } - - @NonNull - @Override - public RadioViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_radio, parent, false); - return new RadioViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull RadioViewHolder holder, int position) { - SaveSounds saveSound = saveSoundsList.get(position); - holder.title.setText(saveSound.getName()); - holder.date.setText(saveSound.getDate()); - holder.time.setText(saveSound.getTime()); - holder.duration.setText(saveSound.getDuration()); - - Executors.newSingleThreadExecutor().execute(() -> { - final boolean[] isFavorite = {checkFavoriteStatus(saveSound)}; - // 更新 UI 需要在主线程中执行 - fragment.requireActivity().runOnUiThread(() -> { - updateFavoriteIcon(holder, isFavorite[0]); - holder.favorite.setOnClickListener(v -> { - isFavorite[0] = !isFavorite[0]; - updateFavoriteIcon(holder, isFavorite[0]); - updateDatabase(saveSound, isFavorite[0]); - }); - }); - }); - } - - @Override - public int getItemCount() { - return saveSoundsList != null ? saveSoundsList.size() : 0; - } - - public void updateData(List newSaveSoundsList) { - this.saveSoundsList = newSaveSoundsList; - notifyDataSetChanged(); - } - - private boolean checkFavoriteStatus(SaveSounds saveSound) { - FavoriteSounds favoriteSound = favoriteSoundsDao.getByPath(saveSound.getPath()); - return favoriteSound != null; - } - - private void updateDatabase(SaveSounds saveSound, boolean isFavorite) { - Executors.newSingleThreadExecutor().execute(() -> { - if (isFavorite) { - favoriteSoundsDao.insertSound(new FavoriteSounds(saveSound.getName(), saveSound.getPath(), "")); - } else { - favoriteSoundsDao.delete(favoriteSoundsDao.getByPath(saveSound.getPath())); - } - }); - } - - private void updateFavoriteIcon(RadioViewHolder holder, boolean isFavorite) { - holder.favorite.setImageResource(isFavorite ? R.drawable.favorite : R.drawable.unfavorite); - } - - static class RadioViewHolder extends RecyclerView.ViewHolder { - - TextView title; - TextView date; - TextView time; - TextView duration; - ImageView favorite; - - public RadioViewHolder(@NonNull View itemView) { - super(itemView); - title = itemView.findViewById(R.id.title); - date = itemView.findViewById(R.id.date); - time = itemView.findViewById(R.id.time); - duration = itemView.findViewById(R.id.duration); - favorite = itemView.findViewById(R.id.favorite); - } - } -} diff --git a/app/src/main/java/com/sound/prankparty/SecondFragment/SaveRecordActivity.java b/app/src/main/java/com/sound/prankparty/SecondFragment/SaveRecordActivity.java deleted file mode 100644 index 490de9d..0000000 --- a/app/src/main/java/com/sound/prankparty/SecondFragment/SaveRecordActivity.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.sound.prankparty.SecondFragment; - -import android.content.Intent; -import android.media.MediaPlayer; -import android.os.Bundle; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; - -import com.sound.prankparty.Main.MainActivity; -import com.sound.prankparty.R; -import com.sound.prankparty.Room.AppDatabase; -import com.sound.prankparty.Room.SaveSounds; -import com.sound.prankparty.Room.SaveSoundsDao; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -public class SaveRecordActivity extends AppCompatActivity { - - private String audioFilePath; - private String inputText; - private MediaPlayer mediaPlayer; - private TextView durationTextView; - private String datePart; - private String timePart; - private ImageView playButton; - private EditText editText; - private Button saveButton; - private boolean isPlaying = false; - private AppDatabase appDatabase; - private SaveSoundsDao saveSoundsDao; - private int duration; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_save_record); - - // 获取传递过来的录音文件路径 - audioFilePath = getIntent().getStringExtra("audioFilePath"); - if (audioFilePath == null) { - Toast.makeText(this, "音频文件路径无效", Toast.LENGTH_SHORT).show(); - return; - } - Log.d("SaveRecordActivity", audioFilePath); - - playButton = findViewById(R.id.save_record_play); - durationTextView = findViewById(R.id.save_record_time); - editText = findViewById(R.id.save_record_name); - saveButton = findViewById(R.id.save_record_save); - - // 初始化数据库和 DAO - appDatabase = AppDatabase.getDatabase(this); // 获取数据库实例 - saveSoundsDao = appDatabase.saveSoundsDao(); - - // 设置焦点变化监听器 - editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - editText.setCursorVisible(hasFocus); - } - }); - - // 处理全局点击事件 - findViewById(R.id.main).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (v instanceof ViewGroup) { - clearFocusFromAllChildren((ViewGroup) v); - } else { - clearFocus(); - } - // 获取输入文本 - inputText = editText.getText().toString(); - Log.d("lux231", "13" + inputText); - } - }); - - // 显示音频文件的时长 - displayAudioDuration(); - - playButton.setOnClickListener(v -> playOrPauseAudio()); - - saveButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - inputText = editText.getText().toString(); - if (inputText == null || inputText.trim().isEmpty()) { - Toast.makeText(getApplicationContext(), "名称不能为空", Toast.LENGTH_SHORT).show(); - return; - } - - formatDateTime(); - - new Thread(new Runnable() { - @Override - public void run() { - - saveSoundsDao.insertSound(new SaveSounds(inputText, audioFilePath, datePart, timePart, formatTime(duration))); - - runOnUiThread(new Runnable() { - @Override - public void run() { - - //FLAG_ACTIVITY_CLEAR_TOP标志来清除栈中的Activity,传递Intent.FLAG_ACTIVITY_SINGLE_TOP - Intent intent = new Intent(SaveRecordActivity.this, MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); - startActivity(intent); - finish(); - } - }); - } - }).start(); - } - }); - } - - private void clearFocusFromAllChildren(ViewGroup parent) { - for (int i = 0; i < parent.getChildCount(); i++) { - View child = parent.getChildAt(i); - if (child instanceof ViewGroup) { - clearFocusFromAllChildren((ViewGroup) child); - } else { - child.clearFocus(); - } - } - } - - private void clearFocus() { - editText.clearFocus(); - } - - private void displayAudioDuration() { - if (audioFilePath != null) { - mediaPlayer = new MediaPlayer(); - try { - mediaPlayer.setDataSource(audioFilePath); - mediaPlayer.prepare(); - - // 获取音频文件的时长 - duration = mediaPlayer.getDuration(); - durationTextView.setText(formatTime(duration)); - - } catch (IOException e) { - e.printStackTrace(); - Toast.makeText(this, "无法加载音频", Toast.LENGTH_SHORT).show(); - } - } else { - Toast.makeText(this, "音频文件路径无效", Toast.LENGTH_SHORT).show(); - } - } - - private void playOrPauseAudio() { - if (isPlaying) { - mediaPlayer.pause(); - playButton.setImageResource(R.drawable.playback); // 更新按钮为播放图标 - isPlaying = false; - } else { - if (mediaPlayer == null) { - mediaPlayer = new MediaPlayer(); - try { - mediaPlayer.setDataSource(audioFilePath); - mediaPlayer.prepare(); - } catch (IOException e) { - e.printStackTrace(); - Toast.makeText(this, "无法播放音频", Toast.LENGTH_SHORT).show(); - return; - } - } - mediaPlayer.start(); - playButton.setImageResource(R.drawable.pause); // 更新按钮为暂停图标 - isPlaying = true; - - mediaPlayer.setOnCompletionListener(mp -> { - Toast.makeText(this, "播放完成", Toast.LENGTH_SHORT).show(); - playButton.setImageResource(R.drawable.playback); // 恢复播放图标 - isPlaying = false; - }); - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - if (mediaPlayer != null) { - if (isPlaying) { - mediaPlayer.stop(); - } - mediaPlayer.release(); - mediaPlayer = null; - } - } - - private String formatTime(int duration) { - int seconds = (duration / 1000) % 60; - int minutes = (duration / (1000 * 60)) % 60; - int hours = (duration / (1000 * 60 * 60)) % 24; - return String.format("%02d:%02d:%02d", hours, minutes, seconds); - } - - private void formatDateTime() { - Date currentDate = new Date(); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); - datePart = dateFormat.format(currentDate); - SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); - timePart = timeFormat.format(currentDate); - } -} diff --git a/app/src/main/java/com/sound/prankparty/StartUp/SplashActivity.java b/app/src/main/java/com/sound/prankparty/StartUp/SplashActivity.java deleted file mode 100644 index ae8d1ee..0000000 --- a/app/src/main/java/com/sound/prankparty/StartUp/SplashActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.sound.prankparty.StartUp; - -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.widget.ProgressBar; -import androidx.appcompat.app.AppCompatActivity; - -import com.sound.prankparty.Main.MainActivity; -import com.sound.prankparty.R; - -public class SplashActivity extends AppCompatActivity { - - private static final int SPLASH_TIME_OUT = 5000; - private ProgressBar progressBar; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_splash); - -// ImageView imageView = findViewById(R.id.splash_image); -// Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.startup_background); -// int targetWidth = imageView.getWidth(); -// int targetHeight = imageView.getHeight(); -// Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, targetWidth, targetHeight, true); -// imageView.setImageBitmap(scaledBitmap); - - - progressBar = findViewById(R.id.progressBar); - - new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { - @Override - public void run() { - Intent intent = new Intent(SplashActivity.this, MainActivity.class); - startActivity(intent); - finish(); - } - }, SPLASH_TIME_OUT); - - // 进度条进展 - new Thread(new Runnable() { - @Override - public void run() { - for (int i = 0; i <= 100; i++) { - final int progress = i; - runOnUiThread(new Runnable() { - @Override - public void run() { - progressBar.setProgress(progress); - } - }); - try { - Thread.sleep(50); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - }).start(); - } -} diff --git a/app/src/main/java/com/sound/prankparty/ThirdFragment/FavoriteFragment.java b/app/src/main/java/com/sound/prankparty/ThirdFragment/FavoriteFragment.java deleted file mode 100644 index a83615b..0000000 --- a/app/src/main/java/com/sound/prankparty/ThirdFragment/FavoriteFragment.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.sound.prankparty.ThirdFragment; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProvider; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.sound.prankparty.R; -import com.sound.prankparty.Room.AppDatabase; -import com.sound.prankparty.Room.FavoriteSounds; -import com.sound.prankparty.Room.FavoriteSoundsDao; -import com.sound.prankparty.Utils.FavoriteSoundsViewModel; -import com.sound.prankparty.Utils.ItemDecoration; - -import java.util.List; - - -public class FavoriteFragment extends Fragment { - - private AppDatabase appDatabase; - private FavoriteSoundsDao favoriteSoundsDao; - private List favoriteSoundsList; - private RecyclerView recyclerView; - private FavoriteRecyclerViewAdapter favoriteRecyclerViewAdapter; - private ImageView tips; - private ImageView image; - private FavoriteSoundsViewModel viewModel; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_favorite, container, false); - - // 使用 ApplicationContext 来获取 ViewModel - viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())).get(FavoriteSoundsViewModel.class); - - recyclerView = view.findViewById(R.id.favorite_recyclerview); - tips = view.findViewById(R.id.fragment_favorite_tips); - image = view.findViewById(R.id.fragment_favorite_image); - - recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3)); - - favoriteRecyclerViewAdapter = new FavoriteRecyclerViewAdapter(requireContext(), this); - recyclerView.setAdapter(favoriteRecyclerViewAdapter); - - // 为 RecyclerView 添加自定义的间距装饰。 - ItemDecoration itemDecoration = new ItemDecoration(16, 19, 10); - recyclerView.addItemDecoration(itemDecoration); - - appDatabase = AppDatabase.getDatabase(requireContext()); - favoriteSoundsDao = appDatabase.favoriteSoundsDao(); - - // 观察 LiveData 的变化 - viewModel.getFavoriteSoundsLiveData().observe(getViewLifecycleOwner(), favoriteSoundsList -> { - if (favoriteSoundsList == null || favoriteSoundsList.isEmpty()) { - recyclerView.setVisibility(View.GONE); - tips.setVisibility(View.VISIBLE); - image.setVisibility(View.VISIBLE); - } else { - recyclerView.setVisibility(View.VISIBLE); - tips.setVisibility(View.GONE); - image.setVisibility(View.GONE); - } - favoriteRecyclerViewAdapter.updateData(favoriteSoundsList); - }); - - return view; - } - - @Override - public void onResume() { - super.onResume(); - // 触发数据刷新 - viewModel.refreshData(); - } -} diff --git a/app/src/main/java/com/sound/prankparty/ThirdFragment/FavoriteRecyclerViewAdapter.java b/app/src/main/java/com/sound/prankparty/ThirdFragment/FavoriteRecyclerViewAdapter.java deleted file mode 100644 index 546f18c..0000000 --- a/app/src/main/java/com/sound/prankparty/ThirdFragment/FavoriteRecyclerViewAdapter.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.sound.prankparty.ThirdFragment; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.DiffUtil; -import androidx.recyclerview.widget.RecyclerView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.resource.bitmap.CenterCrop; -import com.sound.prankparty.Application.MainApplication; -import com.sound.prankparty.R; -import com.sound.prankparty.Room.FavoriteSounds; -import com.sound.prankparty.Utils.FavoriteSoundsDiffCallback; - -import java.util.ArrayList; -import java.util.List; - -public class FavoriteRecyclerViewAdapter extends RecyclerView.Adapter { - - private List favoriteSoundsList = new ArrayList<>(); - private Context context; - private Fragment fragment; - - public FavoriteRecyclerViewAdapter(Context context, Fragment fragment) { - this.context = context; - this.fragment = fragment; - } - - public void updateData(List newFavoriteSoundsList) { - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new FavoriteSoundsDiffCallback(favoriteSoundsList, newFavoriteSoundsList)); - favoriteSoundsList.clear(); - favoriteSoundsList.addAll(newFavoriteSoundsList); - diffResult.dispatchUpdatesTo(this); - } - - @NonNull - @Override - public FavoriteRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_favorite, parent, false); - return new FavoriteRecyclerViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull FavoriteRecyclerViewHolder holder, int position) { - FavoriteSounds favoriteSounds = favoriteSoundsList.get(position); - holder.textView.setText(favoriteSounds.getName()); - - Glide.with(MainApplication.getContext()) - .asDrawable() - .skipMemoryCache(true) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .load(favoriteSounds.getImagePath()) - .transform(new CenterCrop()) - .into(holder.imageView); - } - - @Override - public int getItemCount() { - return favoriteSoundsList != null ? favoriteSoundsList.size() : 0; - } - - static class FavoriteRecyclerViewHolder extends RecyclerView.ViewHolder { - ImageView imageView; - TextView textView; - - public FavoriteRecyclerViewHolder(@NonNull View itemView) { - super(itemView); - imageView = itemView.findViewById(R.id.item_imageview_favorite); - textView = itemView.findViewById(R.id.item_imageview_text); - } - } -} - diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index ef9e96f..17dcb10 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -8,20 +8,23 @@ android:id="@+id/splash_image" android:layout_width="match_parent" android:layout_height="match_parent" - android:src="@mipmap/start_up" - android:scaleType="fitXY"/> + android:scaleType="fitXY" + android:src="@mipmap/start_up" /> + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" />