package com.znv.linkup;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Display;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import cn.smssdk.gui.CommonDialog;
import com.android.volley.VolleyError;
import com.znv.linkup.core.config.LevelCfg;
import com.znv.linkup.core.config.ModeCfg;
import com.znv.linkup.rest.NetMsgListener;
import com.znv.linkup.rest.UserScore;
import com.znv.linkup.rest.VolleyHelper;
import com.znv.linkup.util.AnimatorUtil;
import com.znv.linkup.util.CacheUtil;
import com.znv.linkup.util.LevelUtil;
import com.znv.linkup.util.LikeHelper;
import com.znv.linkup.util.ShareUtil;
import com.znv.linkup.util.StringUtil;
import com.znv.linkup.view.dialog.InfoDialog;
/**
* 排行榜
*
* @author yzb
*
*/
public class TopActivity extends Activity implements OnGestureListener {
private int curMode = 0;
private int curRank = 0;
private int curLevel = 0;
private int levelIndex = 0;
private VolleyHelper volley = null;
private LinearLayout topList = null;
private List<TopItemHolder> holders = null;
private List<ModeCfg> modeCfgs = BaseActivity.modeCfgs;
private Spinner spModes = null;
private Spinner spRanks = null;
private Spinner spLevels = null;
private ShareUtil shareHelper = null;
private Dialog pd;
private Display mDisplay = null;
private Point size = new Point();
// 移动最小距离
private static final int FLING_MIN_DISTANCE = 50;
// 构建手势探测器
private GestureDetector mygesture = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initFullScreen();
setContentView(R.layout.activity_top);
volley = new VolleyHelper(this);
LayoutInflater inflater = LayoutInflater.from(this);
topList = (LinearLayout) findViewById(R.id.topUsers);
holders = new ArrayList<TopItemHolder>(ViewSettings.TopRankN);
for (int i = 0; i < ViewSettings.TopRankN; i++) {
View view = inflater.inflate(R.layout.topitem, null);
TopItemHolder item = new TopItemHolder();
item.tvOrder = (TextView) view.findViewById(R.id.order);
item.ivIcon = (ImageView) view.findViewById(R.id.icon);
item.tvScore = (TextView) view.findViewById(R.id.score);
item.tvName = (TextView) view.findViewById(R.id.name);
item.tvDate = (TextView) view.findViewById(R.id.date);
item.ivLike = (ImageView) view.findViewById(R.id.ivLike);
holders.add(item);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params.setMargins(1, 0, 1, 0);
if (i % 2 == 0) {
// view.setBackgroundColor(0xcccccccc);
view.setBackgroundColor(0xffebe39d);
} else {
// view.setBackgroundColor(0xdddddddd);
}
view.setLayoutParams(params);
view.setVisibility(View.INVISIBLE);
topList.addView(view);
}
topList.setVisibility(View.INVISIBLE);
spModes = (Spinner) findViewById(R.id.spModes);
spRanks = (Spinner) findViewById(R.id.spRanks);
spLevels = (Spinner) findViewById(R.id.spLevels);
shareHelper = new ShareUtil(this);
// 设置查询条件
setSelectItem();
LikeHelper.loadLikeUsers(this);
mygesture = new GestureDetector(this, this);
if (ViewSettings.DeployType == ViewSettings.Deploy91) {
} else {
initInfoDialog();
}
mDisplay = getWindowManager().getDefaultDisplay();
mDisplay.getSize(size);
}
/**
* 全屏初始化
*/
private void initFullScreen() {
// set full screen
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
/**
* 设置选项卡动作
*/
private void setSelectItem() {
spModes.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
curMode = position - 1;
String[] types = TopActivity.this.getResources().getStringArray(ViewSettings.ModeRanks[0]);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(TopActivity.this, android.R.layout.simple_spinner_item, types);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spRanks.setAdapter(adapter);
spLevels.setVisibility(View.INVISIBLE);
if (curRank == 0) {
getTotalRanks();
}
} else if (curMode != position - 1) {
curMode = position - 1;
spLevels.setVisibility(View.VISIBLE);
// // 设置下拉列表风格
String[] ranks = TopActivity.this.getResources().getStringArray(ViewSettings.ModeRanks[position]);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(TopActivity.this, android.R.layout.simple_spinner_item, ranks);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 防止触发Rank的ItemSelected事件
spRanks.setAdapter(adapter);
if (curRank == 0) {
getLevelRanks();
}
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
spRanks.setOnItemSelectedListener(rankSelectedListener);
spLevels.setOnItemSelectedListener(levelSelectedListener);
}
OnItemSelectedListener rankSelectedListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (isTotalRank()) {
if (curRank != position) {
curRank = position;
getTotalRanks();
}
} else if (curRank != position) {
curRank = position;
getLevelRanks();
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
};
OnItemSelectedListener levelSelectedListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (curLevel != position) {
curLevel = position;
getLevelRanks();
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
};
/**
* 获取当前关卡排名信息
*/
private void getLevelRanks() {
hideSearchPad();
volley.cancelAll();
LevelCfg levelCfg = modeCfgs.get(curMode).getRankInfos().get(curRank).getLevelInfos().get(curLevel);
String levelName = modeCfgs.get(curMode).getModeName() + "-" + levelCfg.getRankName() + "-" + levelCfg.getLevelName();
((TextView) findViewById(R.id.tvCurLevel)).setText(getString(R.string.level_title, levelName));
levelIndex = levelCfg.getLevelId();
String uri = UserScore.LEVEL_GET_URI + "?level=" + String.valueOf(levelIndex) + "&top=" + String.valueOf(ViewSettings.TopRankN);
volley.getJsonArray(uri, new NetMsgListener<JSONArray>() {
@Override
public void onNetMsg(JSONArray t) {
hideProgress();
try {
for (int i = 0; i < t.length(); i++) {
topList.getChildAt(i).setVisibility(View.VISIBLE);
JSONObject obj = t.getJSONObject(i);
TopItemHolder item = holders.get(i);
setOrder(item.tvOrder, i);
item.tvName.setTextSize(12);
item.tvName.setText(StringUtil.toUtf8(obj.getString("userName")));
item.tvScore.setVisibility(View.VISIBLE);
if (LevelUtil.isTimeMode(levelIndex)) {
item.tvScore.setText(StringUtil.secondToString(obj.getInt("time")));
} else {
item.tvScore.setText(String.valueOf(obj.getInt("score")));
}
item.tvDate.setText(obj.getString("pubTime").substring(0, 10));
item.tvDate.setTextSize(13);
// 是否点赞
item.ivLike.setTag(obj.getString("userId") + ";" + item.tvName.getText());
if (LikeHelper.isLikeUser(obj.getString("userId"))) {
item.ivLike.setImageResource(R.drawable.like);
} else {
item.ivLike.setImageResource(R.drawable.unlike);
}
volley.loadImage(item.ivIcon, obj.getString("userIcon"));
}
for (int i = t.length(); i < ViewSettings.TopRankN; i++) {
topList.getChildAt(i).setVisibility(View.INVISIBLE);
}
topList.setVisibility(View.VISIBLE);
} catch (Exception e) {
Toast.makeText(TopActivity.this, getString(R.string.top_data_error), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(VolleyError e) {
hideProgress();
Toast.makeText(TopActivity.this, getString(R.string.top_net_error), Toast.LENGTH_SHORT).show();
}
});
showProgress();
}
/**
* 隐藏进度条
*/
private void hideProgress() {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
}
/**
* 显示进度条
*/
private void showProgress() {
hideProgress();
pd = CommonDialog.ProgressDialog(this);
if (pd != null) {
pd.show();
}
}
/**
* 获取当前的总排名,所有/本月/本周
*/
private void getTotalRanks() {
hideSearchPad();
volley.cancelAll();
String rankName = spRanks.getSelectedItem().toString() + "-" + spModes.getSelectedItem().toString();
((TextView) findViewById(R.id.tvCurLevel)).setText(rankName);
String dayString = "";
if (isTotalRank()) {
if (curRank == 0) {
dayString = "&day=7";
} else if (curRank == 1) {
dayString = "&day=30";
} else if (curRank == 2) {
}
}
String uri = UserScore.USER_TOTALRANK_URI + "?top=10" + dayString;
volley.getJsonArray(uri, new NetMsgListener<JSONArray>() {
@Override
public void onNetMsg(JSONArray t) {
hideProgress();
try {
for (int i = 0; i < t.length(); i++) {
topList.getChildAt(i).setVisibility(View.VISIBLE);
JSONObject obj = t.getJSONObject(i);
TopItemHolder item = holders.get(i);
setOrder(item.tvOrder, i);
item.tvName.setTextSize(15);
item.tvName.setText(StringUtil.toUtf8(obj.getString("userName")));
item.tvScore.setVisibility(View.GONE);
item.tvDate.setText(obj.getString("totalScore"));
item.tvDate.setTextSize(15);
// 是否点赞
item.ivLike.setTag(obj.getString("userId") + ";" + item.tvName.getText());
if (LikeHelper.isLikeUser(obj.getString("userId"))) {
item.ivLike.setImageResource(R.drawable.like);
} else {
item.ivLike.setImageResource(R.drawable.unlike);
}
volley.loadImage(item.ivIcon, obj.getString("userIcon"));
}
for (int i = t.length(); i < ViewSettings.TopRankN; i++) {
topList.getChildAt(i).setVisibility(View.INVISIBLE);
}
topList.setVisibility(View.VISIBLE);
} catch (Exception e) {
Toast.makeText(TopActivity.this, getString(R.string.top_data_error), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(VolleyError e) {
hideProgress();
Toast.makeText(TopActivity.this, getString(R.string.top_net_error), Toast.LENGTH_SHORT).show();
}
});
showProgress();
}
/**
* 处理点赞
*
* @param v
*/
public void clickLike(View v) {
String tag = (String) v.getTag();
String userId = tag.substring(0, tag.indexOf(";"));
if (!LikeHelper.isLikeUser(userId)) {
LikeHelper.likeUser(this, userId);
((ImageView) v).setImageResource(R.drawable.like);
UserScore.updateLike(tag, 1, netMsgHandler);
} else {
LikeHelper.unlikeUser(this, userId);
((ImageView) v).setImageResource(R.drawable.unlike);
UserScore.updateLike(tag, -1, netMsgHandler);
}
}
/**
* 获取下一关的排名
*/
public void nextLevel() {
if (isTotalRank()) {
return;
}
if (curMode == modeCfgs.size() - 1 && curRank == modeCfgs.get(curMode).getRankInfos().size() - 1 && curLevel == 23) {
return;
}
if (curLevel + 1 < 24) {
curLevel++;
spLevels.setSelection(curLevel);
} else {
curLevel = 0;
spLevels.setSelection(curLevel);
if (curRank + 1 < modeCfgs.get(curMode).getRankInfos().size()) {
curRank++;
spRanks.setSelection(curRank);
} else {
curRank = 0;
spRanks.setSelection(curRank);
if (curMode + 1 < modeCfgs.size()) {
curMode++;
} else {
curMode = 0;
}
spModes.setSelection(curMode);
}
}
getLevelRanks();
}
/**
* 查询前一关的排名
*/
public void preLevel() {
if (isTotalRank()) {
return;
}
if (curMode == 0 && curRank == 0 && curLevel == 0) {
return;
}
if (curLevel - 1 >= 0) {
curLevel--;
spLevels.setSelection(curLevel);
} else {
curLevel = 23;
spLevels.setSelection(curLevel);
if (curRank - 1 >= 0) {
curRank--;
spRanks.setSelection(curRank);
} else {
if (curMode - 1 >= 0) {
curMode--;
} else {
curMode = modeCfgs.size() - 1;
}
spModes.setSelection(curMode + 1);
// // 设置下拉列表风格
String[] ranks = TopActivity.this.getResources().getStringArray(ViewSettings.ModeRanks[curMode + 1]);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(TopActivity.this, android.R.layout.simple_spinner_item, ranks);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 防止触发Rank的ItemSelected事件
spRanks.setAdapter(adapter);
curRank = modeCfgs.get(curMode).getRankInfos().size() - 1;
spRanks.setSelection(curRank);
}
}
getLevelRanks();
}
/**
* 判断是否为总排行榜
*
* @return 总排行榜:true
*/
private boolean isTotalRank() {
return curMode == -1;
}
/**
* 处理网络消息回调的handler
*/
@SuppressLint("HandlerLeak")
public Handler netMsgHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case ViewSettings.MSG_UPDATE_LIKE: {
String liketag = (String) msg.obj;
String likeStr = liketag.substring(0, liketag.indexOf(";"));
String tag = liketag.substring(liketag.indexOf(";") + 1);
String userName = tag.substring(tag.indexOf(";") + 1);
if (likeStr.startsWith("-")) {
// 取消点赞
Toast.makeText(TopActivity.this, getString(R.string.unlike_info, userName), Toast.LENGTH_SHORT).show();
} else {
// 点赞
Toast.makeText(TopActivity.this, getString(R.string.like_info, userName), Toast.LENGTH_SHORT).show();
}
}
break;
case ViewSettings.MSG_NETWORK_EXCEPTION: {
Toast.makeText(TopActivity.this, getString(R.string.like_error), Toast.LENGTH_SHORT).show();
}
break;
}
}
};
/**
* 分享排行榜
*
* @param v
*/
public void shareTop(View v) {
if (shareHelper != null) {
shareHelper.shareMsgView(getString(R.string.share_top_info), findViewById(R.id.rltTop));
}
}
/**
* 显示查询界面
*
* @param v
*/
public void showSearch(View v) {
showSearchPad();
}
private void showSearchPad() {
LinearLayout rltSearch = (LinearLayout) findViewById(R.id.lltSearch);
AnimatorUtil.animTranslate(rltSearch, 0, 0, size.y, size.y - rltSearch.getHeight(), 500, 0, false);
}
/**
* 隐藏查询界面
*
* @param v
*/
public void hideSearch(View v) {
hideSearchPad();
}
private void hideSearchPad() {
LinearLayout rltSearch = (LinearLayout) findViewById(R.id.lltSearch);
rltSearch.setTranslationY(size.y);
}
/**
* 设置排名列
*
* @param tvOrder
* 排名列的TextView
* @param index
* 排名
*/
private void setOrder(TextView tvOrder, int index) {
tvOrder.setBackgroundResource(ViewSettings.TopOrderImages[index]);
}
/**
* 控件缓存
*
* @author yzb
*
*/
class TopItemHolder {
TextView tvOrder;
ImageView ivIcon;
TextView tvScore;
TextView tvName;
TextView tvDate;
TextView tvTime;
ImageView ivLike;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// 向右翻
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE) {
nextLevel();
}
// 向左翻
if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE) {
preLevel();
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return mygesture.onTouchEvent(event);
}
/**
* 分享提示
*/
private void initInfoDialog() {
if (!CacheUtil.hasBind(this, "info_share")) {
InfoDialog info = new InfoDialog(this);
info.setTitle(getString(R.string.info_prompt));
info.setMessage(getString(R.string.share_prompt));
info.setPositiveButton("info_share");
info.hasLogin(false);
info.show();
}
}
}