2017-02-05 14:31:54 +01:00
|
|
|
package org.moire.ultrasonic.fragment;
|
|
|
|
|
2020-09-28 17:12:36 +02:00
|
|
|
import android.app.AlertDialog;
|
|
|
|
import android.content.DialogInterface;
|
2017-02-05 23:57:21 +01:00
|
|
|
import android.content.Intent;
|
2017-02-05 14:31:54 +01:00
|
|
|
import android.content.SharedPreferences;
|
|
|
|
import android.os.Build;
|
|
|
|
import android.os.Bundle;
|
2018-07-14 22:14:20 +02:00
|
|
|
import android.preference.*;
|
2017-02-05 14:31:54 +01:00
|
|
|
import android.provider.SearchRecentSuggestions;
|
2020-04-26 12:05:28 +02:00
|
|
|
import androidx.annotation.Nullable;
|
2020-09-28 17:12:36 +02:00
|
|
|
import androidx.annotation.StringRes;
|
|
|
|
|
2020-09-30 14:47:59 +02:00
|
|
|
import timber.log.Timber;
|
2017-02-05 14:31:54 +01:00
|
|
|
import android.view.View;
|
2020-09-18 09:37:19 +02:00
|
|
|
|
|
|
|
import org.koin.java.KoinJavaComponent;
|
2017-02-05 14:31:54 +01:00
|
|
|
import org.moire.ultrasonic.R;
|
2020-09-18 09:37:19 +02:00
|
|
|
import org.moire.ultrasonic.activity.ServerSelectorActivity;
|
2017-02-05 14:31:54 +01:00
|
|
|
import org.moire.ultrasonic.activity.SubsonicTabActivity;
|
2018-07-14 22:14:20 +02:00
|
|
|
import org.moire.ultrasonic.featureflags.Feature;
|
|
|
|
import org.moire.ultrasonic.featureflags.FeatureStorage;
|
2020-08-18 21:24:24 +02:00
|
|
|
import org.moire.ultrasonic.filepicker.FilePickerDialog;
|
|
|
|
import org.moire.ultrasonic.filepicker.OnFileSelectedListener;
|
2020-10-02 18:47:21 +02:00
|
|
|
import org.moire.ultrasonic.log.FileLoggerTree;
|
2017-02-05 14:31:54 +01:00
|
|
|
import org.moire.ultrasonic.provider.SearchSuggestionProvider;
|
2020-09-28 17:12:36 +02:00
|
|
|
import org.moire.ultrasonic.service.Consumer;
|
2020-06-25 14:33:44 +02:00
|
|
|
import org.moire.ultrasonic.service.MediaPlayerController;
|
2018-07-14 22:14:20 +02:00
|
|
|
import org.moire.ultrasonic.util.*;
|
2017-02-05 14:31:54 +01:00
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
|
2020-06-22 18:35:58 +02:00
|
|
|
import kotlin.Lazy;
|
|
|
|
|
2020-09-18 09:37:19 +02:00
|
|
|
import static org.koin.java.KoinJavaComponent.inject;
|
|
|
|
import static org.moire.ultrasonic.activity.ServerSelectorActivity.SERVER_SELECTOR_MANAGE_MODE;
|
2020-06-22 18:35:58 +02:00
|
|
|
|
2017-02-05 14:31:54 +01:00
|
|
|
/**
|
|
|
|
* Shows main app settings.
|
|
|
|
*/
|
|
|
|
public class SettingsFragment extends PreferenceFragment
|
|
|
|
implements SharedPreferences.OnSharedPreferenceChangeListener {
|
|
|
|
|
|
|
|
private ListPreference theme;
|
|
|
|
private ListPreference videoPlayer;
|
|
|
|
private ListPreference maxBitrateWifi;
|
|
|
|
private ListPreference maxBitrateMobile;
|
|
|
|
private ListPreference cacheSize;
|
2020-08-18 21:24:24 +02:00
|
|
|
private Preference cacheLocation;
|
2017-02-05 14:31:54 +01:00
|
|
|
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;
|
2020-11-25 20:00:12 +01:00
|
|
|
private CheckBoxPreference showArtistPicture;
|
2017-02-05 14:31:54 +01:00
|
|
|
private ListPreference viewRefresh;
|
|
|
|
private ListPreference imageLoaderConcurrency;
|
|
|
|
private EditTextPreference sharingDefaultDescription;
|
|
|
|
private EditTextPreference sharingDefaultGreeting;
|
|
|
|
private TimeSpanPreference sharingDefaultExpiration;
|
|
|
|
private PreferenceCategory serversCategory;
|
2020-09-25 19:03:53 +02:00
|
|
|
private Preference resumeOnBluetoothDevice;
|
|
|
|
private Preference pauseOnBluetoothDevice;
|
2020-10-02 18:47:21 +02:00
|
|
|
private CheckBoxPreference debugLogToFile;
|
2017-02-05 14:31:54 +01:00
|
|
|
|
|
|
|
private SharedPreferences settings;
|
|
|
|
|
2020-06-25 14:33:44 +02:00
|
|
|
private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
|
2020-06-22 18:35:58 +02:00
|
|
|
|
2017-02-05 14:31:54 +01:00
|
|
|
@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);
|
2020-08-18 21:24:24 +02:00
|
|
|
cacheLocation = findPreference(Constants.PREFERENCES_KEY_CACHE_LOCATION);
|
2017-02-05 14:31:54 +01:00
|
|
|
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);
|
2020-09-25 19:03:53 +02:00
|
|
|
resumeOnBluetoothDevice = findPreference(Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE);
|
|
|
|
pauseOnBluetoothDevice = findPreference(Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE);
|
2020-10-02 18:47:21 +02:00
|
|
|
debugLogToFile = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE);
|
2020-11-25 20:00:12 +01:00
|
|
|
showArtistPicture = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SHOW_ARTIST_PICTURE);
|
2017-02-05 14:31:54 +01:00
|
|
|
|
|
|
|
sharingDefaultGreeting.setText(Util.getShareGreeting(getActivity()));
|
|
|
|
setupClearSearchPreference();
|
|
|
|
setupGaplessControlSettingsV14();
|
2018-07-14 22:14:20 +02:00
|
|
|
setupFeatureFlagsPreferences();
|
2020-08-18 21:24:24 +02:00
|
|
|
setupCacheLocationPreference();
|
2020-09-28 17:12:36 +02:00
|
|
|
setupBluetoothDevicePreferences();
|
2020-06-20 15:16:57 +02:00
|
|
|
|
|
|
|
// After API26 foreground services must be used for music playback, and they must have a notification
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
|
PreferenceCategory notificationsCategory = (PreferenceCategory) findPreference(Constants.PREFERENCES_KEY_CATEGORY_NOTIFICATIONS);
|
|
|
|
notificationsCategory.removePreference(findPreference(Constants.PREFERENCES_KEY_SHOW_NOTIFICATION));
|
|
|
|
notificationsCategory.removePreference(findPreference(Constants.PREFERENCES_KEY_ALWAYS_SHOW_NOTIFICATION));
|
|
|
|
}
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
|
|
|
super.onActivityCreated(savedInstanceState);
|
|
|
|
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onResume() {
|
|
|
|
super.onResume();
|
|
|
|
|
2017-02-05 23:57:21 +01:00
|
|
|
setupServersCategory();
|
2017-02-05 14:31:54 +01:00
|
|
|
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) {
|
2020-09-30 14:47:59 +02:00
|
|
|
Timber.d("Preference changed: %s", key);
|
2017-02-05 14:31:54 +01:00
|
|
|
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_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")));
|
2020-10-02 18:47:21 +02:00
|
|
|
} else if (Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE.equals(key)) {
|
|
|
|
setDebugLogToFile(sharedPreferences.getBoolean(key, false));
|
2020-11-25 20:00:12 +01:00
|
|
|
} else if (Constants.PREFERENCES_KEY_ID3_TAGS.equals(key)) {
|
|
|
|
if (sharedPreferences.getBoolean(key, false)) showArtistPicture.setEnabled(true);
|
|
|
|
else showArtistPicture.setEnabled(false);
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-18 21:24:24 +02:00
|
|
|
private void setupCacheLocationPreference() {
|
|
|
|
cacheLocation.setSummary(settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION,
|
|
|
|
FileUtil.getDefaultMusicDirectory(getActivity()).getPath()));
|
|
|
|
|
|
|
|
cacheLocation.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceClick(Preference preference) {
|
|
|
|
// If the user tries to change the cache location, we must first check to see if we have write access.
|
|
|
|
PermissionUtil.requestInitialPermission(getActivity(), new PermissionUtil.PermissionRequestFinishedCallback() {
|
|
|
|
@Override
|
|
|
|
public void onPermissionRequestFinished(boolean hasPermission) {
|
|
|
|
if (hasPermission) {
|
|
|
|
FilePickerDialog filePickerDialog = FilePickerDialog.Companion.createFilePickerDialog(getActivity());
|
|
|
|
filePickerDialog.setDefaultDirectory(FileUtil.getDefaultMusicDirectory(getActivity()).getPath());
|
|
|
|
filePickerDialog.setInitialDirectory(cacheLocation.getSummary().toString());
|
|
|
|
filePickerDialog.setOnFileSelectedListener(new OnFileSelectedListener() {
|
|
|
|
@Override
|
|
|
|
public void onFileSelected(File file, String path) {
|
|
|
|
SharedPreferences.Editor editor = cacheLocation.getEditor();
|
|
|
|
editor.putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, path);
|
|
|
|
editor.commit();
|
|
|
|
|
|
|
|
setCacheLocation(path);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
filePickerDialog.show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-09-25 19:03:53 +02:00
|
|
|
private void setupBluetoothDevicePreferences() {
|
2020-09-28 17:12:36 +02:00
|
|
|
final int resumeSetting = Util.getResumeOnBluetoothDevice(getActivity());
|
|
|
|
final int pauseSetting = Util.getPauseOnBluetoothDevice(getActivity());
|
|
|
|
|
|
|
|
resumeOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(resumeSetting));
|
|
|
|
pauseOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(pauseSetting));
|
2020-09-25 19:03:53 +02:00
|
|
|
|
|
|
|
resumeOnBluetoothDevice.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceClick(Preference preference) {
|
2020-09-28 17:12:36 +02:00
|
|
|
showBluetoothDevicePreferenceDialog(
|
|
|
|
R.string.settings_playback_resume_on_bluetooth_device,
|
|
|
|
Util.getResumeOnBluetoothDevice(getActivity()),
|
|
|
|
new Consumer<Integer>() {
|
|
|
|
@Override
|
|
|
|
public void accept(Integer choice) {
|
|
|
|
SharedPreferences.Editor editor = resumeOnBluetoothDevice.getEditor();
|
|
|
|
editor.putInt(Constants.PREFERENCES_KEY_RESUME_ON_BLUETOOTH_DEVICE, choice);
|
|
|
|
editor.commit();
|
|
|
|
resumeOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(choice));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
pauseOnBluetoothDevice.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceClick(Preference preference) {
|
|
|
|
showBluetoothDevicePreferenceDialog(
|
|
|
|
R.string.settings_playback_pause_on_bluetooth_device,
|
|
|
|
Util.getPauseOnBluetoothDevice(getActivity()),
|
|
|
|
new Consumer<Integer>() {
|
|
|
|
@Override
|
|
|
|
public void accept(Integer choice) {
|
|
|
|
SharedPreferences.Editor editor = pauseOnBluetoothDevice.getEditor();
|
|
|
|
editor.putInt(Constants.PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE, choice);
|
|
|
|
editor.commit();
|
|
|
|
pauseOnBluetoothDevice.setSummary(bluetoothDevicePreferenceToString(choice));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return true;
|
2020-09-25 19:03:53 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-09-28 17:12:36 +02:00
|
|
|
private void showBluetoothDevicePreferenceDialog(@StringRes int title, int defaultChoice, final Consumer<Integer> onChosen) {
|
|
|
|
final int[] choice = {defaultChoice};
|
|
|
|
new AlertDialog.Builder(getActivity()).setTitle(title)
|
|
|
|
.setSingleChoiceItems(R.array.bluetoothDeviceSettingNames, defaultChoice,
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
|
|
choice[0] = i;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.setNegativeButton(R.string.common_cancel, new DialogInterface.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
|
|
dialogInterface.cancel();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
|
|
onChosen.accept(choice[0]);
|
|
|
|
dialogInterface.dismiss();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.create().show();
|
|
|
|
}
|
|
|
|
|
|
|
|
private String bluetoothDevicePreferenceToString(int preferenceValue) {
|
|
|
|
switch (preferenceValue) {
|
|
|
|
case Constants.PREFERENCE_VALUE_ALL: return getString(R.string.settings_playback_bluetooth_all);
|
|
|
|
case Constants.PREFERENCE_VALUE_A2DP: return getString(R.string.settings_playback_bluetooth_a2dp);
|
|
|
|
case Constants.PREFERENCE_VALUE_DISABLED: return getString(R.string.settings_playback_bluetooth_disabled);
|
|
|
|
default: return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-05 14:31:54 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-14 22:14:20 +02:00
|
|
|
private void setupFeatureFlagsPreferences() {
|
2020-01-13 21:20:52 +01:00
|
|
|
final FeatureStorage featureStorage = KoinJavaComponent.get(FeatureStorage.class);
|
|
|
|
|
2018-07-14 22:14:20 +02:00
|
|
|
CheckBoxPreference ffImageLoader = (CheckBoxPreference) findPreference(
|
|
|
|
Constants.PREFERENCES_KEY_FF_IMAGE_LOADER);
|
|
|
|
|
|
|
|
if (ffImageLoader != null) {
|
|
|
|
ffImageLoader.setChecked(featureStorage.isFeatureEnabled(Feature.NEW_IMAGE_DOWNLOADER));
|
|
|
|
ffImageLoader.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceChange(Preference preference, Object o) {
|
|
|
|
featureStorage.changeFeatureFlag(Feature.NEW_IMAGE_DOWNLOADER, (Boolean) o);
|
|
|
|
((SubsonicTabActivity) getActivity()).clearImageLoader();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2020-01-13 21:20:52 +01:00
|
|
|
|
|
|
|
CheckBoxPreference useFiveStarRating = (CheckBoxPreference) findPreference(
|
|
|
|
Constants.PREFERENCES_KEY_USE_FIVE_STAR_RATING);
|
|
|
|
|
|
|
|
if (useFiveStarRating != null) {
|
|
|
|
useFiveStarRating.setChecked(featureStorage.isFeatureEnabled(Feature.FIVE_STAR_RATING));
|
|
|
|
useFiveStarRating.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceChange(Preference preference, Object o) {
|
|
|
|
featureStorage.changeFeatureFlag(Feature.FIVE_STAR_RATING, (Boolean) o);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-07-14 22:14:20 +02:00
|
|
|
}
|
|
|
|
|
2017-02-05 14:31:54 +01:00
|
|
|
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() {
|
2017-02-05 23:57:21 +01:00
|
|
|
final Preference addServerPreference = new Preference(getActivity());
|
2017-02-05 14:31:54 +01:00
|
|
|
addServerPreference.setPersistent(false);
|
2020-09-18 09:37:19 +02:00
|
|
|
addServerPreference.setTitle(getResources().getString(R.string.settings_server_manage_servers));
|
|
|
|
addServerPreference.setEnabled(true);
|
2017-02-05 14:31:54 +01:00
|
|
|
|
2020-09-18 09:37:19 +02:00
|
|
|
// TODO new server management here
|
2017-02-05 23:57:21 +01:00
|
|
|
serversCategory.removeAll();
|
2017-02-05 14:31:54 +01:00
|
|
|
serversCategory.addPreference(addServerPreference);
|
|
|
|
|
|
|
|
addServerPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceClick(Preference preference) {
|
2020-09-18 09:37:19 +02:00
|
|
|
final Intent intent = new Intent(getActivity(), ServerSelectorActivity.class);
|
|
|
|
intent.putExtra(SERVER_SELECTOR_MANAGE_MODE, true);
|
|
|
|
startActivityForResult(intent, 0);
|
2017-02-05 14:31:54 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|
2020-09-18 09:37:19 +02:00
|
|
|
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private void update() {
|
|
|
|
theme.setSummary(theme.getEntry());
|
|
|
|
videoPlayer.setSummary(videoPlayer.getEntry());
|
|
|
|
maxBitrateWifi.setSummary(maxBitrateWifi.getEntry());
|
|
|
|
maxBitrateMobile.setSummary(maxBitrateMobile.getEntry());
|
|
|
|
cacheSize.setSummary(cacheSize.getEntry());
|
|
|
|
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);
|
|
|
|
}
|
2020-10-02 18:47:21 +02:00
|
|
|
|
|
|
|
if (debugLogToFile.isChecked()) {
|
|
|
|
debugLogToFile.setSummary(getString(R.string.settings_debug_log_path,
|
|
|
|
FileUtil.getUltrasonicDirectory(getActivity()), FileLoggerTree.FILENAME));
|
|
|
|
} else {
|
|
|
|
debugLogToFile.setSummary("");
|
|
|
|
}
|
2020-11-25 20:00:12 +01:00
|
|
|
|
|
|
|
if (Util.getShouldUseId3Tags(getActivity())) showArtistPicture.setEnabled(true);
|
|
|
|
else showArtistPicture.setEnabled(false);
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
2020-09-24 13:03:05 +02:00
|
|
|
File nomediaDir = new File(FileUtil.getUltrasonicDirectory(getActivity()), ".nomedia");
|
2017-02-05 14:31:54 +01:00
|
|
|
if (hide && !nomediaDir.exists()) {
|
|
|
|
if (!nomediaDir.mkdir()) {
|
2020-09-30 14:47:59 +02:00
|
|
|
Timber.w("Failed to create %s", nomediaDir);
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
} else if (nomediaDir.exists()) {
|
|
|
|
if (!nomediaDir.delete()) {
|
2020-09-30 14:47:59 +02:00
|
|
|
Timber.w("Failed to delete %s", nomediaDir);
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
Util.toast(getActivity(), R.string.settings_hide_media_toast, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setMediaButtonsEnabled(boolean enabled) {
|
|
|
|
if (enabled) {
|
|
|
|
lockScreenEnabled.setEnabled(true);
|
2020-07-02 19:01:33 +02:00
|
|
|
Util.registerMediaButtonEventReceiver(getActivity(), false);
|
2017-02-05 14:31:54 +01:00
|
|
|
} else {
|
|
|
|
lockScreenEnabled.setEnabled(false);
|
2020-07-02 19:01:33 +02:00
|
|
|
Util.unregisterMediaButtonEventReceiver(getActivity(), false);
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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)) {
|
2020-06-02 15:35:36 +02:00
|
|
|
PermissionUtil.handlePermissionFailed(getActivity(), new PermissionUtil.PermissionRequestFinishedCallback() {
|
|
|
|
@Override
|
2020-08-18 21:24:24 +02:00
|
|
|
public void onPermissionRequestFinished(boolean hasPermission) {
|
2020-06-17 18:14:34 +02:00
|
|
|
String currentPath = settings.getString(Constants.PREFERENCES_KEY_CACHE_LOCATION,
|
|
|
|
FileUtil.getDefaultMusicDirectory(getActivity()).getPath());
|
2020-06-02 15:35:36 +02:00
|
|
|
cacheLocation.setSummary(currentPath);
|
|
|
|
}
|
|
|
|
});
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
2020-08-18 21:24:24 +02:00
|
|
|
else {
|
|
|
|
cacheLocation.setSummary(path);
|
|
|
|
}
|
2020-06-02 15:35:36 +02:00
|
|
|
|
|
|
|
// Clear download queue.
|
2020-06-25 14:33:44 +02:00
|
|
|
mediaPlayerControllerLazy.getValue().clear();
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|
2020-10-02 18:47:21 +02:00
|
|
|
|
|
|
|
private void setDebugLogToFile(boolean writeLog) {
|
|
|
|
if (writeLog) {
|
|
|
|
FileLoggerTree.Companion.plantToTimberForest(getActivity().getApplicationContext());
|
|
|
|
Timber.i("Enabled debug logging to file");
|
|
|
|
} else {
|
|
|
|
FileLoggerTree.Companion.uprootFromTimberForest();
|
|
|
|
Timber.i("Disabled debug logging to file");
|
|
|
|
|
|
|
|
int fileNum = FileLoggerTree.Companion.getLogFileNumber(getActivity());
|
|
|
|
long fileSize = FileLoggerTree.Companion.getLogFileSizes(getActivity());
|
|
|
|
String message = getString(R.string.settings_debug_log_summary,
|
|
|
|
String.valueOf(fileNum),
|
|
|
|
String.valueOf(Math.ceil(fileSize / 1000000d)),
|
|
|
|
FileUtil.getUltrasonicDirectory(getActivity()));
|
|
|
|
|
|
|
|
new AlertDialog.Builder(getActivity())
|
|
|
|
.setMessage(message)
|
|
|
|
.setIcon(android.R.drawable.ic_dialog_info)
|
|
|
|
.setNegativeButton(R.string.settings_debug_log_keep, new DialogInterface.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
|
|
dialogInterface.cancel();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.setPositiveButton(R.string.settings_debug_log_delete, new DialogInterface.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
|
|
FileLoggerTree.Companion.deleteLogFiles(getActivity());
|
|
|
|
Timber.i("Deleted debug log files");
|
|
|
|
dialogInterface.dismiss();
|
|
|
|
new AlertDialog.Builder(getActivity()).setMessage(R.string.settings_debug_log_deleted)
|
|
|
|
.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialogInterface, int i) {
|
|
|
|
dialogInterface.dismiss();
|
|
|
|
}
|
|
|
|
}).create().show();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.create().show();
|
|
|
|
}
|
|
|
|
}
|
2017-02-05 14:31:54 +01:00
|
|
|
}
|