diff --git a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt
index ce647f0..111db49 100644
--- a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt
+++ b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt
@@ -14,6 +14,7 @@ import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.PopupMenu
+import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toDrawable
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
@@ -26,6 +27,7 @@ import com.github.apognu.otter.repositories.FavoritedRepository
import com.github.apognu.otter.repositories.FavoritesRepository
import com.github.apognu.otter.repositories.Repository
import com.github.apognu.otter.utils.*
+import com.google.android.exoplayer2.Player
import com.preference.PowerPreference
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
@@ -300,6 +302,16 @@ class MainActivity : AppCompatActivity() {
}
}
+ now_playing_details_repeat?.let { now_playing_details_repeat ->
+ changeRepeatMode(Cache.get(this@MainActivity, "repeat")?.readLine()?.toInt() ?: 0)
+
+ now_playing_details_repeat.setOnClickListener {
+ val current = Cache.get(this@MainActivity, "repeat")?.readLine()?.toInt() ?: 0
+
+ changeRepeatMode((current + 1) % 3)
+ }
+ }
+
now_playing_details_info?.let { now_playing_details_info ->
now_playing_details_info.setOnClickListener {
PopupMenu(this@MainActivity, now_playing_details_info, Gravity.START, R.attr.actionOverflowMenuStyle, 0).apply {
@@ -397,4 +409,40 @@ class MainActivity : AppCompatActivity() {
}
}
}
+
+ private fun changeRepeatMode(index: Int) {
+ when (index) {
+ // From no repeat to repeat all
+ 0 -> {
+ Cache.set(this@MainActivity, "repeat", "0".toByteArray())
+
+ now_playing_details_repeat?.setImageResource(R.drawable.repeat)
+ now_playing_details_repeat?.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimaryDark))
+ now_playing_details_repeat?.alpha = 0.4f
+
+ CommandBus.send(Command.SetRepeatMode(Player.REPEAT_MODE_OFF))
+ }
+
+ // From repeat all to repeat one
+ 1 -> {
+ Cache.set(this@MainActivity, "repeat", "1".toByteArray())
+
+ now_playing_details_repeat?.setImageResource(R.drawable.repeat)
+ now_playing_details_repeat?.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary))
+ now_playing_details_repeat?.alpha = 1.0f
+
+ CommandBus.send(Command.SetRepeatMode(Player.REPEAT_MODE_ALL))
+ }
+
+ // From repeat one to no repeat
+ 2 -> {
+ Cache.set(this@MainActivity, "repeat", "2".toByteArray())
+ now_playing_details_repeat?.setImageResource(R.drawable.repeat_one)
+ now_playing_details_repeat?.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimary))
+ now_playing_details_repeat?.alpha = 1.0f
+
+ CommandBus.send(Command.SetRepeatMode(Player.REPEAT_MODE_ONE))
+ }
+ }
+ }
}
diff --git a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt
index fd6f8c9..22f6a0a 100644
--- a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt
+++ b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt
@@ -182,6 +182,8 @@ class PlayerService : Service() {
is Command.Seek -> progress(message.progress)
is Command.ClearQueue -> queue.clear()
+
+ is Command.SetRepeatMode -> player.repeatMode = message.mode
}
if (player.playWhenReady) {
diff --git a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt
index 65198bc..b451e71 100644
--- a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt
+++ b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt
@@ -25,6 +25,8 @@ sealed class Command {
class MoveFromQueue(val oldPosition: Int, val newPosition: Int) : Command()
object ClearQueue : Command()
+ class SetRepeatMode(val mode: Int) : Command()
+
class PlayTrack(val index: Int) : Command()
}
diff --git a/app/src/main/res/drawable/repeat.xml b/app/src/main/res/drawable/repeat.xml
new file mode 100644
index 0000000..e7c67d7
--- /dev/null
+++ b/app/src/main/res/drawable/repeat.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/repeat_one.xml b/app/src/main/res/drawable/repeat_one.xml
new file mode 100644
index 0000000..fc8c83a
--- /dev/null
+++ b/app/src/main/res/drawable/repeat_one.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/shuffle.xml b/app/src/main/res/drawable/shuffle.xml
new file mode 100644
index 0000000..ec80046
--- /dev/null
+++ b/app/src/main/res/drawable/shuffle.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout-land/partial_now_playing.xml b/app/src/main/res/layout-land/partial_now_playing.xml
index a466912..d8198a0 100644
--- a/app/src/main/res/layout-land/partial_now_playing.xml
+++ b/app/src/main/res/layout-land/partial_now_playing.xml
@@ -26,6 +26,7 @@
@@ -160,8 +163,8 @@
@@ -178,8 +181,8 @@
diff --git a/app/src/main/res/layout/partial_now_playing.xml b/app/src/main/res/layout/partial_now_playing.xml
index c797c49..aab9237 100644
--- a/app/src/main/res/layout/partial_now_playing.xml
+++ b/app/src/main/res/layout/partial_now_playing.xml
@@ -26,6 +26,7 @@
@@ -118,8 +121,8 @@
+ android:paddingTop="16dp">
@@ -219,14 +222,31 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/row_track.xml b/app/src/main/res/layout/row_track.xml
index c2045a9..01c33ed 100644
--- a/app/src/main/res/layout/row_track.xml
+++ b/app/src/main/res/layout/row_track.xml
@@ -59,16 +59,18 @@
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index f36cb28..ae07b65 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -59,7 +59,7 @@