From 744b3d6a67b688e470eef7a9eff2163c0b8f239f Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sun, 5 Feb 2017 23:57:21 +0100 Subject: [PATCH] Move out server preferences to separate fragment. Now app opens server settings in a separate activity, rather then reusing same preference screen. --- ultrasonic/src/main/AndroidManifest.xml | 2 + .../activity/ServerSettingsActivity.java | 63 ++++ .../fragment/ServerSettingsFragment.java | 282 ++++++++++++++++ .../ultrasonic/fragment/SettingsFragment.java | 317 ++---------------- ultrasonic/src/main/res/values/strings.xml | 1 + .../src/main/res/xml/server_settings.xml | 57 ++++ 6 files changed, 441 insertions(+), 281 deletions(-) create mode 100644 ultrasonic/src/main/java/org/moire/ultrasonic/activity/ServerSettingsActivity.java create mode 100644 ultrasonic/src/main/java/org/moire/ultrasonic/fragment/ServerSettingsFragment.java create mode 100644 ultrasonic/src/main/res/xml/server_settings.xml diff --git a/ultrasonic/src/main/AndroidManifest.xml b/ultrasonic/src/main/AndroidManifest.xml index 5b0b9cd3..670846ad 100644 --- a/ultrasonic/src/main/AndroidManifest.xml +++ b/ultrasonic/src/main/AndroidManifest.xml @@ -115,6 +115,8 @@ a:resource="@xml/searchable"/> + + task = new ModalBackgroundTask(getActivity(), false) { + private int previousInstance; + + @Override + protected Boolean doInBackground() throws Throwable { + updateProgress(R.string.settings_testing_connection); + + final Context context = getActivity(); + previousInstance = Util.getActiveServer(context); + Util.setActiveServer(context, serverId); + try { + MusicService musicService = MusicServiceFactory.getMusicService(context); + musicService.ping(context, this); + return musicService.isLicenseValid(context, null); + } finally { + Util.setActiveServer(context, previousInstance); + } + } + + @Override + protected void done(Boolean licenseValid) { + if (licenseValid) { + Util.toast(getActivity(), R.string.settings_testing_ok); + } else { + Util.toast(getActivity(), R.string.settings_testing_unlicensed); + } + } + + @Override + protected void cancel() { + super.cancel(); + Util.setActiveServer(getActivity(), previousInstance); + } + + @Override + protected void error(Throwable error) { + Log.w(LOG_TAG, error.toString(), error); + new ErrorDialog(getActivity(), String.format("%s %s", getResources().getString(R.string.settings_connection_failure), getErrorMessage(error)), false); + } + }; + task.execute(); + } + + private void removeServer() { + int activeServers = sharedPreferences + .getInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, 0); + + // Reset values to null so when we ask for them again they are new + sharedPreferences.edit() + .remove(Constants.PREFERENCES_KEY_SERVER_NAME + serverId) + .remove(Constants.PREFERENCES_KEY_SERVER_URL + serverId) + .remove(Constants.PREFERENCES_KEY_USERNAME + serverId) + .remove(Constants.PREFERENCES_KEY_PASSWORD + serverId) + .remove(Constants.PREFERENCES_KEY_SERVER_ENABLED + serverId) + .remove(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + serverId) + .apply(); + + if (serverId < activeServers) { + int activeServer = Util.getActiveServer(getActivity()); + for (int i = serverId; i <= activeServers; i++) { + Util.removeInstanceName(getActivity(), i, activeServer); + } + } + + activeServers--; + + sharedPreferences.edit() + .putInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, activeServers) + .apply(); + + getActivity().finish(); + } +} diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java index a7616f8d..472c49d1 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/SettingsFragment.java @@ -1,7 +1,6 @@ package org.moire.ultrasonic.fragment; -import android.app.Dialog; -import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; @@ -12,32 +11,24 @@ import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; import android.provider.SearchRecentSuggestions; import android.support.annotation.Nullable; -import android.text.InputType; import android.util.Log; import android.view.View; import org.moire.ultrasonic.R; +import org.moire.ultrasonic.activity.ServerSettingsActivity; import org.moire.ultrasonic.activity.SubsonicTabActivity; import org.moire.ultrasonic.provider.SearchSuggestionProvider; import org.moire.ultrasonic.service.DownloadService; import org.moire.ultrasonic.service.DownloadServiceImpl; -import org.moire.ultrasonic.service.MusicService; -import org.moire.ultrasonic.service.MusicServiceFactory; import org.moire.ultrasonic.util.Constants; -import org.moire.ultrasonic.util.ErrorDialog; import org.moire.ultrasonic.util.FileUtil; import org.moire.ultrasonic.util.ImageLoader; -import org.moire.ultrasonic.util.ModalBackgroundTask; import org.moire.ultrasonic.util.TimeSpanPreference; import org.moire.ultrasonic.util.Util; import java.io.File; -import java.net.URL; -import java.util.LinkedHashMap; -import java.util.Map; /** * Shows main app settings. @@ -45,7 +36,6 @@ import java.util.Map; public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String LOG_TAG = SettingsFragment.class.getSimpleName(); - private final Map serverSettings = new LinkedHashMap<>(); private ListPreference theme; private ListPreference videoPlayer; @@ -75,9 +65,7 @@ public class SettingsFragment extends PreferenceFragment private EditTextPreference sharingDefaultGreeting; private TimeSpanPreference sharingDefaultExpiration; private PreferenceCategory serversCategory; - private Preference addServerPreference; - private boolean testingConnection; private int maxServerCount = 10; private SharedPreferences settings; private int activeServers; @@ -89,7 +77,6 @@ public class SettingsFragment extends PreferenceFragment addPreferencesFromResource(R.xml.settings); settings = PreferenceManager.getDefaultSharedPreferences(getActivity()); - activeServers = settings.getInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, 0); } @Override @@ -128,7 +115,6 @@ public class SettingsFragment extends PreferenceFragment sharingDefaultGreeting.setText(Util.getShareGreeting(getActivity())); setupClearSearchPreference(); setupGaplessControlSettingsV14(); - setupServersCategory(); } @Override @@ -142,6 +128,7 @@ public class SettingsFragment extends PreferenceFragment public void onResume() { super.onResume(); + setupServersCategory(); SharedPreferences preferences = Util.getPreferences(getActivity()); preferences.registerOnSharedPreferenceChangeListener(this); } @@ -210,33 +197,34 @@ public class SettingsFragment extends PreferenceFragment } private void setupServersCategory() { - addServerPreference = new Preference(getActivity()); + activeServers = settings.getInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, 0); + final Preference addServerPreference = new Preference(getActivity()); addServerPreference.setKey(Constants.PREFERENCES_KEY_ADD_SERVER); addServerPreference.setPersistent(false); addServerPreference.setTitle(getResources().getString(R.string.settings_server_add_server)); addServerPreference.setEnabled(activeServers < maxServerCount); + serversCategory.removeAll(); serversCategory.addPreference(addServerPreference); for (int i = 1; i <= activeServers; i++) { - final int instanceValue = i; - - serversCategory.addPreference(addServer(i)); - - Preference testConnectionPreference = findPreference(Constants.PREFERENCES_KEY_TEST_CONNECTION + i); - - if (testConnectionPreference != null) { - testConnectionPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - testConnection(instanceValue); - return false; - } - }); - } - - String instance = String.valueOf(i); - serverSettings.put(instance, new ServerSettings(instance)); + final int serverId = i; + Preference preference = new Preference(getActivity()); + preference.setPersistent(false); + preference.setTitle(settings.getString(Constants.PREFERENCES_KEY_SERVER_NAME + serverId, + getString(R.string.settings_server_name))); + preference.setSummary(settings.getString(Constants.PREFERENCES_KEY_SERVER_URL + serverId, + getString(R.string.settings_server_address_unset))); + preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + final Intent intent = new Intent(getActivity(), ServerSettingsActivity.class); + intent.putExtra(ServerSettingsActivity.ARG_SERVER_ID, serverId); + startActivity(intent); + return true; + } + }); + serversCategory.addPreference(preference); } addServerPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @@ -258,260 +246,31 @@ public class SettingsFragment extends PreferenceFragment serversCategory.removePreference(addServerPreference); } - serversCategory.addPreference(addServer(activeServers)); + Preference newServerPrefs = new Preference(getActivity()); + newServerPrefs.setTitle(getString(R.string.settings_server_name)); + newServerPrefs.setSummary(getString(R.string.settings_server_address_unset)); + newServerPrefs.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + final Intent intent = new Intent(getActivity(), ServerSettingsActivity.class); + intent.putExtra(ServerSettingsActivity.ARG_SERVER_ID, activeServers); + startActivity(intent); + return true; + } + }); + serversCategory.addPreference(newServerPrefs); if (addServerPreference != null) { serversCategory.addPreference(addServerPreference); addServerPreference.setEnabled(activeServers < maxServerCount); } - String instance = String.valueOf(activeServers); - serverSettings.put(instance, new ServerSettings(instance)); - return true; } }); } - private PreferenceScreen addServer(final int instance) { - final Context context = getActivity(); - final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context); - - if (screen != null) { - screen.setTitle(R.string.settings_server_unused); - screen.setKey(Constants.PREFERENCES_KEY_SERVER + instance); - } - - final EditTextPreference serverNamePreference = new EditTextPreference(context); - serverNamePreference.setKey(Constants.PREFERENCES_KEY_SERVER_NAME + instance); - serverNamePreference.setDefaultValue(getResources() - .getString(R.string.settings_server_unused)); - serverNamePreference.setTitle(R.string.settings_server_name); - - if (serverNamePreference.getText() == null) { - serverNamePreference.setText(getResources().getString(R.string.settings_server_unused)); - } - - serverNamePreference.setSummary(serverNamePreference.getText()); - - final EditTextPreference serverUrlPreference = new EditTextPreference(context); - serverUrlPreference.setKey(Constants.PREFERENCES_KEY_SERVER_URL + instance); - serverUrlPreference.getEditText().setInputType(InputType.TYPE_TEXT_VARIATION_URI); - serverUrlPreference.setDefaultValue("http://yourhost"); - serverUrlPreference.setTitle(R.string.settings_server_address); - - if (serverUrlPreference.getText() == null) { - serverUrlPreference.setText("http://yourhost"); - } - - serverUrlPreference.setSummary(serverUrlPreference.getText()); - - if (screen != null) { - screen.setSummary(serverUrlPreference.getText()); - } - - final EditTextPreference serverUsernamePreference = new EditTextPreference(context); - serverUsernamePreference.setKey(Constants.PREFERENCES_KEY_USERNAME + instance); - serverUsernamePreference.setTitle(R.string.settings_server_username); - - final EditTextPreference serverPasswordPreference = new EditTextPreference(context); - serverPasswordPreference.setKey(Constants.PREFERENCES_KEY_PASSWORD + instance); - serverPasswordPreference.getEditText().setInputType(InputType.TYPE_CLASS_TEXT | - InputType.TYPE_TEXT_VARIATION_PASSWORD); - serverPasswordPreference.setSummary("***"); - serverPasswordPreference.setTitle(R.string.settings_server_password); - - final CheckBoxPreference serverEnabledPreference = new CheckBoxPreference(context); - serverEnabledPreference.setDefaultValue(true); - serverEnabledPreference.setKey(Constants.PREFERENCES_KEY_SERVER_ENABLED + instance); - serverEnabledPreference.setTitle(R.string.equalizer_enabled); - - final CheckBoxPreference jukeboxEnabledPreference = new CheckBoxPreference(context); - jukeboxEnabledPreference.setDefaultValue(false); - jukeboxEnabledPreference.setKey(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + instance); - jukeboxEnabledPreference.setTitle(R.string.jukebox_is_default); - - Preference serverRemoveServerPreference = new Preference(context); - serverRemoveServerPreference.setKey(Constants.PREFERENCES_KEY_REMOVE_SERVER + instance); - serverRemoveServerPreference.setPersistent(false); - serverRemoveServerPreference.setTitle(R.string.settings_server_remove_server); - - serverRemoveServerPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - if (activeServers == 0) { - return false; - } - - // Reset values to null so when we ask for them again they are new - serverNamePreference.setText(null); - serverUrlPreference.setText(null); - serverUsernamePreference.setText(null); - serverPasswordPreference.setText(null); - serverEnabledPreference.setChecked(true); - jukeboxEnabledPreference.setChecked(false); - - if (instance < activeServers) { - - int activeServer = Util.getActiveServer(getActivity()); - for (int i = instance; i <= activeServers; i++) { - Util.removeInstanceName(getActivity(), i, activeServer); - } - } - - activeServers--; - - if (screen != null) { - serversCategory.removePreference(screen); - Dialog dialog = screen.getDialog(); - - if (dialog != null) { - dialog.dismiss(); - } - } - - settings.edit() - .putInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, activeServers) - .apply(); - - addServerPreference.setEnabled(activeServers < maxServerCount); - - return true; - } - }); - - Preference serverTestConnectionPreference = new Preference(getActivity()); - serverTestConnectionPreference.setKey(Constants.PREFERENCES_KEY_TEST_CONNECTION + instance); - serverTestConnectionPreference.setPersistent(false); - serverTestConnectionPreference.setTitle(R.string.settings_test_connection_title); - - serverTestConnectionPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - testConnection(instance); - return false; - } - }); - - if (screen != null) { - screen.addPreference(serverNamePreference); - screen.addPreference(serverUrlPreference); - screen.addPreference(serverUsernamePreference); - screen.addPreference(serverPasswordPreference); - screen.addPreference(serverEnabledPreference); - screen.addPreference(jukeboxEnabledPreference); - screen.addPreference(serverRemoveServerPreference); - screen.addPreference(serverTestConnectionPreference); - } - - return screen; - } - - private void testConnection(final int instance) { - ModalBackgroundTask task = new ModalBackgroundTask(getActivity(), false) { - private int previousInstance; - - @Override - protected Boolean doInBackground() throws Throwable { - updateProgress(R.string.settings_testing_connection); - - final Context context = getActivity(); - previousInstance = Util.getActiveServer(context); - testingConnection = true; - Util.setActiveServer(context, instance); - try { - MusicService musicService = MusicServiceFactory.getMusicService(context); - musicService.ping(context, this); - return musicService.isLicenseValid(context, null); - } finally { - Util.setActiveServer(context, previousInstance); - testingConnection = false; - } - } - - @Override - protected void done(Boolean licenseValid) { - if (licenseValid) { - Util.toast(getActivity(), R.string.settings_testing_ok); - } else { - Util.toast(getActivity(), R.string.settings_testing_unlicensed); - } - } - - @Override - protected void cancel() { - super.cancel(); - Util.setActiveServer(getActivity(), previousInstance); - } - - @Override - protected void error(Throwable error) { - Log.w(LOG_TAG, error.toString(), error); - new ErrorDialog(getActivity(), String.format("%s %s", getResources().getString(R.string.settings_connection_failure), getErrorMessage(error)), false); - } - }; - task.execute(); - } - - private class ServerSettings { - private EditTextPreference serverName; - private EditTextPreference serverUrl; - private EditTextPreference username; - private PreferenceScreen screen; - - private ServerSettings(String instance) { - screen = (PreferenceScreen) findPreference("server" + instance); - serverName = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_NAME + - instance); - serverUrl = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_URL + - instance); - username = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_USERNAME + - instance); - - serverUrl.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - try { - String url = (String) value; - new URL(url); - if (!url.equals(url.trim()) || url.contains("@")) { - throw new Exception(); - } - } catch (Exception x) { - new ErrorDialog(getActivity(), R.string.settings_invalid_url, false); - return false; - } - return true; - } - }); - - username.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - String username = (String) value; - if (username == null || !username.equals(username.trim())) { - new ErrorDialog(getActivity(), R.string.settings_invalid_username, false); - return false; - } - return true; - } - }); - } - - public void update() { - serverName.setSummary(serverName.getText()); - serverUrl.setSummary(serverUrl.getText()); - username.setSummary(username.getText()); - screen.setSummary(serverUrl.getText()); - screen.setTitle(serverName.getText()); - } - } - private void update() { - if (testingConnection) { - return; - } - theme.setSummary(theme.getEntry()); videoPlayer.setSummary(videoPlayer.getEntry()); maxBitrateWifi.setSummary(maxBitrateWifi.getEntry()); @@ -545,10 +304,6 @@ public class SettingsFragment extends PreferenceFragment sendBluetoothAlbumArt.setChecked(false); sendBluetoothAlbumArt.setEnabled(false); } - - for (ServerSettings ss : serverSettings.values()) { - ss.update(); - } } private static void setImageLoaderConcurrency(int concurrency) { diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 9249b973..2f523aba 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -392,6 +392,7 @@ 12 albumArt Multiple Years + http://yourhost No songs diff --git a/ultrasonic/src/main/res/xml/server_settings.xml b/ultrasonic/src/main/res/xml/server_settings.xml new file mode 100644 index 00000000..cc107299 --- /dev/null +++ b/ultrasonic/src/main/res/xml/server_settings.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + \ No newline at end of file