package com.heyzap.sdk;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.heyzap.http.RequestParams;
public class LeaderboardScoreDialogTop extends ClickableToast {
private Context context;
private String gamePackage;
private String score;
private String displayScore;
private String levelId;
private boolean fromSdk;
private View.OnClickListener showInGameOverlayOrLaunchLeaderboardActivity;
private JSONObject response;
private Runnable autoHide;
private View wrapper;
private String bestDisplayScore = null;
private long shownAt;
private boolean personalBest;
private Drawable gameIcon;
public LeaderboardScoreDialogTop(Context context, JSONObject response, String gamePackage, String score, String displayScore, String levelId) {
this(context, response, gamePackage, score, displayScore, levelId, null, null);
}
public LeaderboardScoreDialogTop(Context context, JSONObject response, String gamePackage, String score, String displayScore, String levelId,
String personalBestFromPhone, Drawable gameIcon) {
super(context);
this.response = response;
this.gamePackage = gamePackage;
this.context = context;
this.score = score;
this.displayScore = displayScore;
this.levelId = levelId;
this.gameIcon = gameIcon;
if (response == null && personalBestFromPhone != null) {
// we need to submit the score silently
this.bestDisplayScore = personalBestFromPhone;
RequestParams requestParams = LeaderboardScoreLauncher.getNewScoreRequestParams(score, displayScore, levelId);
SDKRestClient.post(context, "/in_game_api/leaderboard/new_score", requestParams, new SDKResponseHandler() {
@Override
public void onSuccess(JSONObject response) {
try {
String bestScore = response.getString("best_score");
String bestDisplayScore = response.getString("best_display_score");
JSONObject level = response.getJSONObject("level");
String levelId = level.getString("id");
boolean lowestScoreFirst = level.getBoolean("lowest_score_first");
LeaderboardScoreLauncher.saveLeaderboardInfoOnPhone(LeaderboardScoreDialogTop.this.context, Float.parseFloat(bestScore),
bestDisplayScore, levelId, lowestScoreFirst, true);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable e) {
}
});
} else {
try {
bestDisplayScore = response.getString("best_display_score");
} catch (JSONException e) {
e.printStackTrace();
}
}
this.setContentView(Rzap.layout("leaderboard_score_dialog_top"));
showInGameOverlayOrLaunchLeaderboardActivity = new View.OnClickListener() {
@Override
public void onClick(View v) {
// This is what this class does in the Heyzap SDK:
HeyzapAnalytics.trackEvent(getContext(), "score-overlay-clicked-top");
HeyzapLib.showInGameOverlay(LeaderboardScoreDialogTop.this.context, null, "top");
LeaderboardScoreDialogTop.this.hide();
}
};
wrapper = findViewById(Rzap.id("wrapper"));
wrapper.setOnClickListener(showInGameOverlayOrLaunchLeaderboardActivity);
// Use portrait width, regardless of orientation
RelativeLayout container = (RelativeLayout) findViewById(Rzap.id("container"));
FrameLayout.LayoutParams p = (FrameLayout.LayoutParams) container.getLayoutParams();
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
p.width = Math.min(metrics.widthPixels, metrics.heightPixels);
container.setLayoutParams(p);
final Animation slide = AnimationUtils.loadAnimation(getContext(), Rzap.anim("slide_from_top"));
Logger.log("starting slide in");
wrapper.startAnimation(slide);
autoHide = new Runnable() {
@Override
public void run() {
LeaderboardScoreDialogTop.this.hide();
}
};
wrapper.postDelayed(autoHide, 7000);
}
public void setFromSdk(boolean fromSdk) {
this.fromSdk = fromSdk;
}
@Override
public WindowManager.LayoutParams getWmParams() {
WindowManager.LayoutParams params = super.getWmParams();
params.gravity = Gravity.TOP;
params.width = WindowManager.LayoutParams.FILL_PARENT;
params.verticalMargin = 0.0f;
params.horizontalMargin = 0.0f;
params.flags &= ~WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
params.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
return params;
}
public void hide() {
wrapper.removeCallbacks(autoHide);
slideUp(new Runnable() {
@Override
public void run() {
LeaderboardScoreDialogTop.super.hide();
}
});
}
public void slideUp(Runnable after) {
slide(Rzap.anim("slide_up"), after);
}
public void slide(int anim, Runnable after) {
Animation animation = AnimationUtils.loadAnimation(getContext(), anim);
wrapper.startAnimation(animation);
if (after != null) {
wrapper.postDelayed(after, (int) animation.getDuration());
}
}
private void setupViews() {
TextView titleView = (TextView) this.findViewById(Rzap.id("title"));
TextView ctaView = (TextView) this.findViewById(Rzap.id("cta"));
ImageView pictureView = (ImageView) this.findViewById(Rzap.id("picture"));
titleView.setText(Html.fromHtml(String.format("You scored <font color='#52a600'>%s</font>!", displayScore)));
if (personalBest) {
ctaView.setText(Html.fromHtml(String.format("<font color='#52a600'>New personal best!</font> Sign in to save.", displayScore)));
} else {
ctaView.setText(Html.fromHtml(String.format("Personal best: <font color='#52a600'>%s</font>. Sign in to save.", bestDisplayScore)));
}
ctaView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
pictureView.setBackgroundResource(Rzap.drawable("icon_default_people"));
if (gameIcon != null) {
pictureView.setImageDrawable(gameIcon);
}
}
@Override
public void show() {
HeyzapAnalytics.trackEvent(getContext(), "score-overlay-shown-top");
shownAt = System.currentTimeMillis();
setupViews();
super.show();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE && System.currentTimeMillis() > shownAt + 1000) {
this.hide();
return false;
} else {
return super.onTouchEvent(event);
}
}
public void setPersonalBest(boolean personalBest) {
this.personalBest = personalBest;
}
}