From b67911fde755e03807d38d1b4be9e99aa0ab29b0 Mon Sep 17 00:00:00 2001 From: lihongwei Date: Sat, 12 Oct 2024 18:29:58 +0800 Subject: [PATCH] =?UTF-8?q?A=E9=9D=A2=E5=8A=9F=E8=83=BD=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 +- .../adapter/A_ImportFragmentAdapter.java | 4 + .../hi/music/player/helper/SettingUtil.java | 75 ++++++++++++++++ .../service/MusicPlayerForegroundService.java | 40 +++++++-- .../player/ui/activity/A_HomeActivity.java | 51 +++++------ .../player/ui/activity/A_PlayActivity.java | 90 +++++++++---------- .../player/ui/activity/A_SettingActivity.java | 21 +++++ .../player/ui/fragmnt/A_ImportFragment.java | 50 +++++++++-- app/src/main/res/layout/activity_aplay.xml | 2 +- app/src/main/res/layout/activity_asetting.xml | 11 ++- app/src/main/res/layout/fragment_a_import.xml | 9 +- app/src/main/res/layout/item_a_home_1.xml | 12 +-- app/src/main/res/layout/item_a_home_3.xml | 20 ++--- 13 files changed, 270 insertions(+), 119 deletions(-) create mode 100644 app/src/main/java/com/hi/music/player/helper/SettingUtil.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 834c9e4..7ebcd5a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,7 +36,7 @@ android:exported="false" android:screenOrientation="portrait" /> @@ -46,7 +46,7 @@ getAudioFiles() { + return audioFiles; + } public void setOnOptionClickListener(OnOptionClickListener listener) { this.onOptionClickListener = listener; diff --git a/app/src/main/java/com/hi/music/player/helper/SettingUtil.java b/app/src/main/java/com/hi/music/player/helper/SettingUtil.java new file mode 100644 index 0000000..dee09e7 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/helper/SettingUtil.java @@ -0,0 +1,75 @@ +package com.hi.music.player.helper; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.widget.Toast; + +public class SettingUtil { + public static final String PRIVACY_POLICY_URL = "https://himelody.mystrikingly.com/privacy"; + public static final String TERMS_OF_SERVICE_URL = "https://himelody.mystrikingly.com/terms"; + + // 获取当前应用的版本号 + public static String getCurrentVersion(Context context) { + try { + PackageManager packageManager = context.getPackageManager(); + PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); + return packageInfo.versionName; // 返回版本名称 + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return null; // 返回null表示获取版本号失败 + } + } + + // 发送反馈 + public static void sendFeedback(Context context, String email, String subject) { + Intent emailIntent = new Intent(Intent.ACTION_SEND); + emailIntent.setType("message/rfc822"); + emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{email}); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); + try { + context.startActivity(Intent.createChooser(emailIntent, "Send Feedback")); + } catch (ActivityNotFoundException ex) { + Toast.makeText(context, "There is no app that supports sending emails", Toast.LENGTH_LONG).show(); + } + } + + // 分享应用 + public static void shareApp(Context context) { + String appPackageName = context.getPackageName(); + String appName = context.getApplicationInfo().loadLabel(context.getPackageManager()).toString(); + String appPlayStoreLink = "https://play.google.com/store/apps/details?id=" + appPackageName; + + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Check out this app: " + appName); + shareIntent.putExtra(Intent.EXTRA_TEXT, "Download " + appName + " from Google Play: " + appPlayStoreLink); + context.startActivity(Intent.createChooser(shareIntent, "Share " + appName + " via")); + } + + // 打开隐私政策 + public static void openPrivacyPolicy(Context context) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(PRIVACY_POLICY_URL)); + context.startActivity(intent); + } + + // 打开服务条款 + public static void openTermsOfService(Context context) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(TERMS_OF_SERVICE_URL)); + context.startActivity(intent); + } + + // 打开Google Play + public static void openGooglePlay(Context context, String packageName) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/com/hi/music/player/service/MusicPlayerForegroundService.java b/app/src/main/java/com/hi/music/player/service/MusicPlayerForegroundService.java index 02d0dcb..bc956c0 100644 --- a/app/src/main/java/com/hi/music/player/service/MusicPlayerForegroundService.java +++ b/app/src/main/java/com/hi/music/player/service/MusicPlayerForegroundService.java @@ -49,6 +49,8 @@ public class MusicPlayerForegroundService extends Service { private int remainingTime; // 剩余时间(毫秒) private boolean isTimerRunning = false; // 计时器状态 private boolean isTimerPaused = false; // 计时器是否暂停 + private MutableLiveData currentPosition = new MutableLiveData<>(); + private MutableLiveData duration = new MutableLiveData<>(); // 自定义Binder类 @@ -137,7 +139,7 @@ public class MusicPlayerForegroundService extends Service { mediaPlayer = new MediaPlayer(); // 创建新的MediaPlayer实例 } - fileName.setValue(getFileNameFromPath(path)); // 设置当前文件名 + fileName.setValue(audioItem.getName()); // 设置当前文件名 setDataSource(path); // 设置数据源 mediaPlayer.prepareAsync(); // 异步准备 @@ -306,10 +308,6 @@ public class MusicPlayerForegroundService extends Service { return fileName; } - //获取audioItem的名字 - public String getName() { - return mediaPlayer != null ? audioItem.getName() : null; - } //获取audioItem public AudioItem getAudioItem() { @@ -321,9 +319,14 @@ public class MusicPlayerForegroundService extends Service { return remainingTimeLiveData; // 提供LiveData访问 } - // 获取当前播放位置(毫秒) - public int getCurrentPosition() { - return mediaPlayer != null ? mediaPlayer.getCurrentPosition() : 0; + // 获取当前播放位置的 LiveData + public LiveData getCurrentPositionLiveData() { + return currentPosition; + } + + // 获取音频总时长的 LiveData + public LiveData getDurationLiveData() { + return duration; } // 获取音频总时长(毫秒) @@ -331,6 +334,27 @@ public class MusicPlayerForegroundService extends Service { return mediaPlayer != null ? mediaPlayer.getDuration() : 0; } + // 播放音频时更新进度 + public void startUpdatingProgress() { + // 获取音频总时长 + if (mediaPlayer != null) { + duration.postValue(mediaPlayer.getDuration()); + } + + // 使用 Handler 定时更新 currentPosition + Handler handler = new Handler(Looper.getMainLooper()); + Runnable runnable = new Runnable() { + @Override + public void run() { + if (mediaPlayer != null && mediaPlayer.isPlaying()) { + currentPosition.postValue(mediaPlayer.getCurrentPosition()); + handler.postDelayed(this, 1000); // 每隔1秒更新一次 + } + } + }; + handler.post(runnable); // 启动更新 + } + // 跳转到指定播放位置 public void seekTo(int position) { if (mediaPlayer != null) { diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java index b070bc0..23460b7 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_HomeActivity.java @@ -26,7 +26,6 @@ public class A_HomeActivity extends BaseActivity { private MusicPlayerForegroundService musicService; // 音乐播放服务 private boolean isBound = false; // 服务是否绑定 - private Handler progressHandler; // 用于更新进度的Handler private final int[] defaultIcons = {R.drawable.home_unselect, R.drawable.import_unselect}; // 默认图标 private final int[] selectedIcons = {R.drawable.home_select, R.drawable.import_select}; // 选中图标 @@ -43,8 +42,10 @@ public class A_HomeActivity extends BaseActivity { isBound = true; // 服务已绑定 Log.d("A_HomeActivity", "isBound"); updatePlayButtonState(); // 更新播放按钮状态 - startUpdatingProgress(); // 启动进度更新 + updateProgress(); // 启动进度更新 observeIsPlaying(); // 观察播放状态变化 + + musicService.getFileName().observe(A_HomeActivity.this, vb.topText::setText); // 设置标题 } @Override @@ -106,6 +107,7 @@ public class A_HomeActivity extends BaseActivity { musicService.resumeAudio(); // 恢复播放 } updatePlayButtonState(); // 更新播放按钮图标 + updateProgress(); } } @@ -120,35 +122,29 @@ public class A_HomeActivity extends BaseActivity { // 更新进度 private void updateProgress() { if (isBound && musicService != null) { - int currentPosition = musicService.getCurrentPosition(); // 当前播放位置 - int duration = musicService.getDuration(); // 音频总时长 - String fileName = musicService.getFileName().getValue(); // 当前文件名 - String name = musicService.getName();//// 当前文件名 + // 开始更新播放进度 + musicService.startUpdatingProgress(); - vb.bottomText1.setText(formatTime(currentPosition)); // 更新当前时间文本 - vb.bottomText2.setText(formatTime(duration)); // 更新总时间文本 - vb.topText.setText(name); // 更新文件名文本 + // 观察当前播放位置 + musicService.getCurrentPositionLiveData().observe(this, position -> { + if (musicService.getDurationLiveData().getValue() != null) { + int duration = musicService.getDurationLiveData().getValue(); + vb.bottomText1.setText(formatTime(position)); // 更新当前时间文本 - if (duration > 0) { - int progress = (int) ((currentPosition / (float) duration) * 100); // 计算进度 - vb.circularProgressBar.setProgress(progress); // 更新进度条 - } + if (duration > 0) { + int progress = (int) ((position / (float) duration) * 100); // 计算进度 + vb.circularProgressBar.setProgress(progress); // 更新进度条 + } + } + }); + + // 观察音频总时长 + musicService.getDurationLiveData().observe(this, duration -> { + vb.bottomText2.setText(formatTime(duration)); // 更新总时间文本 + }); } } - // 启动进度更新 - private void startUpdatingProgress() { - if (progressHandler != null) return; // 如果已存在Handler,则返回 - progressHandler = new Handler(Looper.getMainLooper()); - progressHandler.postDelayed(new Runnable() { - @Override - public void run() { - updateProgress(); // 更新进度 - progressHandler.postDelayed(this, 1000); // 每秒更新一次 - } - }, 1000); - } - // 观察播放状态变化 private void observeIsPlaying() { if (isBound && musicService != null) { @@ -216,9 +212,6 @@ public class A_HomeActivity extends BaseActivity { protected void onDestroy() { super.onDestroy(); unbindService(serviceConnection); // 解绑服务 - if (progressHandler != null) { - progressHandler.removeCallbacksAndMessages(null); // 移除所有回调 - } } // 格式化时间 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 ed3554e..cfdb627 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 @@ -46,13 +46,12 @@ public class A_PlayActivity extends BaseActivity { // 设置观察者 musicService.getIsPlaying().observe(A_PlayActivity.this, this::updatePlayButton); -// musicService.getFileName().observe(A_PlayActivity.this, vb.songTitle::setText); - vb.songTitle.setText(musicService.getName()); + musicService.getFileName().observe(A_PlayActivity.this, vb.songTitle::setText); // 更新进度条和时间 updateSeekBarAndTime(); // 添加这一行以确保服务连接时更新UI - startUpdatingProgress(); // 启动进度更新 + musicService.startUpdatingProgress(); // 启动进度更新 } @Override @@ -134,36 +133,33 @@ public class A_PlayActivity extends BaseActivity { musicService.resumeAudio(); } } + if (musicService != null) { + musicService.startUpdatingProgress(); + } }); vb.backButton.setOnClickListener(v -> finish()); // 返回按钮点击事件 } - // 启动进度更新 - private void startUpdatingProgress() { - if (progressHandler == null) { - progressHandler = new Handler(Looper.getMainLooper()); - progressHandler.postDelayed(new Runnable() { - @Override - public void run() { - updateSeekBarAndTime(); // 更新进度条和时间 - progressHandler.postDelayed(this, 1000); // 每秒更新 - } - }, 1000); - } - } // 更新进度条和时间显示 private void updateSeekBarAndTime() { - if (isBound && musicService != null && Boolean.TRUE.equals(musicService.getIsPlaying().getValue())) { - int currentPosition = musicService.getCurrentPosition(); // 当前播放进度 - int duration = musicService.getDuration(); // 音频总时长 - if (duration > 0) { - // 更新进度条和时间显示 - vb.songSeekbar.setProgress((int) ((currentPosition / (float) duration) * 100)); - vb.current.setText(formatTime(currentPosition)); + if (isBound && musicService != null) { + // 观察当前播放进度 + musicService.getCurrentPositionLiveData().observe(this, position -> { + if (musicService.getDurationLiveData().getValue() != null) { + int duration = musicService.getDurationLiveData().getValue(); + if (duration > 0) { + vb.songSeekbar.setProgress((int) ((position / (float) duration) * 100)); + vb.current.setText(formatTime(position)); + } + } + }); + + // 观察音频总时长 + musicService.getDurationLiveData().observe(this, duration -> { vb.time.setText(formatTime(duration)); - } + }); } } @@ -273,28 +269,6 @@ public class A_PlayActivity extends BaseActivity { bottomSheetDialog.show(); // 显示 BottomSheetDialog } - - // 格式化时间显示 - private String formatTime(int milliseconds) { - int minutes = (milliseconds / 1000) / 60; - int seconds = (milliseconds / 1000) % 60; - return String.format(Locale.getDefault(), "%d:%02d", minutes, seconds); - } - - - @Override - protected void onDestroy() { - super.onDestroy(); - if (isBound) { - unbindService(serviceConnection); // 解绑服务 - isBound = false; - } - if (progressHandler != null) { - progressHandler.removeCallbacksAndMessages(null); // 移除所有更新任务 - progressHandler = null; // 释放引用 - } - } - // 进度条的监听器 private class SeekBarListener implements SeekBar.OnSeekBarChangeListener { @@ -316,8 +290,17 @@ public class A_PlayActivity extends BaseActivity { @Override public void onStopTrackingTouch(SeekBar seekBar) { - startUpdatingProgress(); // 拖动结束后重新启动进度更新 + musicService.startUpdatingProgress(); + ; // 拖动结束后重新启动进度更新 } + + } + + // 格式化时间显示 + private String formatTime(int milliseconds) { + int minutes = (milliseconds / 1000) / 60; + int seconds = (milliseconds / 1000) % 60; + return String.format(Locale.getDefault(), "%d:%02d", minutes, seconds); } @Override @@ -334,4 +317,17 @@ public class A_PlayActivity extends BaseActivity { public void onClick(View v) { // 处理其他点击事件 } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (isBound) { + unbindService(serviceConnection); // 解绑服务 + isBound = false; + } + if (progressHandler != null) { + progressHandler.removeCallbacksAndMessages(null); // 移除所有更新任务 + progressHandler = null; // 释放引用 + } + } } diff --git a/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java index 8a7f124..85b7420 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/A_SettingActivity.java @@ -3,6 +3,7 @@ package com.hi.music.player.ui.activity; import android.view.View; import com.hi.music.player.databinding.ActivityAsettingBinding; +import com.hi.music.player.helper.SettingUtil; public class A_SettingActivity extends BaseActivity { @@ -20,6 +21,26 @@ public class A_SettingActivity extends BaseActivity { @Override protected void onInitClick() { + + vb.version.setText("Version: " + SettingUtil.getCurrentVersion(this)); + + vb.feedback.setOnClickListener(v -> { + SettingUtil.sendFeedback(this, "john.mckinley@examplepetstore.com", "Feedback"); + }); + + vb.share.setOnClickListener(v -> { + SettingUtil.shareApp(this); + }); + + vb.privacy.setOnClickListener(v -> { + SettingUtil.openPrivacyPolicy(this); + }); + + vb.terms.setOnClickListener(v -> { + SettingUtil.openTermsOfService(this); + }); + + } @Override 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 fc4e73a..8094c78 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 @@ -5,12 +5,14 @@ import static android.app.Activity.RESULT_OK; import android.Manifest; import android.app.AlertDialog; import android.content.Intent; +import android.content.UriPermission; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; @@ -71,14 +73,24 @@ public class A_ImportFragment extends BaseFragment { private void updateAudioList(List audioFiles) { adapter.setAudioFiles(audioFiles); + // 每次更新音频列表时,重新持久化权限 + for (AudioItem item : audioFiles) { + Uri audioUri = Uri.parse(item.getFile()); + checkPersistableUriPermission(audioUri); + } } private void initEvent() { + // 确保只设置一次点击事件 Vb.setting.setOnClickListener(v -> startActivity(new Intent(getContext(), A_SettingActivity.class))); - Vb.add.setOnClickListener(v -> checkAndOpenAudioPicker()); + Vb.add.setOnClickListener(v -> { + Log.d("A_ImportFragment", "Add button clicked"); // 添加调试日志 + checkAndOpenAudioPicker(); + }); adapter.setOnOptionClickListener(this::showPopupWindow); } + private void showPopupWindow(int position, String filePath, View anchorView) { // 膨胀 PopupWindow 的布局 View popupView = LayoutInflater.from(requireContext()).inflate(R.layout.options_popup_window, null); @@ -90,7 +102,6 @@ public class A_ImportFragment extends BaseFragment { true); // 设置背景为透明 -// popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); // 允许点击外部关闭 // 获取 PopupWindow 中的控件 @@ -109,12 +120,9 @@ public class A_ImportFragment extends BaseFragment { }); // 显示 PopupWindow,设置其位置 - int[] location = new int[2]; - anchorView.getLocationOnScreen(location); popupWindow.showAsDropDown(anchorView, 0, 10); // 在 anchorView 下方显示 } - private void showRenameDialog(int position) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.rename_dialog, null); @@ -129,10 +137,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(); subDialog.dismiss(); }); @@ -149,6 +154,7 @@ public class A_ImportFragment extends BaseFragment { } private void checkAndOpenAudioPicker() { + Log.d("A_ImportFragment", "checkAndOpenAudioPicker called"); // 添加调试日志 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED) { requestPermissions(Manifest.permission.READ_MEDIA_AUDIO); @@ -164,6 +170,7 @@ public class A_ImportFragment extends BaseFragment { } } + private void requestPermissions(String permission) { ActivityCompat.requestPermissions(requireActivity(), new String[]{permission}, REQUEST_CODE_READ_MEDIA_AUDIO); } @@ -173,6 +180,7 @@ public class A_ImportFragment extends BaseFragment { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_READ_MEDIA_AUDIO) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Log.d("A_ImportFragment", "Permission granted"); openAudioPicker(); } else { Toast.makeText(requireContext(), "Permission denied", Toast.LENGTH_SHORT).show(); @@ -180,6 +188,7 @@ public class A_ImportFragment extends BaseFragment { } } + private void openAudioPicker() { if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Toast.makeText(getContext(), "外部存储不可用", Toast.LENGTH_LONG).show(); @@ -200,7 +209,10 @@ public class A_ImportFragment extends BaseFragment { if (requestCode == REQUEST_CODE_PICK_AUDIO && resultCode == RESULT_OK && data != null) { Uri selectedAudioUri = data.getData(); if (selectedAudioUri != null) { - requireActivity().grantUriPermission(requireActivity().getPackageName(), selectedAudioUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + // 持久化 URI 访问权限 + requireActivity().getContentResolver().takePersistableUriPermission( + selectedAudioUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + try { viewModel.addAudioFile(selectedAudioUri); } catch (IOException e) { @@ -213,6 +225,26 @@ public class A_ImportFragment extends BaseFragment { @Override public void onResume() { super.onResume(); + // 检查所有音频文件的持久化权限 + for (AudioItem item : adapter.getAudioFiles()) { + Uri audioUri = Uri.parse(item.getFile()); + checkPersistableUriPermission(audioUri); + } observeAudioFiles(); } + + // 检查并持久化权限 + private void checkPersistableUriPermission(Uri uri) { + boolean hasPermission = false; + for (UriPermission permission : requireContext().getContentResolver().getPersistedUriPermissions()) { + if (permission.getUri().equals(uri) && permission.isReadPermission()) { + hasPermission = true; + break; + } + } + + if (!hasPermission) { + requireContext().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + } } diff --git a/app/src/main/res/layout/activity_aplay.xml b/app/src/main/res/layout/activity_aplay.xml index da9196d..cc6ae8b 100644 --- a/app/src/main/res/layout/activity_aplay.xml +++ b/app/src/main/res/layout/activity_aplay.xml @@ -83,7 +83,7 @@ android:layout_width="60dp" android:layout_height="60dp" android:layout_marginEnd="16dp" - android:background="@drawable/pause" + android:background="@drawable/play" app:layout_constraintBottom_toBottomOf="@+id/song_seekbar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/song_seekbar" /> diff --git a/app/src/main/res/layout/activity_asetting.xml b/app/src/main/res/layout/activity_asetting.xml index b12294f..1a0c1bb 100644 --- a/app/src/main/res/layout/activity_asetting.xml +++ b/app/src/main/res/layout/activity_asetting.xml @@ -43,6 +43,7 @@ - + android:layout_height="wrap_content" /> @@ -97,6 +98,7 @@ android:textSize="16sp" /> @@ -127,6 +129,7 @@ android:textSize="16sp" /> @@ -156,6 +159,7 @@ android:textSize="16sp" /> @@ -185,6 +189,7 @@ android:textSize="16sp" /> diff --git a/app/src/main/res/layout/fragment_a_import.xml b/app/src/main/res/layout/fragment_a_import.xml index 9495e53..8737d27 100644 --- a/app/src/main/res/layout/fragment_a_import.xml +++ b/app/src/main/res/layout/fragment_a_import.xml @@ -13,8 +13,8 @@ android:layout_marginStart="16dp" android:layout_marginTop="32sp" android:text="Parents voice" - android:textSize="32sp" android:textColor="@color/white" + android:textSize="32sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -33,8 +33,11 @@ + android:layout_height="0dp" + android:layout_marginBottom="16dp" + app:layout_constraintTop_toBottomOf="@+id/title" + app:layout_constraintBottom_toBottomOf="parent"/> + - + + + + + + diff --git a/app/src/main/res/layout/item_a_home_3.xml b/app/src/main/res/layout/item_a_home_3.xml index 9c5b3c2..fae54f7 100644 --- a/app/src/main/res/layout/item_a_home_3.xml +++ b/app/src/main/res/layout/item_a_home_3.xml @@ -9,7 +9,6 @@ android:id="@+id/card_view" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginStart="16dp" app:cardCornerRadius="10dp" app:cardElevation="0dp" app:layout_constraintBottom_toBottomOf="parent" @@ -25,7 +24,6 @@ - - + + + + + + + + +