|
|
@ -27,7 +27,10 @@ import com.github.apognu.otter.repositories.FavoritedRepository |
|
|
|
import com.github.apognu.otter.repositories.FavoritesRepository |
|
|
|
import com.github.apognu.otter.repositories.FavoritesRepository |
|
|
|
import com.github.apognu.otter.repositories.Repository |
|
|
|
import com.github.apognu.otter.repositories.Repository |
|
|
|
import com.github.apognu.otter.utils.* |
|
|
|
import com.github.apognu.otter.utils.* |
|
|
|
|
|
|
|
import com.github.kittinunf.fuel.Fuel |
|
|
|
|
|
|
|
import com.github.kittinunf.fuel.coroutines.awaitStringResponse |
|
|
|
import com.google.android.exoplayer2.Player |
|
|
|
import com.google.android.exoplayer2.Player |
|
|
|
|
|
|
|
import com.google.gson.Gson |
|
|
|
import com.preference.PowerPreference |
|
|
|
import com.preference.PowerPreference |
|
|
|
import com.squareup.picasso.Picasso |
|
|
|
import com.squareup.picasso.Picasso |
|
|
|
import kotlinx.android.synthetic.main.activity_main.* |
|
|
|
import kotlinx.android.synthetic.main.activity_main.* |
|
|
@ -236,8 +239,56 @@ class MainActivity : AppCompatActivity() { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
is Event.TrackPlayed -> { |
|
|
|
is Event.TrackPlayed -> refreshCurrentTrack(message.track) |
|
|
|
message.track?.let { track -> |
|
|
|
is Event.RefreshTrack -> refreshCurrentTrack(message.track) |
|
|
|
|
|
|
|
is Event.TrackFinished -> incrementListenCount(message.track) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
is Event.StateChanged -> { |
|
|
|
|
|
|
|
when (message.playing) { |
|
|
|
|
|
|
|
true -> { |
|
|
|
|
|
|
|
now_playing_toggle.icon = getDrawable(R.drawable.pause) |
|
|
|
|
|
|
|
now_playing_details_toggle.icon = getDrawable(R.drawable.pause) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
false -> { |
|
|
|
|
|
|
|
now_playing_toggle.icon = getDrawable(R.drawable.play) |
|
|
|
|
|
|
|
now_playing_details_toggle.icon = getDrawable(R.drawable.play) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
is Event.QueueChanged -> { |
|
|
|
|
|
|
|
findViewById<View>(R.id.nav_queue)?.let { view -> |
|
|
|
|
|
|
|
ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 360f).let { |
|
|
|
|
|
|
|
it.duration = 500 |
|
|
|
|
|
|
|
it.interpolator = AccelerateDecelerateInterpolator() |
|
|
|
|
|
|
|
it.start() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GlobalScope.launch(Main) { |
|
|
|
|
|
|
|
ProgressBus.get().collect { (current, duration, percent) -> |
|
|
|
|
|
|
|
now_playing_progress.progress = percent |
|
|
|
|
|
|
|
now_playing_details_progress.progress = percent |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val currentMins = (current / 1000) / 60 |
|
|
|
|
|
|
|
val currentSecs = (current / 1000) % 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val durationMins = duration / 60 |
|
|
|
|
|
|
|
val durationSecs = duration % 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
now_playing_details_progress_current.text = "%02d:%02d".format(currentMins, currentSecs) |
|
|
|
|
|
|
|
now_playing_details_progress_duration.text = "%02d:%02d".format(durationMins, durationSecs) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun refreshCurrentTrack(track: Track?) { |
|
|
|
|
|
|
|
track?.let { track -> |
|
|
|
if (now_playing.visibility == View.GONE) { |
|
|
|
if (now_playing.visibility == View.GONE) { |
|
|
|
now_playing.visibility = View.VISIBLE |
|
|
|
now_playing.visibility = View.VISIBLE |
|
|
|
now_playing.alpha = 0f |
|
|
|
now_playing.alpha = 0f |
|
|
@ -367,50 +418,6 @@ class MainActivity : AppCompatActivity() { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
is Event.StateChanged -> { |
|
|
|
|
|
|
|
when (message.playing) { |
|
|
|
|
|
|
|
true -> { |
|
|
|
|
|
|
|
now_playing_toggle.icon = getDrawable(R.drawable.pause) |
|
|
|
|
|
|
|
now_playing_details_toggle.icon = getDrawable(R.drawable.pause) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
false -> { |
|
|
|
|
|
|
|
now_playing_toggle.icon = getDrawable(R.drawable.play) |
|
|
|
|
|
|
|
now_playing_details_toggle.icon = getDrawable(R.drawable.play) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
is Event.QueueChanged -> { |
|
|
|
|
|
|
|
findViewById<View>(R.id.nav_queue)?.let { view -> |
|
|
|
|
|
|
|
ObjectAnimator.ofFloat(view, View.ROTATION, 0f, 360f).let { |
|
|
|
|
|
|
|
it.duration = 500 |
|
|
|
|
|
|
|
it.interpolator = AccelerateDecelerateInterpolator() |
|
|
|
|
|
|
|
it.start() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GlobalScope.launch(Main) { |
|
|
|
|
|
|
|
ProgressBus.get().collect { (current, duration, percent) -> |
|
|
|
|
|
|
|
now_playing_progress.progress = percent |
|
|
|
|
|
|
|
now_playing_details_progress.progress = percent |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val currentMins = (current / 1000) / 60 |
|
|
|
|
|
|
|
val currentSecs = (current / 1000) % 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val durationMins = duration / 60 |
|
|
|
|
|
|
|
val durationSecs = duration % 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
now_playing_details_progress_current.text = "%02d:%02d".format(currentMins, currentSecs) |
|
|
|
|
|
|
|
now_playing_details_progress_duration.text = "%02d:%02d".format(durationMins, durationSecs) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun changeRepeatMode(index: Int) { |
|
|
|
private fun changeRepeatMode(index: Int) { |
|
|
|
when (index) { |
|
|
|
when (index) { |
|
|
|
// From no repeat to repeat all |
|
|
|
// From no repeat to repeat all |
|
|
@ -446,4 +453,17 @@ class MainActivity : AppCompatActivity() { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun incrementListenCount(track: Track?) { |
|
|
|
|
|
|
|
track?.let { track -> |
|
|
|
|
|
|
|
GlobalScope.launch(IO) { |
|
|
|
|
|
|
|
Fuel |
|
|
|
|
|
|
|
.post(mustNormalizeUrl("/api/v1/history/listenings/")) |
|
|
|
|
|
|
|
.authorize() |
|
|
|
|
|
|
|
.header("Content-Type", "application/json") |
|
|
|
|
|
|
|
.body(Gson().toJson(mapOf("track" to track.id))) |
|
|
|
|
|
|
|
.awaitStringResponse() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|