diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt
index 3d147b820..2e84e1874 100644
--- a/app/src/main/java/io/legado/app/constant/PreferKey.kt
+++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt
@@ -251,6 +251,7 @@ object PreferKey {
const val showTip = "showTip"
const val sliderVibrator = "sliderVibrator"
+ const val selectVibrator = "selectVibrator"
const val audioCacheCleanTime = "audioCacheCleanTime"
const val audioPreDownloadNum = "audioPreDownloadNum"
}
diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt
index bd21465af..f360721c0 100644
--- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt
+++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt
@@ -990,6 +990,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
appCtx.putPrefBoolean(PreferKey.sliderVibrator, value)
}
+ var selectVibrator: Boolean
+ get() = appCtx.getPrefBoolean(PreferKey.selectVibrator, false)
+ set(value) {
+ appCtx.putPrefBoolean(PreferKey.selectVibrator, value)
+ }
+
val audioPreDownloadNum: Int
get() = appCtx.getPrefInt(PreferKey.audioPreDownloadNum, 10)
diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt
index 5cc1763b2..97fcbd7f5 100644
--- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt
+++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt
@@ -13,13 +13,13 @@ import android.graphics.drawable.TransitionDrawable
import android.icu.text.SimpleDateFormat
import android.os.Build
import android.os.Bundle
-import android.view.HapticFeedbackConstants
import android.view.Menu
import android.view.MenuItem
import androidx.activity.addCallback
import androidx.activity.viewModels
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.graphics.scale
+import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.transition.TransitionManager
@@ -43,7 +43,6 @@ import io.legado.app.databinding.ActivityAudioPlayBinding
import io.legado.app.help.book.isAudio
import io.legado.app.help.book.removeType
import io.legado.app.help.config.AppConfig
-import io.legado.app.lib.dialogs.alert
import io.legado.app.model.AudioPlay
import io.legado.app.model.BookCover
import io.legado.app.service.AudioPlayService
@@ -332,7 +331,7 @@ class AudioPlayActivity :
addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
- slider.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
+ slider.performHapticFeedback(HapticFeedbackConstantsCompat.VIRTUAL_KEY)
}
override fun onStopTrackingTouch(slider: Slider) {}
@@ -358,7 +357,7 @@ class AudioPlayActivity :
addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
- slider.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
+ slider.performHapticFeedback(HapticFeedbackConstantsCompat.VIRTUAL_KEY)
}
override fun onStopTrackingTouch(slider: Slider) {}
diff --git a/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/WebtoonRecyclerView.kt b/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/WebtoonRecyclerView.kt
index 0d1e10d8c..69b51abbe 100644
--- a/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/WebtoonRecyclerView.kt
+++ b/app/src/main/java/io/legado/app/ui/book/manga/recyclerview/WebtoonRecyclerView.kt
@@ -5,11 +5,11 @@ import android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
-import android.view.HapticFeedbackConstants
import android.view.MotionEvent
import android.view.ViewConfiguration
import android.view.animation.DecelerateInterpolator
import androidx.core.animation.doOnEnd
+import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.utils.findCenterViewPosition
@@ -255,7 +255,7 @@ class WebtoonRecyclerView @JvmOverloads constructor(
override fun onLongTapConfirmed(ev: MotionEvent) {
if (longTapListener?.invoke(ev) == true) {
- performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
+ performHapticFeedback(HapticFeedbackConstantsCompat.LONG_PRESS)
}
}
}
diff --git a/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt
index 465effd89..1cf616045 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt
@@ -8,6 +8,7 @@ import android.view.LayoutInflater
import android.view.animation.Animation
import android.widget.FrameLayout
import androidx.appcompat.widget.PopupMenu
+import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
import com.google.android.material.slider.Slider
@@ -20,7 +21,6 @@ import io.legado.app.model.ReadBook
import io.legado.app.model.ReadManga
import io.legado.app.ui.browser.WebViewActivity
import io.legado.app.utils.ConstraintModify
-import io.legado.app.utils.VibrationUtils
import io.legado.app.utils.activity
import io.legado.app.utils.applyNavigationBarPadding
import io.legado.app.utils.gone
@@ -242,16 +242,16 @@ class MangaMenu @JvmOverloads constructor(
ReadManga.moveToPrevChapter(true)
}
- seekReadPage.addOnChangeListener { slider, value, fromUser ->
+ seekReadPage.addOnChangeListener { _, value, fromUser ->
if (fromUser) {
- VibrationUtils.vibrate(context, 12)
+ HapticFeedbackConstantsCompat.TEXT_HANDLE_MOVE
callBack.skipToPage(value.toInt() - 1)
}
}
seekReadPage.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
- VibrationUtils.vibrate(context, 16)
+ HapticFeedbackConstantsCompat.TEXT_HANDLE_MOVE
vwMenuBg.setOnClickListener(null)
}
diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
index 7a4ef9309..ee1ac6095 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
@@ -18,6 +18,7 @@ import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.PopupMenu
+import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.core.view.get
import androidx.core.view.size
import androidx.lifecycle.lifecycleScope
@@ -939,7 +940,8 @@ class ReadBookActivity : BaseReadBookActivity(),
textMenuPosition.x = x
textMenuPosition.y = top
- root.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
+ if (AppConfig.selectVibrator)
+ root.performHapticFeedback(HapticFeedbackConstantsCompat.TEXT_HANDLE_MOVE)
}
/**
@@ -949,8 +951,8 @@ class ReadBookActivity : BaseReadBookActivity(),
cursorRight.x = x
cursorRight.y = y
cursorRight.visible(true)
-
- root.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
+ if (AppConfig.selectVibrator)
+ root.performHapticFeedback(HapticFeedbackConstantsCompat.TEXT_HANDLE_MOVE)
}
/**
diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt
index cec12e392..9eec0be62 100644
--- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt
+++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt
@@ -17,6 +17,7 @@ import androidx.annotation.OptIn
import androidx.appcompat.widget.PopupMenu
import androidx.core.graphics.ColorUtils
import androidx.core.graphics.toColorInt
+import androidx.core.view.HapticFeedbackConstantsCompat
import androidx.core.view.doOnAttach
import androidx.core.view.forEach
import androidx.core.view.isGone
@@ -42,7 +43,6 @@ import io.legado.app.model.ReadBook
import io.legado.app.ui.browser.WebViewActivity
import io.legado.app.ui.widget.seekbar.SeekBarChangeListener
import io.legado.app.utils.ConstraintModify
-import io.legado.app.utils.VibrationUtils
import io.legado.app.utils.activity
import io.legado.app.utils.applyNavigationBarPadding
import io.legado.app.utils.dpToPx
@@ -470,7 +470,7 @@ class ReadMenu @JvmOverloads constructor(
if (AppConfig.progressBarBehavior == "page")
ReadBook.skipToPage(value.toInt() - 1)
if (AppConfig.sliderVibrator)
- VibrationUtils.vibrate(context, 10)
+ HapticFeedbackConstantsCompat.TEXT_HANDLE_MOVE
}
}
diff --git a/app/src/main/java/io/legado/app/utils/VibrationUtils.kt b/app/src/main/java/io/legado/app/utils/VibrationUtils.kt
deleted file mode 100644
index 8bda5a5e9..000000000
--- a/app/src/main/java/io/legado/app/utils/VibrationUtils.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package io.legado.app.utils
-
-import android.content.Context
-import android.os.Build
-import android.os.VibrationEffect
-import android.os.Vibrator
-import android.os.VibratorManager
-
-object VibrationUtils {
-
- /**
- * 触发单次震动
- * @param context 上下文
- * @param milliseconds 震动时长(毫秒)
- */
- fun vibrate(context: Context, milliseconds: Long) {
- val vibrator = getVibrator(context)
- vibrator.vibrate(
- VibrationEffect.createOneShot(
- milliseconds,
- VibrationEffect.DEFAULT_AMPLITUDE
- )
- )
- }
-
- /**
- * 触发带模式的震动
- * @param context 上下文
- * @param pattern 震动模式数组(如 longArrayOf(0, 200, 100, 300))
- * @param repeat 重复次数(-1 为不重复)
- */
- fun vibratePattern(context: Context, pattern: LongArray, repeat: Int = -1) {
- val vibrator = getVibrator(context)
- vibrator.vibrate(VibrationEffect.createWaveform(pattern, repeat))
- }
-
- /**
- * 获取 Vibrator 实例(兼容 Android 12+)
- */
- private fun getVibrator(context: Context): Vibrator {
- return if (Build.VERSION.SDK_INT >= 31) {
- val vibratorManager =
- context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
- vibratorManager.defaultVibrator
- } else {
- @Suppress("DEPRECATION")
- context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index dd01fe5f2..2d73977a9 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1387,4 +1387,7 @@
点击图片行为
输出日志
启用渐变模糊
+ 选择文本时震动
+ 重新同步远程书籍
+ 离字间距
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e44da0849..a5e8782f4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1391,4 +1391,7 @@
点击图片行为
输出日志
启用渐变模糊
+ 选择文本时震动
+ 重新同步远程书籍
+ 离字间距
diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml
index 8beb351a6..cf1b38d6a 100644
--- a/app/src/main/res/xml/pref_config_read.xml
+++ b/app/src/main/res/xml/pref_config_read.xml
@@ -178,6 +178,12 @@
android:title="@string/enable_slider_vibrator"
app:isBottomBackground="true" />
+
+