diff --git a/Squeezer/src/main/AndroidManifest.xml b/Squeezer/src/main/AndroidManifest.xml
index 5b3d95812..20110d06c 100644
--- a/Squeezer/src/main/AndroidManifest.xml
+++ b/Squeezer/src/main/AndroidManifest.xml
@@ -132,6 +132,11 @@
android:theme="@style/Theme.MaterialComponents.NoActionBar">
+
+
+
diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/NowPlayingFragment.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/NowPlayingFragment.java
index 003a23830..d68e9e9a1 100644
--- a/Squeezer/src/main/java/uk/org/ngo/squeezer/NowPlayingFragment.java
+++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/NowPlayingFragment.java
@@ -527,6 +527,8 @@ public boolean onSwipeUp() {
@UiThread
private void updatePlayPauseIcon(@PlayerState.PlayState String playStatus) {
playPauseButton.setIconResource((PlayerState.PLAY_STATE_PLAY.equals(playStatus)) ? R.drawable.ic_action_pause : R.drawable.ic_action_play);
+ // send a signal to the screensaver timers to start or stop count down
+ mActivity.setNotplayingTimer((PlayerState.PLAY_STATE_PLAY.equals(playStatus)) ? false : true);
}
@UiThread
diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/Preferences.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/Preferences.java
index 5a633b66c..8de464688 100644
--- a/Squeezer/src/main/java/uk/org/ngo/squeezer/Preferences.java
+++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/Preferences.java
@@ -172,6 +172,9 @@ public final class Preferences {
// Preferred UI theme.
static final String KEY_ON_THEME_SELECT_ACTION = "squeezer.theme";
+ // Behavior of NowPlaying screen
+ public static final String KEY_ON_NOW_PLAYING_SELECT = "squeezer.always_to_nowplaying";
+
// Screensaver
public static final String KEY_SCREENSAVER = "squeezer.screensaver";
@@ -536,6 +539,14 @@ public void setTheme(ThemeManager.Theme theme) {
sharedPreferences.edit().putString(Preferences.KEY_ON_THEME_SELECT_ACTION, theme.name()).apply();
}
+ public boolean isNowPlayingSwitching() {
+ return sharedPreferences.getBoolean(KEY_ON_NOW_PLAYING_SELECT, false);
+ }
+
+ public void setNowPlayingSwitching(boolean b) {
+ sharedPreferences.edit().putBoolean(Preferences.KEY_ON_NOW_PLAYING_SELECT, b).apply();
+ }
+
public ScreensaverMode getScreensaverMode() {
String string = sharedPreferences.getString(KEY_SCREENSAVER, null);
return string == null ? ScreensaverMode.OFF : ScreensaverMode.valueOf(string);
@@ -892,9 +903,12 @@ public boolean isAll() {
}
public enum ScreensaverMode implements EnumWithText {
- OFF(R.string.settings_screensaver_off),
ON(R.string.settings_screensaver_on),
- CLOCK(R.string.settings_screensaver_clock);
+ OFF(R.string.settings_screensaver_off),
+ OFF_NOTPLAYING(R.string.settings_screensaver_off_whenNotPlaying),
+ CLOCK(R.string.settings_screensaver_clock),
+ CLOCK_NOTPLAYING(R.string.settings_screensaver_clock_whenNotPlaying);
+
private final int labelId;
diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsFragment.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsFragment.java
index 7bd403b8f..eb914cc9e 100644
--- a/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsFragment.java
+++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsFragment.java
@@ -185,6 +185,9 @@ private void fillDisplayPreferences(Preferences preferences) {
}
onSelectThemePref.setOnPreferenceChangeListener(this);
+ final SwitchPreferenceCompat alwaysSwitchToNowPlaying = findPreference(Preferences.KEY_ON_NOW_PLAYING_SELECT);
+ alwaysSwitchToNowPlaying.setChecked(preferences.isNowPlayingSwitching());
+
ListPreference screensaverPref = findPreference(Preferences.KEY_SCREENSAVER);
fillEnumPreference(screensaverPref, Preferences.ScreensaverMode.class, preferences.getScreensaverMode());
}
diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/framework/BaseActivity.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/framework/BaseActivity.java
index 2e2e35308..861709f52 100644
--- a/Squeezer/src/main/java/uk/org/ngo/squeezer/framework/BaseActivity.java
+++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/framework/BaseActivity.java
@@ -62,6 +62,7 @@
import uk.org.ngo.squeezer.model.Action;
import uk.org.ngo.squeezer.model.DisplayMessage;
import uk.org.ngo.squeezer.model.JiveItem;
+import uk.org.ngo.squeezer.screensaver.BlackScreensaver;
import uk.org.ngo.squeezer.screensaver.Screensaver;
import uk.org.ngo.squeezer.service.ISqueezeService;
import uk.org.ngo.squeezer.service.SqueezeService;
@@ -160,6 +161,32 @@ protected void addActionBar() {
}
}
+ private static final int INACTIVITY_TIME = 5 * 60 * 1000;
+ Handler inactivityHandler = null;
+ Runnable inactivityAction;
+
+ Handler notplayingHandler = null;
+ Runnable notplayingAction;
+
+ private void setInactivityTimer(boolean b) {
+ if (inactivityHandler != null) {
+ inactivityHandler.removeCallbacks(inactivityAction);
+ if (b) {
+ inactivityHandler.postDelayed(inactivityAction, INACTIVITY_TIME);
+ }
+ }
+ }
+
+ public void setNotplayingTimer(boolean b) {
+ if (notplayingHandler != null) {
+ notplayingHandler.removeCallbacks(notplayingAction);
+ if (b) {
+ notplayingHandler.postDelayed(notplayingAction, INACTIVITY_TIME);
+ }
+ }
+ }
+
+
@Override
@CallSuper
protected void onCreate(Bundle savedInstanceState) {
@@ -184,7 +211,19 @@ protected void onCreate(Bundle savedInstanceState) {
if (preferences.getScreensaverMode() == Preferences.ScreensaverMode.CLOCK) {
inactivityHandler = new Handler();
inactivityAction = () -> startActivity(new Intent(this, Screensaver.class));
- setInactivityTimer();
+ setInactivityTimer(true);
+ }
+ if (preferences.getScreensaverMode() == Preferences.ScreensaverMode.CLOCK_NOTPLAYING ) {
+ notplayingHandler = new Handler();
+ notplayingAction = () -> startActivity(new Intent(this, Screensaver.class));
+ // do not yet start timer, because player state (playing or paused) is not known here
+ setNotplayingTimer(false);
+ }
+ if (preferences.getScreensaverMode() == Preferences.ScreensaverMode.OFF_NOTPLAYING ) {
+ notplayingHandler = new Handler();
+ notplayingAction = () -> startActivity(new Intent(this, BlackScreensaver.class));
+ // do not yet start timer, because player state (playing or paused) is not known here
+ setNotplayingTimer(false);
}
}
});
@@ -212,9 +251,7 @@ public void onResume() {
maybeRegisterOnEventBus(mService);
}
- if (inactivityHandler != null) {
- setInactivityTimer();
- }
+ setInactivityTimer(true);
// If SqueezePlayer is installed, start it
squeezePlayer = SqueezePlayer.maybeStartControllingSqueezePlayer(this);
@@ -223,17 +260,12 @@ public void onResume() {
ImageFetcher.getInstance(this).setExitTasksEarly(false);
}
- private void setInactivityTimer() {
- inactivityHandler.removeCallbacks(inactivityAction);
- inactivityHandler.postDelayed(inactivityAction, INACTIVITY_TIME);
- }
@Override
@CallSuper
public void onPause() {
- if (inactivityHandler != null) {
- inactivityHandler.removeCallbacks(inactivityAction);
- }
+ setInactivityTimer(false);
+ setNotplayingTimer(false);
if (squeezePlayer != null) {
squeezePlayer.stopControllingSqueezePlayer();
@@ -366,16 +398,19 @@ public void setNotifyVolumePanel(boolean notifyVolumePanel) {
this.notifyVolumePanel = notifyVolumePanel;
}
- private static final int INACTIVITY_TIME = 5 * 60 * 1000;
- Handler inactivityHandler;
- Runnable inactivityAction;
@Override
public void onUserInteraction() {
super.onUserInteraction();
- if (inactivityHandler != null) {
- setInactivityTimer();
+ setInactivityTimer(true);
+
+ if (notplayingHandler != null) {
+ // If playing is paused and there is some user interaction,
+ // the waiting time until screensaver comes is "charged up" again.
+ if (notplayingHandler.hasCallbacks(notplayingAction)) {
+ setNotplayingTimer(true);
+ }
}
}
diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/itemlist/JiveItemListActivity.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/itemlist/JiveItemListActivity.java
index 137710686..1e3244b82 100644
--- a/Squeezer/src/main/java/uk/org/ngo/squeezer/itemlist/JiveItemListActivity.java
+++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/itemlist/JiveItemListActivity.java
@@ -463,6 +463,11 @@ private void nextWindow(Action.NextWindow nextWindow, int alreadyPopped) {
switch (nextWindow.nextWindow) {
case nowPlaying:
// Do nothing as now playing is always available in Squeezer (maybe toast the action)
+ // only if set by special preference
+ Preferences preferences = Squeezer.getPreferences();
+ if (preferences.isNowPlayingSwitching()) {
+ NowPlayingActivity.show(this);
+ }
break;
case playlist:
CurrentPlaylistActivity.show(this);
diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/screensaver/BlackScreensaver.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/screensaver/BlackScreensaver.java
new file mode 100644
index 000000000..64b264761
--- /dev/null
+++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/screensaver/BlackScreensaver.java
@@ -0,0 +1,31 @@
+package uk.org.ngo.squeezer.screensaver;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+import android.view.WindowManager;
+
+
+public class BlackScreensaver extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ WindowManager.LayoutParams params = getWindow().getAttributes();
+ params.screenBrightness = 0;
+ params.flags &= ~ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+ getWindow().setAttributes(params);
+
+ }
+
+ @Override
+ public void onUserInteraction() {
+ super.onUserInteraction();
+ WindowManager.LayoutParams params = getWindow().getAttributes();
+ params.screenBrightness = -1;
+ params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+ finish();
+ }
+
+}
diff --git a/Squeezer/src/main/res/values-de/strings.xml b/Squeezer/src/main/res/values-de/strings.xml
index 3b0d9018d..b72f30530 100644
--- a/Squeezer/src/main/res/values-de/strings.xml
+++ b/Squeezer/src/main/res/values-de/strings.xml
@@ -257,9 +257,14 @@
Zufallswiedergabe gestartet
Minuten
Display aktiviert lassen
- Nein
- Ja
- Uhr zeigen bei Inaktivität
+ bei Aktivität
+ Immer
+ bei Aktivität, dann Uhr zeigen
+ während abgespielt wird, dann Uhr zeigen
+ während abgespielt wird
+ NowPlaying-Bildschirm Verhalten
+ Immer auf NowPlaying wechseln wenn ein Item ausgewählt wurde
+ Bildschirm nicht automatisch wechseln
Einstellungen für Lautstärkeregelung
Nach Beendigung wieder starten
Bei einem Anruf kann Squeezer die Wiedergabe pausieren.
diff --git a/Squeezer/src/main/res/values-fr/strings.xml b/Squeezer/src/main/res/values-fr/strings.xml
index 9f76f5934..288114585 100644
--- a/Squeezer/src/main/res/values-fr/strings.xml
+++ b/Squeezer/src/main/res/values-fr/strings.xml
@@ -42,6 +42,9 @@
Temps d\'ouverture en fondu
Entrez la durée d\'ouverture en fondu, en secondes, quand en pause. Entrez 0 pour désactiver l\'ouverture en fondu.
+ Comportement du vue NowPlaying
+ Toujours alterner à la vue NowPlaying quand on a choisi un élément
+ Pas alterner la vue
Faire du scrobble par Last.fm
Les informations sur le morceau sont envoyées à Last.fm
Les informations sur le morceau ne sont pas envoyées à Last.fm
diff --git a/Squeezer/src/main/res/values/strings.xml b/Squeezer/src/main/res/values/strings.xml
index 6f64581db..a85ece8a1 100644
--- a/Squeezer/src/main/res/values/strings.xml
+++ b/Squeezer/src/main/res/values/strings.xml
@@ -39,9 +39,14 @@
Dark
Light, dark action bar
Keep screen on
- No
- Yes
- Show clock when idle
+ while active
+ always
+ while active, then show clock
+ while playing, then show clock
+ while playing
+ NowPlaying screen behavior
+ Always switch to NowPlaying screen when item has been chosen
+ Remain on current screen
Show composer
Classical music information
Show band and conductor
diff --git a/Squeezer/src/main/res/xml/preferences.xml b/Squeezer/src/main/res/xml/preferences.xml
index 1b00bf2eb..d8f0f0bd2 100644
--- a/Squeezer/src/main/res/xml/preferences.xml
+++ b/Squeezer/src/main/res/xml/preferences.xml
@@ -40,6 +40,12 @@
android:title="@string/settings_theme_title"
android:summary="%s"/>
+
+