From 5b602b536c5be89b2cbfd211025236fb41ba2fa3 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 18 十二月 2023 17:46:00 +0800
Subject: [PATCH] 充值记录分页加载 补卡用户列表分页加载 通信模块添加日志方便分析长时间链接后不能通讯问题
---
gradlew | 275 +++++++-----
app/src/main/java/com/dayu/recharge/activity/MyActivity.java | 4
app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java | 103 +++-
app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java | 6
app/src/main/res/layout/item_replacement.xml | 76 +++
app/src/main/res/layout/activity_newcard_list.xml | 4
app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java | 98 +++-
easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java | 5
app/src/main/java/com/dayu/recharge/dao/RechargeDao.java | 3
app/src/main/res/layout/activity_replacement.xml | 21
gradlew.bat | 14
app/src/main/java/com/dayu/recharge/net/SocketNet.java | 19
easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java | 7
app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java | 24
app/src/main/res/layout/item_new_card.xml | 1
app/src/main/res/layout/activity_recharge_list.xml | 24
app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java | 99 +++-
easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java | 1
local.properties | 4
app/src/main/res/layout/item_recharge.xml | 87 ++-
easysocket/src/main/java/com/easysocket/utils/HexUtil.java | 275 +++++++++++++
app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java | 97 ++++
app/build.gradle | 2
23 files changed, 959 insertions(+), 290 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 590068d..9878278 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,7 +3,7 @@
android {
signingConfigs {
debug {
- storeFile file('dycz.jks')
+ storeFile file('D:\\androidProject\\charge\\app\\dycz.jks')
storePassword 'dycz@2023'
keyAlias 'dayu'
keyPassword 'dycz@2023'
diff --git a/app/src/main/java/com/dayu/recharge/activity/MyActivity.java b/app/src/main/java/com/dayu/recharge/activity/MyActivity.java
index f2b190a..c7cee23 100644
--- a/app/src/main/java/com/dayu/recharge/activity/MyActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/MyActivity.java
@@ -162,7 +162,7 @@
if (isRechargeList) {
listData = asynchBaseDao.rechargeDao().ansyFindByTime(beginTime, endTime);
} else {
- listData = baseDao.userCardDao().findByTime(beginTime, endTime);
+ listData = asynchBaseDao.userCardDao().findByTime(beginTime, endTime);
}
if (listData == null || listData.size() == 0) {
handler.sendEmptyMessage(2);
@@ -178,7 +178,7 @@
return;
}
if (isRechargeList) {
- title = new String[]{"璁惧搴忓垪鍙�", "鐢ㄦ埛鍚�", "韬唤璇佸彿", "鍏呭�兼棩鏈�", "鍏呭�奸噾棰濓紙鍏冿級", "鍓╀綑閲戦锛堝厓锛�"};
+ title = new String[]{"璁惧搴忓垪鍙�", "鐢ㄦ埛鍚�", "璁㈠崟鍙�", "鍏呭�兼棩鏈�", "鍏呭�奸噾棰濓紙鍏冿級", "鍓╀綑閲戦锛堝厓锛�"};
fileName = file.toString() + "/" + ExcelUtil.outRechargePathName;
} else {
title = new String[]{"璁惧搴忓垪鍙�", "鐢ㄦ埛鍚�", "韬唤璇佸彿", "娉ㄥ唽鏃ユ湡", "鐢佃瘽"};
diff --git a/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java b/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
index 46bb0e6..4bab5ec 100644
--- a/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
@@ -54,7 +54,6 @@
//姣忛〉鏁版嵁鏉℃暟
int limit = 30;
RefreshLayout myRefreshLayout;
- Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -83,7 +82,7 @@
newcardListBinding.recyclerView.setLayoutManager(layoutManager);
newcardListBinding.recyclerView.setAdapter(adapter);
int totale = baseDao.userCardDao().getUserTotale();
- newcardListBinding.userTotal.setText(totale + "");
+ newcardListBinding.userTotal.setText("寮�鎴锋暟锛�" + totale + "");
}
@@ -161,15 +160,18 @@
if ((endTime < beginTime) && endTime != beginTime) {
TipUtil.show(NewCardListActivity.this, "缁撴潫鏃堕棿涓嶈兘鏅氫簬寮�濮嬫椂闂�");
} else {
- try {
- endTime = endTime + (1000 * 60 * 60 * 24) - 1;
- List<UserCardBean> userList = baseDao.userCardDao().findByTime(beginTime, endTime);
- userCardBeanList.clear();
- userCardBeanList.addAll(userList);
- adapter.notifyDataSetChanged();
- } catch (Exception e) {
- e.printStackTrace();
- }
+// try {
+// endTime = endTime + (1000 * 60 * 60 * 24) - 1;
+// List<UserCardBean> userList = baseDao.userCardDao().findByTime(beginTime, endTime);
+// userCardBeanList.clear();
+// userCardBeanList.addAll(userList);
+// adapter.notifyDataSetChanged();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+ endTime = endTime + (1000 * 60 * 60 * 24) - 1;
+ userCardBeanList.clear();
+ getList();
}
}
}, beginTimestamp, endTimestamp);
diff --git a/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java b/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
index 9ad290f..88e8d1b 100644
--- a/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
@@ -6,17 +6,28 @@
import android.view.LayoutInflater;
import android.view.View;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.dayu.recharge.adapter.NewCardAdapter;
import com.dayu.recharge.adapter.RechargeAdapter;
import com.dayu.recharge.databinding.ActivityRechargeListBinding;
import com.dayu.recharge.dbBean.RechargeBean;
+import com.dayu.recharge.dbBean.UserCardBean;
import com.dayu.recharge.model.RechargeListModel;
import com.dayu.recharge.utils.ArithUtil;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.datepicker.CustomDatePicker;
import com.dayu.recharge.view.datepicker.DateFormatUtils;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
import java.util.ArrayList;
import java.util.List;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
/**
* Copyright (C), 2023,
@@ -35,7 +46,11 @@
long beginTime;
long endTime;
- RechargeListModel rechargeListModel;
+ int page = 0;
+
+ //姣忛〉鏁版嵁鏉℃暟
+ int limit = 30;
+ RefreshLayout myRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -43,22 +58,26 @@
rechargeListBinding = ActivityRechargeListBinding.inflate(LayoutInflater.from(this));
setContentView(rechargeListBinding.getRoot());
setRightButton();
- setData();
initDatePicker();
- getTotal();
+ initList();
+ getList();
}
- private void setData() {
-
- rechargeListModel = new RechargeListModel(this);
- rechargeListModel.getAllRechargeList().observe(this, myList -> {
- rechargeList.clear();
- rechargeList.addAll(myList);
- adapter.notifyDataSetChanged();
- getTotal();
+ private void initList() {
+ myRefreshLayout = (RefreshLayout) rechargeListBinding.refreshLayout;
+ myRefreshLayout.setEnableRefresh(false);
+ myRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
+ myRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
+ @Override
+ public void onLoadMore(RefreshLayout refreshlayout) {
+ page = page + 1;
+ getList();
+ }
});
adapter = new RechargeAdapter(this, rechargeList);
- rechargeListBinding.rechargeList.setAdapter(adapter);
+ LinearLayoutManager layoutManager = new LinearLayoutManager(this);
+ rechargeListBinding.recyclerView.setLayoutManager(layoutManager);
+ rechargeListBinding.recyclerView.setAdapter(adapter);
}
private void getTotal() {
@@ -68,9 +87,46 @@
double b = Double.parseDouble(rechargeList.get(i).getMorny());
total = ArithUtil.add(total, b);
}
- rechargeListBinding.rechargeTotal.setText("绱鍏呭�硷細" + String.valueOf(total) + "鍏�");
+ rechargeListBinding.rechargeTotal.setText("宸插姞杞芥暟鎹疮璁″厖鍊硷細" + String.valueOf(total) + "鍏�");
}
+ }
+
+ private void getList() {
+ // 鍒涘缓涓�涓� Observable
+ Observable<List<RechargeBean>> observable = Observable.create(emitter -> {
+ // 鍦ㄨ繖閲屾墽琛屽紓姝ユ搷浣�
+ List<RechargeBean> beanList;
+ if (beginTime == 0 && endTime == 0) {
+ beanList = asynchBaseDao.rechargeDao().findAll(page * limit, limit);
+ } else {
+ beanList = asynchBaseDao.rechargeDao().ansyFindByTime(beginTime, endTime);
+ }
+ // 灏嗙粨鏋滃彂閫佺粰瑙傚療鑰�
+ emitter.onNext(beanList);
+ emitter.onComplete();
+ });
+ // 璁㈤槄瑙傚療鑰�
+ observable.subscribeOn(Schedulers.io()) // 鎸囧畾鍦� IO 绾跨▼鎵ц
+ .observeOn(AndroidSchedulers.mainThread()) // 鎸囧畾鍦ㄥ崟涓�绾跨▼瑙傚療缁撴灉
+ .subscribe(
+ result -> {
+ // 鍦ㄨ繖閲屽鐞嗙粨鏋滐紝杩欓噷鏄湪涓荤嚎绋嬩腑
+// System.out.println("Result: " + result);
+ if (result.size() < limit) {
+ myRefreshLayout.finishLoadMoreWithNoMoreData();
+ }
+ if (result != null && result.size() > 0) {
+ rechargeList.addAll(result);
+ }
+ adapter.notifyDataSetChanged();
+ getTotal();
+ },
+ error -> {
+ // 澶勭悊閿欒
+ System.err.println("Error: " + error.getMessage());
+ }
+ );
}
@@ -112,20 +168,8 @@
TipUtil.show(RechargeListActivity.this, "缁撴潫鏃堕棿涓嶈兘鏅氫簬寮�濮嬫椂闂�");
} else {
endTime = endTime + (1000 * 60 * 60 * 24) - 1;
-
- rechargeListModel.getRechargeList(beginTime, endTime).observe(RechargeListActivity.this, list -> {
- if (rechargeList != null) {
- rechargeList.clear();
- rechargeList.addAll(list);
- adapter.notifyDataSetChanged();
- getTotal();
- } else {
- TipUtil.show(RechargeListActivity.this, "鏈煡璇㈠埌鏁版嵁!");
- }
-
- });
-
-
+ rechargeList.clear();
+ getList();
}
}
}, beginTimestamp, endTimestamp);
diff --git a/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java b/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
index f6c182b..053aaa1 100644
--- a/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
@@ -8,13 +8,24 @@
import android.view.View;
import android.widget.AdapterView;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
import com.dayu.recharge.adapter.NewCardAdapter;
+import com.dayu.recharge.adapter.ReplacementAdapter;
import com.dayu.recharge.databinding.ActivityReplacementBinding;
import com.dayu.recharge.dbBean.UserCardBean;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.EdtDialog;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
+import java.util.ArrayList;
import java.util.List;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
/**
* Created by Android Studio.
@@ -24,42 +35,90 @@
* 澶囨敞锛� 琛ュ崱鐣岄潰
*/
public class ReplacementActivity extends BaseActivity {
- ActivityReplacementBinding binding;
- List<UserCardBean> userCardBeanList;
- NewCardAdapter adapter;
+ ActivityReplacementBinding newcardListBinding;
+ List<UserCardBean> userCardBeanList = new ArrayList<>();
+ ReplacementAdapter adapter;
+ long beginTime;
+ long endTime;
+ int page = 0;
+
+ //姣忛〉鏁版嵁鏉℃暟
+ int limit = 30;
+ RefreshLayout myRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- binding = ActivityReplacementBinding.inflate(LayoutInflater.from(this));
- setContentView(binding.getRoot());
+ newcardListBinding = ActivityReplacementBinding.inflate(LayoutInflater.from(this));
+ setContentView(newcardListBinding.getRoot());
setRightButton();
- setData();
- initView();
+ initList();
+ getList();
}
- private void initView() {
- binding.newCardListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+
+ public void itemClick(View view) {
+ UserCardBean userCardBean = userCardBeanList.get((int) view.getTag());
+ Intent intent = new Intent(ReplacementActivity.this, NFCWreatActivity.class);
+ intent.putExtra("dbUserCard", userCardBean);
+ startActivity(intent);
+ }
+
+ private void initList() {
+ myRefreshLayout = (RefreshLayout) newcardListBinding.refreshLayout;
+ myRefreshLayout.setEnableRefresh(false);
+ myRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
+ myRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- UserCardBean userCardBean = userCardBeanList.get(position);
- Intent intent = new Intent(ReplacementActivity.this, NFCWreatActivity.class);
- intent.putExtra("dbUserCard", userCardBean);
- startActivity(intent);
+ public void onLoadMore(RefreshLayout refreshlayout) {
+ page = page + 1;
+ getList();
}
});
+ adapter = new ReplacementAdapter(this, userCardBeanList);
+ LinearLayoutManager layoutManager = new LinearLayoutManager(this);
+ newcardListBinding.recyclerView.setLayoutManager(layoutManager);
+ newcardListBinding.recyclerView.setAdapter(adapter);
}
- private void setData() {
- try {
- userCardBeanList = baseDao.userCardDao().findAll();
- } catch (Exception e) {
- e.printStackTrace();
- }
- adapter = new NewCardAdapter(this, userCardBeanList);
-// binding.newCardListView.setAdapter(adapter);
+
+ private void getList() {
+ // 鍒涘缓涓�涓� Observable
+ Observable<List<UserCardBean>> observable = Observable.create(emitter -> {
+ // 鍦ㄨ繖閲屾墽琛屽紓姝ユ搷浣�
+ List<UserCardBean> beanList;
+ if (beginTime == 0 && endTime == 0) {
+ beanList = asynchBaseDao.userCardDao().findAll(page * limit, limit);
+ } else {
+ beanList = asynchBaseDao.userCardDao().findByTime(beginTime, endTime);
+ }
+ // 灏嗙粨鏋滃彂閫佺粰瑙傚療鑰�
+ emitter.onNext(beanList);
+ emitter.onComplete();
+ });
+ // 璁㈤槄瑙傚療鑰�
+ observable.subscribeOn(Schedulers.io()) // 鎸囧畾鍦� IO 绾跨▼鎵ц
+ .observeOn(AndroidSchedulers.mainThread()) // 鎸囧畾鍦ㄥ崟涓�绾跨▼瑙傚療缁撴灉
+ .subscribe(
+ result -> {
+ // 鍦ㄨ繖閲屽鐞嗙粨鏋滐紝杩欓噷鏄湪涓荤嚎绋嬩腑
+// System.out.println("Result: " + result);
+ if (result.size() < limit) {
+ myRefreshLayout.finishLoadMoreWithNoMoreData();
+ }
+ if (result != null && result.size() > 0) {
+ userCardBeanList.addAll(result);
+ }
+ adapter.notifyDataSetChanged();
+ },
+ error -> {
+ // 澶勭悊閿欒
+ System.err.println("Error: " + error.getMessage());
+ }
+ );
}
+
EdtDialog edtDialog;
private void setRightButton() {
diff --git a/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java b/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java
index 2fba322..55f720f 100644
--- a/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java
+++ b/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java
@@ -1,6 +1,7 @@
package com.dayu.recharge.adapter;
import android.content.Context;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
@@ -8,8 +9,16 @@
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.databinding.DataBindingUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
import com.dayu.recharge.R;
+import com.dayu.recharge.databinding.ItemRechargeBinding;
+import com.dayu.recharge.databinding.ItemNoMoreBinding;
+import com.dayu.recharge.databinding.ItemRechargeBinding;
import com.dayu.recharge.dbBean.RechargeBean;
+import com.dayu.recharge.dbBean.UserCardBean;
import com.dayu.recharge.utils.DateUtil;
import java.util.List;
@@ -18,7 +27,7 @@
* Created by zuoxiao on 2018/12/24.
*/
-public class RechargeAdapter extends BaseAdapter {
+public class RechargeAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> {
List<RechargeBean> rechargeList;
Context mContext;
@@ -28,51 +37,69 @@
this.rechargeList = rechargeList;
}
+
+ @NonNull
@Override
- public int getCount() {
- if (rechargeList == null) {
- return 0;
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_EMPTY) {
+ ItemNoMoreBinding emptyView = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_no_more, parent, false);
+ return new ViewHolderEmpty(emptyView);
+ } else {
+ ItemRechargeBinding binding = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_recharge, parent, false);
+ return new ViewHolder(binding);
+ }
+
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof ViewHolder) {
+ if (rechargeList.size() > 0) {
+ ((ViewHolder) holder).getBinding().userName.setText("鐢ㄦ埛鍚�:" + rechargeList.get(position).getUserName());
+ ((ViewHolder) holder).getBinding().userNo.setText("鐢ㄦ埛缂栧彿:" + rechargeList.get(position).getInitPeasantCode());
+ ((ViewHolder) holder).getBinding().morny.setText("鍏呭�奸噾棰�:" + rechargeList.get(position).getMorny());
+ ((ViewHolder) holder).getBinding().date.setText("鏃ユ湡:" + DateUtil.dateToStamp(rechargeList.get(position).getDate(), DateUtil.type1));
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ //鍚屾椂杩欓噷涔熼渶瑕佹坊鍔犲垽鏂紝濡傛灉mData.size()涓�0鐨勮瘽锛屽彧寮曞叆涓�涓竷灞�锛屽氨鏄痚mptyView
+ // 閭d箞锛岃繖涓猺ecyclerView鐨刬temCount涓�1
+ if (rechargeList.size() == 0) {
+ return 1;
}
return rechargeList.size();
}
@Override
- public Object getItem(int position) {
- return position;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- if (convertView == null) {
- holder = new ViewHolder();
- convertView = View.inflate(mContext, R.layout.item_recharge, null);
- holder.userName = (TextView) convertView.findViewById(R.id.userName);
- holder.userNo = (TextView) convertView.findViewById(R.id.userNo);
- holder.morny = (TextView) convertView.findViewById(R.id.morny);
- holder.date = (TextView) convertView.findViewById(R.id.date);
-
- convertView.setTag(holder);
+ public int getItemViewType(int position) {
+ if (rechargeList.size() == 0) {
+ return VIEW_TYPE_EMPTY;
} else {
- holder = (ViewHolder) convertView.getTag();
+ return VIEW_TYPE_ITEM;
}
- holder.userName.setText("鐢ㄦ埛鍚�:" + rechargeList.get(position).getUserName());
- holder.userNo.setText("鐢ㄦ埛缂栧彿:" + rechargeList.get(position).getInitPeasantCode());
- holder.morny.setText("鍏呭�奸噾棰�:" + rechargeList.get(position).getMorny());
- holder.date.setText("鏃ユ湡:" + DateUtil.dateToStamp(rechargeList.get(position).getDate(), DateUtil.type1));
- return convertView;
}
- class ViewHolder {
- TextView userName;
- TextView userNo;
- TextView morny;
- TextView date;
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ ItemRechargeBinding mBinding;
+
+ public ItemRechargeBinding getBinding() {
+ return mBinding;
+ }
+
+ public void setBinding(ItemRechargeBinding binding) {
+ this.mBinding = binding;
+ }
+
+ public ViewHolder(ItemRechargeBinding itemView) {
+ super(itemView.getRoot());
+ this.mBinding = itemView;
+
+ }
}
+
+
}
diff --git a/app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java b/app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java
new file mode 100644
index 0000000..127a70e
--- /dev/null
+++ b/app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java
@@ -0,0 +1,97 @@
+package com.dayu.recharge.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.databinding.DataBindingUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.dayu.recharge.R;
+import com.dayu.recharge.activity.ReplacementActivity;
+import com.dayu.recharge.databinding.ItemNewCardBinding;
+import com.dayu.recharge.databinding.ItemNoMoreBinding;
+import com.dayu.recharge.databinding.ItemReplacementBinding;
+import com.dayu.recharge.dbBean.UserCardBean;
+import com.dayu.recharge.utils.DateUtil;
+
+import java.util.List;
+
+public class ReplacementAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> {
+
+ List<UserCardBean> rechargeList;
+ ReplacementActivity mContext;
+
+ public ReplacementAdapter(ReplacementActivity context, List<UserCardBean> rechargeList) {
+ mContext = context;
+ this.rechargeList = rechargeList;
+ }
+
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_EMPTY) {
+ ItemNoMoreBinding emptyView = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_no_more, parent, false);
+ return new ViewHolderEmpty(emptyView);
+ } else {
+ ItemReplacementBinding binding = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_replacement, parent, false);
+ return new ViewHolder(binding);
+ }
+
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof ViewHolder) {
+ if (rechargeList.size() > 0) {
+ ((ViewHolder) holder).getBinding().userName.setText("鐢ㄦ埛鍚�:" + rechargeList.get(position).getUserName());
+ ((ViewHolder) holder).getBinding().userNo.setText("韬唤璇佸彿:" + rechargeList.get(position).getUserID());
+ ((ViewHolder) holder).getBinding().water.setText("鐢佃瘽:" + rechargeList.get(position).getPhone());
+ ((ViewHolder) holder).getBinding().date.setText("鏃ユ湡:" + DateUtil.dateToStamp(rechargeList.get(position).getDate(), DateUtil.type1));
+ ((ViewHolder) holder).getBinding().item.setTag(position);
+ ((ViewHolder) holder).getBinding().setActivity(mContext);
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ //鍚屾椂杩欓噷涔熼渶瑕佹坊鍔犲垽鏂紝濡傛灉mData.size()涓�0鐨勮瘽锛屽彧寮曞叆涓�涓竷灞�锛屽氨鏄痚mptyView
+ // 閭d箞锛岃繖涓猺ecyclerView鐨刬temCount涓�1
+ if (rechargeList.size() == 0) {
+ return 1;
+ }
+ return rechargeList.size();
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ if (rechargeList.size() == 0) {
+ return VIEW_TYPE_EMPTY;
+ } else {
+ return VIEW_TYPE_ITEM;
+ }
+ }
+
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ ItemReplacementBinding mBinding;
+
+ public ItemReplacementBinding getBinding() {
+ return mBinding;
+ }
+
+ public void setBinding(ItemReplacementBinding binding) {
+ this.mBinding = binding;
+ }
+
+ public ViewHolder(ItemReplacementBinding itemView) {
+ super(itemView.getRoot());
+ this.mBinding = itemView;
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java b/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java
index 5af3c7f..157acc9 100644
--- a/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java
+++ b/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java
@@ -39,4 +39,7 @@
@Query("select * from RechargeBean where date>=:beginTime and date<=:endTime")
List<RechargeBean> ansyFindByTime(long beginTime, long endTime);
+
+ @Query("select * from RechargeBean order by date desc LIMIT :limit OFFSET :offset")
+ List<RechargeBean> findAll(int offset,int limit);
}
diff --git a/app/src/main/java/com/dayu/recharge/net/SocketNet.java b/app/src/main/java/com/dayu/recharge/net/SocketNet.java
index 3f0aaed..9783701 100644
--- a/app/src/main/java/com/dayu/recharge/net/SocketNet.java
+++ b/app/src/main/java/com/dayu/recharge/net/SocketNet.java
@@ -11,11 +11,13 @@
import com.dayu.recharge.dbBean.DeviceNumber;
import com.dayu.recharge.dbBean.IpBean;
import com.easysocket.EasySocket;
+import com.easysocket.connection.action.SocketStatus;
import com.easysocket.entity.OriginReadData;
import com.easysocket.entity.SocketAddress;
import com.easysocket.interfaces.conn.ISocketActionListener;
import com.easysocket.interfaces.conn.SocketActionListener;
import com.dayu.recharge.MyApplication;
+import com.easysocket.utils.HexUtil;
/**
@@ -53,7 +55,12 @@
if (EasySocket.getInstance().getDefconnection() != null) {
// EasySocket.getInstance().disconnect(false);
// EasySocket.getInstance().connect();
+// if (EasySocket.getInstance().getDefconnection().getConnectionStatus()== SocketStatus.SOCKET_CONNECTED){
EasySocket.getInstance().upMessage(dataMessage);
+// }else {
+//
+// }
+
// this.dataMessage = dataMessage;
} else {
MyApplication.myApplication.initEasySocket(false, null);
@@ -144,21 +151,17 @@
rushState();
}
+
+
/**
* socket鎺ユ敹鐨勬暟鎹�
* @param socketAddress
- * @param readData
+ * @param originReadData
*/
- @Override
- public void onSocketResponse(SocketAddress socketAddress, String readData) {
- Log.i("SocketActionListener", "SocketActionListener鏀跺埌鏁版嵁-->" + readData);
-
- }
-
@Override
public void onSocketResponse(SocketAddress socketAddress, OriginReadData originReadData) {
super.onSocketResponse(socketAddress, originReadData);
- Log.i("SocketActionListener", "SocketActionListener鏀跺埌鏁版嵁-->" + originReadData.getBodyString());
+ Log.i("SocketActionListener", "SocketActionListener鏀跺埌鏁版嵁-->" + HexUtil.bytesToHex(originReadData.getBodyBytes()));
SocketData socketData = new SocketData();
socketData.setBodyData(originReadData.getBodyBytes());
socketData.setHeaderData(originReadData.getHeaderData());
diff --git a/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java b/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java
index 4ac6e11..3de12c9 100644
--- a/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java
+++ b/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java
@@ -131,11 +131,7 @@
RechargeBean projectBean = (RechargeBean) objList.get(j);
list.add(projectBean.getSerial());
list.add(projectBean.getUserName());
- if (projectBean.getUserId() != null) {
- list.add(projectBean.getUserId());
- } else {
- list.add("");
- }
+ list.add(projectBean.getOrderID());
list.add(DateUtil.dateToStamp(projectBean.getDate(), DateUtil.type2));
list.add(projectBean.getMorny());
list.add(projectBean.getBalance());
diff --git a/app/src/main/res/layout/activity_newcard_list.xml b/app/src/main/res/layout/activity_newcard_list.xml
index add0af0..560692e 100644
--- a/app/src/main/res/layout/activity_newcard_list.xml
+++ b/app/src/main/res/layout/activity_newcard_list.xml
@@ -10,7 +10,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_title_height"
android:background="@drawable/title_bar_bg"
- app:centerText="娉ㄥ唽璁板綍"
+ app:centerText="寮�鎴疯褰�"
app:leftImage="@mipmap/icon_back"
app:rightText="绛涢��" />
@@ -26,7 +26,7 @@
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="#fff"
+ android:background="#ffffff"
android:overScrollMode="never"
android:padding="10dp" />
diff --git a/app/src/main/res/layout/activity_recharge_list.xml b/app/src/main/res/layout/activity_recharge_list.xml
index e9994ce..4c0d194 100644
--- a/app/src/main/res/layout/activity_recharge_list.xml
+++ b/app/src/main/res/layout/activity_recharge_list.xml
@@ -14,15 +14,25 @@
app:leftImage="@mipmap/icon_back"
app:rightText="绛涢��" />
- <ListView
- android:id="@+id/recharge_list"
+ <com.scwang.smart.refresh.layout.SmartRefreshLayout
+ android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_above="@+id/recharge_total"
- android:layout_below="@+id/titleBar"
- android:cacheColorHint="#ffffff"
- android:divider="@null"
- android:dividerHeight="0dp" />
+ android:layout_above="@id/recharge_total"
+ android:layout_below="@+id/titleBar">
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/recyclerView"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#ffffff"
+ android:overScrollMode="never"
+ android:padding="10dp" />
+
+ <com.scwang.smart.refresh.footer.ClassicsFooter
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </com.scwang.smart.refresh.layout.SmartRefreshLayout>
<TextView
android:id="@+id/recharge_total"
diff --git a/app/src/main/res/layout/activity_replacement.xml b/app/src/main/res/layout/activity_replacement.xml
index acbfa9c..21cd54b 100644
--- a/app/src/main/res/layout/activity_replacement.xml
+++ b/app/src/main/res/layout/activity_replacement.xml
@@ -14,13 +14,24 @@
app:leftImage="@mipmap/icon_back"
app:rightText="绛涢��" />
- <ListView
- android:id="@+id/newCard_listView"
+ <com.scwang.smart.refresh.layout.SmartRefreshLayout
+ android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:cacheColorHint="#ffffff"
- android:divider="@null"
- android:dividerHeight="0dp" />
+ android:layout_above="@id/user_total"
+ android:layout_below="@+id/titleBar">
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/recyclerView"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#fff"
+ android:overScrollMode="never"
+ android:padding="10dp" />
+
+ <com.scwang.smart.refresh.footer.ClassicsFooter
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </com.scwang.smart.refresh.layout.SmartRefreshLayout>
</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_new_card.xml b/app/src/main/res/layout/item_new_card.xml
index 574e7eb..323228f 100644
--- a/app/src/main/res/layout/item_new_card.xml
+++ b/app/src/main/res/layout/item_new_card.xml
@@ -14,6 +14,7 @@
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="10dp"
+
android:layout_marginRight="15dp"
android:orientation="vertical">
diff --git a/app/src/main/res/layout/item_recharge.xml b/app/src/main/res/layout/item_recharge.xml
index 06bab4b..5760b9a 100644
--- a/app/src/main/res/layout/item_recharge.xml
+++ b/app/src/main/res/layout/item_recharge.xml
@@ -1,55 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="15dp"
- android:layout_marginRight="15dp"
- android:layout_marginTop="10dp"
android:orientation="vertical">
- <TextView
- android:id="@+id/userName"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="鐢ㄦ埛鍚�"
- android:textSize="14sp" />
+ android:layout_marginLeft="15dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginRight="15dp"
+ android:orientation="vertical">
- <TextView
- android:id="@+id/userNo"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="鐢ㄦ埛缂栧彿"
- android:textSize="14sp" />
+ <TextView
+ android:id="@+id/userName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="鐢ㄦ埛鍚�"
+ android:textSize="14sp" />
- <TextView
- android:id="@+id/morny"
+ <TextView
+ android:id="@+id/userNo"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="鐢ㄦ埛缂栧彿"
+ android:textSize="14sp" />
+
+ <TextView
+ android:id="@+id/morny"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="閲戦锛�"
+ android:textSize="14sp" />
+
+ <TextView
+ android:id="@+id/date"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="鏃ユ湡"
+ android:textSize="14sp" />
+ </LinearLayout>
+
+
+ <View
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="閲戦锛�"
- android:textSize="14sp" />
- <TextView
- android:id="@+id/date"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="鏃ユ湡"
- android:textSize="14sp" />
+ android:layout_height="1px"
+ android:layout_marginTop="15dp"
+ android:background="#000000" />
+
</LinearLayout>
+</layout>
-
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1px"
- android:layout_marginTop="15dp"
- android:background="#000000" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_replacement.xml b/app/src/main/res/layout/item_replacement.xml
new file mode 100644
index 0000000..cea90d1
--- /dev/null
+++ b/app/src/main/res/layout/item_replacement.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <data>
+
+ <variable
+ name="activity"
+ type="com.dayu.recharge.activity.ReplacementActivity" />
+
+ </data>
+
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/item"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="15dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginRight="15dp"
+ android:onClick="@{ activity.itemClick}"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/userName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="鐢ㄦ埛鍚�"
+ android:textSize="14sp" />
+
+ <TextView
+ android:id="@+id/userNo"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="鎴峰彿锛�123123"
+ android:textSize="14sp" />
+
+ <TextView
+ android:id="@+id/water"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="姘撮噺锛�123123"
+ android:textSize="14sp" />
+
+ <TextView
+ android:id="@+id/date"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="鏃ユ湡"
+ android:textSize="14sp" />
+
+
+ </LinearLayout>
+
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1px"
+ android:layout_marginTop="15dp"
+ android:background="#000000" />
+
+ </LinearLayout>
+
+
+</layout>
+
diff --git a/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java b/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java
index ba28343..af5491a 100644
--- a/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java
+++ b/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java
@@ -321,6 +321,7 @@
*/
private IConnectionManager sendBytes(byte[] bytes) {
if (ioManager == null || connectionStatus.get() != SocketStatus.SOCKET_CONNECTED) {
+ LogUtil.w("sendBytes閿欒-----ioManager涓簄ull鎴栬�卌onnectionStatus鐘舵�佷笉涓哄凡杩炴帴");
return this;
}
ioManager.sendBytes(bytes);
diff --git a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java
index 3d23041..d2bea0d 100644
--- a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java
+++ b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java
@@ -10,6 +10,7 @@
import com.easysocket.interfaces.conn.IConnectionManager;
import com.easysocket.interfaces.conn.ISocketActionDispatch;
import com.easysocket.interfaces.io.IReader;
+import com.easysocket.utils.HexUtil;
import com.easysocket.utils.LogUtil;
import java.io.IOException;
@@ -138,7 +139,7 @@
// 淇濆瓨body
originalData.setBodyData(bodyBuf.array());
- LogUtil.d("Socket鏀跺埌鏁版嵁-->" + originalData.getBodyString());
+ LogUtil.d("Socket鏀跺埌鏁版嵁-->" +HexUtil.bytesToHex(originalData.getBodyBytes()) );
// 鍒嗗彂鏁版嵁
actionDispatch.dispatchAction(IOAction.ACTION_READ_COMPLETE, originalData);
@@ -171,7 +172,7 @@
throw new ReadUnrecoverableException("鏁版嵁body鐨勯暱搴︿笉鑳藉皬浜�0");
}
- LogUtil.d("Socket鏀跺埌鏁版嵁-->" + originalData.getBodyString());
+ LogUtil.d("Socket鏀跺埌鏁版嵁-->" + HexUtil.bytesToHex(originalData.getBodyBytes()));
// 鍒嗗彂
actionDispatch.dispatchAction(IOAction.ACTION_READ_COMPLETE, originalData);
@@ -236,7 +237,7 @@
byte[] data = new byte[len];
originBuf.get(data, 0, len);
readData.setBodyData(data);
- LogUtil.d("Socket鏀跺埌鏁版嵁-->" + readData.getBodyString());
+ LogUtil.d("Socket鏀跺埌鏁版嵁-->" + HexUtil.bytesToHex(readData.getBodyBytes()));
// 鍒嗗彂鏁版嵁
actionDispatch.dispatchAction(IOAction.ACTION_READ_COMPLETE, readData);
// 鐩稿綋浜庢妸鎸囬拡閲嶆柊鎸囧悜positon=0
diff --git a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java
index 554a06d..9634e16 100644
--- a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java
+++ b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java
@@ -4,6 +4,7 @@
import com.easysocket.interfaces.conn.IConnectionManager;
import com.easysocket.interfaces.conn.ISocketActionDispatch;
import com.easysocket.interfaces.io.IWriter;
+import com.easysocket.utils.HexUtil;
import com.easysocket.utils.LogUtil;
import java.io.IOException;
@@ -92,8 +93,8 @@
@Override
public void write(byte[] sendBytes) throws IOException {
if (sendBytes != null) {
- LogUtil.d("Socket鍙戦�佹暟鎹甋tring-->" + new String(sendBytes, Charset.forName("utf-8")));
- LogUtil.d("Socket鍙戦�佹暟鎹産yte[]-->" + Arrays.toString(sendBytes));
+ LogUtil.d("EasyWriter--Socket鍙戦�佹暟鎹甋tring-->" + HexUtil.bytesToHex(sendBytes));
+ LogUtil.d("EasyWriter--Socket鍙戦�佹暟鎹産yte[]-->" + Arrays.toString(sendBytes));
int packageSize = socketOptions.getMaxWriteBytes(); // 姣忔鍙互鍙戦�佺殑鏈�澶ф暟鎹�
int remainingCount = sendBytes.length;
ByteBuffer writeBuf = ByteBuffer.allocate(packageSize);
diff --git a/easysocket/src/main/java/com/easysocket/utils/HexUtil.java b/easysocket/src/main/java/com/easysocket/utils/HexUtil.java
new file mode 100644
index 0000000..a92049b
--- /dev/null
+++ b/easysocket/src/main/java/com/easysocket/utils/HexUtil.java
@@ -0,0 +1,275 @@
+package com.easysocket.utils;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Copyright (C), 2022,
+ * Author: zuo
+ * Date: 2022/3/9 14:55
+ * Description:
+ */
+public class HexUtil {
+
+
+ /**
+ * hex瀛楃涓茶浆byte鏁扮粍
+ *
+ * @param inHex 寰呰浆鎹㈢殑Hex瀛楃涓�
+ * @return 杞崲鍚庣殑byte鏁扮粍缁撴灉
+ */
+ public static byte[] hexToByteArray(String inHex) {
+ int hexlen = inHex.length();
+ byte[] result;
+ if (hexlen % 2 == 1) {
+ //濂囨暟
+ hexlen++;
+ result = new byte[(hexlen / 2)];
+ inHex = "0" + inHex;
+ } else {
+ //鍋舵暟
+ result = new byte[(hexlen / 2)];
+ }
+ int j = 0;
+ for (int i = 0; i < hexlen; i += 2) {
+ result[j] = hexToByte(inHex.substring(i, i + 2));
+ j++;
+ }
+ return result;
+ }
+
+
+ /**
+ * Hex瀛楃涓茶浆byte
+ *
+ * @param inHex 寰呰浆鎹㈢殑Hex瀛楃涓�
+ * @return 杞崲鍚庣殑byte
+ */
+ public static byte hexToByte(String inHex) {
+ return (byte) Integer.parseInt(inHex, 16);
+ }
+
+ /**
+ * 瀛楄妭杞崄鍏繘鍒�
+ *
+ * @param b 闇�瑕佽繘琛岃浆鎹㈢殑byte瀛楄妭
+ * @return 杞崲鍚庣殑Hex瀛楃涓�
+ */
+ public static String byteToHex(byte b) {
+ String hex = Integer.toHexString(b & 0xFF);
+ if (hex.length() < 2) {
+ hex = "0" + hex;
+ }
+ return hex.toUpperCase();
+ }
+
+
+ /**
+ * 瀛楄妭鏁扮粍杞�16杩涘埗
+ *
+ * @param bytes 闇�瑕佽浆鎹㈢殑byte鏁扮粍
+ * @return 杞崲鍚庣殑Hex瀛楃涓�
+ */
+ public static String bytesToHex(byte[] bytes) {
+ try {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < bytes.length; i++) {
+ String hex = Integer.toHexString(bytes[i] & 0xFF);
+ if (hex.length() < 2) {
+ sb.append(0);
+ }
+ sb.append(hex);
+ }
+ return sb.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static String byteArrayToHexString(byte[] byteArray) {
+ StringBuilder hexString = new StringBuilder();
+ for (byte b : byteArray) {
+ // 灏嗗瓧鑺傝浆鎹负鏃犵鍙锋暣鏁�
+ int unsignedInt = b & 0xff;
+ // 灏嗘棤绗﹀彿鏁存暟杞崲涓�16杩涘埗瀛楃涓�
+ String hex = Integer.toHexString(unsignedInt);
+ // 濡傛灉瀛楃涓查暱搴﹀皬浜�2锛屽湪鍓嶉潰琛�0
+ if (hex.length() < 2) {
+ hex = "0" + hex;
+ }
+ hexString.append(hex);
+ }
+ return hexString.toString();
+ }
+
+ /**
+ * 瀛楄妭鏁扮粍杞�16杩涘埗 涓嶅湪鏈熬娣诲姞0
+ *
+ * @param bytes 闇�瑕佽浆鎹㈢殑byte鏁扮粍
+ * @return 杞崲鍚庣殑Hex瀛楃涓�
+ */
+ public static String bytesToHexNoAddZero(byte[] bytes) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < bytes.length; i++) {
+ String hex = Integer.toHexString(bytes[i] & 0xFF);
+ sb.append(hex);
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * 灏� 4瀛楄妭鐨�16杩涘埗瀛楃涓诧紝杞崲涓�32浣嶅甫绗﹀彿鐨勫崄杩涘埗娴偣鍨�
+ *
+ * @param str 4瀛楄妭 16杩涘埗瀛楃
+ * @return
+ */
+ public static float hexToFloat(String str) {
+ return Float.intBitsToFloat(new BigInteger(str, 16).intValue());
+ }
+
+ /**
+ * 灏嗗甫绗﹀彿鐨�32浣嶆诞鐐规暟瑁呮崲涓�16杩涘埗
+ *
+ * @param value
+ * @return
+ */
+ public static String folatToHexString(Float value) {
+ return Integer.toHexString(Float.floatToIntBits(value));
+ }
+
+ /**
+ * 鍗佽繘鍒惰浆16杩涘埗
+ *
+ * @param number
+ * @return
+ */
+ public static String get10to16(int number) {
+ return Integer.toHexString(number);
+ }
+
+ /**
+ * 鍗佽繘鍒惰浆16杩涘埗 琛ラ綈鍋舵暟 楂樹綅鍦ㄥ墠浣庝綅鍦ㄥ悗
+ *
+ * @param number
+ * @return
+ */
+ public static String get10to16CompleteHex(int number) {
+ String hex = Integer.toHexString(number);
+ if (hex.length() % 2 == 0) {
+ return hex;
+ } else {
+ return "0" + hex;
+ }
+ }
+
+ /**
+ * 鍗佽繘鍒惰浆16杩涘埗浣庝綅鍦ㄥ墠楂樹綅鍦ㄥ悗
+ *
+ * @param number 鍗佽繘鍒舵暟
+ * @param length 琛ヨ冻澶氬皯浣�
+ * @return
+ */
+ public static String get10to16LowHigh(int number, int length) {
+ String str = "";
+ try {
+ str = Integer.toHexString(number);
+ str = getHexToLenght(str, length);
+ str = spaceHex(str);
+ str = HighLowHex(str);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return str;
+ }
+
+ /**
+ * 16杩涘埗杞�10杩涘埗楂樹綆浣嶈浆鎹�
+ *
+ * @param hex
+ * @return
+ */
+ public static int get16to10LowHigh(String hex) {
+ try {
+ String str = "";
+ str = spaceHex(hex);
+ str = HighLowHex(str);
+ return Integer.parseInt(str, 16);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ return 0;
+ }
+
+
+ /**
+ * 杩斿洖鐗瑰畾闀垮害鐨�16杩涘埗瀛楃涓�
+ *
+ * @param data
+ * @param length
+ * @return
+ */
+ public static String getHexToLenght(String data, int length) {
+ StringBuffer stringBuilder = new StringBuffer(data);
+ for (int i = 0; i < length - data.length(); i++) {
+ stringBuilder.insert(0, "0");
+ }
+ return stringBuilder.toString();
+ }
+
+ /**
+ * 鍗佸叚杩涘埗鏁伴殧绌轰綅
+ *
+ * @param str
+ * @return
+ */
+ public static String spaceHex(String str) {
+ char[] array = str.toCharArray();
+ if (str.length() <= 2) return str;
+ StringBuffer bufferHex = new StringBuffer();
+ for (int i = 0; i < array.length; i++) {
+ int start = i + 1;
+ if (start % 2 == 0) {
+ bufferHex.append(array[i]).append(" ");
+ } else {
+ bufferHex.append(array[i]);
+ }
+ }
+ return bufferHex.toString();
+ }
+
+ /**
+ * 楂樹綅16杩涘埗杞綆浣�
+ *
+ * @param str
+ * @return
+ */
+ private static String HighLowHex(String str) {
+ if (str.trim().length() <= 2) return str;
+ List<String> list = Arrays.asList(str.split(" "));
+ Collections.reverse(list);
+ StringBuffer stringBuffer = new StringBuffer();
+ for (String string : list) {
+ stringBuffer.append(string);
+ }
+ return stringBuffer.toString();
+ }
+
+ /**
+ * @param hex
+ * @return
+ */
+ public static int get16to10(String hex) {
+ int x = 0;
+ try {
+ x = Integer.parseInt(hex, 16);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ return x;
+ }
+}
diff --git a/gradlew b/gradlew
index 4f906e0..a69d9cb 100644
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/usr/bin/env sh
+#!/bin/sh
#
-# Copyright 2015 the original author or authors.
+# Copyright 漏 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions 芦$var禄, 芦${var}禄, 芦${var:-default}禄, 芦${var+SET}禄,
+# 芦${var#prefix}禄, 芦${var%suffix}禄, and 芦$( cmd )禄;
+# * compound commands having a testable exit status, especially 芦case禄;
+# * various built-in commands including 芦command禄, 芦set禄, and 芦ulimit禄.
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@
location of your Java installation."
fi
else
- JAVACMD="java"
+ JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,101 @@
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=`expr $i + 1`
- done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 107acd3..f127cfd 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +40,7 @@
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +75,15 @@
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/local.properties b/local.properties
index 1f4d3ae..cf06b5b 100644
--- a/local.properties
+++ b/local.properties
@@ -4,5 +4,5 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
-#Thu Dec 14 09:58:29 CST 2023
-sdk.dir=D\:\\AndroidStudio\\sdk
+#Mon Dec 18 10:17:13 CST 2023
+sdk.dir=D\:\\android\\sdk
--
Gitblit v1.8.0