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"/> + +