package com.heyzap.sdk; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.text.Html; import android.text.Spanned; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.FrameLayout; import android.widget.TextView; import com.heyzap.http.RequestParams; public class LeaderboardScoreDialogFull extends ClickableToast { private Context context; private FeedView feedView; private String gamePackage; private String score; private String displayScore; private String levelId; private boolean fromSdk; private View.OnClickListener showInGameOverlayOrLaunchLeaderboardActivity; private JSONObject response; FrameLayout feedFrame; TextView levelNameView; private long shownAt; public LeaderboardScoreDialogFull(Context context, JSONObject response, final String gamePackage, String score, String displayScore, final String levelId) { super(context); this.response = response; this.gamePackage = gamePackage; this.context = context; this.score = score; this.displayScore = displayScore; this.levelId = levelId; this.setContentView(Rzap.layout("leaderboard_score_dialog_full")); this.setFocusable(true); this.setFocusableInTouchMode(true); feedFrame = (FrameLayout) findViewById(Rzap.id("feed_frame")); levelNameView = (TextView) this.findViewById(Rzap.id("level_name")); TextView titleView = (TextView) this.findViewById(Rzap.id("title")); String prompt = String.format("Personal best: <font color='#a0d63d'>%s</font>!", displayScore); Spanned html = Html.fromHtml(prompt); titleView.setText(Html.fromHtml(prompt)); if (html.length() >= 20) { titleView.setPadding(titleView.getPaddingLeft(), Utils.getScaledSize(context, 4), titleView.getPaddingRight(), titleView.getPaddingBottom()); titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15); } final Button viewFullButton = (Button) this.findViewById(Rzap.id("view_full_button")); // showInGameOverlayOrLaunchLeaderboardActivity = new View.OnClickListener() { // // @Override // public void onClick(View v) { // HeyzapLib.launchLeaderboardActivityOrShowInGameOverlay(LeaderboardScoreDialogFull.this.context, levelId, gamePackage, null); // // if(v == viewFullButton){ // HeyzapAnalytics.trackEvent(getContext(), "score-overlay-clicked-full-view-full"); // }else{ // HeyzapAnalytics.trackEvent(getContext(), "score-overlay-clicked-full-save"); // } // } // }; final FrameLayout closeButton = (FrameLayout) findViewById(Rzap.id("close_wrapper")); closeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { LeaderboardScoreDialogFull.this.hide(); } }); showInGameOverlayOrLaunchLeaderboardActivity = new View.OnClickListener() { @Override public void onClick(View v) { String displayName = null; try { displayName = (String) v.getTag(); } catch (Exception e) { } HeyzapLib.launchLeaderboardActivityOrShowInGameOverlay(LeaderboardScoreDialogFull.this.context, levelId, gamePackage, displayName, "full"); if (v == viewFullButton) { HeyzapAnalytics.trackEvent(getContext(), "score-overlay-clicked-full-view-full"); } else { HeyzapAnalytics.trackEvent(getContext(), "score-overlay-clicked-full-save"); } } }; if (response == null) { postScore(); } else { populateUserFeedlettes(response); } viewFullButton.setOnClickListener(showInGameOverlayOrLaunchLeaderboardActivity); // Use portrait width, regardless of orientation FrameLayout container = (FrameLayout) findViewById(Rzap.id("wrapper")); 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); p.gravity = Gravity.CENTER; container.setLayoutParams(p); } public void postScore() { // we need to submit the score and get the leaderboard HeyzapAnalytics.trackEvent(getContext(), "score-post-started"); levelNameView.setText("Loading..."); findViewById(Rzap.id("spinner")).setVisibility(View.VISIBLE); findViewById(Rzap.id("feed_frame")).setVisibility(View.GONE); findViewById(Rzap.id("view_full_button")).setVisibility(View.GONE); findViewById(Rzap.id("feed_empty")).setVisibility(View.GONE); 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) { HeyzapAnalytics.trackEvent(getContext(), "score-post-success"); String bestScore; try { 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(LeaderboardScoreDialogFull.this.context, Float.parseFloat(bestScore), bestDisplayScore, levelId, lowestScoreFirst, true); } catch (org.json.JSONException e) { e.printStackTrace(); } findViewById(Rzap.id("feed_frame")).setVisibility(View.VISIBLE); findViewById(Rzap.id("view_full_button")).setVisibility(View.VISIBLE); findViewById(Rzap.id("feed_empty")).setVisibility(View.GONE); findViewById(Rzap.id("spinner")).setVisibility(View.GONE); populateUserFeedlettes(response); } @Override public void onFailure(Throwable e) { HeyzapAnalytics.trackEvent(getContext(), "score-post-failure"); findViewById(Rzap.id("feed_frame")).setVisibility(View.GONE); findViewById(Rzap.id("view_full_button")).setVisibility(View.GONE); findViewById(Rzap.id("feed_empty")).setVisibility(View.VISIBLE); findViewById(Rzap.id("spinner")).setVisibility(View.GONE); findViewById(Rzap.id("retry")).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { postScore(); } }); } }); } public void populateUserFeedlettes(JSONObject response) { feedView = new FeedView(context); final List<Feedlette> fs = new ArrayList<Feedlette>(); int youIndex = 4; if (response.has("stream")) { JSONArray stream; try { stream = response.getJSONArray("stream"); for (int i = 0; i < stream.length(); i++) { JSONObject obj = stream.getJSONObject(i); LeaderboardUserFeedlette f = new LeaderboardUserFeedlette(obj); if (obj.optBoolean("active", false)) { youIndex = i; } f.setFromSdk(true); f.setFeedletteClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LeaderboardScoreDialogFull.this.hide(); } }); f.setSaveButtonListener(showInGameOverlayOrLaunchLeaderboardActivity); fs.add(f); } feedView.connectFastAdapter(fs); } catch (org.json.JSONException e) { e.printStackTrace(); } } feedView.setSelectionFromTop(youIndex, Utils.getScaledSize(context, 40)); feedFrame.addView(feedView); try { JSONObject level = response.getJSONObject("level"); levelNameView.setText(level.getString("name")); } catch (JSONException e) { e.printStackTrace(); } } public void setFromSdk(boolean fromSdk) { this.fromSdk = fromSdk; } @Override public WindowManager.LayoutParams getWmParams() { WindowManager.LayoutParams params = super.getWmParams(); params.gravity = Gravity.CENTER; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.verticalMargin = 0.0f; params.horizontalMargin = 0.0f; params.flags &= ~WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; params.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.flags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; return params; } @Override public void show() { HeyzapAnalytics.trackEvent(getContext(), "score-overlay-shown-full"); shownAt = System.currentTimeMillis(); super.show(); } @Override public void hide() { super.hide(); HeyzapLib.sendPBNotification(context, displayScore); } @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); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { this.hide(); return true; } else { return super.onKeyDown(keyCode, event); } } }