package com.heyzap.sdk; import java.io.InputStream; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class AchievementFeedlette extends Feedlette { private Achievement achievement; private ViewHolder holder; private boolean downloadingAchievementImage = false; private Bitmap downloadedAchievementImage = null; public AchievementFeedlette(JSONObject jobj) { super(Rzap.layout("achievement_feedlette")); if (jobj != null) { try { this.achievement = new Achievement(jobj); } catch (JSONException e) { e.printStackTrace(); } } } public AchievementFeedlette(Achievement achievement) { super(Rzap.id("achievement_feedlette")); this.achievement = achievement; } public View render(View convertView, final Context context, FeedView feedView) { // Set up the view holder if(convertView == null) { convertView = super.render(convertView, context, feedView); holder = new ViewHolder(); holder.achievementIconView = (ImageView) convertView.findViewById(Rzap.id("achievement_icon")); holder.achievementNameView = (TextView) convertView.findViewById(Rzap.id("achievement_name")); holder.achievementDescriptionView = (TextView) convertView.findViewById(Rzap.id("achievement_description")); holder.achievementNewBadgeView = (ImageView) convertView.findViewById(Rzap.id("new_badge_icon"));; convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.feedlette = this; holder.achievementIconView.setImageResource(Rzap.drawable("icon_default_badge")); // Fill in the views String iconUrl = achievement.getIconUrl(); if (iconUrl != null && !iconUrl.equals("") && !iconUrl.equals("null")) { if (!downloadingAchievementImage) { downloadingAchievementImage = true; new DownloadImageTask(new DownloadImageListener() { @Override public void onImageDownloaded(Bitmap bitmap) { downloadedAchievementImage = bitmap; if (holder.feedlette == AchievementFeedlette.this) { holder.achievementIconView.setImageBitmap(downloadedAchievementImage); } } }).execute(iconUrl); } if (downloadedAchievementImage != null) { holder.achievementIconView.setImageBitmap(downloadedAchievementImage); } else { holder.achievementIconView.setImageDrawable(null); } } else { holder.achievementIconView.setImageDrawable(null); } if (achievement.hasJustUnlocked()) { holder.achievementNewBadgeView.setVisibility(View.VISIBLE); } else { holder.achievementNewBadgeView.setVisibility(View.GONE); } if (achievement.hasUnlocked()) { holder.achievementNameView.setTextColor(0xff000000); } else { holder.achievementNameView.setTextColor(0xff999999); } holder.achievementNameView.setText(achievement.getName()); holder.achievementDescriptionView.setText(achievement.getDescription()); return convertView; } @Override public String toString() { return achievement.getName(); } static class ViewHolder { ImageView achievementIconView; ImageView achievementNewBadgeView; TextView achievementNameView; TextView achievementDescriptionView; AchievementFeedlette feedlette; } // for setting ImageView to a URL. From http://developer.aiwgame.com/imageview-show-image-from-url-on-android-4-0.html. private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { DownloadImageListener listener; public DownloadImageTask(DownloadImageListener listener) { this.listener = listener; } protected Bitmap doInBackground(String... urls) { String urldisplay = urls[0]; Bitmap mIcon11 = null; try { InputStream in = new java.net.URL(urldisplay).openStream(); mIcon11 = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error: " + urldisplay, e.getMessage()); e.printStackTrace(); } return mIcon11; } protected void onPostExecute(Bitmap result) { if (listener != null) { listener.onImageDownloaded(result); } } } private interface DownloadImageListener { public void onImageDownloaded(Bitmap bitmap); } } class Achievement implements Parcelable { private String name; private String iconUrl; private String description; private boolean unlocked = false; private boolean justUnlocked = false; public Achievement(JSONObject jobj) throws JSONException { name = jobj.getString("name"); if(jobj.has("image_url")) { iconUrl = jobj.getString("image_url"); } if(jobj.has("description")) { description = jobj.getString("description"); } if(jobj.has("unlocked")){ unlocked = jobj.getBoolean("unlocked"); } if(jobj.has("just_unlocked")){ justUnlocked = jobj.getBoolean("just_unlocked"); } } public String getName() { return name; } public String getIconUrl() { return iconUrl; } public String getDescription() { return description; } public boolean hasUnlocked() { return unlocked; } public boolean hasJustUnlocked() { return justUnlocked; } // Parceling part public Achievement(Parcel in) { readFromParcel(in); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(iconUrl); dest.writeString(description); dest.writeInt(justUnlocked ? 1 : 0); dest.writeInt(unlocked ? 1 : 0); } public void readFromParcel(Parcel in) { name = in.readString(); iconUrl = in.readString(); description = in.readString(); justUnlocked = in.readInt() == 1 ? true : false; unlocked = in.readInt() == 1 ? true : false; } public static final Parcelable.Creator<Achievement> CREATOR = new Parcelable.Creator<Achievement>() { public Achievement createFromParcel(Parcel in) { return new Achievement(in); } public Achievement[] newArray(int size) { return new Achievement[size]; } }; }