{
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+
+ mProgressBar.setVisibility(View.VISIBLE);
+ mProfileFriendsListView.setVisibility(View.GONE);
+ }
+
+ @Override
+ public User[] doInBackground(Void... params) {
+ try {
+ User[] friends = mServer.getFriends(username, "1", "1024").getFriends();
+ if (friends.length == 0) {
+ return null;
+ }
+
+ return friends;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } catch (WSError e) {
+ LastFMApplication.getInstance().presentError(mContext, e);
+ }
+ return null;
+ }
+
+ @Override
+ public void onPostExecute(User[] friends) {
+ if (friends != null && friends.length != 0) {
+ ProfileFriendsListAdapter adapter = new ProfileFriendsListAdapter(mContext, getImageCache());
+ adapter.setSource(friends);
+ mProfileFriendsListView.setAdapter(adapter);
+ } else {
+ // TODO :: Show something sais list is empty.
+// String[] strings = new String[] { getString(R.string.profile_nofriends) };
+// ProfileFriendsListAdapter adapter = new ProfileFriendsListAdapter(mContext, strings);
+// adapter.disableDisclosureIcons();
+// adapter.setDisabled();
+// mProfileFriendsListView.setAdapter(adapter);
+ }
+
+ mProgressBar.setVisibility(View.GONE);
+ mProfileFriendsListView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private ImageCache getImageCache() {
+ if (mImageCache == null) {
+ mImageCache = new ImageCache();
+ }
+
+ return mImageCache;
+ }
+
+}
diff --git a/app/src/fm/last/android/utils/AsyncTaskEx.java b/app/src/fm/last/android/utils/AsyncTaskEx.java
index 32c153ed..0311abb5 100644
--- a/app/src/fm/last/android/utils/AsyncTaskEx.java
+++ b/app/src/fm/last/android/utils/AsyncTaskEx.java
@@ -15,20 +15,21 @@
package fm.last.android.utils;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Process;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
import java.util.concurrent.Callable;
-import java.util.concurrent.FutureTask;
+import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
-import java.util.concurrent.CancellationException;
import java.util.concurrent.atomic.AtomicInteger;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Process;
+
/**
* AsyncTaskEx enables proper and easy use of the UI thread. This class allows to
* perform background operations and publish results on the UI thread without
diff --git a/app/src/fm/last/android/widget/AdArea.java b/app/src/fm/last/android/widget/AdArea.java
deleted file mode 100644
index 380f8609..00000000
--- a/app/src/fm/last/android/widget/AdArea.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- *
- */
-package fm.last.android.widget;
-
-import java.net.URL;
-import java.util.Date;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Vector;
-import java.util.concurrent.RejectedExecutionException;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import fm.last.android.utils.AsyncTaskEx;
-import android.telephony.TelephonyManager;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageButton;
-import fm.last.android.LastFMApplication;
-import fm.last.api.Session;
-import fm.last.util.UrlUtil;
-import fm.last.util.XMLUtil;
-
-/**
- * @author sam
- *
- */
-public class AdArea extends ImageButton {
- private static Vector _trackerUrls = new Vector();
- private static Hashtable _imageTable = new Hashtable();
- private static String _url = "";
- private static long slastAdCheck = 0;
- private static boolean sCachedAdStatus = false;
-
- private int _cachedWidth = 0;
-
- public static boolean adsEnabled(Context context) {
- Session session = LastFMApplication.getInstance().session;
-
- if (session == null || session.getSubscriber().equals("1")) {
- return false;
- }
-
- TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- if (!tm.getNetworkCountryIso().equals("us")) {
- return false;
- }
-
- return getAdInfo();
-
- }
-
- static boolean getAdInfo() {
-
- long currentTime = new Date().getTime();
- // 30 minutes - maybe this could be a lot longer..
- if (currentTime - slastAdCheck < 1800000) {
- return sCachedAdStatus;
- }
-
- slastAdCheck = currentTime;
- sCachedAdStatus = retrieveAdInfo();
- return sCachedAdStatus;
- }
-
- static boolean retrieveAdInfo() {
- Document xml = null;
- try {
- String response = UrlUtil
- .doGet(new URL("http://cdn.last.fm/mobile_ads/android/android.xml"/* "http://cdn.last.fm/mobile_ads/blackberry/blackberry.xml" */));
- xml = XMLUtil.stringToDocument(response);
- } catch (Exception e) {
- return false;
- }
-
- if (xml != null) {
-
- // Get tracker URLs
- Node lfm = XMLUtil.findNamedElementNode(xml, "lfm");
- if (lfm == null)
- return false;
-
- // Get Tracker URLs
- {
- List nodes = XMLUtil.findNamedElementNodes(lfm, "tracker");
- for (int i = 0; i < nodes.size(); ++i) {
- Node trackerNode = nodes.get(i);
- String trackerUrl = XMLUtil.getChildTextNodes(trackerNode);
- _trackerUrls.add(trackerUrl);
- }
- }
-
- // Get Link URLs
- {
- Node urlNode = XMLUtil.findNamedElementNode(lfm, "url");
- _url = XMLUtil.getChildTextNodes(urlNode);
- }
-
- // Get image URLs
- {
- List nodes = XMLUtil.findNamedElementNodes(lfm, "img");
- for (int i = 0; i < nodes.size(); ++i) {
- Node imageNode = nodes.get(i);
- String width = XMLUtil.getNodeAttribute(imageNode, "width");
- String url = XMLUtil.getChildTextNodes(imageNode);
- _imageTable.put(Integer.valueOf(width), url);
- }
- }
- }
- return true;
- }
-
- public AdArea(Context context, AttributeSet attributeSet) {
- super(context, attributeSet);
-
- try {
- new AdsEnabledTask(context).execute((Void)null);
- } catch (RejectedExecutionException e) {
- setVisibility(View.GONE);
- }
- setOnClickListener(mClickListener);
- }
-
- private View.OnClickListener mClickListener = new View.OnClickListener() {
-
- public void onClick(View v) {
- if (_url.length() > 0) {
- Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(_url));
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- LastFMApplication.getInstance().getApplicationContext().startActivity(i);
- }
- }
- };
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
-
- if (_cachedWidth != getWidth())
- new FetchAdTask().execute((Void) null);
- _cachedWidth = getWidth();
- }
-
- private class FetchAdTask extends AsyncTaskEx {
- Bitmap mBitmap = null;
-
- @Override
- public void onPreExecute() {
- setImageBitmap(null);
- }
-
- @Override
- public Boolean doInBackground(Void... params) {
- boolean success = false;
- try {
- mBitmap = UrlUtil.getImage(new URL(_imageTable.get(Integer.valueOf(getWidth() - 10))));
- for (int i = 0; i < _trackerUrls.size(); ++i) {
- URL url = UrlUtil.getRedirectedUrl(new URL((_trackerUrls.elementAt(i))));
- UrlUtil.doGet(url);
- }
- success = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return success;
- }
-
- @Override
- public void onPostExecute(Boolean result) {
- setImageBitmap(mBitmap);
- }
- }
-
- private class AdsEnabledTask extends AsyncTaskEx {
- Context ctx = null;
-
- AdsEnabledTask(Context context) {
- super();
- ctx = context;
- }
-
- @Override
- public void onPreExecute() {
- setVisibility(View.GONE);
- }
-
- @Override
- public Boolean doInBackground(Void... params) {
- boolean success = false;
- try {
- success = adsEnabled(ctx);
- } catch (Exception e) {
- }
- return success;
- }
-
- @Override
- public void onPostExecute(Boolean result) {
- if (!result)
- setVisibility(View.GONE);
- else
- setVisibility(View.VISIBLE);
- }
- }
-}
diff --git a/app/src/fm/last/android/widget/AlbumArt.java b/app/src/fm/last/android/widget/AlbumArt.java
old mode 100755
new mode 100644
index 207eb579..56e3b6c4
--- a/app/src/fm/last/android/widget/AlbumArt.java
+++ b/app/src/fm/last/android/widget/AlbumArt.java
@@ -10,7 +10,9 @@
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;
-import fm.last.android.R;
+
+import com.meg7.lastfm_neu.R;
+
import fm.last.android.utils.AsyncTaskEx;
import fm.last.util.UrlUtil;
diff --git a/app/src/fm/last/android/widget/ProfileBubble.java b/app/src/fm/last/android/widget/ProfileBubble.java
index 4f6aa82e..a6f45b02 100644
--- a/app/src/fm/last/android/widget/ProfileBubble.java
+++ b/app/src/fm/last/android/widget/ProfileBubble.java
@@ -29,7 +29,9 @@
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;
-import fm.last.android.R;
+
+import com.meg7.lastfm_neu.R;
+
import fm.last.api.User;
public class ProfileBubble extends LinearLayout {
diff --git a/app/src/fm/last/android/widget/QuickContactProfileBubble.java b/app/src/fm/last/android/widget/QuickContactProfileBubble.java
index 65ea1e02..6dd186fb 100644
--- a/app/src/fm/last/android/widget/QuickContactProfileBubble.java
+++ b/app/src/fm/last/android/widget/QuickContactProfileBubble.java
@@ -5,22 +5,25 @@
import java.net.URL;
-import fm.last.android.R;
-import fm.last.android.activity.Profile;
-import fm.last.android.utils.AsyncTaskEx;
-import fm.last.api.User;
-import fm.last.util.UrlUtil;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.ContactsContract;
+import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.QuickContactBadge;
import android.widget.TextView;
+import com.meg7.lastfm_neu.R;
+
+import fm.last.android.ui.ProfileActivity;
+import fm.last.android.utils.AsyncTaskEx;
+import fm.last.api.User;
+import fm.last.util.UrlUtil;
+
/**
* @author sam
*
@@ -32,7 +35,18 @@ public class QuickContactProfileBubble extends ProfileBubble {
*/
public QuickContactProfileBubble(Context context) {
super(context);
- if(Profile.isHTCContactsInstalled(context)) {
+
+ sharedConstractor(context);
+ }
+
+ public QuickContactProfileBubble(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ sharedConstractor(context);
+ }
+
+ private void sharedConstractor(Context context) {
+ if(ProfileActivity.isHTCContactsInstalled(context)) {
throw new java.lang.VerifyError(); //Fall back to the non-quickcontact version if HTC SenseUI is running
}
init();
diff --git a/app/src/fm/last/android/widget/SafeViewFlipper.java b/app/src/fm/last/android/widget/SafeViewFlipper.java
index efb1e384..61dae79d 100644
--- a/app/src/fm/last/android/widget/SafeViewFlipper.java
+++ b/app/src/fm/last/android/widget/SafeViewFlipper.java
@@ -6,37 +6,39 @@
*/
package fm.last.android.widget;
+
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ViewFlipper;
public class SafeViewFlipper extends ViewFlipper {
- private static final String TAG = "Last.fm";
+ private static final String TAG = "Last.fm";
-public SafeViewFlipper(Context context) {
- super(context);
- }
+ public SafeViewFlipper(Context context) {
+ super(context);
+ }
- public SafeViewFlipper(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
+ public SafeViewFlipper(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
- /**
- * Workaround for Android Bug 6191:
- * http://code.google.com/p/android/issues/detail?id=6191
- *
- * ViewFlipper occasionally throws an IllegalArgumentException after
- * screen rotations.
- */
- @Override protected void onDetachedFromWindow() {
- try {
- super.onDetachedFromWindow();
- } catch (IllegalArgumentException e) {
- Log.d(TAG, "SafeViewFlipper ignoring IllegalArgumentException");
+ /**
+ * Workaround for Android Bug 6191:
+ * http://code.google.com/p/android/issues/detail?id=6191
+ *
+ * ViewFlipper occasionally throws an IllegalArgumentException after screen
+ * rotations.
+ */
+ @Override
+ protected void onDetachedFromWindow() {
+ try {
+ super.onDetachedFromWindow();
+ } catch (IllegalArgumentException e) {
+ Log.d(TAG, "SafeViewFlipper ignoring IllegalArgumentException");
- // Call stopFlipping() in order to kick off updateRunning()
- stopFlipping();
- }
- }
+ // Call stopFlipping() in order to kick off updateRunning()
+ stopFlipping();
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/fm/last/android/widget/TagButton.java b/app/src/fm/last/android/widget/TagButton.java
index 4cac576d..27e50de0 100644
--- a/app/src/fm/last/android/widget/TagButton.java
+++ b/app/src/fm/last/android/widget/TagButton.java
@@ -27,7 +27,8 @@
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
-import fm.last.android.R;
+
+import com.meg7.lastfm_neu.R;
// TODO usage of NinePath
/**
diff --git a/app/src/fm/last/android/widget/TagLayout.java b/app/src/fm/last/android/widget/TagLayout.java
index 469a014d..2ea4fb13 100644
--- a/app/src/fm/last/android/widget/TagLayout.java
+++ b/app/src/fm/last/android/widget/TagLayout.java
@@ -32,10 +32,11 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationUtils;
import android.widget.TextView;
-import fm.last.android.R;
+
+import com.meg7.lastfm_neu.R;
/**
* Layout/container for TagButtons
diff --git a/library/libs/android-support-v4.jar b/library/libs/android-support-v4.jar
new file mode 100644
index 00000000..feaf44f8
Binary files /dev/null and b/library/libs/android-support-v4.jar differ
diff --git a/library/project.properties b/library/project.properties
index f28bc833..76622468 100644
--- a/library/project.properties
+++ b/library/project.properties
@@ -9,4 +9,4 @@
android.library=true
# Project target.
-target=android-15
+target=android-8
diff --git a/library/src/fm/last/api/LastFmServer.java b/library/src/fm/last/api/LastFmServer.java
index c9188690..bcff3550 100644
--- a/library/src/fm/last/api/LastFmServer.java
+++ b/library/src/fm/last/api/LastFmServer.java
@@ -128,7 +128,7 @@ public interface LastFmServer {
* @return An array of artists
* @throws IOException
*/
- public Artist[] getUserTopArtists(String user, String period) throws IOException, WSError;
+ public Artist[] getUserTopArtists(String user, String period, int limit) throws IOException, WSError;
public Artist[] getUserRecommendedArtists(String user, String period) throws IOException, WSError;
@@ -141,7 +141,7 @@ public interface LastFmServer {
* @return An array of albums
* @throws IOException
*/
- public Album[] getUserTopAlbums(String user, String period) throws IOException, WSError;
+ public Album[] getUserTopAlbums(String user, String period, int limit) throws IOException, WSError;
/**
* See http://www.lastfm.pl/api/show?service=301
@@ -152,7 +152,7 @@ public interface LastFmServer {
* @return An array of tracks
* @throws IOException
*/
- public Track[] getUserTopTracks(String user, String period) throws IOException, WSError;
+ public Track[] getUserTopTracks(String user, String period, int limit) throws IOException, WSError;
/**
* See http://www.lastfm.pl/api/show?service=278
diff --git a/library/src/fm/last/api/SessionInfo.java b/library/src/fm/last/api/SessionInfo.java
old mode 100755
new mode 100644
diff --git a/library/src/fm/last/api/Track.java b/library/src/fm/last/api/Track.java
index 385cd287..f9cbd9b0 100644
--- a/library/src/fm/last/api/Track.java
+++ b/library/src/fm/last/api/Track.java
@@ -77,6 +77,9 @@ public String getUrl() {
public ImageUrl[] getImages() {
return images;
}
+ public void setImages(ImageUrl[] images) {
+ this.images = images;
+ }
public String getDuration() {
return duration;
diff --git a/library/src/fm/last/api/User.java b/library/src/fm/last/api/User.java
index 99463871..20219fe3 100644
--- a/library/src/fm/last/api/User.java
+++ b/library/src/fm/last/api/User.java
@@ -93,6 +93,12 @@ public String getSubscriber() {
public Track getRecentTrack() {
return recentTrack;
}
+
+ public void setRecentTrackImages(ImageUrl[] images) {
+ if (recentTrack != null) {
+ recentTrack.setImages(images);
+ }
+ }
public String getURLforImageSize(String size) {
for (ImageUrl image : images) {
@@ -102,7 +108,7 @@ public String getURLforImageSize(String size) {
}
return null;
}
-
+
private final String name;
private final String url;
private final ImageUrl[] images;
diff --git a/library/src/fm/last/api/impl/LastFmServerImpl.java b/library/src/fm/last/api/impl/LastFmServerImpl.java
index 531f8c4b..40b7b21a 100644
--- a/library/src/fm/last/api/impl/LastFmServerImpl.java
+++ b/library/src/fm/last/api/impl/LastFmServerImpl.java
@@ -269,7 +269,26 @@ public Friends getFriends(String user, String recenttracks, String limit) throws
if (limit != null) {
params.put("limit", limit);
}
- return FriendFunctions.getFriends(baseUrl, params);
+ Friends friends = FriendFunctions.getFriends(baseUrl, params);
+
+ // Add images to recent tracks.
+ Artist artist;
+ if (recenttracks != null) {
+ User[] users = friends.getFriends();
+ for (User friend : users) {
+ try {
+ artist = getArtistInfo(friend.getRecentTrack().getArtist().getName(), null, null, null);
+
+ if (artist != null) {
+ friend.setRecentTrackImages(artist.getImages());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return friends;
}
public Track getTrackInfo(String artist, String track, String mbid) throws IOException, WSError {
@@ -653,7 +672,7 @@ public void attendEvent(String event, String status, String sk) throws IOExcepti
post(baseUrl, params);
}
- public Artist[] getUserTopArtists(String user, String period) throws IOException {
+ public Artist[] getUserTopArtists(String user, String period, int limit) throws IOException {
Map params = createParams("user.getTopArtists");
if (user != null) {
params.put("user", user);
@@ -661,6 +680,9 @@ public Artist[] getUserTopArtists(String user, String period) throws IOException
if (period != null) {
params.put("period", period);
}
+ if (limit > 0) {
+ params.put("limit", String.valueOf(limit));
+ }
List artists = new Parser().getList(baseUrl, params, "topartists", "artist", new ArtistBuilder());
return artists.toArray(new Artist[artists.size()]);
}
@@ -676,7 +698,7 @@ public Artist[] getUserRecommendedArtists(String user, String sk) throws IOExcep
return artists.toArray(new Artist[artists.size()]);
}
- public Album[] getUserTopAlbums(String user, String period) throws IOException {
+ public Album[] getUserTopAlbums(String user, String period, int limit) throws IOException {
Map params = createParams("user.getTopAlbums");
if (user != null) {
params.put("user", user);
@@ -684,11 +706,14 @@ public Album[] getUserTopAlbums(String user, String period) throws IOException {
if (period != null) {
params.put("period", period);
}
+ if (limit > 0) {
+ params.put("limit", String.valueOf(limit));
+ }
List albums = new Parser().getList(baseUrl, params, "topalbums", "album", new AlbumBuilder());
return albums.toArray(new Album[albums.size()]);
}
- public Track[] getUserTopTracks(String user, String period) throws IOException {
+ public Track[] getUserTopTracks(String user, String period, int limit) throws IOException {
Map params = createParams("user.getTopTracks");
if (user != null) {
params.put("user", user);
@@ -696,6 +721,9 @@ public Track[] getUserTopTracks(String user, String period) throws IOException {
if (period != null) {
params.put("period", period);
}
+ if (limit > 0) {
+ params.put("limit", String.valueOf(limit));
+ }
List