Removed favorite icon from mini player
This commit is contained in:
parent
01804b7829
commit
8690cf5159
12 changed files with 168 additions and 183 deletions
|
@ -13,7 +13,7 @@ android {
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
|
|
||||||
applicationId "code.name.monkey.retromusic"
|
applicationId "code.name.monkey.retromusic"
|
||||||
versionCode 355
|
versionCode 357
|
||||||
versionName '3.3.200'
|
versionName '3.3.200'
|
||||||
|
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -53,7 +53,7 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpda
|
||||||
setUpMiniPlayer()
|
setUpMiniPlayer()
|
||||||
|
|
||||||
miniPlayerImage.setOnClickListener {
|
miniPlayerImage.setOnClickListener {
|
||||||
toggleFavorite(MusicPlayerRemote.currentSong)
|
//toggleFavorite(MusicPlayerRemote.currentSong)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RetroUtil.isTablet()) {
|
if (RetroUtil.isTablet()) {
|
||||||
|
@ -100,12 +100,12 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(), MusicProgressViewUpda
|
||||||
override fun onServiceConnected() {
|
override fun onServiceConnected() {
|
||||||
updateSongTitle()
|
updateSongTitle()
|
||||||
updatePlayPauseDrawableState()
|
updatePlayPauseDrawableState()
|
||||||
updateIsFavorite()
|
//updateIsFavorite()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPlayingMetaChanged() {
|
override fun onPlayingMetaChanged() {
|
||||||
updateSongTitle()
|
updateSongTitle()
|
||||||
updateIsFavorite()
|
//updateIsFavorite()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPlayStateChanged() {
|
override fun onPlayStateChanged() {
|
||||||
|
|
|
@ -12,36 +12,32 @@
|
||||||
* See the GNU General Public License for more details.
|
* See the GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package code.name.monkey.retromusic.service;
|
package code.name.monkey.retromusic.service
|
||||||
|
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver
|
||||||
import android.os.Handler;
|
import android.os.Handler
|
||||||
|
|
||||||
public class MediaStoreObserver extends ContentObserver implements Runnable {
|
class MediaStoreObserver(
|
||||||
// milliseconds to delay before calling refresh to aggregate events
|
private val musicService: MusicService,
|
||||||
private static final long REFRESH_DELAY = 500;
|
private val mHandler: Handler
|
||||||
private final MusicService musicService;
|
) : ContentObserver(mHandler), Runnable {
|
||||||
private Handler mHandler;
|
|
||||||
|
|
||||||
MediaStoreObserver(MusicService musicService, Handler handler) {
|
override fun onChange(selfChange: Boolean) {
|
||||||
super(handler);
|
|
||||||
this.musicService = musicService;
|
|
||||||
mHandler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onChange(boolean selfChange) {
|
|
||||||
// if a change is detected, remove any scheduled callback
|
// if a change is detected, remove any scheduled callback
|
||||||
// then post a new one. This is intended to prevent closely
|
// then post a new one. This is intended to prevent closely
|
||||||
// spaced events from generating multiple refresh calls
|
// spaced events from generating multiple refresh calls
|
||||||
mHandler.removeCallbacks(this);
|
mHandler.removeCallbacks(this)
|
||||||
mHandler.postDelayed(this, REFRESH_DELAY);
|
mHandler.postDelayed(this, REFRESH_DELAY)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
override fun run() {
|
||||||
public void run() {
|
|
||||||
// actually call refresh when the delayed callback fires
|
// actually call refresh when the delayed callback fires
|
||||||
// do not send a sticky broadcast here
|
// do not send a sticky broadcast here
|
||||||
musicService.handleAndSendChangeInternal(MusicService.MEDIA_STORE_CHANGED);
|
musicService.handleAndSendChangeInternal(MusicService.MEDIA_STORE_CHANGED)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
// milliseconds to delay before calling refresh to aggregate events
|
||||||
|
private val REFRESH_DELAY: Long = 500
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1088,6 +1088,7 @@ public class MusicService extends MediaBrowserServiceCompat implements SharedPre
|
||||||
try {
|
try {
|
||||||
int newPosition = playback.seek(millis);
|
int newPosition = playback.seek(millis);
|
||||||
throttledSeekHandler.notifySeek();
|
throttledSeekHandler.notifySeek();
|
||||||
|
updateMediaSessionPlaybackState();
|
||||||
return newPosition;
|
return newPosition;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 Hemanth Savarala.
|
|
||||||
*
|
|
||||||
* Licensed under the GNU General Public License v3
|
|
||||||
*
|
|
||||||
* This is free software: you can redistribute it and/or modify it under
|
|
||||||
* the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package code.name.monkey.retromusic.service;
|
|
||||||
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.Message;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
|
|
||||||
import static code.name.monkey.retromusic.service.MusicService.SAVE_QUEUES;
|
|
||||||
|
|
||||||
class QueueSaveHandler extends Handler {
|
|
||||||
@NonNull
|
|
||||||
private final WeakReference<MusicService> mService;
|
|
||||||
|
|
||||||
QueueSaveHandler(final MusicService service, @NonNull final Looper looper) {
|
|
||||||
super(looper);
|
|
||||||
mService = new WeakReference<>(service);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handleMessage(@NonNull Message msg) {
|
|
||||||
final MusicService service = mService.get();
|
|
||||||
if (msg.what == SAVE_QUEUES) {
|
|
||||||
service.saveQueuesImpl();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Hemanth Savarala.
|
||||||
|
*
|
||||||
|
* Licensed under the GNU General Public License v3
|
||||||
|
*
|
||||||
|
* This is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package code.name.monkey.retromusic.service
|
||||||
|
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import android.os.Message
|
||||||
|
import code.name.monkey.retromusic.service.MusicService.SAVE_QUEUES
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
|
internal class QueueSaveHandler(
|
||||||
|
musicService: MusicService,
|
||||||
|
looper: Looper
|
||||||
|
) : Handler(looper) {
|
||||||
|
private val service: WeakReference<MusicService> = WeakReference(musicService)
|
||||||
|
|
||||||
|
override fun handleMessage(msg: Message) {
|
||||||
|
val service: MusicService? = service.get()
|
||||||
|
if (msg.what == SAVE_QUEUES) {
|
||||||
|
service?.saveQueuesImpl()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 Hemanth Savarala.
|
|
||||||
*
|
|
||||||
* Licensed under the GNU General Public License v3
|
|
||||||
*
|
|
||||||
* This is free software: you can redistribute it and/or modify it under
|
|
||||||
* the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package code.name.monkey.retromusic.service;
|
|
||||||
|
|
||||||
import code.name.monkey.retromusic.helper.StopWatch;
|
|
||||||
import code.name.monkey.retromusic.model.Song;
|
|
||||||
|
|
||||||
public class SongPlayCountHelper {
|
|
||||||
public static final String TAG = SongPlayCountHelper.class.getSimpleName();
|
|
||||||
|
|
||||||
private StopWatch stopWatch = new StopWatch();
|
|
||||||
private Song song = Song.getEmptySong();
|
|
||||||
|
|
||||||
public Song getSong() {
|
|
||||||
return song;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean shouldBumpPlayCount() {
|
|
||||||
return song.getDuration() * 0.5d < stopWatch.getElapsedTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
void notifySongChanged(Song song) {
|
|
||||||
synchronized (this) {
|
|
||||||
stopWatch.reset();
|
|
||||||
this.song = song;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void notifyPlayStateChanged(boolean isPlaying) {
|
|
||||||
synchronized (this) {
|
|
||||||
if (isPlaying) {
|
|
||||||
stopWatch.start();
|
|
||||||
} else {
|
|
||||||
stopWatch.pause();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Hemanth Savarala.
|
||||||
|
*
|
||||||
|
* Licensed under the GNU General Public License v3
|
||||||
|
*
|
||||||
|
* This is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package code.name.monkey.retromusic.service
|
||||||
|
|
||||||
|
import code.name.monkey.retromusic.helper.StopWatch
|
||||||
|
import code.name.monkey.retromusic.model.Song
|
||||||
|
|
||||||
|
class SongPlayCountHelper {
|
||||||
|
|
||||||
|
private val stopWatch = StopWatch()
|
||||||
|
var song = Song.emptySong
|
||||||
|
private set
|
||||||
|
|
||||||
|
fun shouldBumpPlayCount(): Boolean {
|
||||||
|
return song.duration * 0.5 < stopWatch.elapsedTime
|
||||||
|
}
|
||||||
|
|
||||||
|
fun notifySongChanged(song: Song) {
|
||||||
|
synchronized(this) {
|
||||||
|
stopWatch.reset()
|
||||||
|
this.song = song
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun notifyPlayStateChanged(isPlaying: Boolean) {
|
||||||
|
synchronized(this) {
|
||||||
|
if (isPlaying) {
|
||||||
|
stopWatch.start()
|
||||||
|
} else {
|
||||||
|
stopWatch.pause()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val TAG: String = SongPlayCountHelper::class.java.simpleName
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 Hemanth Savarala.
|
|
||||||
*
|
|
||||||
* Licensed under the GNU General Public License v3
|
|
||||||
*
|
|
||||||
* This is free software: you can redistribute it and/or modify it under
|
|
||||||
* the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package code.name.monkey.retromusic.service;
|
|
||||||
|
|
||||||
|
|
||||||
import android.os.Handler;
|
|
||||||
|
|
||||||
import static code.name.monkey.retromusic.service.MusicService.PLAY_STATE_CHANGED;
|
|
||||||
|
|
||||||
public class ThrottledSeekHandler implements Runnable {
|
|
||||||
// milliseconds to throttle before calling run() to aggregate events
|
|
||||||
private static final long THROTTLE = 500;
|
|
||||||
private final MusicService musicService;
|
|
||||||
private Handler handler;
|
|
||||||
|
|
||||||
ThrottledSeekHandler(MusicService musicService, Handler handler) {
|
|
||||||
this.musicService = musicService;
|
|
||||||
this.handler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
void notifySeek() {
|
|
||||||
handler.removeCallbacks(this);
|
|
||||||
handler.postDelayed(this, THROTTLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
musicService.savePositionInTrack();
|
|
||||||
musicService.sendPublicIntent(PLAY_STATE_CHANGED); // for musixmatch synced lyrics
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 Hemanth Savarala.
|
||||||
|
*
|
||||||
|
* Licensed under the GNU General Public License v3
|
||||||
|
*
|
||||||
|
* This is free software: you can redistribute it and/or modify it under
|
||||||
|
* the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package code.name.monkey.retromusic.service
|
||||||
|
|
||||||
|
|
||||||
|
import android.os.Handler
|
||||||
|
|
||||||
|
import code.name.monkey.retromusic.service.MusicService.PLAY_STATE_CHANGED
|
||||||
|
|
||||||
|
class ThrottledSeekHandler(
|
||||||
|
private val musicService: MusicService,
|
||||||
|
private val handler: Handler
|
||||||
|
) : Runnable {
|
||||||
|
|
||||||
|
fun notifySeek() {
|
||||||
|
handler.removeCallbacks(this)
|
||||||
|
handler.postDelayed(this, THROTTLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun run() {
|
||||||
|
musicService.savePositionInTrack()
|
||||||
|
musicService.sendPublicIntent(PLAY_STATE_CHANGED) // for musixmatch synced lyrics
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
// milliseconds to throttle before calling run() to aggregate events
|
||||||
|
private val THROTTLE: Long = 500
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,46 +12,44 @@
|
||||||
* See the GNU General Public License for more details.
|
* See the GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package code.name.monkey.retromusic.service.playback;
|
package code.name.monkey.retromusic.service.playback
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
|
|
||||||
public interface Playback {
|
interface Playback {
|
||||||
|
|
||||||
boolean setDataSource(String path);
|
val isInitialized: Boolean
|
||||||
|
|
||||||
void setNextDataSource(@Nullable String path);
|
val isPlaying: Boolean
|
||||||
|
|
||||||
void setCallbacks(PlaybackCallbacks callbacks);
|
val audioSessionId: Int
|
||||||
|
|
||||||
boolean isInitialized();
|
fun setDataSource(path: String): Boolean
|
||||||
|
|
||||||
boolean start();
|
fun setNextDataSource(path: String?)
|
||||||
|
|
||||||
void stop();
|
fun setCallbacks(callbacks: PlaybackCallbacks)
|
||||||
|
|
||||||
void release();
|
fun start(): Boolean
|
||||||
|
|
||||||
boolean pause();
|
fun stop()
|
||||||
|
|
||||||
boolean isPlaying();
|
fun release()
|
||||||
|
|
||||||
int duration();
|
fun pause(): Boolean
|
||||||
|
|
||||||
int position();
|
fun duration(): Int
|
||||||
|
|
||||||
int seek(int whereto);
|
fun position(): Int
|
||||||
|
|
||||||
boolean setVolume(float vol);
|
fun seek(whereto: Int): Int
|
||||||
|
|
||||||
boolean setAudioSessionId(int sessionId);
|
fun setVolume(vol: Float): Boolean
|
||||||
|
|
||||||
int getAudioSessionId();
|
fun setAudioSessionId(sessionId: Int): Boolean
|
||||||
|
|
||||||
interface PlaybackCallbacks {
|
interface PlaybackCallbacks {
|
||||||
void onTrackWentToNext();
|
fun onTrackWentToNext()
|
||||||
|
|
||||||
void onTrackEnded();
|
fun onTrackEnded()
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue