package com.aiyou.ecard; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.TextUtils; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.EditorInfo; import android.widget.DatePicker; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.TextView.OnEditorActionListener; import com.aiyou.BaseActivity; import com.aiyou.R; import com.aiyou.utils.AiYouManager; import com.aiyou.utils.NetWorkManager; import com.aiyou.utils.thread.ThreadUtils; import external.PullToRefresh.PullToRefreshListView; import external.smartimageview.SmartImageView; public class EcardActivity extends BaseActivity implements OnPageChangeListener, OnClickListener { private static final String URL_BASIC = "http://ecard.bupt.edu.cn/"; private static final String URL_BASIC_USER = URL_BASIC + "User/"; private static final String URL_LOGIN = URL_BASIC + "Login.aspx"; private static final String URL_BASIC_INFO = URL_BASIC_USER + "baseinfo.aspx"; private static final String URL_CONSUME_INFO = URL_BASIC_USER + "ConsumeInfo.aspx"; private static final int MSG_ERROR = -1; private static final int MSG_BASIC_INFO = 1; private static final int MSG_CONSUME_INFO = 2; private static final String KEY_DATA = "data"; private Map<String, String> mCookies = new HashMap<>(); private Map<String, String> mConsumeParams = new HashMap<>(); private BasicInfo mBasicInfo = null; private EditText mIdET, mPasswordET; private ProgressDialog mProgressDlg; private LinearLayout mContentLL; private ViewPager mViewPager; private TextView mTag1TV, mTag2TV; private SmartImageView mFaceSIV; private TextView mIdTV, mNameTV, mSexTV, mNationTV, mMoneyMainTV, mMoneyExtraTV, mMoneySpecTV, mRoleTV, mStatusTV, mDepartmentTV; private EditText mFromET, mToET; private TextView mQueryConsumeTV; private List<ConsumeInfo> mList = new ArrayList<>(); private MyListAdapter mAdapter; private int mYear1, mYear2, mMonth1, mMonth2, mDay1, mDay2; private int mPage = 1, mTotalPage = 1; // 处理UI线程的handler public Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (msg.what == MSG_BASIC_INFO) { // 显示基本信息 showBasicInfo(mBasicInfo); } else if (msg.what == MSG_CONSUME_INFO) { // 显示消费信息 Bundle data = msg.getData(); String html = data.getString(KEY_DATA); data.clear(); Document doc = Jsoup.parse(html); parseConsumeInfo(mList, doc); mAdapter.notifyDataSetChanged(); if (mList.isEmpty()) { Toast.makeText(getBaseContext(), "暂无消费记录", Toast.LENGTH_SHORT).show(); } if (mPage < mTotalPage) { queryConsumeInfo(++mPage); } else { Toast.makeText(getBaseContext(), "共" + mList.size() + "条记录", Toast.LENGTH_SHORT) .show(); } } else if (msg.what == MSG_ERROR) { Bundle data = msg.getData(); String error = data.getString(KEY_DATA); if (TextUtils.isEmpty(error)) { error = NetWorkManager.MSG_NONET; } Toast.makeText(getBaseContext(), error, Toast.LENGTH_SHORT) .show(); } mProgressDlg.dismiss(); return true; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ecard); init(); } private void showBasicInfo(BasicInfo info) { mIdTV.setText("学 号:" + info.id); mNameTV.setText("姓 名:" + info.name); String cookie = ""; if (mCookies != null && !mCookies.isEmpty()) { Set<String> keySet = mCookies.keySet(); for (String key : keySet) { cookie += key + "=" + mCookies.get(key) + ";"; } } Map<String, String> header = new HashMap<>(); header.put("Cookie", cookie); mFaceSIV.setImageUrl(info.face_url, header); mSexTV.setText("性 别:" + info.sex); mNationTV.setText("民 族:" + info.nation); mMoneyMainTV.setText(info.money_main); mMoneyExtraTV.setText(info.money_extra); mMoneySpecTV.setText(info.money_spec); mRoleTV.setText(info.role); mStatusTV.setText(info.status); mDepartmentTV.setText(info.department); mContentLL.setVisibility(View.VISIBLE); } @SuppressLint("InflateParams") private void init() { mProgressDlg = new ProgressDialog(this); mProgressDlg.setCancelable(false); mProgressDlg.setCanceledOnTouchOutside(false); mProgressDlg.setIndeterminate(true); mProgressDlg.setMessage("正在查询"); mIdET = (EditText) findViewById(R.id.et_id); mPasswordET = (EditText) findViewById(R.id.et_password); mPasswordET.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { switch (actionId) { case EditorInfo.IME_ACTION_DONE: onQuery(null); break; } return true; } }); mContentLL = (LinearLayout) findViewById(R.id.ll_content); mTag1TV = (TextView) findViewById(R.id.tv_tag1); mTag2TV = (TextView) findViewById(R.id.tv_tag2); mViewPager = (ViewPager) findViewById(R.id.vp); List<View> viewList = new ArrayList<>(); LayoutInflater inflater = getLayoutInflater(); View view1 = inflater.inflate(R.layout.ecard_vp_page1, null); View view2 = inflater.inflate(R.layout.ecard_vp_page2, null); mFaceSIV = (SmartImageView) view1.findViewById(R.id.siv); mIdTV = (TextView) view1.findViewById(R.id.tv_id); mNameTV = (TextView) view1.findViewById(R.id.tv_name); mSexTV = (TextView) view1.findViewById(R.id.tv_sex); mNationTV = (TextView) view1.findViewById(R.id.tv_nation); mMoneyMainTV = (TextView) view1.findViewById(R.id.tv_money_main); mMoneyExtraTV = (TextView) view1.findViewById(R.id.tv_money_extra); mMoneySpecTV = (TextView) view1.findViewById(R.id.tv_money_spec); mRoleTV = (TextView) view1.findViewById(R.id.tv_role); mStatusTV = (TextView) view1.findViewById(R.id.tv_status); mDepartmentTV = (TextView) view1.findViewById(R.id.tv_department); mFromET = (EditText) view2.findViewById(R.id.et_from); mToET = (EditText) view2.findViewById(R.id.et_to); mQueryConsumeTV = (TextView) view2.findViewById(R.id.tv_seek); mQueryConsumeTV.setOnClickListener(this); PullToRefreshListView mPTRLV = (PullToRefreshListView) view2.findViewById(R.id.ptrlv); mPTRLV.setShowIndicator(false); mAdapter = new MyListAdapter(getBaseContext(), mList); mPTRLV.setAdapter(mAdapter); Calendar c = Calendar.getInstance(); mYear1 = mYear2 = c.get(Calendar.YEAR); mMonth1 = mMonth2 = c.get(Calendar.MONTH); mDay2 = c.get(Calendar.DAY_OF_MONTH); mDay1 = 1; if (mDay1 == mDay2) { mMonth1 = mMonth2 - 1; if (mMonth1 < 0) { mMonth1 = 11; mYear1--; } } mFromET.setText(dateFormat(mYear1, mMonth1, mDay1)); mToET.setText(dateFormat(mYear2, mMonth2, mDay2)); viewList.add(view1); viewList.add(view2); mViewPager .setAdapter(new EcardPagerAdapter(getBaseContext(), viewList)); mViewPager.setOnPageChangeListener(this); mViewPager.setCurrentItem(0); } @Override public void onClick(View v) { if (v == mQueryConsumeTV) { // 查询消费记录 mPage = mTotalPage = 1; queryConsumeInfo(mPage); } } public void onTagClick(View v) { final int nId = v.getId(); if (nId == R.id.tv_tag1) { mViewPager.setCurrentItem(0); } else if (nId == R.id.tv_tag2) { mViewPager.setCurrentItem(1); } } public void onDatePick(View v) { int nId = v.getId(); if (nId == R.id.et_from) { new DatePickerDialog(EcardActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (year * 10000L + monthOfYear * 100 + dayOfMonth >= mYear2 * 10000 + mMonth2 * 100 + mDay2) { Toast.makeText(EcardActivity.this, "开始日期要小于结束日期", Toast.LENGTH_SHORT) .show(); return; } mYear1 = year; mMonth1 = monthOfYear; mDay1 = dayOfMonth; mFromET.setText(dateFormat(mYear1, mMonth1, mDay1)); clearList(); } }, mYear1, mMonth1, mDay1).show(); } else if (nId == R.id.et_to) { new DatePickerDialog(EcardActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if (mYear1 * 10000L + mMonth1 * 100 + mDay1 >= year * 10000 + monthOfYear * 100 + dayOfMonth) { Toast.makeText(EcardActivity.this, "开始日期要小于结束日期", Toast.LENGTH_SHORT) .show(); return; } mYear2 = year; mMonth2 = monthOfYear; mDay2 = dayOfMonth; mToET.setText(dateFormat(mYear2, mMonth2, mDay2)); clearList(); } }, mYear2, mMonth2, mDay2).show(); } } public void onQuery(View v) { String id = mIdET.getText().toString().trim(); String password = mPasswordET.getText().toString().trim(); if (TextUtils.isEmpty(id) || TextUtils.isEmpty(password)) { Toast.makeText(getBaseContext(), "卡号和密码不能为空", Toast.LENGTH_SHORT) .show(); return; } clear(); query(id, password); AiYouManager.viewInputMethod(EcardActivity.this, false, getCurrentFocus()); } private void clear() { mFaceSIV.setImageResource(R.drawable.iu_default_green); mIdTV.setText(""); mNameTV.setText(""); mSexTV.setText(""); mNationTV.setText(""); mMoneyMainTV.setText(""); mMoneyExtraTV.setText(""); mMoneySpecTV.setText(""); mRoleTV.setText(""); mStatusTV.setText(""); mDepartmentTV.setText(""); clearList(); mCookies.clear(); } private void clearList() { mPage = mTotalPage = 1; mList.clear(); mAdapter.notifyDataSetChanged(); } private void query(final String id, final String password) { if (!NetWorkManager.getInstance(getBaseContext()).isNetAvailable()) { if (mHandler != null) { mHandler.sendEmptyMessage(MSG_ERROR); } return; } mProgressDlg.show(); ThreadUtils.execute(new Runnable() { @Override public void run() { String error; // 登录 error = login(id, password); if (error != null) { if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, error); mHandler.sendMessage(msg); } return; } // 查询基本信息 error = queryBasicInfo(); if (error != null) { if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, error); mHandler.sendMessage(msg); } return; } // 为查询消费情况准备参数 error = prepareConsumeInfo(); if (error != null) { if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, error); mHandler.sendMessage(msg); } return; } if (mHandler != null) { mHandler.sendEmptyMessage(MSG_BASIC_INFO); } } }); } private String login(final String id, final String password) { Document doc; /** * 访问登录页面,获取需要的键值对 */ try { doc = Jsoup.connect(URL_LOGIN).timeout(10000).get(); } catch (IOException e) { doc = null; } if (doc == null) { return "查询失败"; } String param1 = ""; String param2 = "btnLogin"; String param3 = ""; String param4 = doc.select("input#__VIEWSTATE").get(0).attr("value"); String param5 = doc.select("input#__VIEWSTATEGENERATOR").get(0) .attr("value"); String param6 = doc.select("input#__EVENTVALIDATION").get(0) .attr("value"); Map<String, String> params = new HashMap<>(); params.put("__LASTFOCUS", param1); params.put("__EVENTTARGET", param2); params.put("__EVENTARGUMENT", param3); params.put("__VIEWSTATE", param4); params.put("__VIEWSTATEGENERATOR", param5); params.put("__EVENTVALIDATION", param6); params.put("txtUserName", id); params.put("txtPassword", password); params.put("hfIsManager", "0"); /** * 登录 */ try { Connection conn = Jsoup.connect(URL_LOGIN).data(params) .timeout(10000); doc = conn.post(); mCookies = conn.response().cookies(); } catch (IOException e) { doc = null; } if (doc == null) { return "查询失败"; } // 账号、密码是否有误 if (doc.select("span#lblError").size() > 0) { return doc.select("span#lblError").get(0).text(); } return null; } private String queryBasicInfo() { Document doc; try { doc = Jsoup.connect(URL_BASIC_INFO).timeout(10000) .cookies(mCookies).get(); } catch (IOException e) { doc = null; } if (doc == null) { return "查询基本信息失败"; } mBasicInfo = new BasicInfo(); mBasicInfo.face_url = URL_BASIC_USER + doc.select("img").get(0).attr("src"); mBasicInfo.id = doc.select("span#ContentPlaceHolder1_txtOutID").get(0) .text(); mBasicInfo.name = doc.select("span#ContentPlaceHolder1_txtUserName") .get(0).text(); mBasicInfo.sex = doc.select("span#ContentPlaceHolder1_txtSex").get(0) .text(); mBasicInfo.nation = doc.select("span#ContentPlaceHolder1_txtNation") .get(0).text(); mBasicInfo.money_main = doc .select("span#ContentPlaceHolder1_txtOddFare").get(0).text(); mBasicInfo.money_extra = doc .select("span#ContentPlaceHolder1_txtSubsidy").get(0).text(); mBasicInfo.money_spec = doc .select("span#ContentPlaceHolder1_txtSpecialOddfare").get(0) .text(); mBasicInfo.role = doc.select("span#ContentPlaceHolder1_txtCardSF") .get(0).text(); mBasicInfo.status = doc.select("span#ContentPlaceHolder1_txtStatus") .get(0).text(); mBasicInfo.department = doc .select("span#ContentPlaceHolder1_stxtCustDeptName").get(0) .text(); return null; } private String prepareConsumeInfo() { Document doc; try { doc = Jsoup.connect(URL_CONSUME_INFO).timeout(10000) .cookies(mCookies).get(); } catch (IOException e) { doc = null; } if (doc == null) { return "查询基本信息失败"; } getConsumeParams(doc); return null; } private void queryConsumeInfo(final int page) { String from = dateFormat(mYear1, mMonth1, mDay1); String to = dateFormat(mYear2, mMonth2, mDay2); // 为查询消费情况准备参数 final Map<String, String> data = mConsumeParams; data.put("__EVENTARGUMENT", page + ""); // 0查询主钱包,1查询补助钱包 data.put("ctl00$ContentPlaceHolder1$rbtnType", "0"); data.put("ctl00$ContentPlaceHolder1$txtStartDate", from); data.put("ctl00$ContentPlaceHolder1$txtEndDate", to); if (page == 1) { data.put("ctl00$ContentPlaceHolder1$btnSearch", "查 询"); } mProgressDlg.show(); ThreadUtils.execute(new Runnable() { @Override public void run() { Document doc; try { doc = Jsoup.connect(URL_CONSUME_INFO).data(data) .timeout(10000).cookies(mCookies).post(); } catch (IOException e) { doc = null; } if (doc == null) { if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_ERROR); Bundle data = msg.getData(); data.putString(KEY_DATA, "查询消费信息失败"); mHandler.sendMessage(msg); } return; } getConsumeParams(doc); // 获取总页数 if (mTotalPage == 1) { try { String page = doc .select("div#ContentPlaceHolder1_AspNetPager1") .select("a").last().attr("href"); String[] arr = page.split("'"); if (arr.length >= 2) { page = arr[arr.length - 2]; mTotalPage = Integer.parseInt(page); } } catch (Exception e) { // 只有一页 } if (mTotalPage < 1) { mTotalPage = 1; } } if (mHandler != null) { Message msg = mHandler.obtainMessage(MSG_CONSUME_INFO); Bundle data = msg.getData(); data.putString(KEY_DATA, doc.toString()); mHandler.sendMessage(msg); } } }); } private void parseConsumeInfo(List<ConsumeInfo> list, Document doc) { Elements tr = doc.select("table#ContentPlaceHolder1_gridView").select( "tr"); tr.remove(0); ConsumeInfo info; Elements td; String time; for (Element ele : tr) { td = ele.select("td"); if (td.size() < 7) { continue; } time = td.get(0).text().trim(); if (TextUtils.isEmpty(time)) { continue; } info = new ConsumeInfo(); info.time = time; info.description = td.get(1).text().trim(); info.money_deal = td.get(2).text().trim(); info.money_remain = td.get(3).text().trim(); info.station = td.get(5).text().trim(); info.name = td.get(6).text().trim(); list.add(info); } } private Map<String, String> getConsumeParams(final Document doc) { String param1 = "ctl00$ContentPlaceHolder1$AspNetPager1"; String param2 = doc.select("input#__VIEWSTATE").get(0).attr("value"); String param3 = doc.select("input#__VIEWSTATEGENERATOR").get(0) .attr("value"); String param4 = doc.select("input#__EVENTVALIDATION").get(0) .attr("value"); mConsumeParams.clear(); mConsumeParams.put("__EVENTTARGET", param1); mConsumeParams.put("__VIEWSTATE", param2); mConsumeParams.put("__VIEWSTATEGENERATOR", param3); mConsumeParams.put("__EVENTVALIDATION", param4); return mConsumeParams; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position == 0) { mTag1TV.setTextColor(0xff0fd451); mTag2TV.setTextColor(0xff000000); } else if (position == 1) { mTag1TV.setTextColor(0xff000000); mTag2TV.setTextColor(0xff0fd451); } } @Override public void onPageScrollStateChanged(int state) { } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 按下键盘上返回按钮 if (keyCode == KeyEvent.KEYCODE_BACK) { selfFinish(null); return true; } return super.onKeyDown(keyCode, event); } public void selfFinish(View view) { scrollToFinishActivity(); } @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacksAndMessages(null); mHandler = null; } private String dateFormat(int year, int month, int day) { String date = year + "-"; month += 1; if (month < 10) { date += "0" + month + "-"; } else { date += month + "-"; } if (day < 10) { date += "0" + day; } else { date += day; } return date; } }