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.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.DisplayMetrics;
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.ImageView;
import android.widget.TextView;
import com.heyzap.http.RequestParams;
import com.heyzap.http.SDKCookieStore;
import com.heyzap.sdk.LeaderboardLevelFeedlette.LeaderboardLevelSelectListener;
public class LeaderboardDialog extends ClickableToast {
private Context context;
private FeedView feedView;
private FeedView levelsFeedView;
private LeaderboardLevelsDialog levelsDialog;
private String gamePackage;
private String displayScore;
private View.OnClickListener showInGameOverlayOrLaunchLeaderboardActivity;
FrameLayout feedFrame;
TextView levelNameView;
private long shownAt;
private String levelId = "";
public LeaderboardDialog(final Context context, final String gamePackage, final String levelId) {
super(context);
this.gamePackage = gamePackage;
this.context = context;
this.setContentView(Rzap.layout("leaderboard_score_dialog_full"));
this.setFocusable(true);
this.setFocusableInTouchMode(true);
if (levelId == null) {
this.levelId = "";
} else {
this.levelId = levelId;
}
feedFrame = (FrameLayout) findViewById(Rzap.id("feed_frame"));
levelNameView = (TextView) this.findViewById(Rzap.id("level_name"));
PackageManager pm = context.getPackageManager();
ApplicationInfo info = null;
try {
info = pm.getApplicationInfo(gamePackage, 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
((TextView) this.findViewById(Rzap.id("title"))).setText(info != null ? pm.getApplicationLabel(info) : "Leaderboards");
final FrameLayout closeButton = (FrameLayout) findViewById(Rzap.id("close_wrapper"));
closeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
LeaderboardDialog.this.hide();
}
});
Button viewFullButton = (Button) this.findViewById(Rzap.id("view_full_button"));
showInGameOverlayOrLaunchLeaderboardActivity = new View.OnClickListener() {
@Override
public void onClick(View v) {
String displayName = null;
try {
displayName = (String) v.getTag();
} catch (Exception e) {
}
HeyzapLib.launchLeaderboardActivityOrShowInGameOverlay(LeaderboardDialog.this.context, LeaderboardDialog.this.levelId, gamePackage, displayName, "manual");
}
};
levelsFeedView = new FeedView(context);
levelsFeedView.setCacheColorHint(0);
levelsDialog = new LeaderboardLevelsDialog(context);
levelsDialog.setFeedView(levelsFeedView);
requestLeaderboard(this.levelId);
requestLevels();
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);
final FrameLayout showLevelsWrapper = (FrameLayout) this.findViewById(Rzap.id("show_levels_wrapper"));
showLevelsWrapper.setVisibility(View.VISIBLE);
final ImageView showLevels = (ImageView) this.findViewById(Rzap.id("show_levels"));
showLevels.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
levelsDialog.show();
}
});
showLevelsWrapper.post(new Runnable() {
@Override
public void run() {
Utils.clickWrap(context, showLevelsWrapper, showLevels, 500);
}
});
}
public void requestLeaderboard(final String levelId) {
Logger.log("bbb request level", levelId);
this.levelId = levelId;
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 = new RequestParams();
requestParams.put("for_game_package", gamePackage);
requestParams.put("from_sdk", "true");
requestParams.put("limit", "100");
if (!levelId.equals("")) {
requestParams.put("level", levelId);
}
SDKRestClient.get(context, "/in_game_api/leaderboard/everyone", requestParams, new SDKResponseHandler() {
@Override
public void onSuccess(JSONObject response) {
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) {
levelNameView.setText("");
((TextView) findViewById(Rzap.id("empty_text"))).setText("Could not load scores.");
((Button) findViewById(Rzap.id("retry"))).setText("Try again");
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) {
requestLeaderboard(levelId);
}
});
}
});
}
public void requestLevels() {
final View feedFrameWrapper = levelsDialog.findViewById(Rzap.id("feed_frame_wrapper"));
feedFrameWrapper.findViewById(Rzap.id("levels_spinner")).setVisibility(View.VISIBLE);
feedFrameWrapper.findViewById(Rzap.id("levels_feed_frame")).setVisibility(View.GONE);
feedFrameWrapper.findViewById(Rzap.id("levels_feed_empty")).setVisibility(View.GONE);
RequestParams requestParams = new RequestParams();
requestParams.put("for_game_package", gamePackage);
requestParams.put("from_sdk", "true");
requestParams.put("limit", "1000");
SDKRestClient.get(context, "/in_game_api/leaderboard/levels", requestParams, new SDKResponseHandler() {
@Override
public void onSuccess(JSONObject response) {
feedFrameWrapper.findViewById(Rzap.id("levels_spinner")).setVisibility(View.GONE);
feedFrameWrapper.findViewById(Rzap.id("levels_feed_frame")).setVisibility(View.VISIBLE);
populateLevelFeedlettes(response);
}
@Override
public void onFailure(Throwable e) {
feedFrameWrapper.findViewById(Rzap.id("levels_spinner")).setVisibility(View.GONE);
feedFrameWrapper.findViewById(Rzap.id("levels_feed_frame")).setVisibility(View.VISIBLE);
feedFrameWrapper.findViewById(Rzap.id("levels_feed_empty")).setVisibility(View.VISIBLE);
feedFrameWrapper.findViewById(Rzap.id("levels_retry")).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
requestLevels();
}
});
}
});
}
public void populateLevelFeedlettes(JSONObject response) {
final List<Feedlette> fs = new ArrayList<Feedlette>();
if (response.has("leaderboards")) {
JSONArray stream;
try {
stream = response.getJSONArray("leaderboards");
for (int i = 0; i < stream.length(); i++) {
JSONObject obj = stream.getJSONObject(i);
LeaderboardLevelFeedlette f = new LeaderboardLevelFeedlette(obj);
if (levelId.equals("") && i == 0) {
f.setSelected(true);
} else if (obj.optString("id", "").equals(levelId)) {
f.setSelected(true);
}
f.setLevelSelectListener(new LeaderboardLevelSelectListener() {
@Override
public void onSelect(String levelId, String levelName, String everyoneRank, String friendsRank, String displayScore) {
LeaderboardDialog.this.onLevelSelect(levelId, levelName);
LeaderboardDialog.this.levelsDialog.hide();
}
});
fs.add(f);
}
levelsFeedView.connectFastAdapter(fs);
} catch (org.json.JSONException e) {
e.printStackTrace();
}
}
}
protected void onLevelSelect(String levelId, String levelName) {
requestLeaderboard(levelId);
}
public void populateUserFeedlettes(JSONObject response) {
feedView = new FeedView(context);
final List<Feedlette> fs = new ArrayList<Feedlette>();
if (response.has("stream")) {
JSONArray stream;
try {
stream = response.getJSONArray("stream");
if (stream.length() == 0) {
feedFrame.removeAllViews();
((TextView) findViewById(Rzap.id("empty_text"))).setText("There are no scores yet for this level. Go be the first!");
((Button) findViewById(Rzap.id("retry"))).setVisibility(View.GONE);
findViewById(Rzap.id("feed_empty")).setVisibility(View.VISIBLE);
} else {
for (int i = 0; i < stream.length(); i++) {
JSONObject obj = stream.getJSONObject(i);
LeaderboardUserFeedlette f = new LeaderboardUserFeedlette(obj);
f.setFromSdk(true);
f.setFeedletteClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LeaderboardDialog.this.hide();
}
});
f.setSaveButtonListener(showInGameOverlayOrLaunchLeaderboardActivity);
fs.add(f);
}
feedView.connectFastAdapter(fs);
feedFrame.removeAllViews();
feedFrame.addView(feedView);
}
} catch (org.json.JSONException e) {
e.printStackTrace();
}
}
try {
JSONObject level = response.getJSONObject("level");
levelNameView.setText(level.getString("name"));
} catch (JSONException e) {
e.printStackTrace();
}
}
@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() {
shownAt = System.currentTimeMillis();
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);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.hide();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
}