1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
package net.sourceforge.subsonic.androidapp.activity; |
20 |
|
|
21 |
|
import android.content.SharedPreferences; |
22 |
|
import android.os.Bundle; |
23 |
|
import android.preference.EditTextPreference; |
24 |
|
import android.preference.ListPreference; |
25 |
|
import android.preference.Preference; |
26 |
|
import android.preference.PreferenceActivity; |
27 |
|
import android.preference.PreferenceScreen; |
28 |
|
import android.provider.SearchRecentSuggestions; |
29 |
|
import android.util.Log; |
30 |
|
import net.sourceforge.subsonic.androidapp.R; |
31 |
|
import net.sourceforge.subsonic.androidapp.provider.SearchSuggestionProvider; |
32 |
|
import net.sourceforge.subsonic.androidapp.service.DownloadService; |
33 |
|
import net.sourceforge.subsonic.androidapp.service.DownloadServiceImpl; |
34 |
|
import net.sourceforge.subsonic.androidapp.service.MusicService; |
35 |
|
import net.sourceforge.subsonic.androidapp.service.MusicServiceFactory; |
36 |
|
import net.sourceforge.subsonic.androidapp.util.Constants; |
37 |
|
import net.sourceforge.subsonic.androidapp.util.ErrorDialog; |
38 |
|
import net.sourceforge.subsonic.androidapp.util.FileUtil; |
39 |
|
import net.sourceforge.subsonic.androidapp.util.ModalBackgroundTask; |
40 |
|
import net.sourceforge.subsonic.androidapp.util.Util; |
41 |
|
|
42 |
|
import java.io.File; |
43 |
|
import java.net.URL; |
44 |
|
import java.util.LinkedHashMap; |
45 |
|
import java.util.Map; |
46 |
|
|
|
|
| 69,4% |
Uncovered Elements: 41 (134) |
Complexity: 30 |
Complexity Density: 0,33 |
|
47 |
|
public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { |
48 |
|
|
49 |
|
private static final String TAG = SettingsActivity.class.getSimpleName(); |
50 |
|
private final Map<String, ServerSettings> serverSettings = new LinkedHashMap<String, ServerSettings>(); |
51 |
|
private boolean testingConnection; |
52 |
|
private ListPreference theme; |
53 |
|
private ListPreference maxBitrateWifi; |
54 |
|
private ListPreference maxBitrateMobile; |
55 |
|
private ListPreference cacheSize; |
56 |
|
private EditTextPreference cacheLocation; |
57 |
|
private ListPreference preloadCount; |
58 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (20) |
Complexity: 2 |
Complexity Density: 0,11 |
|
59 |
2
|
@Override... |
60 |
|
public void onCreate(Bundle savedInstanceState) { |
61 |
2
|
super.onCreate(savedInstanceState); |
62 |
2
|
addPreferencesFromResource(R.xml.settings); |
63 |
|
|
64 |
2
|
theme = (ListPreference) findPreference(Constants.PREFERENCES_KEY_THEME); |
65 |
2
|
maxBitrateWifi = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_WIFI); |
66 |
2
|
maxBitrateMobile = (ListPreference) findPreference(Constants.PREFERENCES_KEY_MAX_BITRATE_MOBILE); |
67 |
2
|
cacheSize = (ListPreference) findPreference(Constants.PREFERENCES_KEY_CACHE_SIZE); |
68 |
2
|
cacheLocation = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_CACHE_LOCATION); |
69 |
2
|
preloadCount = (ListPreference) findPreference(Constants.PREFERENCES_KEY_PRELOAD_COUNT); |
70 |
|
|
71 |
2
|
findPreference("testConnection1").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { |
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
72 |
2
|
@Override... |
73 |
|
public boolean onPreferenceClick(Preference preference) { |
74 |
2
|
testConnection(1); |
75 |
2
|
return false; |
76 |
|
} |
77 |
|
}); |
78 |
|
|
79 |
2
|
findPreference("testConnection2").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { |
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
80 |
0
|
@Override... |
81 |
|
public boolean onPreferenceClick(Preference preference) { |
82 |
0
|
testConnection(2); |
83 |
0
|
return false; |
84 |
|
} |
85 |
|
}); |
86 |
|
|
87 |
2
|
findPreference("testConnection3").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { |
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
88 |
0
|
@Override... |
89 |
|
public boolean onPreferenceClick(Preference preference) { |
90 |
0
|
testConnection(3); |
91 |
0
|
return false; |
92 |
|
} |
93 |
|
}); |
94 |
|
|
95 |
2
|
findPreference("clearSearchHistory").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { |
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0,25 |
|
96 |
3
|
@Override... |
97 |
|
public boolean onPreferenceClick(Preference preference) { |
98 |
3
|
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(SettingsActivity.this, SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE); |
99 |
3
|
suggestions.clearHistory(); |
100 |
3
|
Util.toast(SettingsActivity.this, R.string.settings_search_history_cleared); |
101 |
3
|
return false; |
102 |
|
} |
103 |
|
}); |
104 |
|
|
105 |
8
|
for (int i = 1; i <= 3; i++) { |
106 |
6
|
String instance = String.valueOf(i); |
107 |
6
|
serverSettings.put(instance, new ServerSettings(instance)); |
108 |
|
} |
109 |
|
|
110 |
2
|
SharedPreferences prefs = Util.getPreferences(this); |
111 |
2
|
prefs.registerOnSharedPreferenceChangeListener(this); |
112 |
|
|
113 |
2
|
update(); |
114 |
|
} |
115 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (3) |
Complexity: 1 |
Complexity Density: 0,33 |
|
116 |
2
|
@Override... |
117 |
|
protected void onDestroy() { |
118 |
2
|
super.onDestroy(); |
119 |
|
|
120 |
2
|
SharedPreferences prefs = Util.getPreferences(this); |
121 |
2
|
prefs.unregisterOnSharedPreferenceChangeListener(this); |
122 |
|
} |
123 |
|
|
|
|
| 85,7% |
Uncovered Elements: 2 (14) |
Complexity: 4 |
Complexity Density: 0,5 |
|
124 |
20
|
@Override... |
125 |
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { |
126 |
20
|
Log.d(TAG, "Preference changed: " + key); |
127 |
20
|
update(); |
128 |
|
|
129 |
20
|
if (Constants.PREFERENCES_KEY_HIDE_MEDIA.equals(key)) { |
130 |
3
|
setHideMedia(sharedPreferences.getBoolean(key, false)); |
131 |
|
} |
132 |
17
|
else if (Constants.PREFERENCES_KEY_MEDIA_BUTTONS.equals(key)) { |
133 |
2
|
setMediaButtonsEnabled(sharedPreferences.getBoolean(key, true)); |
134 |
|
} |
135 |
15
|
else if (Constants.PREFERENCES_KEY_CACHE_LOCATION.equals(key)) { |
136 |
0
|
setCacheLocation(sharedPreferences.getString(key, "")); |
137 |
|
} |
138 |
|
} |
139 |
|
|
|
|
| 83,3% |
Uncovered Elements: 2 (12) |
Complexity: 2 |
Complexity Density: 0,2 |
|
140 |
22
|
private void update() {... |
141 |
22
|
if (testingConnection) { |
142 |
0
|
return; |
143 |
|
} |
144 |
|
|
145 |
22
|
theme.setSummary(theme.getEntry()); |
146 |
22
|
maxBitrateWifi.setSummary(maxBitrateWifi.getEntry()); |
147 |
22
|
maxBitrateMobile.setSummary(maxBitrateMobile.getEntry()); |
148 |
22
|
cacheSize.setSummary(cacheSize.getEntry()); |
149 |
22
|
cacheLocation.setSummary(cacheLocation.getText()); |
150 |
22
|
preloadCount.setSummary(preloadCount.getEntry()); |
151 |
22
|
for (ServerSettings ss : serverSettings.values()) { |
152 |
66
|
ss.update(); |
153 |
|
} |
154 |
|
} |
155 |
|
|
|
|
| 68,8% |
Uncovered Elements: 5 (16) |
Complexity: 6 |
Complexity Density: 0,75 |
|
156 |
3
|
private void setHideMedia(boolean hide) {... |
157 |
3
|
File nomediaDir = new File(FileUtil.getSubsonicDirectory(), ".nomedia"); |
158 |
3
|
if (hide && !nomediaDir.exists()) { |
159 |
2
|
if (!nomediaDir.mkdir()) { |
160 |
0
|
Log.w(TAG, "Failed to create " + nomediaDir); |
161 |
|
} |
162 |
1
|
} else if (nomediaDir.exists()) { |
163 |
1
|
if (!nomediaDir.delete()) { |
164 |
0
|
Log.w(TAG, "Failed to delete " + nomediaDir); |
165 |
|
} |
166 |
|
} |
167 |
3
|
Util.toast(this, R.string.settings_hide_media_toast, false); |
168 |
|
} |
169 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 2 |
Complexity Density: 0,67 |
|
170 |
2
|
private void setMediaButtonsEnabled(boolean enabled) {... |
171 |
2
|
if (enabled) { |
172 |
1
|
Util.registerMediaButtonEventReceiver(this); |
173 |
|
} else { |
174 |
1
|
Util.unregisterMediaButtonEventReceiver(this); |
175 |
|
} |
176 |
|
} |
177 |
|
|
|
|
| 0% |
Uncovered Elements: 17 (17) |
Complexity: 3 |
Complexity Density: 0,23 |
|
178 |
0
|
private void setCacheLocation(String path) {... |
179 |
0
|
File dir = new File(path); |
180 |
0
|
if (!FileUtil.ensureDirectoryExistsAndIsReadWritable(dir)) { |
181 |
0
|
Util.toast(this, R.string.settings_cache_location_error, false); |
182 |
|
|
183 |
|
|
184 |
0
|
String defaultPath = FileUtil.getDefaultMusicDirectory().getPath(); |
185 |
0
|
if (!defaultPath.equals(path)) { |
186 |
0
|
SharedPreferences prefs = Util.getPreferences(this); |
187 |
0
|
SharedPreferences.Editor editor = prefs.edit(); |
188 |
0
|
editor.putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, defaultPath); |
189 |
0
|
editor.commit(); |
190 |
0
|
cacheLocation.setSummary(defaultPath); |
191 |
0
|
cacheLocation.setText(defaultPath); |
192 |
|
} |
193 |
|
|
194 |
|
|
195 |
0
|
DownloadService downloadService = DownloadServiceImpl.getInstance(); |
196 |
0
|
downloadService.clear(); |
197 |
|
} |
198 |
|
} |
199 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
200 |
2
|
private void testConnection(final int instance) {... |
201 |
2
|
ModalBackgroundTask<Boolean> task = new ModalBackgroundTask<Boolean>(this, false) { |
202 |
|
private int previousInstance; |
203 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (10) |
Complexity: 1 |
Complexity Density: 0,1 |
|
204 |
2
|
@Override... |
205 |
|
protected Boolean doInBackground() throws Throwable { |
206 |
2
|
updateProgress(R.string.settings_testing_connection); |
207 |
|
|
208 |
2
|
previousInstance = Util.getActiveServer(SettingsActivity.this); |
209 |
2
|
testingConnection = true; |
210 |
2
|
Util.setActiveServer(SettingsActivity.this, instance); |
211 |
2
|
try { |
212 |
2
|
MusicService musicService = MusicServiceFactory.getMusicService(SettingsActivity.this); |
213 |
2
|
musicService.ping(SettingsActivity.this, this); |
214 |
2
|
return musicService.isLicenseValid(SettingsActivity.this, null); |
215 |
|
} finally { |
216 |
2
|
Util.setActiveServer(SettingsActivity.this, previousInstance); |
217 |
2
|
testingConnection = false; |
218 |
|
} |
219 |
|
} |
220 |
|
|
|
|
| 60% |
Uncovered Elements: 2 (5) |
Complexity: 2 |
Complexity Density: 0,67 |
|
221 |
2
|
@Override... |
222 |
|
protected void done(Boolean licenseValid) { |
223 |
2
|
if (licenseValid) { |
224 |
2
|
Util.toast(SettingsActivity.this, R.string.settings_testing_ok); |
225 |
|
} else { |
226 |
0
|
Util.toast(SettingsActivity.this, R.string.settings_testing_unlicensed); |
227 |
|
} |
228 |
|
} |
229 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
230 |
0
|
@Override... |
231 |
|
protected void cancel() { |
232 |
0
|
super.cancel(); |
233 |
0
|
Util.setActiveServer(SettingsActivity.this, previousInstance); |
234 |
|
} |
235 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0,5 |
|
236 |
0
|
@Override... |
237 |
|
protected void error(Throwable error) { |
238 |
0
|
Log.w(TAG, error.toString(), error); |
239 |
0
|
new ErrorDialog(SettingsActivity.this, getResources().getString(R.string.settings_connection_failure) + |
240 |
|
" " + getErrorMessage(error), false); |
241 |
|
} |
242 |
|
}; |
243 |
2
|
task.execute(); |
244 |
|
} |
245 |
|
|
|
|
| 40,6% |
Uncovered Elements: 19 (32) |
Complexity: 9 |
Complexity Density: 0,38 |
|
246 |
|
private class ServerSettings { |
247 |
|
private EditTextPreference serverName; |
248 |
|
private EditTextPreference serverUrl; |
249 |
|
private EditTextPreference username; |
250 |
|
private PreferenceScreen screen; |
251 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (6) |
Complexity: 1 |
Complexity Density: 0,17 |
|
252 |
6
|
private ServerSettings(String instance) {... |
253 |
|
|
254 |
6
|
screen = (PreferenceScreen) findPreference("server" + instance); |
255 |
6
|
serverName = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_NAME + instance); |
256 |
6
|
serverUrl = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_URL + instance); |
257 |
6
|
username = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_USERNAME + instance); |
258 |
|
|
259 |
6
|
serverUrl.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { |
|
|
| 0% |
Uncovered Elements: 10 (10) |
Complexity: 4 |
Complexity Density: 0,5 |
|
260 |
0
|
@Override... |
261 |
|
public boolean onPreferenceChange(Preference preference, Object value) { |
262 |
0
|
try { |
263 |
0
|
String url = (String) value; |
264 |
0
|
new URL(url); |
265 |
0
|
if (!url.equals(url.trim()) || url.contains("@")) { |
266 |
0
|
throw new Exception(); |
267 |
|
} |
268 |
|
} catch (Exception x) { |
269 |
0
|
new ErrorDialog(SettingsActivity.this, R.string.settings_invalid_url, false); |
270 |
0
|
return false; |
271 |
|
} |
272 |
0
|
return true; |
273 |
|
} |
274 |
|
}); |
275 |
|
|
276 |
6
|
username.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { |
|
|
| 0% |
Uncovered Elements: 7 (7) |
Complexity: 3 |
Complexity Density: 0,6 |
|
277 |
0
|
@Override... |
278 |
|
public boolean onPreferenceChange(Preference preference, Object value) { |
279 |
0
|
String username = (String) value; |
280 |
0
|
if (username == null || !username.equals(username.trim())) { |
281 |
0
|
new ErrorDialog(SettingsActivity.this, R.string.settings_invalid_username, false); |
282 |
0
|
return false; |
283 |
|
} |
284 |
0
|
return true; |
285 |
|
} |
286 |
|
}); |
287 |
|
} |
288 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (5) |
Complexity: 1 |
Complexity Density: 0,2 |
|
289 |
66
|
public void update() {... |
290 |
66
|
serverName.setSummary(serverName.getText()); |
291 |
66
|
serverUrl.setSummary(serverUrl.getText()); |
292 |
66
|
username.setSummary(username.getText()); |
293 |
66
|
screen.setSummary(serverUrl.getText()); |
294 |
66
|
screen.setTitle(serverName.getText()); |
295 |
|
} |
296 |
|
} |
297 |
|
} |