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.graphics.Typeface; import android.os.AsyncTask; import android.text.Editable; import android.text.TextWatcher; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; public class LeaderboardUserFeedlette extends Feedlette { private ViewHolder holder; private LeaderboardUserFeedletteType type; private OnClickListener saveButtonListener; String username = null; String displayName; String rank; Double score; String displayScore; String buttonCta = null; String picture; private boolean fromSdk; private View.OnClickListener feedletteClickListener = null; private boolean useSeveredProxy; private String levelId; private boolean downloadingUserImage = false; private Bitmap downloadedUserImage = null; public LeaderboardUserFeedlette(JSONObject jobj) throws JSONException { this(jobj, LeaderboardUserFeedletteType.NORMAL, null); } public LeaderboardUserFeedlette(JSONObject jobj, LeaderboardUserFeedletteType type, String levelId) throws JSONException { this(jobj, type, levelId, null); } public LeaderboardUserFeedlette(JSONObject jobj, LeaderboardUserFeedletteType type, String levelId, OnClickListener saveButtonListener) throws JSONException { super(Rzap.layout("leaderboard_user_feedlette")); this.type = type; this.saveButtonListener = saveButtonListener; this.levelId = levelId; if (jobj != null) { username = jobj.optString("username", null); displayName = jobj.optString("display_name", ""); rank = jobj.optString("rank", ""); score = jobj.optDouble("score", 0.0); displayScore = jobj.optString("display_score", ""); if (jobj.has("button_cta")) { buttonCta = jobj.getString("button_cta"); } picture = jobj.optString("picture", ""); if (jobj.optBoolean("before_active", false)) { this.type = LeaderboardUserFeedletteType.BEFORE_ACTIVE; } if (jobj.optBoolean("active", false)) { this.type = LeaderboardUserFeedletteType.ACTIVE; } if (jobj.optBoolean("after_active", false)) { this.type = LeaderboardUserFeedletteType.AFTER_ACTIVE; } } } public enum LeaderboardUserFeedletteType { NORMAL, BEFORE_ACTIVE, AFTER_ACTIVE, ACTIVE, CHALLENGEABLE, CHALLENGED, TOP_HOVER } public void setType(LeaderboardUserFeedletteType type) { // set visibilities to a common base holder.container.setBackgroundDrawable(null); holder.separatorTop.setVisibility(View.VISIBLE); holder.separatorBottom.setVisibility(View.VISIBLE); holder.greenActionButton.setVisibility(View.GONE); holder.score.setTypeface(null, Typeface.NORMAL); holder.glowTop.setVisibility(View.GONE); holder.glowBottom.setVisibility(View.GONE); showGreenActionButton(false); showLightActionButton(false); holder.lightActionButtonIcon.setVisibility(View.GONE); switch (type) { case NORMAL: break; case BEFORE_ACTIVE: holder.glowTop.setVisibility(View.VISIBLE); break; case AFTER_ACTIVE: holder.glowBottom.setVisibility(View.VISIBLE); break; case ACTIVE: holder.container.setBackgroundResource(Rzap.drawable("leaderboard_highlight")); holder.separatorTop.setVisibility(View.GONE); holder.separatorBottom.setVisibility(View.GONE); showGreenActionButton(true); if (buttonCta != null) { holder.greenActionButton.setText(buttonCta); } holder.greenActionButton.setOnClickListener(saveButtonListener); holder.score.setTypeface(null, Typeface.BOLD); break; case CHALLENGEABLE: showLightActionButton(true); holder.lightActionButtonLabel.setText("Challenge"); holder.lightActionButtonLabel.setTextColor(0xff548ec0); break; case CHALLENGED: showLightActionButton(true); holder.lightActionButtonLabel.setText("Challenged"); holder.lightActionButtonLabel.setTextColor(0xffc0c0c0); holder.lightActionButtonIcon.setVisibility(View.VISIBLE); holder.lightActionButton.setClickable(false); break; case TOP_HOVER: ((LinearLayout) holder.wrapper.findViewById(Rzap.id("linear_layout"))).setBackgroundColor(0xebeff1f2); holder.separatorTop.setVisibility(View.GONE); holder.separatorBottom.setVisibility(View.GONE); break; } if (type == LeaderboardUserFeedletteType.ACTIVE && (this.username == null || this.username.equals("null"))) { holder.editUserName.setVisibility(View.VISIBLE); holder.userName.setVisibility(View.GONE); holder.score.setVisibility(View.GONE); } else { holder.editUserName.setVisibility(View.GONE); holder.userName.setVisibility(View.VISIBLE); holder.score.setVisibility(View.VISIBLE); } this.type = type; } public View render(View convertView, Context context, FeedView webFeedView) { this.context = context; if (convertView == null) { convertView = getInflater(context).inflate(layout, null); holder = new ViewHolder(); holder.wrapper = (FrameLayout) convertView.findViewById(Rzap.id("wrapper")); holder.linearLayout = (LinearLayout) convertView.findViewById(Rzap.id("linear_layout")); holder.container = (RelativeLayout) convertView.findViewById(Rzap.id("container")); holder.glowTop = (View) convertView.findViewById(Rzap.id("glow_top")); holder.glowBottom = (View) convertView.findViewById(Rzap.id("glow_bottom")); holder.separatorTop = (View) convertView.findViewById(Rzap.id("separator_top")); holder.separatorBottom = (View) convertView.findViewById(Rzap.id("separator_bottom")); holder.userThumb = (ImageView) convertView.findViewById(Rzap.id("user_thumb")); holder.userName = (TextView) convertView.findViewById(Rzap.id("user_name")); holder.editUserName = (EditText) convertView.findViewById(Rzap.id("edit_user_name")); holder.score = (TextView) convertView.findViewById(Rzap.id("score")); holder.rank = (TextView) convertView.findViewById(Rzap.id("rank")); holder.buttonWrapper = (LinearLayout) convertView.findViewById(Rzap.id("button_wrapper")); holder.greenActionButton = (Button) convertView.findViewById(Rzap.id("green_action_button")); holder.lightActionButton = (LinearLayout) convertView.findViewById(Rzap.id("light_action_button")); holder.lightActionButtonWrapper = (FrameLayout) convertView.findViewById(Rzap.id("light_action_wrapper")); holder.lightActionButtonLabel = (TextView) holder.lightActionButton.findViewById(Rzap.id("label")); holder.lightActionButtonIcon = (ImageView) holder.lightActionButton.findViewById(Rzap.id("icon")); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.feedlette = this; holder.userThumb.setBackgroundResource(Rzap.drawable("icon_default_people")); if (picture != null && !picture.equals("") && !picture.equals("null")) { if (!downloadingUserImage) { downloadingUserImage = true; new DownloadImageTask(new DownloadImageListener() { @Override public void onImageDownloaded(Bitmap bitmap) { downloadedUserImage = bitmap; if (holder.feedlette == LeaderboardUserFeedlette.this) { holder.userThumb.setImageBitmap(downloadedUserImage); } } }).execute(picture); } if (downloadedUserImage != null) { holder.userThumb.setImageBitmap(downloadedUserImage); } else { holder.userThumb.setImageDrawable(null); } } else { holder.userThumb.setImageDrawable(null); } holder.userName.setText(displayName); holder.score.setText(displayScore); holder.rank.setText(rank); holder.editUserName.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { holder.greenActionButton.setTag(s.toString()); } }); holder.buttonWrapper.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); setType(this.type); convertView.setOnClickListener(null); return convertView; } public void showGreenActionButton(boolean show) { holder.greenActionButton.setVisibility(show ? View.VISIBLE : View.GONE); if (show) { Utils.clickWrap(context, holder.buttonWrapper, holder.greenActionButton, 500); holder.greenActionButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Logger.log("Immad", "share"); } }); } } public void showLightActionButton(boolean show) { holder.lightActionButtonWrapper.setVisibility(show ? View.VISIBLE : View.GONE); if (show) { holder.lightActionButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { LeaderboardUserFeedlette.this.setType(LeaderboardUserFeedletteType.CHALLENGED); } }); Utils.clickWrap(context, holder.buttonWrapper, holder.lightActionButton, 500); } } static class ViewHolder { FrameLayout wrapper; LinearLayout linearLayout; RelativeLayout container; View glowTop; View glowBottom; View separatorTop; View separatorBottom; ImageView userThumb; TextView userName; EditText editUserName; TextView score; TextView rank; LinearLayout buttonWrapper; Button greenActionButton; LinearLayout lightActionButton; FrameLayout lightActionButtonWrapper; TextView lightActionButtonLabel; ImageView lightActionButtonIcon; LeaderboardUserFeedlette feedlette; } public OnClickListener getSaveButtonListener() { return saveButtonListener; } public void setSaveButtonListener(OnClickListener saveButtonListener) { this.saveButtonListener = saveButtonListener; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public String getRank() { return rank; } public void setRank(String rank) { this.rank = rank; } public Double getScore() { return score; } public void setScore(Double score) { this.score = score; } public String getDisplayScore() { return displayScore; } public void seDisplaytScore(String displayScore) { this.displayScore = displayScore; } public String getPicture() { return picture; } public void setPicture(String picture) { this.picture = picture; } public LeaderboardUserFeedletteType getType() { return type; } public void setFromSdk(boolean fromSdk) { this.fromSdk = fromSdk; } public void setFeedletteClickListener(View.OnClickListener feedletteClickListener) { this.feedletteClickListener = feedletteClickListener; } public void setUseSeveredProxy(boolean b) { this.useSeveredProxy = b; } // 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); } }