From 3585390fa5041c0a2942fef542e55a95e762541f Mon Sep 17 00:00:00 2001 From: Joshua Bahnsen Date: Sun, 29 Dec 2013 23:15:22 -0700 Subject: [PATCH] Add all show all songs by artist option --- res/values-fr/strings.xml | 3 + res/values-hu/strings.xml | 125 +++++++------ res/values/strings.xml | 3 + res/xml/settings.xml | 5 + .../activity/SelectAlbumActivity.java | 174 ++++++++++++++++-- .../activity/SelectArtistActivity.java | 1 + .../androidapp/domain/MusicDirectory.java | 28 ++- .../ultrasonic/androidapp/util/Constants.java | 2 + .../ultrasonic/androidapp/util/Util.java | 38 ++-- .../ultrasonic/androidapp/view/AlbumView.java | 2 +- 10 files changed, 284 insertions(+), 97 deletions(-) diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 171d9e00..8c8b9098 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -359,6 +359,9 @@ Défaut Flash Partager + All Songs by %s + Show All Songs By Artist + Add new entry in artist view to access all songs for an artist Aucun titre diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index f0ef4294..16a1e965 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -20,12 +20,12 @@ Megjegyzés Jóváhagyás Törlés - Letöltés + Letöltés (Gyorsítótárba) Részletek Többféle műfaj Név OK - Tárolás + Tárolás (Megőrzés az eszközön) Lejátszás (Utolsóként) Lejátszás (Következőként) Lejátszás @@ -37,22 +37,22 @@ Biztos, hogy törölni akarja? %1$s Könyvjelző eltávolítva. Könyvjelző beállítva %s. - A lejátszási lista üres! + A várólista üres! A távvezérlés nem áll rendelkezésre. Kérjük, engedélyezze a Jukebox módot a Felhasználók > Beállítások menüpontban, az Ön Subsonic kiszolgálóján! Távvezérlés kikapcsolása. A zenelejátszás a telefonon történik. A távvezérlés nem lehetséges kapcsolat nélküli módban! Távvezérlés bekapcsolása. A zenelejátszás a kiszolgálón történik. A távvezérlés nem támogatott. Kérjük, frissítse a Subsonic kiszolgálót! - Távoli hangerő + Hangerő távvezérlése Equalizer Jukebox ki Jukebox be - Dalszövegek + Dalszöveg Dal eltávolítása - Lejátszási lista mentése + Mentés lejátszási listába Kijelző ki Kijelző be - Album megjelenítése + Ugrás az albumhoz Véletlen sorrendű Véletlen sorrendű lejátszás Visualizer @@ -74,16 +74,16 @@ Profil kiválasztása Hiba! file:///android_asset/html/en/index.html - Jukebox alapértelmezettként + Jukebox alapértelmezésként Dalszöveg nem található! Előadónév szerint - Albumnév szerint + Albumcím szerint Legtöbbször lejátszott Legjobbra értékelt Utoljára hozzáadott Véletlenszerű Utoljára lejátszott - Csillagozott + Csillaggal megjelölt Albumok Előadók Műfajok @@ -92,10 +92,10 @@ Kiszolgáló kiválasztása Véletlen sorrendű Véletlenszerű - Csillagozott + Csillaggal megjelölt Dalok Videók - Üdvözli az UltraSonic! Az alkalmazás még nincs beállítva. Miután konfigurálta saját kiszolgálóját (elérhető: subsonic.org), húzza jobbra a képernyőt, lépjen be a Beállítások menüpontba, és adja meg csatlakozási adatokat! + Üdvözli az UltraSonic! Az alkalmazás még nincs beállítva. Miután konfigurálta saját kiszolgálóját (elérhető: subsonic.org), húzza balról jobbra az oldalsávot, lépjen be a Beállítások menüpontba, és adja meg csatlakozási adatokat! Üdvözlet! Névjegy Általános @@ -127,7 +127,7 @@ Érintse meg a kereséshez Dalok Keresés - A próba időszak lejárt! + A próbaidőszak lejárt! Később Korlátlan letöltéshez juthat a Subsonic támogatásával. Most @@ -143,19 +143,19 @@ Műfajok nem találhatók! Nincs mentett lejátszási lista a kiszolgálón. Csatlakozás a kiszolgálóhoz, kérem várjon! - Megjelenítés + Megjelenés Pufferméret Letiltva 1 másodperc 10 másodperc 12 másodperc - 2 minutes + 2 perc 15 másodperc 2 másodperc 20 másodperc 30 másodperc 5 másodperc - 60 másodperc + 1 perc 8 másodperc Gyorsítótár helye Hibás gyorsítótár hely! Az alapértelmezett használata. @@ -173,8 +173,8 @@ Csevegés frissítési gyakorisága Könyvjelző törlése Könyvjelző törlése a dal lejátszása után. - Lejátszási lista törlése - Lejátszási lista törlése az összes dal lejátszása után. + Várólista törlése + Várólista törlése az összes dal lejátszása után. Keresési előzmények törlése Csatlakozási hiba! Albumok találati száma @@ -229,8 +229,8 @@ 60 másodperc 75 másodperc 90 másodperc - Hálózat Értesítések + Hálózat Egyéb beállítások Lejátszás-vezérlés beállításai Dalok előolvasása @@ -240,7 +240,7 @@ 3 dal 5 dal Korlátlan - Képernyő ébrentartása a letöltési sebesség növelése érdekében. + Képernyő ébrentartása a letöltés alatt, a magasabb letöltési sebesség érdekében. Képernyő ébrentartása A Last.fm felhasználónevet és jelszót be kell állítani a Subsonic kiszolgálón! Továbbítás Last.fm-re (Scrobbling) @@ -278,7 +278,7 @@ Lejátszó-kezelőpanel megjelenítése a képernyőzáron. Értesítések megjelenítése Állandó kijelzés - Lejátszás jelzése az értesítési sávon, míg a lejátszási lista aktív. + Lejátszás jelzése az értesítési sávon, míg a várólista aktív. Lejátszás jelzése az értesítési sávon. Lejátszó-kezelőpanel Lejátszó-kezelőpanel megjelenítése minden oldalon. @@ -292,24 +292,24 @@ Világos Téma Mappanevek használata az előadók neveként - Feltételezi, hogy a legfelső szintű mappa az elődó neve. + Feltételezi, hogy a legfelső szintű mappa az előadó neve. Böngészés ID3 Tag használatával ID3 Tag módszer használata a fájlredszer alapú mód helyett. Videó Videólejátszó - Megtekinté Frissítési - 0,5 másodperc + Nézet frissítési gyakorisága + .5 másodperc 1 másodperc - 1,5 másodperc + 1.5 másodperc 2 másodperc - 2,5 másodperc + 2.5 másodperc 3 másodperc - 3,5 másodperc + 3.5 másodperc 4 másodperc - 4,5 másodperc + 4.5 másodperc 5 másodperc - Streaming, csak ha rendelkezésre áll Wi-Fi kapcsolat. - Csak Wi-Fi streaming + Streaming csak Wi-Fi hálózaton keresztül. + Streaming csak Wi-Fivel %1$s%2$s %d kbps 0 B @@ -323,42 +323,45 @@ Érintse meg a zene kiválasztásához Az SD kártya nem elérhető! Nincs SD kártya! - Alapértelmezett share leírás - Megosztása - Mindig kérjen leírása és lejárati létrehozásakor a részvény - Mindig kérjen részleteket - Alapértelmezett idő a lejárati - Ne mutassa párbeszédablak többé - Megosztási lehetőségek - Nincs lejárati - Kapcsoló lejátszási lista nézet - Beállított könyvjelző + Megosztás alapértelmezett leírása + Megosztás + Megosztás létrehozásakor mindig kérje be a leírást és a lejárati időt. + Mindig kérdezzen rá a részletekre + Alapértelmezett lejárati idő + A párbeszédablak ne jelenjen meg többé + Megosztás beállításai + Nincs lejárati idő + Toggle Playlist + Könyvjelző létrehozása Könyvjelző törlése Csillag - Törölje a lejátszási lista - Dalok osztani másokkal - Nincs dalok osztani másokkal elérhető a szerveren - Megosztani törölték %s - Nem törölheti megosztott dal másokkal %s - Milliszekundum + Clear Playlist + Megosztás + Nincs mentett megosztás a kiszolgálón. + %s megosztás törölve + %s megosztás törlése sikertelen! + Ezredmásodperc Másodperc Perc Óra Nap - Tiltsa - Rokkant - Menteni az alapértelmezett + Letiltva + Letiltva + Mentés alapértelmezésként Megjegyzés - Lejárati - \"%s\" ez a dal törölték - Ossza meg ezt a lejátszási lista - Alapértelmezett megosztási üdvözlő - Nézd meg ezt a zenét közös nektek %s - Megosztani dalok + Lejárati idő + \"%s\" eltávolítva a várólistáról + Várólista megosztása + Alapértelmezett megosztási üzenet + Hallgasd meg ezt a zenét, megosztottam innen: %s + Dalok megosztása ezzel MX Player Alapértelmezett Flash - Megosztani + Megosztás + All Songs by %s + Show All Songs By Artist + Add new entry in artist view to access all songs for an artist Nincsenek dalok @@ -378,16 +381,16 @@ %d dal tárolása visszavonva. - 1 dal hozzáadva a lejátszási sorhoz. - %d dal hozzáadva a lejátszási sorhoz. + 1 dal hozzáadva a várólistához utolsóként. + %d dal hozzáadva a várólistához utolsóként. - 1 dal hozzáadva következőként. - %d dal hozzáadva következőként. + 1 dal hozzáadva a várólistához következőként. + %d dal hozzáadva a várólistához következőként. 1 nap van hátra a próba időszakból. %d nap van hátra a próba időszakból. - + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 5527acb8..5d019088 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -359,6 +359,9 @@ Default Flash Share + All Songs by %s + Show All Songs By Artist + Add new entry in artist view to access all songs for an artist No songs diff --git a/res/xml/settings.xml b/res/xml/settings.xml index 79f6fc7d..66c7f43a 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -56,6 +56,11 @@ a:key="mediaButtons" a:summary="@string/settings.media_button_summary" a:title="@string/settings.media_button_title" /> + selectedSongs = getSelectedSongs(albumListView); - if (selectedSongs.size() > 0) + if (!selectedSongs.isEmpty()) { download(append, false, !append, false, shuffle, selectedSongs); selectAll(false, false); @@ -498,7 +503,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity return false; } - private void getMusicDirectory(final String id, final String name) + private void getMusicDirectory(final String id, final String name, final String parentId) { setActionBarSubtitle(name); @@ -507,8 +512,80 @@ public class SelectAlbumActivity extends SubsonicTabActivity @Override protected MusicDirectory load(MusicService service) throws Exception { - boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false); - return service.getMusicDirectory(id, name, refresh, SelectAlbumActivity.this, this); + MusicDirectory root = new MusicDirectory(); + + if (allSongsId.equals(id)) + { + boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false); + MusicDirectory musicDirectory = service.getMusicDirectory(parentId, name, refresh, SelectAlbumActivity.this, this); + + List songs = new LinkedList(); + getSongsRecursively(musicDirectory, songs); + + for (MusicDirectory.Entry song : songs) + { + if (!song.isDirectory()) + { + root.addChild(song); + } + } + } + else + { + boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false); + MusicDirectory musicDirectory = service.getMusicDirectory(id, name, refresh, SelectAlbumActivity.this, this); + + if (Util.getShouldShowAllSongsByArtist(SelectAlbumActivity.this) && musicDirectory.findChild(allSongsId) == null && musicDirectory.getChildren(true, false).size() == musicDirectory.getChildren(true, true).size()) + { + MusicDirectory.Entry allSongs = new MusicDirectory.Entry(); + + allSongs.setIsDirectory(true); + allSongs.setArtist(name); + allSongs.setParent(id); + allSongs.setId(allSongsId); + allSongs.setTitle(String.format(getResources().getString(R.string.select_album_all_songs), name)); + + root.addChild(allSongs); + + List children = musicDirectory.getChildren(); + + if (children != null) + { + root.addAll(children); + } + } + else + { + root = musicDirectory; + } + } + + return root; + } + + private void getSongsRecursively(MusicDirectory parent, List songs) throws Exception + { + for (MusicDirectory.Entry song : parent.getChildren(false, true)) + { + if (!song.isVideo() && !song.isDirectory()) + { + songs.add(song); + } + } + + MusicService musicService = MusicServiceFactory.getMusicService(SelectAlbumActivity.this); + + for (MusicDirectory.Entry dir : parent.getChildren(true, false)) + { + MusicDirectory root; + + if (!allSongsId.equals(dir.getId())) + { + root = musicService.getMusicDirectory(dir.getId(), dir.getTitle(), false, SelectAlbumActivity.this, this); + + getSongsRecursively(root, songs); + } + } } }.execute(); } @@ -522,13 +599,41 @@ public class SelectAlbumActivity extends SubsonicTabActivity @Override protected MusicDirectory load(MusicService service) throws Exception { + MusicDirectory root = new MusicDirectory(); + boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false); - return service.getArtist(id, name, refresh, SelectAlbumActivity.this, this); + MusicDirectory musicDirectory = service.getArtist(id, name, refresh, SelectAlbumActivity.this, this); + + if (Util.getShouldShowAllSongsByArtist(SelectAlbumActivity.this) && musicDirectory.findChild(allSongsId) == null && musicDirectory.getChildren(true, false).size() == musicDirectory.getChildren(true, true).size()) + { + MusicDirectory.Entry allSongs = new MusicDirectory.Entry(); + + allSongs.setIsDirectory(true); + allSongs.setArtist(name); + allSongs.setParent(id); + allSongs.setId(allSongsId); + allSongs.setTitle(String.format(getResources().getString(R.string.select_album_all_songs), name)); + + root.addFirst(allSongs); + + List children = musicDirectory.getChildren(); + + if (children != null) + { + root.addAll(children); + } + } + else + { + root = musicDirectory; + } + + return root; } }.execute(); } - private void getAlbum(final String id, final String name) + private void getAlbum(final String id, final String name, final String parentId) { setActionBarSubtitle(name); @@ -537,8 +642,55 @@ public class SelectAlbumActivity extends SubsonicTabActivity @Override protected MusicDirectory load(MusicService service) throws Exception { + MusicDirectory musicDirectory; + boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false); - return service.getAlbum(id, name, refresh, SelectAlbumActivity.this, this); + + if (allSongsId.equals(id)) + { + MusicDirectory root = new MusicDirectory(); + + Collection songs = new LinkedList(); + getSongsForArtist(parentId, songs); + + for (MusicDirectory.Entry song : songs) + { + if (!song.isDirectory()) + { + root.addChild(song); + } + } + + musicDirectory = root; + } + else + { + musicDirectory = service.getAlbum(id, name, refresh, SelectAlbumActivity.this, this); + } + + return musicDirectory; + } + + private void getSongsForArtist(String id, Collection songs) throws Exception + { + MusicService musicService = MusicServiceFactory.getMusicService(SelectAlbumActivity.this); + MusicDirectory artist = musicService.getArtist(id, "", false, SelectAlbumActivity.this, this); + + for (MusicDirectory.Entry album : artist.getChildren()) + { + if (!allSongsId.equals(album.getId())) + { + MusicDirectory albumDirectory = musicService.getAlbum(album.getId(), "", false, SelectAlbumActivity.this, this); + + for (MusicDirectory.Entry song : albumDirectory.getChildren()) + { + if (!song.isVideo()) + { + songs.add(song); + } + } + } + } } }.execute(); } @@ -649,7 +801,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity }.execute(); } - private void getShare(final String shareId, final String shareName) + private void getShare(final String shareId, final CharSequence shareName) { setActionBarSubtitle(shareName); diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java index a10675d2..0d8602e0 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java @@ -219,6 +219,7 @@ public class SelectArtistActivity extends SubsonicTabActivity implements Adapter Intent intent = new Intent(this, SelectAlbumActivity.class); intent.putExtra(Constants.INTENT_EXTRA_NAME_ID, artist.getId()); intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, artist.getName()); + intent.putExtra(Constants.INTENT_EXTRA_NAME_PARENT_ID, artist.getId()); intent.putExtra(Constants.INTENT_EXTRA_NAME_ARTIST, true); Util.startActivityWithoutTransition(this, intent); } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java b/src/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java index 6edd8c70..86c0bcdc 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java @@ -18,13 +18,14 @@ */ package com.thejoshwa.ultrasonic.androidapp.domain; +import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Locale; -import java.io.Serializable; /** * @author Sindre Mehus @@ -45,6 +46,16 @@ public class MusicDirectory this.name = name; } + public void addAll(Collection entries) + { + children.addAll(entries); + } + + public void addFirst(Entry child) + { + children.add(0, child); + } + public void addChild(Entry child) { children.add(child); @@ -55,6 +66,21 @@ public class MusicDirectory return getChildren(true, true); } + public Entry findChild(String id) + { + Entry entry = null; + + for (Entry song : getChildren()) + { + if (song.getId().equals(id)) + { + entry = song; + } + } + + return entry; + } + public List getChildren(boolean includeDirs, boolean includeFiles) { if (includeDirs && includeFiles) diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java b/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java index a819731a..c779e3f8 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java @@ -41,6 +41,7 @@ public final class Constants public static final String INTENT_EXTRA_NAME_AUTOPLAY = "subsonic.playall"; public static final String INTENT_EXTRA_NAME_QUERY = "subsonic.query"; public static final String INTENT_EXTRA_NAME_PLAYLIST_ID = "subsonic.playlist.id"; + public static final String INTENT_EXTRA_NAME_PARENT_ID = "subsonic.parent.id"; public static final String INTENT_EXTRA_NAME_PLAYLIST_NAME = "subsonic.playlist.name"; public static final String INTENT_EXTRA_NAME_SHARE_ID = "subsonic.share.id"; public static final String INTENT_EXTRA_NAME_SHARE_NAME = "subsonic.share.name"; @@ -124,6 +125,7 @@ public final class Constants public static final String PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION = "sharingDefaultDescription"; public static final String PREFERENCES_KEY_DEFAULT_SHARE_GREETING = "sharingDefaultGreeting"; public static final String PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION = "sharingDefaultExpiration"; + public static final String PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST = "showAllSongsByArtist"; // Name of the preferences file. public static final String PREFERENCES_FILE_NAME = "com.thejoshwa.ultrasonic.androidapp_preferences"; diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java b/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java index 924fb7e4..bf320a4b 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java @@ -46,7 +46,6 @@ import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; -import android.widget.DatePicker; import android.widget.RemoteViews; import android.widget.Toast; @@ -81,8 +80,6 @@ import java.lang.reflect.Method; import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.NumberFormat; -import java.util.Calendar; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -468,21 +465,20 @@ public class Util extends DownloadActivity public static void atomicCopy(File from, File to) throws IOException { - FileInputStream in = null; - FileOutputStream out = null; - File tmp = null; + File tmp = new File(String.format("%s.tmp", to.getPath())); + FileInputStream in = new FileInputStream(from); + FileOutputStream out = new FileOutputStream(tmp); try { - tmp = new File(String.format("%s.tmp", to.getPath())); - in = new FileInputStream(from); - out = new FileOutputStream(tmp); in.getChannel().transferTo(0, from.length(), out.getChannel()); out.close(); + if (!tmp.renameTo(to)) { throw new IOException(String.format("Failed to rename %s to %s", tmp, to)); } + Log.i(TAG, String.format("Copied %s to %s", from, to)); } catch (IOException x) @@ -714,12 +710,13 @@ public class Util extends DownloadActivity { int length = data.length; char[] out = new char[length << 1]; + int j = 0; // two characters form the hex value. - for (int i = 0, j = 0; i < length; i++) + for (byte aData : data) { - out[j++] = HEX_DIGITS[(0xF0 & data[i]) >>> 4]; - out[j++] = HEX_DIGITS[0x0F & data[i]]; + out[j++] = HEX_DIGITS[(0xF0 & aData) >>> 4]; + out[j++] = HEX_DIGITS[0x0F & aData]; } return new String(out); @@ -1574,17 +1571,6 @@ public class Util extends DownloadActivity return Integer.parseInt(preferences.getString(Constants.PREFERENCES_KEY_VIEW_REFRESH, "1000")); } - public static Date getDateFromDatePicker(DatePicker datePicker) { - int day = datePicker.getDayOfMonth(); - int month = datePicker.getMonth(); - int year = datePicker.getYear(); - - Calendar calendar = Calendar.getInstance(); - calendar.set(year, month, day); - - return calendar.getTime(); - } - public static boolean getShouldAskForShareDetails(Context context) { SharedPreferences preferences = getPreferences(context); @@ -1652,4 +1638,10 @@ public class Util extends DownloadActivity editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, defaultShareDescription); editor.commit(); } + + public static boolean getShouldShowAllSongsByArtist(Context context) + { + SharedPreferences preferences = getPreferences(context); + return preferences.getBoolean(Constants.PREFERENCES_KEY_SHOW_ALL_SONGS_BY_ARTIST, false); + } } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java b/src/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java index e017bea2..5e1591d5 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java @@ -99,7 +99,7 @@ public class AlbumView extends UpdateView starImageView.setImageDrawable(starred ? starDrawable : starHollowDrawable); imageLoader.loadImage(this.coverArtView, album, false, 0, false, true); - if (Util.isOffline(this.context)) + if (Util.isOffline(this.context) || "-1".equals(album.getId())) { starImageView.setVisibility(View.GONE); }