diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index e450294c1f..28242627e8 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -2,12 +2,12 @@ name: Android CI on: push: - branches: [ dev ] pull_request: - branches: [ dev ] + workflow_dispatch: jobs: check: + if: false runs-on: ubuntu-latest timeout-minutes: 10 steps: diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml new file mode 100644 index 0000000000..fd5e4e1f7c --- /dev/null +++ b/.github/workflows/compile.yml @@ -0,0 +1,23 @@ +name: Compile and Upload +on: + push: + workflow_dispatch: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + + - name: Checkout the code + uses: actions/checkout@v3 + + - name: Build the app + run: | + chmod +x gradlew + ./gradlew build + + - name: Upload Release + uses: softprops/action-gh-release@v0.1.14 + with: + files: app/build/outputs/apk/release/*.apk diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt index 31032f62b3..aa3ff4eda6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -133,6 +133,7 @@ const val EXPAND_NOW_PLAYING_PANEL = "expand_now_playing_panel" const val EXTRA_ARTIST_NAME = "extra_artist_name" const val TOGGLE_SUGGESTIONS = "toggle_suggestions" const val AUDIO_FADE_DURATION = "audio_fade_duration" +const val MANAGE_HAPTIC_GENERATOR = "manage_haptic_generator" const val CROSS_FADE_DURATION = "cross_fade_duration" const val SHOW_LYRICS = "show_lyrics" const val REMEMBER_LAST_TAB = "remember_last_tab" @@ -151,4 +152,4 @@ const val CIRCLE_PLAY_BUTTON = "circle_play_button" const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing" const val PAUSE_HISTORY = "pause_history" const val MANAGE_AUDIO_FOCUS = "manage_audio_focus" -const val SWIPE_DOWN_DISMISS = "swipe_to_dismiss" \ No newline at end of file +const val SWIPE_DOWN_DISMISS = "swipe_to_dismiss" diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt index a29122a68f..10cc093576 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt @@ -15,14 +15,18 @@ package code.name.monkey.retromusic.service import android.content.Context import android.media.MediaPlayer +import android.media.audiofx.HapticGenerator +import android.os.Build import android.os.PowerManager import android.util.Log +import androidx.annotation.RequiresApi import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.extensions.uri import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.PreferenceUtil.isGapLessPlayback +import code.name.monkey.retromusic.util.PreferenceUtil.isHapticGeneratorActive import code.name.monkey.retromusic.util.logE /** @@ -30,6 +34,8 @@ import code.name.monkey.retromusic.util.logE */ class MultiPlayer(context: Context) : LocalPlayback(context) { private var mCurrentMediaPlayer = MediaPlayer() + @RequiresApi(Build.VERSION_CODES.S) + private var hapticGenerator: HapticGenerator? = null private var mNextMediaPlayer: MediaPlayer? = null override var callbacks: PlaybackCallbacks? = null @@ -117,10 +123,15 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { /** * Starts or resumes playback. */ + @RequiresApi(Build.VERSION_CODES.S) override fun start(): Boolean { super.start() return try { mCurrentMediaPlayer.start() + if (isHapticGeneratorActive) { + hapticGenerator = HapticGenerator.create(audioSessionId) + hapticGenerator?.setEnabled(true) + } true } catch (e: IllegalStateException) { false @@ -139,19 +150,23 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { /** * Releases resources associated with this MediaPlayer object. */ + @RequiresApi(Build.VERSION_CODES.S) override fun release() { stop() mCurrentMediaPlayer.release() mNextMediaPlayer?.release() + hapticGenerator?.release() } /** * Pauses playback. Call start() to resume. */ + @RequiresApi(Build.VERSION_CODES.S) override fun pause(): Boolean { super.pause() return try { mCurrentMediaPlayer.pause() + hapticGenerator?.release() true } catch (e: IllegalStateException) { false diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index 13f4f3948e..e3cddcea40 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -330,6 +330,9 @@ object PreferenceUtil { MANAGE_AUDIO_FOCUS, false ) + val isHapticGeneratorActive + get() = sharedPreferences.getBoolean(MANAGE_HAPTIC_GENERATOR, false) + val isLockScreen get() = sharedPreferences.getBoolean(LOCK_SCREEN, false) var lyricsOption diff --git a/app/src/main/res/drawable/ic_spatial_speaker.xml b/app/src/main/res/drawable/ic_spatial_speaker.xml new file mode 100644 index 0000000000..917a1fc98c --- /dev/null +++ b/app/src/main/res/drawable/ic_spatial_speaker.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9609c7c19..40f115e9e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -83,6 +83,7 @@ Artists Audio fade duration Audio focus denied. + Manage Haptic Generator Change the sound settings and adjust the equalizer controls Auto Backup and restore your settings, playlists @@ -343,6 +344,7 @@ Show Album Artists in the Artist category Lower the volume when a system sound is played or a notification is received Fade audio when song is paused or played + Sync the haptic motor to the music The content of blacklisted folders is hidden from your library. Start playing as soon as connected to bluetooth device Blur the album cover on the lockscreen. Can cause problems with third party apps and widgets @@ -383,6 +385,7 @@ Header style Reduce volume on focus loss Fade audio + Enable haptics Auto-download artist images Blacklist Bluetooth playback diff --git a/app/src/main/res/xml/pref_audio.xml b/app/src/main/res/xml/pref_audio.xml index 6bf54069c9..9e5e9a2c5c 100755 --- a/app/src/main/res/xml/pref_audio.xml +++ b/app/src/main/res/xml/pref_audio.xml @@ -16,6 +16,14 @@ android:summary="@string/pref_summary_manage_audio_focus" android:title="@string/pref_title_manage_audio_focus" /> + + - \ No newline at end of file +