aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Jackson <daneren2005@gmail.com>2013-02-23 10:15:34 -0800
committerScott Jackson <daneren2005@gmail.com>2013-02-23 10:15:34 -0800
commit395138103947f114b77c546735be5dd92f4010d9 (patch)
treeaeec2b4602789f36d7d355f9bfb59578d220cb28
parente2e2e81624af3dd486f10b3838c48e9d87beb0df (diff)
parent956c3119a1fe2dcdbdbfab90e72c606d2fac3a4b (diff)
downloaddsub-395138103947f114b77c546735be5dd92f4010d9.tar.gz
dsub-395138103947f114b77c546735be5dd92f4010d9.tar.bz2
dsub-395138103947f114b77c546735be5dd92f4010d9.zip
Merge branch 'master' into StreamProxy
-rw-r--r--.gitignore9
-rw-r--r--.gitmodules5
m---------ActionBarSherlock0
m---------DragSortListView0
-rw-r--r--README10
-rw-r--r--subsonic-android/AndroidManifest.xml2
-rw-r--r--subsonic-android/debug.keystorebin1267 -> 1268 bytes
-rw-r--r--subsonic-android/project.properties3
-rw-r--r--subsonic-android/res/layout-land/download.xml2
-rw-r--r--subsonic-android/res/layout/download_playlist.xml26
-rw-r--r--subsonic-android/res/layout/song_list_item.xml7
-rw-r--r--subsonic-android/res/values/ids.xml4
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/activity/DownloadActivity.java87
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/activity/EqualizerActivity.java105
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/activity/SelectAlbumActivity.java11
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/activity/SelectPlaylistActivity.java6
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/audiofx/EqualizerController.java15
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/audiofx/VisualizerController.java16
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/receiver/MediaButtonIntentReceiver.java6
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/service/DownloadService.java8
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java72
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java29
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/updates/Updater.java10
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/updates/Updater373.java7
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/util/Constants.java2
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/util/ImageLoader.java14
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/util/ModalBackgroundTask.java14
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java13
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/view/UpdateView.java6
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/view/VisualizerView.java15
30 files changed, 398 insertions, 106 deletions
diff --git a/.gitignore b/.gitignore
index d466c271..eb01e9aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
-subsonic-android/.classpath
-subsonic-android/.project
-subsonic-android/bin/*
-subsonic-android/gen/* \ No newline at end of file
+subsonic-android/.classpath
+subsonic-android/.project
+subsonic-android/bin/*
+subsonic-android/gen/*
+subsonic-android/private/* \ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 0303afcf..1d77a2e9 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
[submodule "ActionBarSherlock"]
path = ActionBarSherlock
- url = https://github.com/JakeWharton/ActionBarSherlock.git
+ url = https://github.com/JakeWharton/ActionBarSherlock.git
+[submodule "DragSortListView"]
+ path = DragSortListView
+ url = https://github.com/bauerca/drag-sort-listview.git
diff --git a/ActionBarSherlock b/ActionBarSherlock
-Subproject 9598f2bb2ceed4a834cd5586a903f270ca4c0cc
+Subproject 90939dc3925ffaaa0de269bbbe1b35e274968ea
diff --git a/DragSortListView b/DragSortListView
new file mode 160000
+Subproject c4166a8fb4fd46688061ec915d4fa51de374e0a
diff --git a/README b/README
index c3cd2cda..c9e871cf 100644
--- a/README
+++ b/README
@@ -1,3 +1,13 @@
+Basic Instructions
+Run these commands to grab dependent libraries:
+git submodule init
+git submodule update
+
+Go to both ActionBarSherlock/library and DragSortListView/library and build project files with:
+android update project --path ./
+
+
+
Roadmap of major planned features in rough order that I plan to work on them in (little features get sprinkled in wherever):
Gapless Playback (may not be possible to get perfect)
diff --git a/subsonic-android/AndroidManifest.xml b/subsonic-android/AndroidManifest.xml
index 44609b37..5ca6cf49 100644
--- a/subsonic-android/AndroidManifest.xml
+++ b/subsonic-android/AndroidManifest.xml
@@ -3,7 +3,7 @@
package="github.daneren2005.dsub"
android:installLocation="internalOnly"
android:versionCode="36"
- android:versionName="3.7.3">
+ android:versionName="3.7.4">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
diff --git a/subsonic-android/debug.keystore b/subsonic-android/debug.keystore
index 1cb2c3d1..4e662d41 100644
--- a/subsonic-android/debug.keystore
+++ b/subsonic-android/debug.keystore
Binary files differ
diff --git a/subsonic-android/project.properties b/subsonic-android/project.properties
index 9b3b31a8..cd253d77 100644
--- a/subsonic-android/project.properties
+++ b/subsonic-android/project.properties
@@ -9,4 +9,5 @@
# Project target.
target=android-16
-android.library.reference.1=../../ActionBarSherlock
+android.library.reference.1=../ActionBarSherlock/library
+android.library.reference.2=../DragSortListView/library \ No newline at end of file
diff --git a/subsonic-android/res/layout-land/download.xml b/subsonic-android/res/layout-land/download.xml
index 431fef96..4992d169 100644
--- a/subsonic-android/res/layout-land/download.xml
+++ b/subsonic-android/res/layout-land/download.xml
@@ -53,7 +53,6 @@
android:text="EQ"
android:textStyle="bold"
android:textSize="22sp"
- android:visibility="gone"
android:background="@android:color/transparent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -76,7 +75,6 @@
android:text="VIS"
android:textStyle="bold"
android:textSize="22sp"
- android:visibility="gone"
android:background="@android:color/transparent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/subsonic-android/res/layout/download_playlist.xml b/subsonic-android/res/layout/download_playlist.xml
index 8e92a984..dc77826d 100644
--- a/subsonic-android/res/layout/download_playlist.xml
+++ b/subsonic-android/res/layout/download_playlist.xml
@@ -19,11 +19,25 @@
android:layout_height="wrap_content"
android:padding="10dip"/>
- <ListView
- android:id="@+id/download_list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_weight="1"
- android:cacheColorHint="#00000000"/>
+ <com.mobeta.android.dslv.DragSortListView
+ xmlns:dslv="http://schemas.android.com/apk/res/github.daneren2005.dsub"
+ android:id="@+id/download_list"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_weight="1"
+ android:cacheColorHint="#00000000"
+ dslv:drag_enabled="true"
+ dslv:collapsed_height="1dp"
+ dslv:drag_scroll_start="1.0"
+ dslv:max_drag_scroll_speed="2.0"
+ dslv:float_alpha="0.6"
+ dslv:slide_shuffle_speed="0.3"
+ dslv:track_drag_sort="false"
+ dslv:use_default_controller="true"
+ dslv:drag_handle_id="@id/drag_handle"
+ dslv:sort_enabled="true"
+ dslv:remove_enabled="false"
+ dslv:remove_mode="flingRemove"
+ dslv:drag_start_mode="onLongPress"/>
</LinearLayout> \ No newline at end of file
diff --git a/subsonic-android/res/layout/song_list_item.xml b/subsonic-android/res/layout/song_list_item.xml
index 9bbfde94..0ff738d2 100644
--- a/subsonic-android/res/layout/song_list_item.xml
+++ b/subsonic-android/res/layout/song_list_item.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="?android:attr/listPreferredItemHeight">
+ android:id="@id/drag_handle"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="?android:attr/listPreferredItemHeight">
<CheckedTextView
android:id="@+id/song_check"
diff --git a/subsonic-android/res/values/ids.xml b/subsonic-android/res/values/ids.xml
new file mode 100644
index 00000000..edb3bbec
--- /dev/null
+++ b/subsonic-android/res/values/ids.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources>
+ <item name="drag_handle" type="id"/>
+</resources> \ No newline at end of file
diff --git a/subsonic-android/src/github/daneren2005/dsub/activity/DownloadActivity.java b/subsonic-android/src/github/daneren2005/dsub/activity/DownloadActivity.java
index dd5b3f0a..954a3f02 100644
--- a/subsonic-android/src/github/daneren2005/dsub/activity/DownloadActivity.java
+++ b/subsonic-android/src/github/daneren2005/dsub/activity/DownloadActivity.java
@@ -36,6 +36,7 @@ import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Parcelable;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Display;
@@ -81,6 +82,7 @@ import github.daneren2005.dsub.util.*;
import github.daneren2005.dsub.view.AutoRepeatButton;
import java.util.ArrayList;
import java.util.concurrent.ScheduledFuture;
+import com.mobeta.android.dslv.*;
public class DownloadActivity extends SubsonicTabActivity implements OnGestureListener {
private static final String TAG = DownloadActivity.class.getSimpleName();
@@ -95,7 +97,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private TextView emptyTextView;
private TextView songTitleTextView;
private ImageView albumArtImageView;
- private ListView playlistView;
+ private DragSortListView playlistView;
private TextView positionTextView;
private TextView durationTextView;
private TextView statusTextView;
@@ -121,6 +123,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private VisualizerView visualizerView;
private boolean nowPlaying = true;
private ScheduledFuture<?> hideControlsFuture;
+ private SongListAdapter songListAdapter;
/**
* Called when the activity is first created.
@@ -145,7 +148,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
durationTextView = (TextView) findViewById(R.id.download_duration);
statusTextView = (TextView) findViewById(R.id.download_status);
progressBar = (HorizontalSlider) findViewById(R.id.download_progress_bar);
- playlistView = (ListView) findViewById(R.id.download_list);
+ playlistView = (DragSortListView) findViewById(R.id.download_list);
previousButton = (AutoRepeatButton)findViewById(R.id.download_previous);
nextButton = (AutoRepeatButton)findViewById(R.id.download_next);
pauseButton = findViewById(R.id.download_pause);
@@ -275,8 +278,14 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
equalizerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- startActivity(new Intent(DownloadActivity.this, EqualizerActivity.class));
- setControlsVisible(true);
+ DownloadService downloadService = getDownloadService();
+ if(downloadService != null && downloadService.getEqualizerController() != null
+ && downloadService.getEqualizerController().getEqualizer() != null) {
+ startActivity(new Intent(DownloadActivity.this, EqualizerActivity.class));
+ setControlsVisible(true);
+ } else {
+ Util.toast(DownloadActivity.this, "Failed to start equalizer. Try restarting.");
+ }
}
});
@@ -285,9 +294,14 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
public void onClick(View view) {
boolean active = !visualizerView.isActive();
visualizerView.setActive(active);
- getDownloadService().setShowVisualization(visualizerView.isActive());
+ boolean isActive = visualizerView.isActive();
+ getDownloadService().setShowVisualization(isActive);
updateButtons();
- Util.toast(DownloadActivity.this, active ? R.string.download_visualizer_on : R.string.download_visualizer_off);
+ if(active == isActive) {
+ Util.toast(DownloadActivity.this, active ? R.string.download_visualizer_on : R.string.download_visualizer_off);
+ } else {
+ Util.toast(DownloadActivity.this, "Failed to start visualizer. Try restarting.");
+ }
setControlsVisible(true);
}
});
@@ -333,6 +347,20 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
}
});
+ playlistView.setDropListener(new DragSortListView.DropListener() {
+ @Override
+ public void drop(int from, int to) {
+ getDownloadService().swap(from, to);
+ onDownloadListChanged();
+ }
+ });
+ playlistView.setRemoveListener(new DragSortListView.RemoveListener() {
+ @Override
+ public void remove(int which) {
+ getDownloadService().remove(which);
+ onDownloadListChanged();
+ }
+ });
registerForContextMenu(playlistView);
@@ -343,8 +371,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
downloadService.setShufflePlayEnabled(true);
}
- boolean visualizerAvailable = downloadService != null && downloadService.getVisualizerController() != null;
- boolean equalizerAvailable = downloadService != null && downloadService.getEqualizerController() != null;
+ boolean visualizerAvailable = downloadService != null && downloadService.getVisualizerAvailable();
+ boolean equalizerAvailable = downloadService != null && downloadService.getEqualizerAvailable();
if (!equalizerAvailable) {
equalizerButton.setVisibility(View.GONE);
@@ -400,8 +428,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
- if (visualizerView != null) {
- visualizerView.setActive(downloadService != null && downloadService.getShowVisualization());
+ if (visualizerView != null && downloadService != null && downloadService.getShowVisualization()) {
+ visualizerView.setActive(true);
}
updateButtons();
@@ -441,10 +469,15 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
private void updateButtons() {
- boolean eqEnabled = getDownloadService() != null && getDownloadService().getEqualizerController() != null &&
- getDownloadService().getEqualizerController().isEnabled();
- equalizerButton.setTextColor(eqEnabled ? COLOR_BUTTON_ENABLED : COLOR_BUTTON_DISABLED);
-
+ SharedPreferences prefs = Util.getPreferences(DownloadActivity.this);
+ boolean equalizerOn = prefs.getBoolean(Constants.PREFERENCES_EQUALIZER_ON, false);
+ if(equalizerOn && getDownloadService() != null && getDownloadService().getEqualizerController() != null &&
+ getDownloadService().getEqualizerController().isEnabled()) {
+ equalizerButton.setTextColor(COLOR_BUTTON_ENABLED);
+ } else {
+ equalizerButton.setTextColor(COLOR_BUTTON_DISABLED);
+ }
+
if (visualizerView != null) {
visualizerButton.setTextColor(visualizerView.isActive() ? COLOR_BUTTON_ENABLED : COLOR_BUTTON_DISABLED);
}
@@ -767,25 +800,35 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
}
}
-
- private void onDownloadListChanged() {
+ private void onDownloadListChanged() {
+ onDownloadListChanged(false);
+ }
+ private void onDownloadListChanged(boolean refresh) {
DownloadService downloadService = getDownloadService();
if (downloadService == null) {
return;
}
List<DownloadFile> list;
- if(nowPlaying)
+ if(nowPlaying) {
list = downloadService.getSongs();
- else
+ }
+ else {
list = downloadService.getBackgroundDownloads();
+ }
- if(downloadService.isShufflePlayEnabled())
+ if(downloadService.isShufflePlayEnabled()) {
emptyTextView.setText(R.string.download_shuffle_loading);
- else
+ }
+ else {
emptyTextView.setText(R.string.download_empty);
+ }
- playlistView.setAdapter(new SongListAdapter(list));
+ if(songListAdapter == null || refresh) {
+ playlistView.setAdapter(songListAdapter = new SongListAdapter(list));
+ } else {
+ songListAdapter.notifyDataSetChanged();
+ }
emptyTextView.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE);
currentRevision = downloadService.getDownloadListUpdateRevision();
@@ -988,7 +1031,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private void toggleNowPlaying() {
nowPlaying = !nowPlaying;
setTitle(nowPlaying ? "Now Playing" : "Downloading");
- onDownloadListChanged();
+ onDownloadListChanged(true);
}
@Override
diff --git a/subsonic-android/src/github/daneren2005/dsub/activity/EqualizerActivity.java b/subsonic-android/src/github/daneren2005/dsub/activity/EqualizerActivity.java
index 9906673a..e5de3858 100644
--- a/subsonic-android/src/github/daneren2005/dsub/activity/EqualizerActivity.java
+++ b/subsonic-android/src/github/daneren2005/dsub/activity/EqualizerActivity.java
@@ -22,8 +22,10 @@ import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
+import android.content.SharedPreferences;
import android.media.audiofx.Equalizer;
import android.os.Bundle;
+import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
@@ -36,6 +38,8 @@ import android.widget.TextView;
import github.daneren2005.dsub.R;
import github.daneren2005.dsub.audiofx.EqualizerController;
import github.daneren2005.dsub.service.DownloadServiceImpl;
+import github.daneren2005.dsub.util.Constants;
+import github.daneren2005.dsub.util.Util;
/**
* Equalizer controls.
@@ -44,12 +48,14 @@ import github.daneren2005.dsub.service.DownloadServiceImpl;
* @version $Id$
*/
public class EqualizerActivity extends Activity {
+ private static final String TAG = EqualizerActivity.class.getSimpleName();
private static final int MENU_GROUP_PRESET = 100;
private final Map<Short, SeekBar> bars = new HashMap<Short, SeekBar>();
private EqualizerController equalizerController;
private Equalizer equalizer;
+ private short masterLevel = 0;
@Override
public void onCreate(Bundle bundle) {
@@ -83,6 +89,17 @@ public class EqualizerActivity extends Activity {
protected void onPause() {
super.onPause();
equalizerController.saveSettings();
+
+ if(!equalizer.getEnabled()) {
+ equalizerController.release();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ equalizerController = DownloadServiceImpl.getInstance().getEqualizerController();
+ equalizer = equalizerController.getEqualizer();
}
@Override
@@ -109,24 +126,46 @@ public class EqualizerActivity extends Activity {
public boolean onContextItemSelected(MenuItem menuItem) {
short preset = (short) menuItem.getItemId();
equalizer.usePreset(preset);
- updateBars();
+ updateBars(false);
return true;
}
private void setEqualizerEnabled(boolean enabled) {
+ SharedPreferences prefs = Util.getPreferences(EqualizerActivity.this);
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putBoolean(Constants.PREFERENCES_EQUALIZER_ON, enabled);
+ editor.commit();
equalizer.setEnabled(enabled);
- updateBars();
+ updateBars(true);
}
- private void updateBars() {
-
+ private void updateBars(boolean changedEnabled) {
+ boolean isEnabled = equalizer.getEnabled();
+ short minEQLevel = equalizer.getBandLevelRange()[0];
for (Map.Entry<Short, SeekBar> entry : bars.entrySet()) {
short band = entry.getKey();
SeekBar bar = entry.getValue();
- bar.setEnabled(equalizer.getEnabled());
- short minEQLevel = equalizer.getBandLevelRange()[0];
- bar.setProgress(equalizer.getBandLevel(band) - minEQLevel);
+ bar.setEnabled(isEnabled);
+ if(band >= (short)0) {
+ if(changedEnabled) {
+ equalizer.setBandLevel(band, (short)(equalizer.getBandLevel(band) - masterLevel));
+ bar.setProgress(equalizer.getBandLevel(band) - minEQLevel);
+ } else {
+ bar.setProgress(equalizer.getBandLevel(band) - minEQLevel);
+ equalizer.setBandLevel(band, (short)(equalizer.getBandLevel(band) + masterLevel));
+ }
+ } else if(!isEnabled) {
+ bar.setProgress(-minEQLevel);
+ }
}
+
+ if(!isEnabled) {
+ masterLevel = 0;
+ SharedPreferences prefs = Util.getPreferences(EqualizerActivity.this);
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(Constants.PREFERENCES_EQUALIZER_SETTINGS, masterLevel);
+ editor.commit();
+ }
}
private void initEqualizer() {
@@ -134,6 +173,11 @@ public class EqualizerActivity extends Activity {
final short minEQLevel = equalizer.getBandLevelRange()[0];
final short maxEQLevel = equalizer.getBandLevelRange()[1];
+
+ // Setup Pregain
+ SharedPreferences prefs = Util.getPreferences(this);
+ masterLevel = (short)prefs.getInt(Constants.PREFERENCES_EQUALIZER_SETTINGS, 0);
+ initPregain(layout, minEQLevel, maxEQLevel);
for (short i = 0; i < equalizer.getNumberOfBands(); i++) {
final short band = i;
@@ -148,6 +192,9 @@ public class EqualizerActivity extends Activity {
bars.put(band, bar);
bar.setMax(maxEQLevel - minEQLevel);
short level = equalizer.getBandLevel(band);
+ if(equalizer.getEnabled()) {
+ level = (short) (level - masterLevel);
+ }
bar.setProgress(level - minEQLevel);
bar.setEnabled(equalizer.getEnabled());
updateLevelText(levelTextView, level);
@@ -157,7 +204,7 @@ public class EqualizerActivity extends Activity {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
short level = (short) (progress + minEQLevel);
if (fromUser) {
- equalizer.setBandLevel(band, level);
+ equalizer.setBandLevel(band, (short)(level + masterLevel));
}
updateLevelText(levelTextView, level);
}
@@ -173,6 +220,48 @@ public class EqualizerActivity extends Activity {
layout.addView(bandBar);
}
}
+
+ private void initPregain(LinearLayout layout, final short minEQLevel, final short maxEQLevel) {
+ View bandBar = LayoutInflater.from(this).inflate(R.layout.equalizer_bar, null);
+ TextView freqTextView = (TextView) bandBar.findViewById(R.id.equalizer_frequency);
+ final TextView levelTextView = (TextView) bandBar.findViewById(R.id.equalizer_level);
+ SeekBar bar = (SeekBar) bandBar.findViewById(R.id.equalizer_bar);
+
+ freqTextView.setText("Master");
+
+ bars.put((short)-1, bar);
+ bar.setMax(maxEQLevel - minEQLevel);
+ bar.setProgress(masterLevel - minEQLevel);
+ bar.setEnabled(equalizer.getEnabled());
+ updateLevelText(levelTextView, masterLevel);
+
+ bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ masterLevel = (short) (progress + minEQLevel);
+ if (fromUser) {
+ SharedPreferences prefs = Util.getPreferences(EqualizerActivity.this);
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(Constants.PREFERENCES_EQUALIZER_SETTINGS, masterLevel);
+ editor.commit();
+ for (short i = 0; i < equalizer.getNumberOfBands(); i++) {
+ short level = (short) ((bars.get(i).getProgress() + minEQLevel) + masterLevel);
+ equalizer.setBandLevel(i, level);
+ }
+ }
+ updateLevelText(levelTextView, masterLevel);
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ }
+ });
+ layout.addView(bandBar);
+ }
private void updateLevelText(TextView levelTextView, short level) {
levelTextView.setText((level > 0 ? "+" : "") + level / 100 + " dB");
diff --git a/subsonic-android/src/github/daneren2005/dsub/activity/SelectAlbumActivity.java b/subsonic-android/src/github/daneren2005/dsub/activity/SelectAlbumActivity.java
index 392401bf..926467ec 100644
--- a/subsonic-android/src/github/daneren2005/dsub/activity/SelectAlbumActivity.java
+++ b/subsonic-android/src/github/daneren2005/dsub/activity/SelectAlbumActivity.java
@@ -53,6 +53,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
private Button moreButton;
private Boolean licenseValid;
private boolean showHeader = true;
+ private EntryAdapter entryAdapter;
/**
* Called when the activity is first created.
@@ -695,7 +696,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
}
emptyView.setVisibility(entries.isEmpty() ? View.VISIBLE : View.GONE);
- entryList.setAdapter(new EntryAdapter(SelectAlbumActivity.this, getImageLoader(), entries, true));
+ entryList.setAdapter(entryAdapter = new EntryAdapter(SelectAlbumActivity.this, getImageLoader(), entries, true));
licenseValid = result.getSecond();
invalidateOptionsMenu();
@@ -753,12 +754,16 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
@Override
protected void done(Void result) {
- refresh();
+ for(int i = indexes.size() - 1; i >= 0; i--) {
+ entryList.setItemChecked(indexes.get(i) + 1, false);
+ entryAdapter.removeAt(indexes.get(i));
+ }
+ entryAdapter.notifyDataSetChanged();
Util.toast(SelectAlbumActivity.this, getResources().getString(R.string.removed_playlist, indexes.size(), name));
}
@Override
- protected void error(Throwable error) {
+ protected void error(Throwable error) {
String msg;
if (error instanceof OfflineException || error instanceof ServerTooOldException) {
msg = getErrorMessage(error);
diff --git a/subsonic-android/src/github/daneren2005/dsub/activity/SelectPlaylistActivity.java b/subsonic-android/src/github/daneren2005/dsub/activity/SelectPlaylistActivity.java
index d7deb610..5870f286 100644
--- a/subsonic-android/src/github/daneren2005/dsub/activity/SelectPlaylistActivity.java
+++ b/subsonic-android/src/github/daneren2005/dsub/activity/SelectPlaylistActivity.java
@@ -43,6 +43,7 @@ import java.util.List;
public class SelectPlaylistActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener {
private ListView list;
private View emptyTextView;
+ private PlaylistAdapter playlistAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -116,7 +117,7 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt
@Override
protected void done(List<Playlist> result) {
- list.setAdapter(new PlaylistAdapter(SelectPlaylistActivity.this, result));
+ list.setAdapter(playlistAdapter = new PlaylistAdapter(SelectPlaylistActivity.this, result));
emptyTextView.setVisibility(result.isEmpty() ? View.VISIBLE : View.GONE);
}
};
@@ -206,7 +207,8 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt
@Override
protected void done(Void result) {
- refresh();
+ playlistAdapter.remove(playlist);
+ playlistAdapter.notifyDataSetChanged();
Util.toast(SelectPlaylistActivity.this, getResources().getString(R.string.menu_deleted_playlist, playlist.getName()));
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/audiofx/EqualizerController.java b/subsonic-android/src/github/daneren2005/dsub/audiofx/EqualizerController.java
index f16ff968..0dcee863 100644
--- a/subsonic-android/src/github/daneren2005/dsub/audiofx/EqualizerController.java
+++ b/subsonic-android/src/github/daneren2005/dsub/audiofx/EqualizerController.java
@@ -38,6 +38,8 @@ public class EqualizerController {
private final Context context;
private Equalizer equalizer;
+ private boolean released = false;
+ private int audioSessionId = 0;
// Class initialization fails when this throws an exception.
static {
@@ -58,7 +60,8 @@ public class EqualizerController {
public EqualizerController(Context context, MediaPlayer mediaPlayer) {
this.context = context;
try {
- equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
+ audioSessionId = mediaPlayer.getAudioSessionId();
+ equalizer = new Equalizer(0, audioSessionId);
} catch (Throwable x) {
Log.w(TAG, "Failed to create equalizer.", x);
}
@@ -97,11 +100,21 @@ public class EqualizerController {
public void release() {
if (isAvailable()) {
+ released = true;
equalizer.release();
}
}
public Equalizer getEqualizer() {
+ if(released) {
+ released = false;
+ try {
+ equalizer = new Equalizer(0, audioSessionId);
+ } catch (Throwable x) {
+ equalizer = null;
+ Log.w(TAG, "Failed to create equalizer.", x);
+ }
+ }
return equalizer;
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/audiofx/VisualizerController.java b/subsonic-android/src/github/daneren2005/dsub/audiofx/VisualizerController.java
index 184aeb51..b32245f4 100644
--- a/subsonic-android/src/github/daneren2005/dsub/audiofx/VisualizerController.java
+++ b/subsonic-android/src/github/daneren2005/dsub/audiofx/VisualizerController.java
@@ -36,6 +36,8 @@ public class VisualizerController {
private final Context context;
private Visualizer visualizer;
+ private boolean released = false;
+ private int audioSessionId = 0;
// Class initialization fails when this throws an exception.
static {
@@ -56,7 +58,8 @@ public class VisualizerController {
public VisualizerController(Context context, MediaPlayer mediaPlayer) {
this.context = context;
try {
- visualizer = new Visualizer(mediaPlayer.getAudioSessionId());
+ audioSessionId = mediaPlayer.getAudioSessionId();
+ visualizer = new Visualizer(audioSessionId);
} catch (Throwable x) {
Log.w(TAG, "Failed to create visualizer.", x);
}
@@ -80,10 +83,21 @@ public class VisualizerController {
public void release() {
if (isAvailable()) {
visualizer.release();
+ released = true;
}
}
public Visualizer getVisualizer() {
+ if(released) {
+ released = false;
+ try {
+ visualizer = new Visualizer(audioSessionId);
+ } catch (Throwable x) {
+ visualizer = null;
+ Log.w(TAG, "Failed to create visualizer.", x);
+ }
+ }
+
return visualizer;
}
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/receiver/MediaButtonIntentReceiver.java b/subsonic-android/src/github/daneren2005/dsub/receiver/MediaButtonIntentReceiver.java
index cdbe8c4d..9796971f 100644
--- a/subsonic-android/src/github/daneren2005/dsub/receiver/MediaButtonIntentReceiver.java
+++ b/subsonic-android/src/github/daneren2005/dsub/receiver/MediaButtonIntentReceiver.java
@@ -40,5 +40,11 @@ public class MediaButtonIntentReceiver extends BroadcastReceiver {
Intent serviceIntent = new Intent(context, DownloadServiceImpl.class);
serviceIntent.putExtra(Intent.EXTRA_KEY_EVENT, event);
context.startService(serviceIntent);
+
+ try {
+ abortBroadcast();
+ } catch (Exception x) {
+ // Ignored.
+ }
}
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/service/DownloadService.java b/subsonic-android/src/github/daneren2005/dsub/service/DownloadService.java
index 663a6e6c..889d7d2b 100644
--- a/subsonic-android/src/github/daneren2005/dsub/service/DownloadService.java
+++ b/subsonic-android/src/github/daneren2005/dsub/service/DownloadService.java
@@ -60,6 +60,8 @@ public interface DownloadService {
void clearIncomplete();
int size();
+
+ void remove(int which);
void remove(DownloadFile downloadFile);
@@ -106,6 +108,10 @@ public interface DownloadService {
void setSuggestedPlaylistName(String name);
String getSuggestedPlaylistName();
+
+ boolean getEqualizerAvailable();
+
+ boolean getVisualizerAvailable();
EqualizerController getEqualizerController();
@@ -126,4 +132,6 @@ public interface DownloadService {
boolean getSleepTimer();
void setVolume(float volume);
+
+ void swap(int from, int to);
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java b/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java
index 6fdc2db3..fab4d6a1 100644
--- a/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java
+++ b/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java
@@ -159,21 +159,6 @@ public class DownloadServiceImpl extends Service implements DownloadService {
mRemoteControl.register(this, mediaButtonReceiverComponent);
}
- if (equalizerAvailable) {
- equalizerController = new EqualizerController(this, mediaPlayer);
- if (!equalizerController.isAvailable()) {
- equalizerController = null;
- } else {
- equalizerController.loadSettings();
- }
- }
- if (visualizerAvailable) {
- visualizerController = new VisualizerController(this, mediaPlayer);
- if (!visualizerController.isAvailable()) {
- visualizerController = null;
- }
- }
-
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());
wakeLock.setReferenceCounted(false);
@@ -190,6 +175,10 @@ public class DownloadServiceImpl extends Service implements DownloadService {
instance = this;
lifecycleSupport.onCreate();
+
+ if(prefs.getBoolean(Constants.PREFERENCES_EQUALIZER_ON, false)) {
+ getEqualizerController();
+ }
}
@Override
@@ -435,6 +424,11 @@ public class DownloadServiceImpl extends Service implements DownloadService {
}
updateJukeboxPlaylist();
}
+
+ @Override
+ public synchronized void remove(int which) {
+ downloadList.remove(which);
+ }
@Override
public synchronized void remove(DownloadFile downloadFile) {
@@ -513,9 +507,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
@Override
public synchronized List<DownloadFile> getSongs() {
- List<DownloadFile> temp = new ArrayList<DownloadFile>();
- temp.addAll(downloadList);
- return temp;
+ return downloadList;
}
@Override
@@ -528,9 +520,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
@Override
public synchronized List<DownloadFile> getBackgroundDownloads() {
- List<DownloadFile> temp = new ArrayList<DownloadFile>();
- temp.addAll(backgroundDownloadList);
- return temp;
+ return backgroundDownloadList;
}
/** Plays either the current song (resume) or the first/next one in queue. */
@@ -789,14 +779,38 @@ public class DownloadServiceImpl extends Service implements DownloadService {
public String getSuggestedPlaylistName() {
return suggestedPlaylistName;
}
+
+ @Override
+ public boolean getEqualizerAvailable() {
+ return equalizerAvailable;
+ }
+
+ @Override
+ public boolean getVisualizerAvailable() {
+ return visualizerAvailable;
+ }
@Override
public EqualizerController getEqualizerController() {
+ if (equalizerAvailable && equalizerController == null) {
+ equalizerController = new EqualizerController(this, mediaPlayer);
+ if (!equalizerController.isAvailable()) {
+ equalizerController = null;
+ } else {
+ equalizerController.loadSettings();
+ }
+ }
return equalizerController;
}
@Override
public VisualizerController getVisualizerController() {
+ if (visualizerAvailable && visualizerController == null) {
+ visualizerController = new VisualizerController(this, mediaPlayer);
+ if (!visualizerController.isAvailable()) {
+ visualizerController = null;
+ }
+ }
return visualizerController;
}
@@ -993,6 +1007,22 @@ public class DownloadServiceImpl extends Service implements DownloadService {
mediaPlayer.setVolume(volume, volume);
}
}
+
+ @Override
+ public synchronized void swap(int from, int to) {
+ int max = size();
+ if(to >= max) {
+ to = max - 1;
+ }
+ else if(to < 0) {
+ to = 0;
+ }
+
+ downloadList.add(to, downloadList.remove(from));
+ if(jukeboxEnabled) {
+ updateJukeboxPlaylist();
+ }
+ }
private void handleError(Exception x) {
Log.w(TAG, "Media player error: " + x, x);
diff --git a/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java b/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java
index 6ff45dee..e04fc00c 100644
--- a/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java
+++ b/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceLifecycleSupport.java
@@ -30,6 +30,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.RemoteControlClient;
+import android.os.AsyncTask;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -181,15 +182,7 @@ public class DownloadServiceLifecycleSupport {
}
public void serializeDownloadQueue() {
- State state = new State();
- for (DownloadFile downloadFile : downloadService.getSongs()) {
- state.songs.add(downloadFile.getSong());
- }
- state.currentPlayingIndex = downloadService.getCurrentPlayingIndex();
- state.currentPlayingPosition = downloadService.getPlayerPosition();
-
- Log.i(TAG, "Serialized currentPlayingIndex: " + state.currentPlayingIndex + ", currentPlayingPosition: " + state.currentPlayingPosition);
- FileUtil.serialize(downloadService, state, FILENAME_DOWNLOADS_SER);
+ new SerializeTask().execute();
}
private void deserializeDownloadQueue() {
@@ -277,4 +270,22 @@ public class DownloadServiceLifecycleSupport {
private int currentPlayingIndex;
private int currentPlayingPosition;
}
+
+ private class SerializeTask extends AsyncTask<Void, Void, Void> {
+ @Override
+ protected Void doInBackground(Void... params) {
+ List<DownloadFile> songs = new ArrayList<DownloadFile>(downloadService.getSongs());
+ State state = new State();
+ for (DownloadFile downloadFile : songs) {
+ state.songs.add(downloadFile.getSong());
+ }
+ state.currentPlayingIndex = downloadService.getCurrentPlayingIndex();
+ state.currentPlayingPosition = downloadService.getPlayerPosition();
+
+ Log.i(TAG, "Serialized currentPlayingIndex: " + state.currentPlayingIndex + ", currentPlayingPosition: " + state.currentPlayingPosition);
+ FileUtil.serialize(downloadService, state, FILENAME_DOWNLOADS_SER);
+
+ return null;
+ }
+ }
} \ No newline at end of file
diff --git a/subsonic-android/src/github/daneren2005/dsub/updates/Updater.java b/subsonic-android/src/github/daneren2005/dsub/updates/Updater.java
index a62920b9..69cdb642 100644
--- a/subsonic-android/src/github/daneren2005/dsub/updates/Updater.java
+++ b/subsonic-android/src/github/daneren2005/dsub/updates/Updater.java
@@ -60,10 +60,18 @@ public class Updater {
}
}
+ public String getName() {
+ return this.TAG;
+ }
+
private class BackgroundUpdate extends AsyncTask<Updater, Void, Void> {
@Override
protected Void doInBackground(Updater... params) {
- params[0].update(context);
+ try {
+ params[0].update(context);
+ } catch(Exception e) {
+ Log.w(TAG, "Failed to run update for " + params[0].getName());
+ }
return null;
}
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/updates/Updater373.java b/subsonic-android/src/github/daneren2005/dsub/updates/Updater373.java
index 4df31580..b56c2731 100644
--- a/subsonic-android/src/github/daneren2005/dsub/updates/Updater373.java
+++ b/subsonic-android/src/github/daneren2005/dsub/updates/Updater373.java
@@ -29,9 +29,10 @@ import java.io.File;
*
* @author Scott
*/
-public class Updater373 extends Updater {
+public class Updater373 extends Updater {
public Updater373() {
super(373);
+ TAG = Updater373.class.getSimpleName();
}
@Override
@@ -39,7 +40,9 @@ public class Updater373 extends Updater {
// Rename cover.jpeg to cover.jpg
Log.i(TAG, "Running Updater373: updating cover.jpeg to cover.jpg");
File dir = FileUtil.getMusicDirectory(context);
- moveArt(dir);
+ if(dir != null) {
+ moveArt(dir);
+ }
}
private void moveArt(File dir) {
diff --git a/subsonic-android/src/github/daneren2005/dsub/util/Constants.java b/subsonic-android/src/github/daneren2005/dsub/util/Constants.java
index c116c484..3ee7d7e8 100644
--- a/subsonic-android/src/github/daneren2005/dsub/util/Constants.java
+++ b/subsonic-android/src/github/daneren2005/dsub/util/Constants.java
@@ -88,6 +88,8 @@ public final class Constants {
public static final String PREFERENCES_KEY_SHUFFLE_GENRE = "genre";
public static final String PREFERENCES_KEY_KEEP_SCREEN_ON = "keepScreenOn";
public static final String PREFERENCES_KEY_BUFFER_LENGTH = "bufferLength";
+ public static final String PREFERENCES_EQUALIZER_ON = "equalizerOn";
+ public static final String PREFERENCES_EQUALIZER_SETTINGS = "equalizerSettings";
// Name of the preferences file.
public static final String PREFERENCES_FILE_NAME = "github.daneren2005.dsub_preferences";
diff --git a/subsonic-android/src/github/daneren2005/dsub/util/ImageLoader.java b/subsonic-android/src/github/daneren2005/dsub/util/ImageLoader.java
index 9586e24d..8e014afe 100644
--- a/subsonic-android/src/github/daneren2005/dsub/util/ImageLoader.java
+++ b/subsonic-android/src/github/daneren2005/dsub/util/ImageLoader.java
@@ -158,6 +158,15 @@ public class ImageLoader implements Runnable {
emptyImage = Bitmap.createBitmap(imageSizeDefault, imageSizeDefault, Bitmap.Config.ARGB_8888);
}
existingDrawable = new BitmapDrawable(emptyImage);
+ } else {
+ // Try to get rid of old transitions
+ try {
+ TransitionDrawable tmp = (TransitionDrawable) existingDrawable;
+ int layers = tmp.getNumberOfLayers();
+ existingDrawable = tmp.getDrawable(layers - 1);
+ } catch(Exception e) {
+ // Do nothing, just means that the drawable is a flat image
+ }
}
Drawable[] layers = new Drawable[]{existingDrawable, drawable};
@@ -244,7 +253,10 @@ public class ImageLoader implements Runnable {
try {
MusicService musicService = MusicServiceFactory.getMusicService(mContext);
Bitmap bitmap = musicService.getCoverArt(mContext, mEntry, mSize, mSaveSize, null);
- cache.put(getKey(mEntry.getCoverArt(), mSize), bitmap);
+ String key = getKey(mEntry.getCoverArt(), mSize);
+ cache.put(key, bitmap);
+ // Make sure key is the most recently "used"
+ cache.get(key);
final Drawable drawable = Util.createDrawableFromBitmap(mContext, bitmap);
mTaskHandler.setDrawable(drawable);
diff --git a/subsonic-android/src/github/daneren2005/dsub/util/ModalBackgroundTask.java b/subsonic-android/src/github/daneren2005/dsub/util/ModalBackgroundTask.java
index 973f4ead..1954c474 100644
--- a/subsonic-android/src/github/daneren2005/dsub/util/ModalBackgroundTask.java
+++ b/subsonic-android/src/github/daneren2005/dsub/util/ModalBackgroundTask.java
@@ -129,11 +129,13 @@ public abstract class ModalBackgroundTask<T> extends BackgroundTask<T> {
@Override
public void updateProgress(final String message) {
- getHandler().post(new Runnable() {
- @Override
- public void run() {
- progressDialog.setMessage(message);
- }
- });
+ if(!cancelled) {
+ getHandler().post(new Runnable() {
+ @Override
+ public void run() {
+ progressDialog.setMessage(message);
+ }
+ });
+ }
}
}
diff --git a/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java b/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java
index 6d2c7a63..476d3478 100644
--- a/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java
+++ b/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java
@@ -37,13 +37,19 @@ public class EntryAdapter extends ArrayAdapter<MusicDirectory.Entry> {
private final SubsonicTabActivity activity;
private final ImageLoader imageLoader;
private final boolean checkable;
+ private List<MusicDirectory.Entry> entries;
public EntryAdapter(SubsonicTabActivity activity, ImageLoader imageLoader, List<MusicDirectory.Entry> entries, boolean checkable) {
super(activity, android.R.layout.simple_list_item_1, entries);
+ this.entries = entries;
this.activity = activity;
this.imageLoader = imageLoader;
this.checkable = checkable;
}
+
+ public void removeAt(int position) {
+ entries.remove(position);
+ }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
@@ -51,12 +57,7 @@ public class EntryAdapter extends ArrayAdapter<MusicDirectory.Entry> {
if (entry.isDirectory()) {
AlbumView view;
- // TODO: Reuse AlbumView objects once cover art loading is working.
-// if (convertView != null && convertView instanceof AlbumView) {
-// view = (AlbumView) convertView;
-// } else {
- view = new AlbumView(activity);
-// }
+ view = new AlbumView(activity);
view.setAlbum(entry, imageLoader);
return view;
diff --git a/subsonic-android/src/github/daneren2005/dsub/view/UpdateView.java b/subsonic-android/src/github/daneren2005/dsub/view/UpdateView.java
index fee37ff0..9cc627cc 100644
--- a/subsonic-android/src/github/daneren2005/dsub/view/UpdateView.java
+++ b/subsonic-android/src/github/daneren2005/dsub/view/UpdateView.java
@@ -21,6 +21,8 @@ package github.daneren2005.dsub.view;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
import android.widget.LinearLayout;
import java.util.WeakHashMap;
@@ -32,6 +34,10 @@ public class UpdateView extends LinearLayout {
public UpdateView(Context context) {
super(context);
+ setLayoutParams(new LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.FILL_PARENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT));
+
INSTANCES.put(this, null);
int instanceCount = INSTANCES.size();
if (instanceCount > 50) {
diff --git a/subsonic-android/src/github/daneren2005/dsub/view/VisualizerView.java b/subsonic-android/src/github/daneren2005/dsub/view/VisualizerView.java
index 9bff3a2d..53ebc2ec 100644
--- a/subsonic-android/src/github/daneren2005/dsub/view/VisualizerView.java
+++ b/subsonic-android/src/github/daneren2005/dsub/view/VisualizerView.java
@@ -45,14 +45,14 @@ public class VisualizerView extends View {
private byte[] data;
private float[] points;
- private boolean active;
+ private boolean active = false;
public VisualizerView(Context context) {
super(context);
paint.setStrokeWidth(2f);
paint.setAntiAlias(true);
- paint.setColor(Color.rgb(129, 201, 54));
+ paint.setColor(Color.rgb(51, 181, 229));
}
public boolean isActive() {
@@ -61,8 +61,10 @@ public class VisualizerView extends View {
public void setActive(boolean active) {
this.active = active;
- Visualizer visualizer = getVizualiser();
+ VisualizerController visualizerController = getVizualiser();
+ Visualizer visualizer = visualizerController == null ? null : visualizerController.getVisualizer();
if (visualizer == null) {
+ this.active = false;
return;
}
@@ -83,13 +85,16 @@ public class VisualizerView extends View {
}
visualizer.setEnabled(active);
+ if(!active) {
+ visualizerController.release();
+ }
invalidate();
}
- private Visualizer getVizualiser() {
+ private VisualizerController getVizualiser() {
DownloadService downloadService = DownloadServiceImpl.getInstance();
VisualizerController visualizerController = downloadService == null ? null : downloadService.getVisualizerController();
- return visualizerController == null ? null : visualizerController.getVisualizer();
+ return visualizerController;
}
private void updateVisualizer(byte[] waveform) {