From fefa84fa84434e5bd34888084e4d1c6ddb67e345 Mon Sep 17 00:00:00 2001 From: Luke Dominic Date: Sat, 31 Jan 2015 18:12:51 +0000 Subject: [PATCH] Added option to enable party mode to protect playlist and setting modification --- .../java/uk/org/ngo/squeezer/Preferences.java | 31 +++++++ .../uk/org/ngo/squeezer/SettingsActivity.java | 23 ++++- .../org/ngo/squeezer/dialog/PartyModePin.java | 89 +++++++++++++++++++ .../ngo/squeezer/framework/BaseActivity.java | 12 ++- .../ngo/squeezer/service/SqueezeService.java | 61 ++++++++----- .../src/main/res/layout/party_mode_pin.xml | 67 ++++++++++++++ Squeezer/src/main/res/values/strings.xml | 7 ++ Squeezer/src/main/res/xml/preferences.xml | 7 ++ 8 files changed, 274 insertions(+), 23 deletions(-) create mode 100644 Squeezer/src/main/java/uk/org/ngo/squeezer/dialog/PartyModePin.java create mode 100644 Squeezer/src/main/res/layout/party_mode_pin.xml 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 f320eba94..66a7f5840 100644 --- a/Squeezer/src/main/java/uk/org/ngo/squeezer/Preferences.java +++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/Preferences.java @@ -60,6 +60,12 @@ public final class Preferences { // Fade-in period? (0 = disable fade-in) public static final String KEY_FADE_IN_SECS = "squeezer.fadeInSecs"; + // Are we having a party? + public static final String KEY_PARTYMODE_ENABLED = "squeezer.partymode.enabled"; + + // Pin to disable the party mode + public static final String KEY_PARTYMODE_PIN = "squeezer.partymode.pin"; + // What do to when an album is selected in the list view public static final String KEY_ON_SELECT_ALBUM_ACTION = "squeezer.action.onselect.album"; @@ -86,6 +92,31 @@ public Preferences(Context context) { sharedPreferences = context.getSharedPreferences(Preferences.NAME, Context.MODE_PRIVATE); } + public Boolean getPartyModeStatus() { + return sharedPreferences.getBoolean(Preferences.KEY_PARTYMODE_ENABLED, true); + } + + public void setPartyModeStatus(Boolean status){ + SharedPreferences.Editor editor = sharedPreferences.edit(); + + editor.putBoolean(Preferences.KEY_PARTYMODE_ENABLED, status); + editor.commit(); + } + + public String getPartyModePin() { + return getPartyModePin(null); + } + + public String getPartyModePin(String defaultValue) { + return getStringPreference(Preferences.KEY_PARTYMODE_PIN, defaultValue); + } + + public void setPartyModePin (String password){ + SharedPreferences.Editor editor = sharedPreferences.edit(); + + editor.putString(Preferences.KEY_PARTYMODE_PIN, password); + editor.commit(); + } private String getStringPreference(String preference, String defaultValue) { final String pref = sharedPreferences.getString(preference, null); diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsActivity.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsActivity.java index 6384549f4..3747c344c 100644 --- a/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsActivity.java +++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/SettingsActivity.java @@ -115,6 +115,24 @@ protected void onCreate(Bundle savedInstanceState) { CheckBoxPreference startSqueezePlayerPref = (CheckBoxPreference) findPreference( Preferences.KEY_SQUEEZEPLAYER_ENABLED); startSqueezePlayerPref.setChecked(preferences.getBoolean(Preferences.KEY_SQUEEZEPLAYER_ENABLED, true)); + + if(preferences.getBoolean(Preferences.KEY_PARTYMODE_ENABLED, false)) { + SetAllSettingEnabled(false); + } + } + + private void SetAllSettingEnabled(boolean status) + { + findPreference(Preferences.KEY_SCROBBLE_ENABLED).setEnabled(status); + findPreference(Preferences.KEY_ANALYTICS_ENABLED).setEnabled(status); + findPreference(Preferences.KEY_FADE_IN_SECS).setEnabled(status); + findPreference(Preferences.KEY_SQUEEZEPLAYER_ENABLED).setEnabled(status); + findPreference(Preferences.KEY_NOTIFY_OF_CONNECTION).setEnabled(status); + findPreference(Preferences.KEY_AUTO_CONNECT).setEnabled(status); + findPreference(Preferences.KEY_SERVERADDR).setEnabled(status); + findPreference(Preferences.KEY_ON_THEME_SELECT_ACTION).setEnabled(status); + findPreference(Preferences.KEY_ON_SELECT_SONG_ACTION).setEnabled(status); + findPreference(Preferences.KEY_ON_SELECT_ALBUM_ACTION).setEnabled(status); } private void fillScrobblePreferences(SharedPreferences preferences) { @@ -331,8 +349,11 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin } else { Log.v(TAG, "service is null!"); } - } + if (Preferences.KEY_PARTYMODE_ENABLED.equals(key)) { + finish(); + } + } @Override @Deprecated protected Dialog onCreateDialog(int id) { diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/dialog/PartyModePin.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/dialog/PartyModePin.java new file mode 100644 index 000000000..94bbb5c7d --- /dev/null +++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/dialog/PartyModePin.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2012 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package uk.org.ngo.squeezer.dialog; + +import android.content.Context; +import android.os.Parcelable; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import uk.org.ngo.squeezer.Preferences; +import uk.org.ngo.squeezer.R; + +/** + * Shows a preference dialog that allows the user to enable party mode, and choose an + * optional pin to disable party mode. + */ +public class PartyModePin extends DialogPreference { + + private EditText passwordEditText; + private boolean previousPartyModeEnabled; + private Preferences preferences; + + public PartyModePin(Context context, AttributeSet attrs) { + super(context, attrs); + setDialogLayoutResource(R.layout.party_mode_pin); + } + + @Override + protected void onBindDialogView(View view) { + super.onBindDialogView(view); + + preferences = new Preferences(getContext()); + passwordEditText = (EditText) view.findViewById(R.id.partypin); + + previousPartyModeEnabled = preferences.getPartyModeStatus(); + + TextView statusText = (TextView) view.findViewById(R.id.PartyStatus); + if (previousPartyModeEnabled) { + statusText.setText("Disable Party Mode:"); + } else { + statusText.setText("Enable Party Mode:"); + } + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + + // If the user has pressed ok + if (positiveResult) { + + // If party mode wasn't enabled before + if (!previousPartyModeEnabled) { + String pin = passwordEditText.getText().toString(); + preferences.setPartyModePin(pin); + preferences.setPartyModeStatus(true); + + } else { + String storedPin = preferences.getPartyModePin(null); + String pin = passwordEditText.getText().toString(); + + if (storedPin == null || pin.equals(preferences.getPartyModePin())) { + preferences.setPartyModeStatus(false); + } + } + } + } + + @Override + protected Parcelable onSaveInstanceState() { + return super.onSaveInstanceState(); + } +} 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 36d55aaed..d4763fd86 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 @@ -365,7 +365,11 @@ public String getServerString(ServerString stringToken) { // This section is just an easier way to call squeeze service public void play(PlaylistItem item) { - playlistControl(PlaylistControlCmd.load, item, R.string.ITEM_PLAYING); + if (new Preferences(this).getPartyModeStatus()) { + playlistControl(PlaylistControlCmd.add, item, R.string.ITEM_ADDED); + } else { + playlistControl(PlaylistControlCmd.load, item, R.string.ITEM_PLAYING); + } } public void add(PlaylistItem item) { @@ -373,7 +377,11 @@ public void add(PlaylistItem item) { } public void insert(PlaylistItem item) { - playlistControl(PlaylistControlCmd.insert, item, R.string.ITEM_INSERTED); + if (new Preferences(this).getPartyModeStatus()) { + playlistControl(PlaylistControlCmd.add, item, R.string.ITEM_ADDED); + } else { + playlistControl(PlaylistControlCmd.insert, item, R.string.ITEM_INSERTED); + } } private void playlistControl(PlaylistControlCmd cmd, PlaylistItem item, int resId) diff --git a/Squeezer/src/main/java/uk/org/ngo/squeezer/service/SqueezeService.java b/Squeezer/src/main/java/uk/org/ngo/squeezer/service/SqueezeService.java index 47ec1f116..6d769517d 100644 --- a/Squeezer/src/main/java/uk/org/ngo/squeezer/service/SqueezeService.java +++ b/Squeezer/src/main/java/uk/org/ngo/squeezer/service/SqueezeService.java @@ -35,6 +35,7 @@ import android.support.annotation.Nullable; import android.util.Base64; import android.util.Log; +import android.widget.Toast; import com.crashlytics.android.Crashlytics; import com.google.common.base.Splitter; @@ -152,6 +153,11 @@ public void removeClient(ServiceCallback item) { final CliClient cli = new CliClient(this); + /** + * Are we having a party? + */ + private boolean partyModeEnabled; + /** * Is scrobbling enabled? */ @@ -199,6 +205,7 @@ public void onCreate() { private void getPreferences() { final SharedPreferences preferences = getSharedPreferences(Preferences.NAME, MODE_PRIVATE); + partyModeEnabled = preferences.getBoolean(Preferences.KEY_PARTYMODE_ENABLED, false); scrobblingEnabled = preferences.getBoolean(Preferences.KEY_SCROBBLE_ENABLED, false); mFadeInSecs = preferences.getInt(Preferences.KEY_FADE_IN_SECS, 0); mUpdateOngoingNotification = preferences @@ -1141,16 +1148,23 @@ public EventBus getEventBus() { @Override public void adjustVolumeTo(Player player, int newVolume) { + if(isPartyMode()) + return; + cli.sendPlayerCommand(player, "mixer volume " + Math.min(100, Math.max(0, newVolume))); } @Override public void adjustVolumeTo(int newVolume) { + if(isPartyMode()) + return; cli.sendActivePlayerCommand("mixer volume " + Math.min(100, Math.max(0, newVolume))); } @Override public void adjustVolumeBy(int delta) { + if(isPartyMode()) + return; if (delta > 0) { cli.sendActivePlayerCommand("mixer volume %2B" + delta); } else if (delta < 0) { @@ -1163,6 +1177,13 @@ public boolean isConnected() { return connectionState.isConnected(); } + public boolean isPartyMode(){ + getPreferences(); + if(partyModeEnabled) + Toast.makeText(getApplicationContext(), "Just enjoy the party!", Toast.LENGTH_LONG).show(); + return partyModeEnabled; + } + @Override public boolean isConnectInProgress() { return connectionState.isConnectInProgress(); @@ -1266,7 +1287,7 @@ private String fadeInSecs() { @Override public boolean togglePausePlay() { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } @@ -1306,7 +1327,7 @@ public boolean togglePausePlay() { @Override public boolean play() { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("play" + fadeInSecs()); @@ -1315,7 +1336,7 @@ public boolean play() { @Override public boolean stop() { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("stop"); @@ -1324,7 +1345,7 @@ public boolean stop() { @Override public boolean nextTrack() { - if (!isConnected() || !isPlaying()) { + if (!isConnected() || !isPlaying() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("button jump_fwd"); @@ -1333,7 +1354,7 @@ public boolean nextTrack() { @Override public boolean previousTrack() { - if (!isConnected() || !isPlaying()) { + if (!isConnected() || !isPlaying() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("button jump_rew"); @@ -1342,7 +1363,7 @@ public boolean previousTrack() { @Override public boolean toggleShuffle() { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist shuffle"); @@ -1351,7 +1372,7 @@ public boolean toggleShuffle() { @Override public boolean toggleRepeat() { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist repeat"); @@ -1385,7 +1406,7 @@ public boolean randomPlay(String type) throws HandshakeNotCompleteException { */ @Override public boolean playlistIndex(int index) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist index " + index + fadeInSecs()); @@ -1394,7 +1415,7 @@ public boolean playlistIndex(int index) { @Override public boolean playlistRemove(int index) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist delete " + index); @@ -1403,7 +1424,7 @@ public boolean playlistRemove(int index) { @Override public boolean playlistMove(int fromIndex, int toIndex) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist move " + fromIndex + " " + toIndex); @@ -1412,7 +1433,7 @@ public boolean playlistMove(int fromIndex, int toIndex) { @Override public boolean playlistClear() { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist clear"); @@ -1421,7 +1442,7 @@ public boolean playlistClear() { @Override public boolean playlistSave(String name) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand("playlist save " + Util.encode(name)); @@ -1430,7 +1451,7 @@ public boolean playlistSave(String name) { @Override public boolean pluginPlaylistControl(Plugin plugin, String cmd, String itemId) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendActivePlayerCommand(plugin.getId() + " playlist " + cmd + " item_id:" + itemId); @@ -1526,7 +1547,7 @@ private String getAbsoluteUrl(String relativeUrl) throws HandshakeNotCompleteExc @Override public boolean setSecondsElapsed(int seconds) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } if (seconds < 0) { @@ -1553,7 +1574,7 @@ public void preferenceChanged(String key) { } getPreferences(); - } + } @Override @@ -1714,7 +1735,7 @@ public void playlists(int start, IServiceItemListCallback callback) th @Override public boolean playlistsDelete(Playlist playlist) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendCommand("playlists delete " + playlist.getFilterParameter()); @@ -1723,7 +1744,7 @@ public boolean playlistsDelete(Playlist playlist) { @Override public boolean playlistsMove(Playlist playlist, int index, int toindex) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendCommand("playlists edit cmd:move " + playlist.getFilterParameter() @@ -1733,7 +1754,7 @@ public boolean playlistsMove(Playlist playlist, int index, int toindex) { @Override public boolean playlistsNew(String name) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendCommand("playlists new name:" + Util.encode(name)); @@ -1742,7 +1763,7 @@ public boolean playlistsNew(String name) { @Override public boolean playlistsRemove(Playlist playlist, int index) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendCommand("playlists edit cmd:delete " + playlist.getFilterParameter() + " index:" @@ -1752,7 +1773,7 @@ public boolean playlistsRemove(Playlist playlist, int index) { @Override public boolean playlistsRename(Playlist playlist, String newname) { - if (!isConnected()) { + if (!isConnected() || isPartyMode()) { return false; } cli.sendCommand( diff --git a/Squeezer/src/main/res/layout/party_mode_pin.xml b/Squeezer/src/main/res/layout/party_mode_pin.xml new file mode 100644 index 000000000..48c2da781 --- /dev/null +++ b/Squeezer/src/main/res/layout/party_mode_pin.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Squeezer/src/main/res/values/strings.xml b/Squeezer/src/main/res/values/strings.xml index 1f1038cb5..d221eb0a6 100644 --- a/Squeezer/src/main/res/values/strings.xml +++ b/Squeezer/src/main/res/values/strings.xml @@ -62,6 +62,13 @@ Show notification only while playing music + Party Mode + SqueezePlayer interface is unlocked + + SqueezePlayer interface is locked down preventing unauthorized + access to settings and modifying playlists. + + Scrobble to Last.fm Song information is sent to Last.fm Song information is not sent to Last.fm diff --git a/Squeezer/src/main/res/xml/preferences.xml b/Squeezer/src/main/res/xml/preferences.xml index 100442633..b1fd35fb0 100644 --- a/Squeezer/src/main/res/xml/preferences.xml +++ b/Squeezer/src/main/res/xml/preferences.xml @@ -66,6 +66,13 @@ android:summaryOff="@string/settings_notifyofconnection_off" android:persistent="true"/> + +