diff --git a/README.md b/README.md index 642708b..edfa0c2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 风月读书,一款开源、无广告的小说阅读软件。 -成品下载【11.11 新增语音朗读】:[https://fycz.lanzoui.com/iETUwib10af](https://fycz.lanzoui.com/iETUwib10af) +成品下载【11.11 新增语音朗读】:[https://fycz.lanzoui.com/iZJVdib1fej](https://fycz.lanzoui.com/iZJVdib1fej) #### 一、关于书源 diff --git a/app/src/main/assets/updatelog.fy b/app/src/main/assets/updatelog.fy index 93164df..28416ab 100644 --- a/app/src/main/assets/updatelog.fy +++ b/app/src/main/assets/updatelog.fy @@ -1,5 +1,5 @@ 2020.11.12 -风月读书v1.20.1111208 +风月读书v1.20.1111209 1、修复语音朗读定时停止无效的bug 2、修复语音朗读时切换日夜间闪退的bug 3、修复安卓5进入字体界面闪退的bug diff --git a/app/src/main/java/xyz/fycz/myreader/ui/dialog/AudioPlayerDialog.java b/app/src/main/java/xyz/fycz/myreader/ui/dialog/AudioPlayerDialog.java new file mode 100644 index 0000000..5b89137 --- /dev/null +++ b/app/src/main/java/xyz/fycz/myreader/ui/dialog/AudioPlayerDialog.java @@ -0,0 +1,306 @@ +package xyz.fycz.myreader.ui.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.NumberPicker; +import android.widget.SeekBar; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatImageView; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import xyz.fycz.myreader.R; +import xyz.fycz.myreader.application.MyApplication; +import xyz.fycz.myreader.application.SysManager; +import xyz.fycz.myreader.model.audio.ReadAloudService; +import xyz.fycz.myreader.model.audio.ReadService; +import xyz.fycz.myreader.ui.activity.ReadActivity; +import xyz.fycz.myreader.util.DateHelper; +import xyz.fycz.myreader.util.SharedPreUtils; +import xyz.fycz.myreader.util.ToastUtils; +import xyz.fycz.myreader.util.utils.AudioMngHelper; +import xyz.fycz.myreader.widget.page.PageLoader; + +import static xyz.fycz.myreader.util.utils.StringUtils.getString; + +public class AudioPlayerDialog extends Dialog{ + private static final String TAG="AudioPlayerDialog"; + private PageLoader mPageLoader; + private ReadActivity mReadActivity; + private boolean aloudNextPage; + public ReadAloudService.Status aloudStatus = ReadAloudService.Status.STOP; + + private int volume; + private int pitch; + private int speechRate; + private int timer; + + @BindView(R.id.sb_volume_progress) + SeekBar sbVolume; + @BindView(R.id.sb_pitch_progress) + SeekBar sbPitch; + @BindView(R.id.sb_speech_rate_progress) + SeekBar sbSpeechRate; + @BindView(R.id.iv_go_tts_setting) + AppCompatImageView ivGoTTSSetting; + @BindView(R.id.iv_read_last_paragraph) + AppCompatImageView ivReadLastParagraph; + @BindView(R.id.iv_read_play_stop) + AppCompatImageView ivReadPlayStop; + @BindView(R.id.iv_read_next_paragraph) + AppCompatImageView ivReadNextParagraph; + @BindView(R.id.iv_read_stop) + AppCompatImageView ivReadStop; + @BindView(R.id.iv_read_timer) + AppCompatImageView ivReadTimer; + @BindView(R.id.iv_read_home) + AppCompatImageView ivReadHome; + + + public AudioPlayerDialog(@NonNull ReadActivity context, PageLoader mPageLoader) { + super(context); + mReadActivity = context; + this.mPageLoader = mPageLoader; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.diallog_audio_player); + ButterKnife.bind(this); + setUpWindow(); + initData(); + initWidget(); + readAloud(); + } + + @Override + protected void onStart() { + super.onStart(); + volume = AudioMngHelper.getInstance().get100CurrentVolume(); + sbVolume.setProgress(volume); + if (!ReadAloudService.running){ + readAloud(); + } + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (ReadAloudService.running){ + switch (keyCode) { + case KeyEvent.KEYCODE_VOLUME_UP: + return addOrSubVolume(true); + case KeyEvent.KEYCODE_VOLUME_DOWN: + return addOrSubVolume(false); + } + } + return super.onKeyDown(keyCode, event); + } + private void initData(){ + volume = AudioMngHelper.getInstance().get100CurrentVolume(); + pitch = SharedPreUtils.getInstance().getInt("readPitch", 10); + speechRate = SharedPreUtils.getInstance().getInt("speechRate", 10); + timer = SharedPreUtils.getInstance().getInt("timer", 10); + AudioMngHelper.getInstance().setVoiceStep100(5); + } + + private void initWidget() { + sbVolume.setProgress(volume); + sbPitch.setProgress(pitch); + sbSpeechRate.setProgress(speechRate); + SeekBarChangeListener seekBarChangeListener = new SeekBarChangeListener(); + sbVolume.setOnSeekBarChangeListener(seekBarChangeListener); + sbPitch.setOnSeekBarChangeListener(seekBarChangeListener); + sbSpeechRate.setOnSeekBarChangeListener(seekBarChangeListener); + } + + private class SeekBarChangeListener implements SeekBar.OnSeekBarChangeListener{ + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + int progress = seekBar.getProgress(); + switch (seekBar.getId()){ + case R.id.sb_volume_progress: + AudioMngHelper.getInstance().setVoice100(progress); + break; + case R.id.sb_pitch_progress: + SharedPreUtils.getInstance().putInt("readPitch", progress); + if (ReadAloudService.running) { + ReadAloudService.pause(mReadActivity); + ReadAloudService.resume(mReadActivity); + } + break; + case R.id.sb_speech_rate_progress: + SharedPreUtils.getInstance().putInt("speechRate", progress); + if (ReadAloudService.running) { + ReadAloudService.pause(mReadActivity); + ReadAloudService.resume(mReadActivity); + } + break; + } + } + } + + /** + * 设置Dialog显示的位置 + */ + private void setUpWindow() { + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = getContext().getResources().getDisplayMetrics().widthPixels; + lp.height = WindowManager.LayoutParams.WRAP_CONTENT; + lp.gravity = Gravity.BOTTOM; + lp.windowAnimations = R.style.dialogWindowAnim; + lp.dimAmount = 0f; + window.setAttributes(lp); + window.getDecorView().setBackgroundColor(getContext().getResources().getColor(R.color.read_menu_bg)); + } + + @OnClick({R.id.iv_read_play_stop, R.id.iv_read_last_paragraph, + R.id.iv_read_next_paragraph, R.id.iv_go_tts_setting, + R.id.iv_read_stop, R.id.iv_read_timer, R.id.iv_read_home}) + public void onClick(View view){ + //Log.d("onClick", String.valueOf(view.getId())); + switch (view.getId()){ + case R.id.iv_go_tts_setting: + ReadAloudService.toTTSSetting(mReadActivity); + break; + case R.id.iv_read_play_stop: + if (ReadAloudService.running) { + if (aloudStatus == ReadAloudService.Status.PLAY) { + ReadAloudService.pause(mReadActivity); + } else { + ReadAloudService.resume(mReadActivity); + } + }else { + readAloud(); + } + break; + case R.id.iv_read_last_paragraph: + ReadAloudService.lastP(mReadActivity); + break; + case R.id.iv_read_next_paragraph: + ReadAloudService.nextP(mReadActivity); + break; + case R.id.iv_read_timer: + View timer = LayoutInflater.from(getContext()).inflate(R.layout.dialog_hour_minute_picker, null, false); + NumberPicker hourPicker = timer.findViewById(R.id.hour_picker); + int hour = this.timer / 60; + int minute = this.timer % 60; + hourPicker.setMaxValue(24); + hourPicker.setMinValue(0); + hourPicker.setValue(hour); + NumberPicker minutePicker = timer.findViewById(R.id.minute_picker); + minutePicker.setMaxValue(59); + minutePicker.setMinValue(0); + minutePicker.setValue(minute); + MyAlertDialog.build(mReadActivity) + .setTitle("定时停止") + .setView(timer) + .setPositiveButton("确定", (dialog, which) -> { + this.timer = hourPicker.getValue() * 60 + minutePicker.getValue(); + SharedPreUtils.getInstance().putInt("timer", this.timer); + ReadAloudService.setTimer(mReadActivity, this.timer); + ToastUtils.showInfo("朗读将在" + hourPicker.getValue() + "时" + minutePicker.getValue() + "分钟后停止!"); + }).setNegativeButton("取消", null) + .show(); + break; + case R.id.iv_read_stop: + ReadAloudService.stop(mReadActivity); + dismiss(); + break; + case R.id.iv_read_home: + dismiss(); + mReadActivity.toggleMenu(true, true); + break; + } + } + + + public void readAloud() { + aloudNextPage = false; + String unReadContent = mPageLoader.getUnReadContent(); + ReadAloudService.setReadEvent(new ReadEvent()); + ReadAloudService.play(getContext(), unReadContent, + mPageLoader.getCollBook().getName(), + mPageLoader.getChapterCategory().get(mPageLoader.getChapterPos()).getTitle(), + mPageLoader.getPagePos()); + } + + public boolean addOrSubVolume(boolean isAdd){ + volume = isAdd ? AudioMngHelper.getInstance().addVoice100() : AudioMngHelper.getInstance().subVoice100(); + sbVolume.setProgress(volume); + return true; + } + + private class ReadEvent implements ReadAloudService.ReadEvent { + @Override + public void onEventOccur(String tag, Object event) { + switch (tag){ + case ReadAloudService.READ_ALOUD_START: + aloudNextPage = true; + if (mPageLoader != null) { + mPageLoader.readAloudStart((Integer) event); + } + break; + case ReadAloudService.READ_ALOUD_NUMBER: + if (mPageLoader != null && aloudNextPage) { + mPageLoader.readAloudLength((Integer) event); + } + break; + case ReadAloudService.ALOUD_STATE: + updateAloudState((ReadAloudService.Status) event); + break; + case ReadAloudService.ALOUD_TIMER: + break; + + } + } + + private void updateAloudState(ReadAloudService.Status status) { + aloudStatus = status; + if (!MyApplication.isDestroy(mReadActivity)) { + mReadActivity.autoPageStop(); + } + switch (status) { + case NEXT: + if (mPageLoader == null) { + ReadAloudService.stop(mReadActivity); + break; + } + if (!mPageLoader.skipNextChapter()) { + ReadAloudService.stop(mReadActivity); + } + break; + case PLAY: + ivReadPlayStop.setImageResource(R.drawable.ic_stop); + break; + case PAUSE: + ivReadPlayStop.setImageResource(R.drawable.ic_play); + break; + default: + ivReadPlayStop.setImageResource(R.drawable.ic_play); + mPageLoader.skipToPage(mPageLoader.getPagePos()); + } + } + } +} diff --git a/app/version_code.properties b/app/version_code.properties index 571fcc4..5fd1b6a 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -1,2 +1,2 @@ -#Thu Nov 12 08:45:48 CST 2020 +#Thu Nov 12 09:11:40 CST 2020 VERSION_CODE=157