Clover Coverage Report - Subsonic-Android Coverage Report
Coverage timestamp: ven dic 19 2014 17:57:13 EST
../../../../../img/srcFileCovDistChart7.png 55% of files have more coverage
116   297   39   5,8
30   240   0,34   10
20     1,95  
2    
This report was generated with an evaluation server license. Purchase Clover or configure your license.
 
  SettingsActivity       Line # 47 92 30 69,4% 0.69402987
  SettingsActivity.ServerSettings       Line # 246 24 9 40,6% 0.40625
 
No Tests
 
1    /*
2    This file is part of Subsonic.
3   
4    Subsonic is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8   
9    Subsonic is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12    GNU General Public License for more details.
13   
14    You should have received a copy of the GNU General Public License
15    along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
16   
17    Copyright 2009 (C) Sindre Mehus
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   
 
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   
 
59  2 toggle @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() {
 
72  2 toggle @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() {
 
80  0 toggle @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() {
 
88  0 toggle @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() {
 
96  3 toggle @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   
 
116  2 toggle @Override
117    protected void onDestroy() {
118  2 super.onDestroy();
119   
120  2 SharedPreferences prefs = Util.getPreferences(this);
121  2 prefs.unregisterOnSharedPreferenceChangeListener(this);
122    }
123   
 
124  20 toggle @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   
 
140  22 toggle 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   
 
156  3 toggle 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   
 
170  2 toggle private void setMediaButtonsEnabled(boolean enabled) {
171  2 if (enabled) {
172  1 Util.registerMediaButtonEventReceiver(this);
173    } else {
174  1 Util.unregisterMediaButtonEventReceiver(this);
175    }
176    }
177   
 
178  0 toggle 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    // Reset it to the default.
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    // Clear download queue.
195  0 DownloadService downloadService = DownloadServiceImpl.getInstance();
196  0 downloadService.clear();
197    }
198    }
199   
 
200  2 toggle private void testConnection(final int instance) {
201  2 ModalBackgroundTask<Boolean> task = new ModalBackgroundTask<Boolean>(this, false) {
202    private int previousInstance;
203   
 
204  2 toggle @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   
 
221  2 toggle @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   
 
230  0 toggle @Override
231    protected void cancel() {
232  0 super.cancel();
233  0 Util.setActiveServer(SettingsActivity.this, previousInstance);
234    }
235   
 
236  0 toggle @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   
 
246    private class ServerSettings {
247    private EditTextPreference serverName;
248    private EditTextPreference serverUrl;
249    private EditTextPreference username;
250    private PreferenceScreen screen;
251   
 
252  6 toggle 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() {
 
260  0 toggle @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() {
 
277  0 toggle @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   
 
289  66 toggle 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    }