mirror of
https://gitlab.com/ultrasonic/ultrasonic.git
synced 2025-04-29 07:01:33 +03:00
commit
4de3c9d24b
@ -3,10 +3,10 @@ ext.versions = [
|
|||||||
targetSdk : 22,
|
targetSdk : 22,
|
||||||
compileSdk : 22,
|
compileSdk : 22,
|
||||||
|
|
||||||
buildTools : "25.0.2",
|
buildTools : "22.0.1",
|
||||||
androidTools : "2.2.3",
|
androidTools : "2.2.3",
|
||||||
|
|
||||||
androidSupport : "25.1.0",
|
androidSupport : "22.2.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
ext.gradlePlugins = [
|
ext.gradlePlugins = [
|
||||||
@ -14,5 +14,6 @@ ext.gradlePlugins = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
ext.androidSupport = [
|
ext.androidSupport = [
|
||||||
support : "com.android.support:support-v4:$versions.androidSupport"
|
support : "com.android.support:support-v4:$versions.androidSupport",
|
||||||
|
design : "com.android.support:design:$versions.androidSupport",
|
||||||
]
|
]
|
@ -22,4 +22,7 @@ dependencies {
|
|||||||
compile project(':menudrawer')
|
compile project(':menudrawer')
|
||||||
compile project(':pulltorefresh')
|
compile project(':pulltorefresh')
|
||||||
compile project(':library')
|
compile project(':library')
|
||||||
|
|
||||||
|
compile androidSupport.support
|
||||||
|
compile androidSupport.design
|
||||||
}
|
}
|
||||||
|
@ -15,10 +15,6 @@
|
|||||||
<uses-permission a:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
|
<uses-permission a:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
|
||||||
<uses-permission a:name="android.permission.BLUETOOTH"/>
|
<uses-permission a:name="android.permission.BLUETOOTH"/>
|
||||||
|
|
||||||
<uses-sdk
|
|
||||||
a:minSdkVersion="14"
|
|
||||||
a:targetSdkVersion="19"/>
|
|
||||||
|
|
||||||
<supports-screens
|
<supports-screens
|
||||||
a:anyDensity="true"
|
a:anyDensity="true"
|
||||||
a:largeScreens="true"
|
a:largeScreens="true"
|
||||||
@ -29,6 +25,7 @@
|
|||||||
<application
|
<application
|
||||||
a:allowBackup="false"
|
a:allowBackup="false"
|
||||||
a:icon="@drawable/ic_launcher"
|
a:icon="@drawable/ic_launcher"
|
||||||
|
a:theme="@style/Theme.AppCompat"
|
||||||
a:label="@string/common.appname">
|
a:label="@string/common.appname">
|
||||||
<activity
|
<activity
|
||||||
a:name=".activity.MainActivity"
|
a:name=".activity.MainActivity"
|
||||||
@ -118,6 +115,8 @@
|
|||||||
a:resource="@xml/searchable"/>
|
a:resource="@xml/searchable"/>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity a:name=".activity.ServerSettingsActivity" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
a:name=".service.DownloadServiceImpl"
|
a:name=".service.DownloadServiceImpl"
|
||||||
a:label="UltraSonic Download Service"
|
a:label="UltraSonic Download Service"
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
package org.moire.ultrasonic.activity;
|
package org.moire.ultrasonic.activity;
|
||||||
|
|
||||||
import android.app.ActionBar;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.app.ActionBar;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -32,13 +32,13 @@ import android.webkit.WebViewClient;
|
|||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import net.simonvt.menudrawer.MenuDrawer;
|
||||||
|
import net.simonvt.menudrawer.Position;
|
||||||
|
|
||||||
import org.moire.ultrasonic.R;
|
import org.moire.ultrasonic.R;
|
||||||
import org.moire.ultrasonic.util.Constants;
|
import org.moire.ultrasonic.util.Constants;
|
||||||
import org.moire.ultrasonic.util.Util;
|
import org.moire.ultrasonic.util.Util;
|
||||||
|
|
||||||
import net.simonvt.menudrawer.MenuDrawer;
|
|
||||||
import net.simonvt.menudrawer.Position;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An HTML-based help screen with Back and Done buttons at the bottom.
|
* An HTML-based help screen with Back and Done buttons at the bottom.
|
||||||
*
|
*
|
||||||
@ -65,8 +65,8 @@ public final class HelpActivity extends ResultActivity implements OnClickListene
|
|||||||
protected void onCreate(Bundle bundle)
|
protected void onCreate(Bundle bundle)
|
||||||
{
|
{
|
||||||
applyTheme();
|
applyTheme();
|
||||||
|
getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
|
|
||||||
|
|
||||||
setContentView(R.layout.help);
|
setContentView(R.layout.help);
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ public final class HelpActivity extends ResultActivity implements OnClickListene
|
|||||||
aboutMenuItem.setOnClickListener(this);
|
aboutMenuItem.setOnClickListener(this);
|
||||||
findViewById(R.id.menu_exit).setOnClickListener(this);
|
findViewById(R.id.menu_exit).setOnClickListener(this);
|
||||||
|
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
@ -318,7 +318,7 @@ public final class HelpActivity extends ResultActivity implements OnClickListene
|
|||||||
setProgressBarIndeterminateVisibility(false);
|
setProgressBarIndeterminateVisibility(false);
|
||||||
String versionName = Util.getVersionName(HelpActivity.this);
|
String versionName = Util.getVersionName(HelpActivity.this);
|
||||||
String title = String.format("%s (%s)", view.getTitle(), versionName);
|
String title = String.format("%s (%s)", view.getTitle(), versionName);
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
package org.moire.ultrasonic.activity;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.preference.PreferenceActivity;
|
|
||||||
|
|
||||||
import org.moire.ultrasonic.util.Constants;
|
|
||||||
import org.moire.ultrasonic.util.Util;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Joshua Bahnsen on 12/30/13.
|
|
||||||
*/
|
|
||||||
public class PreferenceResultActivity extends PreferenceActivity
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
|
||||||
{
|
|
||||||
switch (resultCode)
|
|
||||||
{
|
|
||||||
case Constants.RESULT_CLOSE_ALL:
|
|
||||||
setResult(Constants.RESULT_CLOSE_ALL);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void startActivityForResultWithoutTransition(Activity currentActivity, Class<? extends Activity> newActivity)
|
|
||||||
{
|
|
||||||
startActivityForResultWithoutTransition(currentActivity, new Intent(currentActivity, newActivity));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void startActivityForResultWithoutTransition(Activity currentActivity, Intent intent)
|
|
||||||
{
|
|
||||||
startActivityForResult(intent, 0);
|
|
||||||
Util.disablePendingTransition(currentActivity);
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,6 +2,7 @@ package org.moire.ultrasonic.activity;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
|
||||||
import org.moire.ultrasonic.util.Constants;
|
import org.moire.ultrasonic.util.Constants;
|
||||||
import org.moire.ultrasonic.util.Util;
|
import org.moire.ultrasonic.util.Util;
|
||||||
@ -9,7 +10,7 @@ import org.moire.ultrasonic.util.Util;
|
|||||||
/**
|
/**
|
||||||
* Created by Joshua Bahnsen on 12/30/13.
|
* Created by Joshua Bahnsen on 12/30/13.
|
||||||
*/
|
*/
|
||||||
public class ResultActivity extends Activity
|
public class ResultActivity extends AppCompatActivity
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package org.moire.ultrasonic.activity;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v7.app.ActionBar;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
|
||||||
|
import org.moire.ultrasonic.R;
|
||||||
|
import org.moire.ultrasonic.fragment.ServerSettingsFragment;
|
||||||
|
import org.moire.ultrasonic.util.Util;
|
||||||
|
|
||||||
|
public class ServerSettingsActivity extends AppCompatActivity {
|
||||||
|
public static final String ARG_SERVER_ID = "argServerId";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
applyTheme();
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
final Bundle extras = getIntent().getExtras();
|
||||||
|
if (!extras.containsKey(ARG_SERVER_ID)) {
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (savedInstanceState == null) {
|
||||||
|
configureActionBar();
|
||||||
|
|
||||||
|
final int serverId = extras.getInt(ARG_SERVER_ID);
|
||||||
|
getFragmentManager().beginTransaction()
|
||||||
|
.add(android.R.id.content, ServerSettingsFragment.newInstance(serverId))
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
if (item.getItemId() == android.R.id.home) {
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyTheme() {
|
||||||
|
String theme = Util.getTheme(this);
|
||||||
|
|
||||||
|
if ("dark".equalsIgnoreCase(theme) || "fullscreen".equalsIgnoreCase(theme)) {
|
||||||
|
setTheme(R.style.UltraSonicTheme);
|
||||||
|
} else if ("light".equalsIgnoreCase(theme) || "fullscreenlight".equalsIgnoreCase(theme)) {
|
||||||
|
setTheme(R.style.UltraSonicTheme_Light);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureActionBar() {
|
||||||
|
final ActionBar actionBar = getSupportActionBar();
|
||||||
|
if (actionBar != null) {
|
||||||
|
actionBar.setDisplayShowHomeEnabled(true);
|
||||||
|
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,870 +18,26 @@
|
|||||||
*/
|
*/
|
||||||
package org.moire.ultrasonic.activity;
|
package org.moire.ultrasonic.activity;
|
||||||
|
|
||||||
import android.app.ActionBar;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.CheckBoxPreference;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.preference.EditTextPreference;
|
|
||||||
import android.preference.ListPreference;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.preference.PreferenceCategory;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.preference.PreferenceScreen;
|
|
||||||
import android.provider.SearchRecentSuggestions;
|
|
||||||
import android.text.InputType;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.View.OnClickListener;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.moire.ultrasonic.R;
|
import org.moire.ultrasonic.R;
|
||||||
import org.moire.ultrasonic.provider.SearchSuggestionProvider;
|
import org.moire.ultrasonic.fragment.SettingsFragment;
|
||||||
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 net.simonvt.menudrawer.MenuDrawer;
|
|
||||||
import net.simonvt.menudrawer.Position;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class SettingsActivity extends PreferenceResultActivity implements SharedPreferences.OnSharedPreferenceChangeListener, OnClickListener
|
|
||||||
{
|
|
||||||
private static final String TAG = SettingsActivity.class.getSimpleName();
|
|
||||||
private final Map<String, ServerSettings> serverSettings = new LinkedHashMap<String, ServerSettings>();
|
|
||||||
private boolean testingConnection;
|
|
||||||
private ListPreference theme;
|
|
||||||
private ListPreference videoPlayer;
|
|
||||||
private ListPreference maxBitrateWifi;
|
|
||||||
private ListPreference maxBitrateMobile;
|
|
||||||
private ListPreference cacheSize;
|
|
||||||
private EditTextPreference cacheLocation;
|
|
||||||
private ListPreference preloadCount;
|
|
||||||
private ListPreference bufferLength;
|
|
||||||
private ListPreference incrementTime;
|
|
||||||
private ListPreference networkTimeout;
|
|
||||||
private ListPreference maxAlbums;
|
|
||||||
private ListPreference maxSongs;
|
|
||||||
private ListPreference maxArtists;
|
|
||||||
private ListPreference defaultAlbums;
|
|
||||||
private ListPreference defaultSongs;
|
|
||||||
private ListPreference defaultArtists;
|
|
||||||
private ListPreference chatRefreshInterval;
|
|
||||||
private ListPreference directoryCacheTime;
|
|
||||||
private CheckBoxPreference mediaButtonsEnabled;
|
|
||||||
private CheckBoxPreference lockScreenEnabled;
|
|
||||||
private CheckBoxPreference sendBluetoothNotifications;
|
|
||||||
private CheckBoxPreference sendBluetoothAlbumArt;
|
|
||||||
private ListPreference viewRefresh;
|
|
||||||
private ListPreference imageLoaderConcurrency;
|
|
||||||
private EditTextPreference sharingDefaultDescription;
|
|
||||||
private EditTextPreference sharingDefaultGreeting;
|
|
||||||
private TimeSpanPreference sharingDefaultExpiration;
|
|
||||||
private int maxServerCount = 10;
|
|
||||||
private int minServerCount;
|
|
||||||
|
|
||||||
private static final String STATE_MENUDRAWER = "org.moire.ultrasonic.menuDrawer";
|
|
||||||
private static final String STATE_ACTIVE_VIEW_ID = "org.moire.ultrasonic.activeViewId";
|
|
||||||
private static final String STATE_ACTIVE_POSITION = "org.moire.ultrasonic.activePosition";
|
|
||||||
|
|
||||||
public MenuDrawer menuDrawer;
|
|
||||||
private int activePosition = 1;
|
|
||||||
private int menuActiveViewId;
|
|
||||||
private int activeServers;
|
|
||||||
View chatMenuItem;
|
|
||||||
View bookmarksMenuItem;
|
|
||||||
View sharesMenuItem;
|
|
||||||
PreferenceCategory serversCategory;
|
|
||||||
Preference addServerPreference;
|
|
||||||
SharedPreferences settings;
|
|
||||||
|
|
||||||
|
public class SettingsActivity extends SubsonicTabActivity {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState)
|
public void onCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
applyTheme();
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
addPreferencesFromResource(R.xml.settings);
|
getFragmentManager().beginTransaction()
|
||||||
|
.replace(android.R.id.content, new SettingsFragment())
|
||||||
|
.commit();
|
||||||
|
|
||||||
if (savedInstanceState != null)
|
|
||||||
{
|
|
||||||
activePosition = savedInstanceState.getInt(STATE_ACTIVE_POSITION);
|
|
||||||
menuActiveViewId = savedInstanceState.getInt(STATE_ACTIVE_VIEW_ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
menuDrawer = MenuDrawer.attach(this, MenuDrawer.Type.BEHIND, Position.LEFT, MenuDrawer.MENU_DRAG_WINDOW);
|
|
||||||
menuDrawer.setMenuView(R.layout.menu_main);
|
|
||||||
|
|
||||||
chatMenuItem = findViewById(R.id.menu_chat);
|
|
||||||
bookmarksMenuItem = findViewById(R.id.menu_bookmarks);
|
|
||||||
sharesMenuItem = findViewById(R.id.menu_shares);
|
|
||||||
|
|
||||||
findViewById(R.id.menu_home).setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_browse).setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_search).setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_playlists).setOnClickListener(this);
|
|
||||||
sharesMenuItem.setOnClickListener(this);
|
|
||||||
chatMenuItem.setOnClickListener(this);
|
|
||||||
bookmarksMenuItem.setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_now_playing).setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_settings).setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_about).setOnClickListener(this);
|
|
||||||
findViewById(R.id.menu_exit).setOnClickListener(this);
|
|
||||||
|
|
||||||
ActionBar actionBar = getActionBar();
|
|
||||||
|
|
||||||
if (actionBar != null)
|
|
||||||
{
|
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
View browseMenuItem = findViewById(R.id.menu_settings);
|
|
||||||
menuDrawer.setActiveView(browseMenuItem);
|
|
||||||
|
|
||||||
TextView activeView = (TextView) findViewById(menuActiveViewId);
|
|
||||||
|
|
||||||
if (activeView != null)
|
|
||||||
{
|
|
||||||
menuDrawer.setActiveView(activeView);
|
|
||||||
}
|
|
||||||
|
|
||||||
theme = (ListPreference) findPreference(Constants.PREFERENCES_KEY_THEME);
|
|
||||||
videoPlayer = (ListPreference) findPreference(Constants.PREFERENCES_KEY_VIDEO_PLAYER);
|
|
||||||
maxBitrateWifi = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI);
|
|
||||||
maxBitrateMobile = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE);
|
|
||||||
cacheSize = (ListPreference) findPreference(Constants.PREFERENCES_KEY_CACHE_SIZE);
|
|
||||||
cacheLocation = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_CACHE_LOCATION);
|
|
||||||
preloadCount = (ListPreference) findPreference(Constants.PREFERENCES_KEY_PRELOAD_COUNT);
|
|
||||||
bufferLength = (ListPreference) findPreference(Constants.PREFERENCES_KEY_BUFFER_LENGTH);
|
|
||||||
incrementTime = (ListPreference) findPreference(Constants.PREFERENCES_KEY_INCREMENT_TIME);
|
|
||||||
networkTimeout = (ListPreference) findPreference(Constants.PREFERENCES_KEY_NETWORK_TIMEOUT);
|
|
||||||
maxAlbums = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_ALBUMS);
|
|
||||||
maxSongs = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_SONGS);
|
|
||||||
maxArtists = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_ARTISTS);
|
|
||||||
defaultArtists = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS);
|
|
||||||
defaultSongs = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SONGS);
|
|
||||||
defaultAlbums = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS);
|
|
||||||
chatRefreshInterval = (ListPreference) findPreference(Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL);
|
|
||||||
directoryCacheTime = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME);
|
|
||||||
mediaButtonsEnabled = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_MEDIA_BUTTONS);
|
|
||||||
lockScreenEnabled = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS);
|
|
||||||
sendBluetoothAlbumArt = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART);
|
|
||||||
sendBluetoothNotifications = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS);
|
|
||||||
viewRefresh = (ListPreference) findPreference(Constants.PREFERENCES_KEY_VIEW_REFRESH);
|
|
||||||
imageLoaderConcurrency = (ListPreference) findPreference(Constants.PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY);
|
|
||||||
sharingDefaultDescription = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION);
|
|
||||||
sharingDefaultGreeting = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING);
|
|
||||||
sharingDefaultExpiration = (TimeSpanPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION);
|
|
||||||
|
|
||||||
sharingDefaultGreeting.setText(Util.getShareGreeting(this));
|
|
||||||
|
|
||||||
Preference clearSearchPreference = findPreference(Constants.PREFERENCES_KEY_CLEAR_SEARCH_HISTORY);
|
|
||||||
|
|
||||||
if (clearSearchPreference != null)
|
|
||||||
{
|
|
||||||
clearSearchPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference)
|
|
||||||
{
|
|
||||||
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(SettingsActivity.this, SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE);
|
|
||||||
suggestions.clearHistory();
|
|
||||||
Util.toast(SettingsActivity.this, R.string.settings_search_history_cleared);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
|
|
||||||
{
|
|
||||||
PreferenceCategory playbackControlSettings = (PreferenceCategory) findPreference(Constants.PREFERENCES_KEY_PLAYBACK_CONTROL_SETTINGS);
|
|
||||||
CheckBoxPreference gaplessPlaybackEnabled = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK);
|
|
||||||
|
|
||||||
if (gaplessPlaybackEnabled != null)
|
|
||||||
{
|
|
||||||
gaplessPlaybackEnabled.setChecked(false);
|
|
||||||
gaplessPlaybackEnabled.setEnabled(false);
|
|
||||||
|
|
||||||
if (playbackControlSettings != null)
|
|
||||||
{
|
|
||||||
playbackControlSettings.removePreference(gaplessPlaybackEnabled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
settings = PreferenceManager.getDefaultSharedPreferences(this);
|
|
||||||
activeServers = settings.getInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, 0);
|
|
||||||
|
|
||||||
serversCategory = (PreferenceCategory) findPreference(Constants.PREFERENCES_KEY_SERVERS_KEY);
|
|
||||||
|
|
||||||
addServerPreference = new Preference(this);
|
|
||||||
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.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));
|
|
||||||
}
|
|
||||||
|
|
||||||
addServerPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceClick(Preference preference)
|
|
||||||
{
|
|
||||||
if (activeServers == maxServerCount)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
activeServers++;
|
|
||||||
|
|
||||||
SharedPreferences.Editor prefEditor = settings.edit();
|
|
||||||
prefEditor.putInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, activeServers);
|
|
||||||
prefEditor.commit();
|
|
||||||
|
|
||||||
Preference addServerPreference = findPreference(Constants.PREFERENCES_KEY_ADD_SERVER);
|
|
||||||
|
|
||||||
if (addServerPreference != null)
|
|
||||||
{
|
|
||||||
serversCategory.removePreference(addServerPreference);
|
|
||||||
}
|
|
||||||
|
|
||||||
serversCategory.addPreference(addServer(activeServers));
|
|
||||||
|
|
||||||
if (addServerPreference != null)
|
|
||||||
{
|
|
||||||
serversCategory.addPreference(addServerPreference);
|
|
||||||
addServerPreference.setEnabled(activeServers < maxServerCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
String instance = String.valueOf(activeServers);
|
|
||||||
serverSettings.put(instance, new ServerSettings(instance));
|
|
||||||
|
|
||||||
applyTheme();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
SharedPreferences preferences = Util.getPreferences(this);
|
|
||||||
preferences.registerOnSharedPreferenceChangeListener(this);
|
|
||||||
|
|
||||||
|
final ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
actionBar.setSubtitle(R.string.menu_settings);
|
actionBar.setSubtitle(R.string.menu_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostCreate(Bundle bundle)
|
|
||||||
{
|
|
||||||
super.onPostCreate(bundle);
|
|
||||||
|
|
||||||
int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE;
|
|
||||||
chatMenuItem.setVisibility(visibility);
|
|
||||||
bookmarksMenuItem.setVisibility(visibility);
|
|
||||||
sharesMenuItem.setVisibility(visibility);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PreferenceScreen addServer(final int instance)
|
|
||||||
{
|
|
||||||
final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(this);
|
|
||||||
|
|
||||||
if (screen != null)
|
|
||||||
{
|
|
||||||
screen.setTitle(R.string.settings_server_unused);
|
|
||||||
screen.setKey(Constants.PREFERENCES_KEY_SERVER + instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
final EditTextPreference serverNamePreference = new EditTextPreference(this);
|
|
||||||
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(this);
|
|
||||||
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(this);
|
|
||||||
serverUsernamePreference.setKey(Constants.PREFERENCES_KEY_USERNAME + instance);
|
|
||||||
serverUsernamePreference.setTitle(R.string.settings_server_username);
|
|
||||||
|
|
||||||
final EditTextPreference serverPasswordPreference = new EditTextPreference(this);
|
|
||||||
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(this);
|
|
||||||
serverEnabledPreference.setDefaultValue(true);
|
|
||||||
serverEnabledPreference.setKey(Constants.PREFERENCES_KEY_SERVER_ENABLED + instance);
|
|
||||||
serverEnabledPreference.setTitle(R.string.equalizer_enabled);
|
|
||||||
|
|
||||||
final CheckBoxPreference jukeboxEnabledPreference = new CheckBoxPreference(this);
|
|
||||||
jukeboxEnabledPreference.setDefaultValue(false);
|
|
||||||
jukeboxEnabledPreference.setKey(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + instance);
|
|
||||||
jukeboxEnabledPreference.setTitle(R.string.jukebox_is_default);
|
|
||||||
|
|
||||||
Preference serverRemoveServerPreference = new Preference(this);
|
|
||||||
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 == minServerCount)
|
|
||||||
{
|
|
||||||
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(SettingsActivity.this);
|
|
||||||
for (int i = instance; i <= activeServers; i++)
|
|
||||||
{
|
|
||||||
Util.removeInstanceName(SettingsActivity.this, i, activeServer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
activeServers--;
|
|
||||||
|
|
||||||
if (screen != null)
|
|
||||||
{
|
|
||||||
serversCategory.removePreference(screen);
|
|
||||||
Dialog dialog = screen.getDialog();
|
|
||||||
|
|
||||||
if (dialog != null)
|
|
||||||
{
|
|
||||||
dialog.dismiss();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedPreferences.Editor prefEditor = settings.edit();
|
|
||||||
prefEditor.putInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, activeServers);
|
|
||||||
prefEditor.commit();
|
|
||||||
|
|
||||||
addServerPreference.setEnabled(activeServers < maxServerCount);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Preference serverTestConnectionPreference = new Preference(this);
|
|
||||||
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 applyTheme()
|
|
||||||
{
|
|
||||||
String theme = Util.getTheme(this);
|
|
||||||
|
|
||||||
// Support the old fullscreen themes as well, for upgrade purposes
|
|
||||||
if ("dark".equalsIgnoreCase(theme) || "fullscreen".equalsIgnoreCase(theme))
|
|
||||||
{
|
|
||||||
setTheme(R.style.UltraSonicTheme);
|
|
||||||
}
|
|
||||||
else if ("light".equalsIgnoreCase(theme) || "fullscreenlight".equalsIgnoreCase(theme))
|
|
||||||
{
|
|
||||||
setTheme(R.style.UltraSonicTheme_Light);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy()
|
|
||||||
{
|
|
||||||
super.onDestroy();
|
|
||||||
|
|
||||||
SharedPreferences prefs = Util.getPreferences(this);
|
|
||||||
prefs.unregisterOnSharedPreferenceChangeListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
|
|
||||||
{
|
|
||||||
Log.d(TAG, "Preference changed: " + key);
|
|
||||||
update();
|
|
||||||
|
|
||||||
if (Constants.PREFERENCES_KEY_HIDE_MEDIA.equals(key))
|
|
||||||
{
|
|
||||||
setHideMedia(sharedPreferences.getBoolean(key, false));
|
|
||||||
}
|
|
||||||
else if (Constants.PREFERENCES_KEY_MEDIA_BUTTONS.equals(key))
|
|
||||||
{
|
|
||||||
setMediaButtonsEnabled(sharedPreferences.getBoolean(key, true));
|
|
||||||
}
|
|
||||||
else if (Constants.PREFERENCES_KEY_CACHE_LOCATION.equals(key))
|
|
||||||
{
|
|
||||||
setCacheLocation(sharedPreferences.getString(key, ""));
|
|
||||||
}
|
|
||||||
else if (Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS.equals(key))
|
|
||||||
{
|
|
||||||
setBluetoothPreferences(sharedPreferences.getBoolean(key, true));
|
|
||||||
}
|
|
||||||
else if (Constants.PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY.equals(key))
|
|
||||||
{
|
|
||||||
setImageLoaderConcurrency(Integer.parseInt(sharedPreferences.getString(key, "5")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void update()
|
|
||||||
{
|
|
||||||
if (testingConnection)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
theme.setSummary(theme.getEntry());
|
|
||||||
videoPlayer.setSummary(videoPlayer.getEntry());
|
|
||||||
maxBitrateWifi.setSummary(maxBitrateWifi.getEntry());
|
|
||||||
maxBitrateMobile.setSummary(maxBitrateMobile.getEntry());
|
|
||||||
cacheSize.setSummary(cacheSize.getEntry());
|
|
||||||
cacheLocation.setSummary(cacheLocation.getText());
|
|
||||||
preloadCount.setSummary(preloadCount.getEntry());
|
|
||||||
bufferLength.setSummary(bufferLength.getEntry());
|
|
||||||
incrementTime.setSummary(incrementTime.getEntry());
|
|
||||||
networkTimeout.setSummary(networkTimeout.getEntry());
|
|
||||||
maxAlbums.setSummary(maxAlbums.getEntry());
|
|
||||||
maxArtists.setSummary(maxArtists.getEntry());
|
|
||||||
maxSongs.setSummary(maxSongs.getEntry());
|
|
||||||
defaultAlbums.setSummary(defaultAlbums.getEntry());
|
|
||||||
defaultArtists.setSummary(defaultArtists.getEntry());
|
|
||||||
defaultSongs.setSummary(defaultSongs.getEntry());
|
|
||||||
chatRefreshInterval.setSummary(chatRefreshInterval.getEntry());
|
|
||||||
directoryCacheTime.setSummary(directoryCacheTime.getEntry());
|
|
||||||
viewRefresh.setSummary(viewRefresh.getEntry());
|
|
||||||
imageLoaderConcurrency.setSummary(imageLoaderConcurrency.getEntry());
|
|
||||||
sharingDefaultExpiration.setSummary(sharingDefaultExpiration.getText());
|
|
||||||
sharingDefaultDescription.setSummary(sharingDefaultDescription.getText());
|
|
||||||
sharingDefaultGreeting.setSummary(sharingDefaultGreeting.getText());
|
|
||||||
|
|
||||||
if (!mediaButtonsEnabled.isChecked())
|
|
||||||
{
|
|
||||||
lockScreenEnabled.setChecked(false);
|
|
||||||
lockScreenEnabled.setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sendBluetoothNotifications.isChecked())
|
|
||||||
{
|
|
||||||
sendBluetoothAlbumArt.setChecked(false);
|
|
||||||
sendBluetoothAlbumArt.setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ServerSettings ss : serverSettings.values())
|
|
||||||
{
|
|
||||||
ss.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setImageLoaderConcurrency(int concurrency)
|
|
||||||
{
|
|
||||||
SubsonicTabActivity instance = SubsonicTabActivity.getInstance();
|
|
||||||
|
|
||||||
if (instance != null)
|
|
||||||
{
|
|
||||||
ImageLoader imageLoader = instance.getImageLoader();
|
|
||||||
|
|
||||||
if (imageLoader != null)
|
|
||||||
{
|
|
||||||
imageLoader.stopImageLoader();
|
|
||||||
imageLoader.setConcurrency(concurrency);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setHideMedia(boolean hide)
|
|
||||||
{
|
|
||||||
File nomediaDir = new File(FileUtil.getUltraSonicDirectory(), ".nomedia");
|
|
||||||
if (hide && !nomediaDir.exists())
|
|
||||||
{
|
|
||||||
if (!nomediaDir.mkdir())
|
|
||||||
{
|
|
||||||
Log.w(TAG, "Failed to create " + nomediaDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (nomediaDir.exists())
|
|
||||||
{
|
|
||||||
if (!nomediaDir.delete())
|
|
||||||
{
|
|
||||||
Log.w(TAG, "Failed to delete " + nomediaDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Util.toast(this, R.string.settings_hide_media_toast, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setMediaButtonsEnabled(boolean enabled)
|
|
||||||
{
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
lockScreenEnabled.setEnabled(true);
|
|
||||||
Util.registerMediaButtonEventReceiver(this);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lockScreenEnabled.setEnabled(false);
|
|
||||||
Util.unregisterMediaButtonEventReceiver(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setBluetoothPreferences(boolean enabled)
|
|
||||||
{
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
sendBluetoothAlbumArt.setEnabled(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sendBluetoothAlbumArt.setEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCacheLocation(String path)
|
|
||||||
{
|
|
||||||
File dir = new File(path);
|
|
||||||
|
|
||||||
if (!FileUtil.ensureDirectoryExistsAndIsReadWritable(dir))
|
|
||||||
{
|
|
||||||
Util.toast(this, R.string.settings_cache_location_error, false);
|
|
||||||
|
|
||||||
// Reset it to the default.
|
|
||||||
String defaultPath = FileUtil.getDefaultMusicDirectory().getPath();
|
|
||||||
if (!defaultPath.equals(path))
|
|
||||||
{
|
|
||||||
SharedPreferences prefs = Util.getPreferences(this);
|
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
|
||||||
editor.putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, defaultPath);
|
|
||||||
editor.commit();
|
|
||||||
cacheLocation.setSummary(defaultPath);
|
|
||||||
cacheLocation.setText(defaultPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear download queue.
|
|
||||||
DownloadService downloadService = DownloadServiceImpl.getInstance();
|
|
||||||
downloadService.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void testConnection(final int instance)
|
|
||||||
{
|
|
||||||
ModalBackgroundTask<Boolean> task = new ModalBackgroundTask<Boolean>(this, false)
|
|
||||||
{
|
|
||||||
private int previousInstance;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Boolean doInBackground() throws Throwable
|
|
||||||
{
|
|
||||||
updateProgress(R.string.settings_testing_connection);
|
|
||||||
|
|
||||||
previousInstance = Util.getActiveServer(SettingsActivity.this);
|
|
||||||
testingConnection = true;
|
|
||||||
Util.setActiveServer(SettingsActivity.this, instance);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
MusicService musicService = MusicServiceFactory.getMusicService(SettingsActivity.this);
|
|
||||||
musicService.ping(SettingsActivity.this, this);
|
|
||||||
return musicService.isLicenseValid(SettingsActivity.this, null);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
Util.setActiveServer(SettingsActivity.this, previousInstance);
|
|
||||||
testingConnection = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void done(Boolean licenseValid)
|
|
||||||
{
|
|
||||||
if (licenseValid)
|
|
||||||
{
|
|
||||||
Util.toast(SettingsActivity.this, R.string.settings_testing_ok);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Util.toast(SettingsActivity.this, R.string.settings_testing_unlicensed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void cancel()
|
|
||||||
{
|
|
||||||
super.cancel();
|
|
||||||
Util.setActiveServer(SettingsActivity.this, previousInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void error(Throwable error)
|
|
||||||
{
|
|
||||||
Log.w(TAG, error.toString(), error);
|
|
||||||
new ErrorDialog(SettingsActivity.this, 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(SettingsActivity.this, 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(SettingsActivity.this, 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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item)
|
|
||||||
{
|
|
||||||
switch (item.getItemId())
|
|
||||||
{
|
|
||||||
case android.R.id.home:
|
|
||||||
menuDrawer.toggleMenu();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onRestoreInstanceState(Bundle inState)
|
|
||||||
{
|
|
||||||
super.onRestoreInstanceState(inState);
|
|
||||||
menuDrawer.restoreState(inState.getParcelable(STATE_MENUDRAWER));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onSaveInstanceState(Bundle outState)
|
|
||||||
{
|
|
||||||
super.onSaveInstanceState(outState);
|
|
||||||
outState.putParcelable(STATE_MENUDRAWER, menuDrawer.saveState());
|
|
||||||
outState.putInt(STATE_ACTIVE_VIEW_ID, menuActiveViewId);
|
|
||||||
outState.putInt(STATE_ACTIVE_POSITION, activePosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBackPressed()
|
|
||||||
{
|
|
||||||
final int drawerState = menuDrawer.getDrawerState();
|
|
||||||
|
|
||||||
if (drawerState == MenuDrawer.STATE_OPEN || drawerState == MenuDrawer.STATE_OPENING)
|
|
||||||
{
|
|
||||||
menuDrawer.closeMenu(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
super.onBackPressed();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(View v)
|
|
||||||
{
|
|
||||||
menuActiveViewId = v.getId();
|
|
||||||
menuDrawer.setActiveView(v);
|
|
||||||
|
|
||||||
Intent intent;
|
|
||||||
|
|
||||||
switch (menuActiveViewId)
|
|
||||||
{
|
|
||||||
case R.id.menu_home:
|
|
||||||
intent = new Intent(this, MainActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
startActivityForResultWithoutTransition(this, intent);
|
|
||||||
break;
|
|
||||||
case R.id.menu_browse:
|
|
||||||
intent = new Intent(this, SelectArtistActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
startActivityForResultWithoutTransition(this, intent);
|
|
||||||
break;
|
|
||||||
case R.id.menu_search:
|
|
||||||
intent = new Intent(this, SearchActivity.class);
|
|
||||||
intent.putExtra(Constants.INTENT_EXTRA_REQUEST_SEARCH, true);
|
|
||||||
startActivityForResultWithoutTransition(this, intent);
|
|
||||||
break;
|
|
||||||
case R.id.menu_playlists:
|
|
||||||
intent = new Intent(this, SelectPlaylistActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
startActivityForResultWithoutTransition(this, intent);
|
|
||||||
break;
|
|
||||||
case R.id.menu_shares:
|
|
||||||
intent = new Intent(this, ShareActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
startActivityForResultWithoutTransition(this, intent);
|
|
||||||
break;
|
|
||||||
case R.id.menu_chat:
|
|
||||||
startActivityForResultWithoutTransition(this, ChatActivity.class);
|
|
||||||
break;
|
|
||||||
case R.id.menu_bookmarks:
|
|
||||||
startActivityForResultWithoutTransition(this, BookmarkActivity.class);
|
|
||||||
break;
|
|
||||||
case R.id.menu_now_playing:
|
|
||||||
startActivityForResultWithoutTransition(this, DownloadActivity.class);
|
|
||||||
break;
|
|
||||||
case R.id.menu_settings:
|
|
||||||
startActivityForResultWithoutTransition(this, SettingsActivity.class);
|
|
||||||
break;
|
|
||||||
case R.id.menu_about:
|
|
||||||
startActivityForResultWithoutTransition(this, HelpActivity.class);
|
|
||||||
break;
|
|
||||||
case R.id.menu_exit:
|
|
||||||
intent = new Intent(this, MainActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
intent.putExtra(Constants.INTENT_EXTRA_NAME_EXIT, true);
|
|
||||||
startActivityForResultWithoutTransition(this, intent);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
menuDrawer.closeMenu(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -19,7 +19,6 @@
|
|||||||
package org.moire.ultrasonic.activity;
|
package org.moire.ultrasonic.activity;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.ActionBar;
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
@ -36,6 +35,7 @@ import android.os.Build;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.support.v7.app.ActionBar;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -52,6 +52,9 @@ import android.widget.ImageView;
|
|||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import net.simonvt.menudrawer.MenuDrawer;
|
||||||
|
import net.simonvt.menudrawer.Position;
|
||||||
|
|
||||||
import org.moire.ultrasonic.R;
|
import org.moire.ultrasonic.R;
|
||||||
import org.moire.ultrasonic.domain.MusicDirectory;
|
import org.moire.ultrasonic.domain.MusicDirectory;
|
||||||
import org.moire.ultrasonic.domain.MusicDirectory.Entry;
|
import org.moire.ultrasonic.domain.MusicDirectory.Entry;
|
||||||
@ -75,9 +78,6 @@ import org.moire.ultrasonic.util.TimeSpanPicker;
|
|||||||
import org.moire.ultrasonic.util.Util;
|
import org.moire.ultrasonic.util.Util;
|
||||||
import org.moire.ultrasonic.util.VideoPlayerType;
|
import org.moire.ultrasonic.util.VideoPlayerType;
|
||||||
|
|
||||||
import net.simonvt.menudrawer.MenuDrawer;
|
|
||||||
import net.simonvt.menudrawer.Position;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -1276,7 +1276,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected void setActionBarDisplayHomeAsUp(boolean enabled)
|
protected void setActionBarDisplayHomeAsUp(boolean enabled)
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
@ -1286,7 +1286,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected void setActionBarTitle(CharSequence title)
|
protected void setActionBarTitle(CharSequence title)
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
@ -1296,7 +1296,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected void setActionBarTitle(int id)
|
protected void setActionBarTitle(int id)
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
@ -1306,7 +1306,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected CharSequence getActionBarTitle()
|
protected CharSequence getActionBarTitle()
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
CharSequence title = null;
|
CharSequence title = null;
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
@ -1319,7 +1319,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected void setActionBarSubtitle(CharSequence title)
|
protected void setActionBarSubtitle(CharSequence title)
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
@ -1329,7 +1329,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected void setActionBarSubtitle(int id)
|
protected void setActionBarSubtitle(int id)
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
{
|
{
|
||||||
@ -1339,7 +1339,7 @@ public class SubsonicTabActivity extends ResultActivity implements OnClickListen
|
|||||||
|
|
||||||
protected CharSequence getActionBarSubtitle()
|
protected CharSequence getActionBarSubtitle()
|
||||||
{
|
{
|
||||||
ActionBar actionBar = getActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
CharSequence subtitle = null;
|
CharSequence subtitle = null;
|
||||||
|
|
||||||
if (actionBar != null)
|
if (actionBar != null)
|
||||||
|
@ -0,0 +1,282 @@
|
|||||||
|
package org.moire.ultrasonic.fragment;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.CheckBoxPreference;
|
||||||
|
import android.preference.EditTextPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceFragment;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import org.moire.ultrasonic.R;
|
||||||
|
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.ModalBackgroundTask;
|
||||||
|
import org.moire.ultrasonic.util.Util;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Settings for Subsonic server.
|
||||||
|
*/
|
||||||
|
public class ServerSettingsFragment extends PreferenceFragment
|
||||||
|
implements Preference.OnPreferenceChangeListener,
|
||||||
|
Preference.OnPreferenceClickListener {
|
||||||
|
private static final String LOG_TAG = ServerSettingsFragment.class.getSimpleName();
|
||||||
|
private static final String ARG_SERVER_ID = "serverId";
|
||||||
|
|
||||||
|
private EditTextPreference serverNamePref;
|
||||||
|
private EditTextPreference serverUrlPref;
|
||||||
|
private EditTextPreference serverUsernamePref;
|
||||||
|
private EditTextPreference serverPasswordPref;
|
||||||
|
private CheckBoxPreference equalizerPref;
|
||||||
|
private CheckBoxPreference jukeboxPref;
|
||||||
|
private Preference removeServerPref;
|
||||||
|
private Preference testConnectionPref;
|
||||||
|
|
||||||
|
private int serverId;
|
||||||
|
private SharedPreferences sharedPreferences;
|
||||||
|
|
||||||
|
public static ServerSettingsFragment newInstance(final int serverId) {
|
||||||
|
final ServerSettingsFragment fragment = new ServerSettingsFragment();
|
||||||
|
final Bundle args = new Bundle();
|
||||||
|
args.putInt(ARG_SERVER_ID, serverId);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
serverId = getArguments().getInt(ARG_SERVER_ID);
|
||||||
|
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
||||||
|
|
||||||
|
addPreferencesFromResource(R.xml.server_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
serverNamePref = (EditTextPreference) findPreference(getString(R.string.settings_server_name));
|
||||||
|
serverUrlPref = (EditTextPreference) findPreference(getString(R.string.settings_server_address));
|
||||||
|
serverUsernamePref = (EditTextPreference) findPreference(getString(R.string.settings_server_username));
|
||||||
|
serverPasswordPref = (EditTextPreference) findPreference(getString(R.string.settings_server_password));
|
||||||
|
equalizerPref = (CheckBoxPreference) findPreference(getString(R.string.equalizer_enabled));
|
||||||
|
jukeboxPref = (CheckBoxPreference) findPreference(getString(R.string.jukebox_is_default));
|
||||||
|
removeServerPref = findPreference(getString(R.string.settings_server_remove_server));
|
||||||
|
testConnectionPref = findPreference(getString(R.string.settings_test_connection_title));
|
||||||
|
|
||||||
|
setupPreferencesValues();
|
||||||
|
setupPreferencesListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
if (preference == serverNamePref) {
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putString(Constants.PREFERENCES_KEY_SERVER_NAME + serverId, (String) newValue)
|
||||||
|
.apply();
|
||||||
|
updateName();
|
||||||
|
return true;
|
||||||
|
} else if (preference == serverUrlPref) {
|
||||||
|
final String url = (String) newValue;
|
||||||
|
try {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putString(Constants.PREFERENCES_KEY_SERVER_URL + serverId, url)
|
||||||
|
.apply();
|
||||||
|
updateUrl();
|
||||||
|
return true;
|
||||||
|
} else if (preference == serverUsernamePref) {
|
||||||
|
String username = (String) newValue;
|
||||||
|
if (username == null || !username.equals(username.trim())) {
|
||||||
|
new ErrorDialog(getActivity(), R.string.settings_invalid_username, false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putString(Constants.PREFERENCES_KEY_USERNAME + serverId, username)
|
||||||
|
.apply();
|
||||||
|
updateUsername();
|
||||||
|
return true;
|
||||||
|
} else if (preference == serverPasswordPref) {
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putString(Constants.PREFERENCES_KEY_PASSWORD + serverId, (String) newValue)
|
||||||
|
.apply();
|
||||||
|
updatePassword();
|
||||||
|
return true;
|
||||||
|
} else if (preference == equalizerPref) {
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + serverId, (Boolean) newValue)
|
||||||
|
.apply();
|
||||||
|
return true;
|
||||||
|
} else if (preference == jukeboxPref) {
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putBoolean(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + serverId, (Boolean) newValue)
|
||||||
|
.apply();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
if (preference == removeServerPref) {
|
||||||
|
removeServer();
|
||||||
|
return true;
|
||||||
|
} else if (preference == testConnectionPref) {
|
||||||
|
testConnection();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPreferencesValues() {
|
||||||
|
updateName();
|
||||||
|
updateUrl();
|
||||||
|
updateUsername();
|
||||||
|
updatePassword();
|
||||||
|
|
||||||
|
if (!sharedPreferences.contains(Constants.PREFERENCES_KEY_SERVER_ENABLED + serverId)) {
|
||||||
|
sharedPreferences.edit()
|
||||||
|
.putBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + serverId, true)
|
||||||
|
.apply();
|
||||||
|
}
|
||||||
|
equalizerPref.setChecked(sharedPreferences
|
||||||
|
.getBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + serverId, true));
|
||||||
|
|
||||||
|
jukeboxPref.setChecked(sharedPreferences
|
||||||
|
.getBoolean(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + serverId, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updatePassword() {
|
||||||
|
serverPasswordPref.setText(sharedPreferences
|
||||||
|
.getString(Constants.PREFERENCES_KEY_PASSWORD + serverId, "***"));
|
||||||
|
serverPasswordPref.setSummary("***");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateUsername() {
|
||||||
|
serverUsernamePref.setText(sharedPreferences
|
||||||
|
.getString(Constants.PREFERENCES_KEY_USERNAME + serverId,
|
||||||
|
getString(R.string.settings_server_username)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateUrl() {
|
||||||
|
final String serverUrl = sharedPreferences
|
||||||
|
.getString(Constants.PREFERENCES_KEY_SERVER_URL + serverId,
|
||||||
|
getString(R.string.settings_server_address_unset));
|
||||||
|
serverUrlPref.setText(serverUrl);
|
||||||
|
serverUrlPref.setSummary(serverUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateName() {
|
||||||
|
final String serverName = sharedPreferences
|
||||||
|
.getString(Constants.PREFERENCES_KEY_SERVER_NAME + serverId,
|
||||||
|
getString(R.string.settings_server_unused));
|
||||||
|
serverNamePref.setText(serverName);
|
||||||
|
serverNamePref.setSummary(serverName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupPreferencesListeners() {
|
||||||
|
serverNamePref.setOnPreferenceChangeListener(this);
|
||||||
|
serverUrlPref.setOnPreferenceChangeListener(this);
|
||||||
|
serverUsernamePref.setOnPreferenceChangeListener(this);
|
||||||
|
serverPasswordPref.setOnPreferenceChangeListener(this);
|
||||||
|
equalizerPref.setOnPreferenceChangeListener(this);
|
||||||
|
jukeboxPref.setOnPreferenceChangeListener(this);
|
||||||
|
|
||||||
|
removeServerPref.setOnPreferenceClickListener(this);
|
||||||
|
testConnectionPref.setOnPreferenceClickListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testConnection() {
|
||||||
|
ModalBackgroundTask<Boolean> task = new ModalBackgroundTask<Boolean>(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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,375 @@
|
|||||||
|
package org.moire.ultrasonic.fragment;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.CheckBoxPreference;
|
||||||
|
import android.preference.EditTextPreference;
|
||||||
|
import android.preference.ListPreference;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceCategory;
|
||||||
|
import android.preference.PreferenceFragment;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import android.provider.SearchRecentSuggestions;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
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.util.Constants;
|
||||||
|
import org.moire.ultrasonic.util.FileUtil;
|
||||||
|
import org.moire.ultrasonic.util.ImageLoader;
|
||||||
|
import org.moire.ultrasonic.util.TimeSpanPreference;
|
||||||
|
import org.moire.ultrasonic.util.Util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows main app settings.
|
||||||
|
*/
|
||||||
|
public class SettingsFragment extends PreferenceFragment
|
||||||
|
implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
private static final String LOG_TAG = SettingsFragment.class.getSimpleName();
|
||||||
|
|
||||||
|
private ListPreference theme;
|
||||||
|
private ListPreference videoPlayer;
|
||||||
|
private ListPreference maxBitrateWifi;
|
||||||
|
private ListPreference maxBitrateMobile;
|
||||||
|
private ListPreference cacheSize;
|
||||||
|
private EditTextPreference cacheLocation;
|
||||||
|
private ListPreference preloadCount;
|
||||||
|
private ListPreference bufferLength;
|
||||||
|
private ListPreference incrementTime;
|
||||||
|
private ListPreference networkTimeout;
|
||||||
|
private ListPreference maxAlbums;
|
||||||
|
private ListPreference maxSongs;
|
||||||
|
private ListPreference maxArtists;
|
||||||
|
private ListPreference defaultAlbums;
|
||||||
|
private ListPreference defaultSongs;
|
||||||
|
private ListPreference defaultArtists;
|
||||||
|
private ListPreference chatRefreshInterval;
|
||||||
|
private ListPreference directoryCacheTime;
|
||||||
|
private CheckBoxPreference mediaButtonsEnabled;
|
||||||
|
private CheckBoxPreference lockScreenEnabled;
|
||||||
|
private CheckBoxPreference sendBluetoothNotifications;
|
||||||
|
private CheckBoxPreference sendBluetoothAlbumArt;
|
||||||
|
private ListPreference viewRefresh;
|
||||||
|
private ListPreference imageLoaderConcurrency;
|
||||||
|
private EditTextPreference sharingDefaultDescription;
|
||||||
|
private EditTextPreference sharingDefaultGreeting;
|
||||||
|
private TimeSpanPreference sharingDefaultExpiration;
|
||||||
|
private PreferenceCategory serversCategory;
|
||||||
|
|
||||||
|
private int maxServerCount = 10;
|
||||||
|
private SharedPreferences settings;
|
||||||
|
private int activeServers;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
addPreferencesFromResource(R.xml.settings);
|
||||||
|
|
||||||
|
settings = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
theme = (ListPreference) findPreference(Constants.PREFERENCES_KEY_THEME);
|
||||||
|
videoPlayer = (ListPreference) findPreference(Constants.PREFERENCES_KEY_VIDEO_PLAYER);
|
||||||
|
maxBitrateWifi = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI);
|
||||||
|
maxBitrateMobile = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE);
|
||||||
|
cacheSize = (ListPreference) findPreference(Constants.PREFERENCES_KEY_CACHE_SIZE);
|
||||||
|
cacheLocation = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_CACHE_LOCATION);
|
||||||
|
preloadCount = (ListPreference) findPreference(Constants.PREFERENCES_KEY_PRELOAD_COUNT);
|
||||||
|
bufferLength = (ListPreference) findPreference(Constants.PREFERENCES_KEY_BUFFER_LENGTH);
|
||||||
|
incrementTime = (ListPreference) findPreference(Constants.PREFERENCES_KEY_INCREMENT_TIME);
|
||||||
|
networkTimeout = (ListPreference) findPreference(Constants.PREFERENCES_KEY_NETWORK_TIMEOUT);
|
||||||
|
maxAlbums = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_ALBUMS);
|
||||||
|
maxSongs = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_SONGS);
|
||||||
|
maxArtists = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_ARTISTS);
|
||||||
|
defaultArtists = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_ARTISTS);
|
||||||
|
defaultSongs = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SONGS);
|
||||||
|
defaultAlbums = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_ALBUMS);
|
||||||
|
chatRefreshInterval = (ListPreference) findPreference(Constants.PREFERENCES_KEY_CHAT_REFRESH_INTERVAL);
|
||||||
|
directoryCacheTime = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DIRECTORY_CACHE_TIME);
|
||||||
|
mediaButtonsEnabled = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_MEDIA_BUTTONS);
|
||||||
|
lockScreenEnabled = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SHOW_LOCK_SCREEN_CONTROLS);
|
||||||
|
sendBluetoothAlbumArt = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_ALBUM_ART);
|
||||||
|
sendBluetoothNotifications = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS);
|
||||||
|
viewRefresh = (ListPreference) findPreference(Constants.PREFERENCES_KEY_VIEW_REFRESH);
|
||||||
|
imageLoaderConcurrency = (ListPreference) findPreference(Constants.PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY);
|
||||||
|
sharingDefaultDescription = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION);
|
||||||
|
sharingDefaultGreeting = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING);
|
||||||
|
sharingDefaultExpiration = (TimeSpanPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION);
|
||||||
|
serversCategory = (PreferenceCategory) findPreference(Constants.PREFERENCES_KEY_SERVERS_KEY);
|
||||||
|
|
||||||
|
sharingDefaultGreeting.setText(Util.getShareGreeting(getActivity()));
|
||||||
|
setupClearSearchPreference();
|
||||||
|
setupGaplessControlSettingsV14();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
setupServersCategory();
|
||||||
|
SharedPreferences preferences = Util.getPreferences(getActivity());
|
||||||
|
preferences.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
|
||||||
|
SharedPreferences prefs = Util.getPreferences(getActivity());
|
||||||
|
prefs.unregisterOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
Log.d(LOG_TAG, "Preference changed: " + key);
|
||||||
|
update();
|
||||||
|
|
||||||
|
if (Constants.PREFERENCES_KEY_HIDE_MEDIA.equals(key)) {
|
||||||
|
setHideMedia(sharedPreferences.getBoolean(key, false));
|
||||||
|
} else if (Constants.PREFERENCES_KEY_MEDIA_BUTTONS.equals(key)) {
|
||||||
|
setMediaButtonsEnabled(sharedPreferences.getBoolean(key, true));
|
||||||
|
} else if (Constants.PREFERENCES_KEY_CACHE_LOCATION.equals(key)) {
|
||||||
|
setCacheLocation(sharedPreferences.getString(key, ""));
|
||||||
|
} else if (Constants.PREFERENCES_KEY_SEND_BLUETOOTH_NOTIFICATIONS.equals(key)) {
|
||||||
|
setBluetoothPreferences(sharedPreferences.getBoolean(key, true));
|
||||||
|
} else if (Constants.PREFERENCES_KEY_IMAGE_LOADER_CONCURRENCY.equals(key)) {
|
||||||
|
setImageLoaderConcurrency(Integer.parseInt(sharedPreferences.getString(key, "5")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupClearSearchPreference() {
|
||||||
|
Preference clearSearchPreference = findPreference(Constants.PREFERENCES_KEY_CLEAR_SEARCH_HISTORY);
|
||||||
|
|
||||||
|
if (clearSearchPreference != null) {
|
||||||
|
clearSearchPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
SearchRecentSuggestions suggestions =
|
||||||
|
new SearchRecentSuggestions(getActivity(),
|
||||||
|
SearchSuggestionProvider.AUTHORITY,
|
||||||
|
SearchSuggestionProvider.MODE);
|
||||||
|
suggestions.clearHistory();
|
||||||
|
Util.toast(getActivity(), R.string.settings_search_history_cleared);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupGaplessControlSettingsV14() {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
|
||||||
|
PreferenceCategory playbackControlSettings =
|
||||||
|
(PreferenceCategory) findPreference(Constants.PREFERENCES_KEY_PLAYBACK_CONTROL_SETTINGS);
|
||||||
|
CheckBoxPreference gaplessPlaybackEnabled =
|
||||||
|
(CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_GAPLESS_PLAYBACK);
|
||||||
|
|
||||||
|
if (gaplessPlaybackEnabled != null) {
|
||||||
|
gaplessPlaybackEnabled.setChecked(false);
|
||||||
|
gaplessPlaybackEnabled.setEnabled(false);
|
||||||
|
|
||||||
|
if (playbackControlSettings != null) {
|
||||||
|
playbackControlSettings.removePreference(gaplessPlaybackEnabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupServersCategory() {
|
||||||
|
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 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() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
|
if (activeServers == maxServerCount) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
activeServers++;
|
||||||
|
|
||||||
|
settings.edit()
|
||||||
|
.putInt(Constants.PREFERENCES_KEY_ACTIVE_SERVERS, activeServers)
|
||||||
|
.apply();
|
||||||
|
|
||||||
|
Preference addServerPreference = findPreference(Constants.PREFERENCES_KEY_ADD_SERVER);
|
||||||
|
|
||||||
|
if (addServerPreference != null) {
|
||||||
|
serversCategory.removePreference(addServerPreference);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void update() {
|
||||||
|
theme.setSummary(theme.getEntry());
|
||||||
|
videoPlayer.setSummary(videoPlayer.getEntry());
|
||||||
|
maxBitrateWifi.setSummary(maxBitrateWifi.getEntry());
|
||||||
|
maxBitrateMobile.setSummary(maxBitrateMobile.getEntry());
|
||||||
|
cacheSize.setSummary(cacheSize.getEntry());
|
||||||
|
cacheLocation.setSummary(cacheLocation.getText());
|
||||||
|
preloadCount.setSummary(preloadCount.getEntry());
|
||||||
|
bufferLength.setSummary(bufferLength.getEntry());
|
||||||
|
incrementTime.setSummary(incrementTime.getEntry());
|
||||||
|
networkTimeout.setSummary(networkTimeout.getEntry());
|
||||||
|
maxAlbums.setSummary(maxAlbums.getEntry());
|
||||||
|
maxArtists.setSummary(maxArtists.getEntry());
|
||||||
|
maxSongs.setSummary(maxSongs.getEntry());
|
||||||
|
defaultAlbums.setSummary(defaultAlbums.getEntry());
|
||||||
|
defaultArtists.setSummary(defaultArtists.getEntry());
|
||||||
|
defaultSongs.setSummary(defaultSongs.getEntry());
|
||||||
|
chatRefreshInterval.setSummary(chatRefreshInterval.getEntry());
|
||||||
|
directoryCacheTime.setSummary(directoryCacheTime.getEntry());
|
||||||
|
viewRefresh.setSummary(viewRefresh.getEntry());
|
||||||
|
imageLoaderConcurrency.setSummary(imageLoaderConcurrency.getEntry());
|
||||||
|
sharingDefaultExpiration.setSummary(sharingDefaultExpiration.getText());
|
||||||
|
sharingDefaultDescription.setSummary(sharingDefaultDescription.getText());
|
||||||
|
sharingDefaultGreeting.setSummary(sharingDefaultGreeting.getText());
|
||||||
|
|
||||||
|
if (!mediaButtonsEnabled.isChecked()) {
|
||||||
|
lockScreenEnabled.setChecked(false);
|
||||||
|
lockScreenEnabled.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sendBluetoothNotifications.isChecked()) {
|
||||||
|
sendBluetoothAlbumArt.setChecked(false);
|
||||||
|
sendBluetoothAlbumArt.setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void setImageLoaderConcurrency(int concurrency) {
|
||||||
|
SubsonicTabActivity instance = SubsonicTabActivity.getInstance();
|
||||||
|
|
||||||
|
if (instance != null) {
|
||||||
|
ImageLoader imageLoader = instance.getImageLoader();
|
||||||
|
|
||||||
|
if (imageLoader != null) {
|
||||||
|
imageLoader.stopImageLoader();
|
||||||
|
imageLoader.setConcurrency(concurrency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setHideMedia(boolean hide) {
|
||||||
|
File nomediaDir = new File(FileUtil.getUltraSonicDirectory(), ".nomedia");
|
||||||
|
if (hide && !nomediaDir.exists()) {
|
||||||
|
if (!nomediaDir.mkdir()) {
|
||||||
|
Log.w(LOG_TAG, "Failed to create " + nomediaDir);
|
||||||
|
}
|
||||||
|
} else if (nomediaDir.exists()) {
|
||||||
|
if (!nomediaDir.delete()) {
|
||||||
|
Log.w(LOG_TAG, "Failed to delete " + nomediaDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Util.toast(getActivity(), R.string.settings_hide_media_toast, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMediaButtonsEnabled(boolean enabled) {
|
||||||
|
if (enabled) {
|
||||||
|
lockScreenEnabled.setEnabled(true);
|
||||||
|
Util.registerMediaButtonEventReceiver(getActivity());
|
||||||
|
} else {
|
||||||
|
lockScreenEnabled.setEnabled(false);
|
||||||
|
Util.unregisterMediaButtonEventReceiver(getActivity());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setBluetoothPreferences(boolean enabled) {
|
||||||
|
if (enabled) {
|
||||||
|
sendBluetoothAlbumArt.setEnabled(true);
|
||||||
|
} else {
|
||||||
|
sendBluetoothAlbumArt.setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCacheLocation(String path) {
|
||||||
|
File dir = new File(path);
|
||||||
|
|
||||||
|
if (!FileUtil.ensureDirectoryExistsAndIsReadWritable(dir)) {
|
||||||
|
Util.toast(getActivity(), R.string.settings_cache_location_error, false);
|
||||||
|
|
||||||
|
// Reset it to the default.
|
||||||
|
String defaultPath = FileUtil.getDefaultMusicDirectory().getPath();
|
||||||
|
if (!defaultPath.equals(path)) {
|
||||||
|
Util.getPreferences(getActivity()).edit()
|
||||||
|
.putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, defaultPath)
|
||||||
|
.apply();
|
||||||
|
cacheLocation.setSummary(defaultPath);
|
||||||
|
cacheLocation.setText(defaultPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear download queue.
|
||||||
|
DownloadService downloadService = DownloadServiceImpl.getInstance();
|
||||||
|
downloadService.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -392,6 +392,7 @@
|
|||||||
<string name="settings.image_loader_concurrency_12">12</string>
|
<string name="settings.image_loader_concurrency_12">12</string>
|
||||||
<string name="albumArt">albumArt</string>
|
<string name="albumArt">albumArt</string>
|
||||||
<string name="common_multiple_years">Multiple Years</string>
|
<string name="common_multiple_years">Multiple Years</string>
|
||||||
|
<string name="settings.server_address_unset">http://yourhost</string>
|
||||||
|
|
||||||
<plurals name="select_album_n_songs">
|
<plurals name="select_album_n_songs">
|
||||||
<item quantity="zero">No songs</item>
|
<item quantity="zero">No songs</item>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<style name="listselect" parent="android:style/Widget.ListView">
|
<style name="listselect" parent="Widget.AppCompat.ListView">
|
||||||
<item name="android:listSelector">@drawable/list_selector_holo_dark</item>
|
<item name="android:listSelector">@drawable/list_selector_holo_dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="listselectlight" parent="android:style/Widget.ListView.White">
|
<style name="listselectlight" parent="Widget.AppCompat.ListView">
|
||||||
<item name="android:listSelector">@drawable/list_selector_holo_light</item>
|
<item name="android:listSelector">@drawable/list_selector_holo_light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="customprogress" parent="android:style/Widget.ProgressBar.Horizontal">
|
<style name="customprogress" parent="Widget.AppCompat.ProgressBar.Horizontal">
|
||||||
<item name="android:progressDrawable">@drawable/progress_horizontal_holo_dark</item>
|
<item name="android:progressDrawable">@drawable/progress_horizontal_holo_dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<style name="UltraSonicTheme" parent="@android:style/Theme.Holo">
|
<style name="UltraSonicTheme" parent="Theme.AppCompat">
|
||||||
<item name="color_background">@color/background_color_dark</item>
|
<item name="color_background">@color/background_color_dark</item>
|
||||||
<item name="star_hollow">@drawable/ic_star_hollow_dark</item>
|
<item name="star_hollow">@drawable/ic_star_hollow_dark</item>
|
||||||
<item name="star_full">@drawable/ic_star_full_dark</item>
|
<item name="star_full">@drawable/ic_star_full_dark</item>
|
||||||
@ -46,7 +46,7 @@
|
|||||||
<item name="button_check_custom">@drawable/btn_check_custom_dark</item>
|
<item name="button_check_custom">@drawable/btn_check_custom_dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="UltraSonicTheme.Light" parent="@android:style/Theme.Holo.Light">
|
<style name="UltraSonicTheme.Light" parent="Theme.AppCompat.Light">
|
||||||
<item name="color_background">@color/background_color_light</item>
|
<item name="color_background">@color/background_color_light</item>
|
||||||
<item name="star_hollow">@drawable/ic_star_hollow_light</item>
|
<item name="star_hollow">@drawable/ic_star_hollow_light</item>
|
||||||
<item name="star_full">@drawable/ic_star_full_light</item>
|
<item name="star_full">@drawable/ic_star_full_light</item>
|
||||||
|
57
ultrasonic/src/main/res/xml/server_settings.xml
Normal file
57
ultrasonic/src/main/res/xml/server_settings.xml
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<PreferenceScreen
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:title="@string/common.appname"
|
||||||
|
>
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="@string/settings.server_name"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings.server_name"
|
||||||
|
android:defaultValue="@string/settings.server_unused"
|
||||||
|
android:text="@string/settings.server_unused"
|
||||||
|
android:summary="@string/settings.server_unused"
|
||||||
|
/>
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="@string/settings.server_address"
|
||||||
|
android:persistent="false"
|
||||||
|
android:inputType="textUri"
|
||||||
|
android:defaultValue="@string/settings.server_address_unset"
|
||||||
|
android:title="@string/settings.server_address"
|
||||||
|
android:text="@string/settings.server_address_unset"
|
||||||
|
android:summary="@string/settings.server_address_unset"
|
||||||
|
/>
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="@string/settings.server_username"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings.server_username"
|
||||||
|
/>
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="@string/settings.server_password"
|
||||||
|
android:persistent="false"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:summary="***"
|
||||||
|
android:title="@string/settings.server_password"
|
||||||
|
/>
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="@string/equalizer.enabled"
|
||||||
|
android:persistent="false"
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:title="@string/equalizer.enabled"
|
||||||
|
/>
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="@string/jukebox.is_default"
|
||||||
|
android:persistent="false"
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:title="@string/jukebox.is_default"
|
||||||
|
/>
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings.server_remove_server"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings.server_remove_server"
|
||||||
|
/>
|
||||||
|
<Preference
|
||||||
|
android:key="@string/settings.test_connection_title"
|
||||||
|
android:persistent="false"
|
||||||
|
android:title="@string/settings.test_connection_title"
|
||||||
|
/>
|
||||||
|
</PreferenceScreen>
|
Loading…
x
Reference in New Issue
Block a user