listAll(Context context) {
DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(context, Constant.SQLITE_DATABASE, null);
SQLiteDatabase readableDatabase = devOpenHelper.getReadableDatabase();
@@ -125,28 +129,116 @@ public class GoodsEntityService {
return list;
}
+ /**
+ * 逐步废弃本地数据库
+ *
+ * @param context
+ * @param number
+ * @return
+ * @see GoodsEntityService#getOneFromServer(android.content.Context, java.lang.String)
+ */
+ @Deprecated
public static GoodsEntity getOneByNumber(Context context, String number) {
+
DaoSession readSession = DBManager.getReadSession(context);
GoodsEntityDao goodsEntityDao = readSession.getGoodsEntityDao();
GoodsEntity goodsEntity = goodsEntityDao.queryBuilder().where(GoodsEntityDao.Properties.Number.eq(number)).unique();
readSession.clear();
+
return goodsEntity;
}
+
+ /**
+ * // 这里需要异步获取信息,而且加载圈圈
+ *
+ * 不要从本地获取数据,直接从服务器获取数据
+ *
+ * @param context
+ * @param number
+ * @return
+ */
+ public static void getOneFromServer(Context context, String number) {
+
+ OkHttps.async("/goods")
+ .bind(context) // 绑定(生命周期|Context获取)
+// .tag(Tags.TOKEN) // 自动添加 TOEKN
+ .tag(Tags.LOADING) // 自动显示加载框
+ .addUrlPara("number", number)
+ .setOnResponse(res -> {
+
+ HttpResult.Body body1 = res.getBody().cache();
+ String bodyStr = body1.toString();
+ if (StringUtil.hasText(bodyStr)) {
+ JSONObject jsonObject = JSONObject.parseObject(bodyStr);
+ if (jsonObject != null) {
+ String message = jsonObject.getString("message");
+ Integer code = jsonObject.getInteger("code");
+ if (code != Constant.STATUS_CODE) {
+ Toast.makeText(context, message, Toast.LENGTH_LONG).show();
+ }
+ String data = jsonObject.getString("data");
+ if (StringUtil.hasText(data) && JSONObject.parseObject(data, GoodsEntity.class) != null) {
+ GoodsEntity goodsEntity = JSONObject.parseObject(data, GoodsEntity.class);
+ // 广播消息通知结果
+ GoodsShowActivity goodsShowActivity = GoodsShowActivity.goodsShowActivity;
+ if (goodsShowActivity != null) {
+ goodsShowActivity.finish();
+ }
+ // 说明查询到了记录
+ Intent intent = new Intent(context, GoodsShowActivity.class);
+ intent.putExtra("scanCode", number);
+ Bundle bundle = new Bundle();
+ bundle.putSerializable("goodsEntity", goodsEntity);
+ intent.putExtras(bundle);
+
+ context.startActivity(intent);
+
+ } else {
+ GoodsAddActivity goodsAddActivity = GoodsAddActivity.goodsAddActivity;
+ if (goodsAddActivity != null) {
+ goodsAddActivity.finish();
+ }
+
+ Intent intent = new Intent(context, GoodsAddActivity.class);
+ intent.putExtra("scanCode", number);
+ context.startActivity(intent);
+ }
+ CaptureActivity.captureActivity.finish();
+ }
+ }
+
+ })
+ .setOnException((IOException e) -> {
+ Log.e("kkk", "异步异常捕获:" + e.getMessage());
+ })
+ .get();
+
+ }
+
/**
* 获取我的信息
**/
- public AsyncHttpTask updatePasswrod(String passwrod) {
+ public String updatePasswrod(String passwrod) {
+
return OkHttps.async("/mine/passwrod")
.bind(context)
.tag(Tags.TOKEN) // 自动添加 TOEKN
.tag(Tags.LOADING) // 自动显示加载框
- .addBodyPara("passwrod", passwrod);
+ .addBodyPara("passwrod", passwrod).get().getResult().getBody().toString();
+
}
- public static HttpResult postToServer(Context context, GoodsEntity goodsEntity) {
- return OkHttps.async("/goods")
+ /**
+ * 新增推送到服务器
+ *
+ * @param context
+ * @param goodsEntity
+ * @return
+ */
+ public static void postToServer(Context context, GoodsEntity goodsEntity) {
+ OkHttps.async("/goods")
.bind(context) // 绑定(生命周期|Context获取)
// .tag(Tags.TOKEN) // 自动添加 TOEKN
.tag(Tags.LOADING) // 自动显示加载框
@@ -159,14 +251,22 @@ public class GoodsEntityService {
// 这里处理请求异常
Log.i("kkk", "异步异常捕获:" + e.getMessage());
// editText4.setText(e.getMessage());
+ // TODO 广播消息通知
})
// 请求参数设置...
- .post().getResult();
+ .post();
}
- public static HttpResult putToServer(Context context, GoodsEntity goodsEntity) {
- return OkHttps.async("/goods")
+ /**
+ * 修改到服务器
+ *
+ * @param context
+ * @param goodsEntity
+ * @return
+ */
+ public static void putToServer(Context context, GoodsEntity goodsEntity) {
+ OkHttps.async("/goods")
.bind(context) // 绑定(生命周期|Context获取)
// .tag(Tags.TOKEN) // 自动添加 TOEKN
.tag(Tags.LOADING) // 自动显示加载框
@@ -181,37 +281,47 @@ public class GoodsEntityService {
// editText4.setText(e.getMessage());
})
// 请求参数设置...
- .put().getResult();
+ .put();
}
- public static HttpResult deleteFromServer(Context context, GoodsEntity goodsEntity) {
- return OkHttps.async("/goods")
+ /**
+ * 从服务器
+ *
+ * @param context
+ * @param goodsEntity
+ * @return
+ */
+ public static void deleteFromServer(Context context, GoodsEntity goodsEntity) {
+ OkHttps.async("/goods")
.bind(context) // 绑定(生命周期|Context获取)
// .tag(Tags.TOKEN) // 自动添加 TOEKN
.tag(Tags.LOADING) // 自动显示加载框
.setBodyPara(goodsEntity)
.bodyType(OkHttps.JSON)
.setOnResponse(res -> {
-// editText4.setText(res.toString());
+ log.info("{}", res);
+ GoodsUpdateActivity.goodsUpdateActivity.finish();
})
.setOnException((IOException e) -> {
// 这里处理请求异常
Log.i("kkk", "异步异常捕获:" + e.getMessage());
// editText4.setText(e.getMessage());
})
- // 请求参数设置...
- .delete().getResult();
+ .delete();
}
/**
- * 把本地所有的全部上传
+ * 把本地所有的全部上传,请求不可以同步!!
*
* @param goodsEntities
* @return
*/
- public HttpResult postAllToServer(List goodsEntities) {
- return OkHttps.async("/goods/list")
+ public void postAllToServer(List goodsEntities) {
+ if (goodsEntities == null || goodsEntities.size() <= 0) {
+ return;
+ }
+ OkHttps.async("/goods/list")
.bind(context) // 绑定(生命周期|Context获取)
// .tag(Tags.TOKEN) // 自动添加 TOEKN
// .tag(Tags.LOADING) // 自动显示加载框
@@ -219,18 +329,18 @@ public class GoodsEntityService {
.bodyType(OkHttps.JSON)
.setOnResponse(res -> {
// editText4.setText(res.toString());
- Toast.makeText(GoodsStoreActivity.goodsStoreActivity, "同步到线上成功", Toast.LENGTH_SHORT).show();
+ Toast.makeText(GoodsStoreActivity.getCurrentActivity(), "同步了" + goodsEntities.size() + "条数据", Toast.LENGTH_SHORT).show();
})
.setOnException((IOException e) -> {
// 这里处理请求异常
Log.i("kkk", "异步异常捕获:" + e.getMessage());
- Toast.makeText(GoodsStoreActivity.goodsStoreActivity, "服务不在线", Toast.LENGTH_SHORT).show();
+ Toast.makeText(GoodsStoreActivity.getCurrentActivity(), "服务不在线", Toast.LENGTH_SHORT).show();
// editText4.setText(e.getMessage());
})
// 请求参数设置...
- .post().getResult();
+ .post();
}
@@ -239,43 +349,56 @@ public class GoodsEntityService {
*
* @return
*/
- public String requestGetListAll() {
+ public void requestGetListAll() {
// 异步操作,多线程操作
- Object lock = new Object();
-
- HttpResult result = OkHttps.async("/goods/list")
+ log.info("开始请求服务器数据");
+ if (context != null) {
+ Log.i(Constant.TAG, "requestGetListAll: " + context);
+ }
+ OkHttps.async("/goods/list")
.bind(context) // 绑定(生命周期|Context获取)
// .tag(Tags.TOKEN) // 自动添加 TOEKN
-// .tag(Tags.LOADING) // 自动显示加载框
+ .tag(Tags.LOADING) // 自动显示加载框
// .setBodyPara(goodsEntities)
.bodyType(OkHttps.JSON)
.setOnResponse(res -> {
- synchronized (lock) {
- HttpResult.Body body1 = res.getBody().cache();
- String bodyStr = body1.toString();
- JSONObject jsonObject = JSONObject.parseObject(bodyStr);
- String message = jsonObject.getString("message");
-
- Toast.makeText(GoodsStoreActivity.goodsStoreActivity, message, Toast.LENGTH_SHORT).show();
+ HttpResult.Body body1 = res.getBody().cache();
+ String bodyStr = body1.toString();
+ JSONObject jsonObject = JSONObject.parseObject(bodyStr);
+ String message = jsonObject.getString("message");
+ Toast.makeText(GoodsStoreActivity.getCurrentActivity(), message, Toast.LENGTH_SHORT).show();
+
+ String data = jsonObject.getString("data");
+
+ List goodsEntities1 = JSONObject.parseArray(data, GoodsEntity.class);
+ // 查询是否存在
+ if (goodsEntities1 != null) {
+ goodsEntities1.forEach(goodsEntity1 -> {
+ GoodsEntity oneByNumber = getOneByNumber(context, goodsEntity1.getNumber());
+ if (oneByNumber == null) {
+// 防止id冲突
+ goodsEntity1.setId(null);
+ GoodsMapper.save(context, goodsEntity1);
+ }
+ });
+ // 广播通知渲染下界面,Service通过广播刷新UI
+ Intent broadCastIntent = new Intent(Constant.BROADCAST_ACTION);
+ broadCastIntent.putExtra(Constant.MESSAGE, "数据更新完成");
+ context.sendBroadcast(broadCastIntent);
}
+
})
.setOnException((IOException e) -> {
// 这里处理请求异常
Log.i("kkk", "异步异常捕获:" + e.getMessage());
- Toast.makeText(GoodsStoreActivity.goodsStoreActivity, "服务不在线", Toast.LENGTH_SHORT).show();
+ Toast.makeText(GoodsStoreActivity.getCurrentActivity(), "服务不在线", Toast.LENGTH_SHORT).show();
})
// 请求参数设置...
- .get().getResult();
+ .get();
+ log.info("请求服务器数据完成");
- synchronized (lock) {
- HttpResult.Body body = result.getBody();
- if (body != null) {
- return body.cache().toString();
- }
- }
- return new String();
}
/**
@@ -283,30 +406,12 @@ public class GoodsEntityService {
*
* @return
*/
- public void syncData(Context context, List goodsEntities) {
- if (goodsEntities != null && goodsEntities.size() > 0) {
- HttpResult httpResult = postAllToServer(goodsEntities);
- }
+ public void syncData(List goodsEntities) {
- String httpResult1 = requestGetListAll();
- if (StringUtil.hasText(httpResult1)) {
- JSONObject jsonObject = JSONObject.parseObject(httpResult1);
- String message = jsonObject.getString("message");
- String data = jsonObject.getString("data");
-
- List goodsEntities1 = JSONObject.parseArray(data, GoodsEntity.class);
- // 查询是否存在
- if (goodsEntities1 != null) {
- goodsEntities1.forEach(goodsEntity1 -> {
- GoodsEntity oneByNumber = getOneByNumber(context, goodsEntity1.getNumber());
- if (oneByNumber == null) {
-// 防止id冲突
- goodsEntity1.setId(null);
- save(context, goodsEntity1);
- }
- });
- }
+ if (goodsEntities != null && goodsEntities.size() > 0) {
+ log.info("推送本地数据到服务器");
+ postAllToServer(goodsEntities);
}
-
+ requestGetListAll();
}
}
diff --git a/app/src/main/java/com/hxy/manager/service/MainService.java b/app/src/main/java/com/hxy/manager/service/MainService.java
index a9a197159bf525062e15c559beead71d3273df49..7ece2caa65c5cdfab19a55fbe830b556b9140bcc 100755
--- a/app/src/main/java/com/hxy/manager/service/MainService.java
+++ b/app/src/main/java/com/hxy/manager/service/MainService.java
@@ -8,35 +8,95 @@ package com.hxy.manager.service;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
+import android.os.Bundle;
import android.os.IBinder;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.hxy.manager.util.Constant;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Created by 傲寒宏志 on 2018/1/3.
*/
public class MainService extends Service {
+ Logger log = LoggerFactory.getLogger(SyncService.class);
//实现一个INBinder接口
public final IBinder myBinder = new LocalBinder();
//将该接口实现为一个继承Binder得内部类的对象!
public class LocalBinder extends Binder {
//在内部类实现一个返回对象的方法
-
+ public MainService getService() {
+ return MainService.this;
+ }
}
- // 绑定时执行
+ /**
+ * 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
+ * 如果服务已在运行,则不会调用此方法。该方法只被调用一次
+ */
public void onCreate() {
super.onCreate();
}
- // 重写onBind方法
+ /**
+ * 重写onBind方法
+ *
+ * @param intent
+ * @return
+ */
@Override
public IBinder onBind(Intent intent) {
+ // Toast.makeText(this,"本地绑定:SyncService",Toast.LENGTH_SHORT).show();
return myBinder;
}
- //调用时执行
- public void sync() {
+ @Override
+ public boolean onUnbind(Intent intent) {
+ // Toast.makeText(this,"取消本地绑定:SyncService",Toast.LENGTH_SHORT).show();
+ return false;
+ }
+
+ /**
+ * 每次通过startService()方法启动Service时都会被回调。
+ *
+ * @param intent
+ * @param flags
+ * @param startId
+ * @return
+ */
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+
+ Bundle extras = intent.getExtras();
+ String msg = extras.getString("msg");
+ log.info("服务处理消息==>{}", msg);
+// try {
+// Thread.sleep(10000);
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }
+ // Service通过广播刷新UI
+ Intent broadCastIntent = new Intent(Constant.BROADCAST_ACTION);
+ broadCastIntent.putExtra(Constant.MESSAGE, "数据更新完成");
+ sendBroadcast(broadCastIntent);
+
+ return super.onStartCommand(intent, flags, startId);
+ }
+ /**
+ * 服务销毁时的回调
+ */
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ log.info("SyncService服务已经停止");
+ Log.i(Constant.TAG, "SyncService服务已经停止");
+ Toast.makeText(this, "SyncService服务已经停止", Toast.LENGTH_SHORT).show();
}
+
}
diff --git a/app/src/main/java/com/hxy/manager/service/MyNotificationListenerService.java b/app/src/main/java/com/hxy/manager/service/MyNotificationListenerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..efb537ba0ff94dddb99de17dbf6136f31570f8a6
--- /dev/null
+++ b/app/src/main/java/com/hxy/manager/service/MyNotificationListenerService.java
@@ -0,0 +1,75 @@
+package com.hxy.manager.service;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.os.Bundle;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.StatusBarNotification;
+
+import com.hxy.manager.request.NotificationRequest;
+import com.hxy.manager.util.StringUtil;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * https://blog.csdn.net/Lemon_husky/article/details/102914881
+ *
+ * https://juejin.cn/post/6844903669121417230
+ */
+public class MyNotificationListenerService extends NotificationListenerService {
+
+ Logger log = LoggerFactory.getLogger(MyNotificationListenerService.class);
+
+ public static final String QQ = "com.tencent.mobileqq";
+ public static final String TIM = "com.tencent.tim";
+ public static final String WX = "com.tencent.mm";
+ public static final String MMS = "com.android.mms";
+
+ @Override
+ public void onListenerConnected() {
+ //当连接成功时调用,一般在开启监听后会回调一次该方法
+ log.info("当连接成功时调用,一般在开启监听后会回调一次该方法");
+ }
+
+ @Override
+ public void onNotificationPosted(StatusBarNotification sbn) {
+ Bundle extras = sbn.getNotification().extras;
+ String pachageName = sbn.getPackageName();
+ String title = extras.getString(Notification.EXTRA_TITLE); //通知title
+ String content = extras.getString(Notification.EXTRA_TEXT); //通知内容
+ if (StringUtil.isEmpty(content) && sbn.getNotification().tickerText != null) {
+ content = sbn.getNotification().tickerText.toString();
+ }
+ PendingIntent pendingIntent = sbn.getNotification().contentIntent; //获取通知的PendingIntent
+ if (!StringUtil.isEmpty(content)) {
+ int length = content.length();
+ if (content.endsWith("...") && length > 150) {
+ log.error("{},{}={},长度{}", pachageName, title, content, length);
+ } else {
+ // TIM的消息最多支持1024个长度。
+ log.info("{},{}={},长度{}", pachageName, title, content, length);
+ }
+ if (TIM.equalsIgnoreCase(pachageName)) {
+ // 筛选出来需要处理的群名,
+ if (title.contains("极兔") && content.contains("JT")) {
+ NotificationRequest.put(this, content);
+ }
+ }
+ }
+ }
+
+
+ @Override
+ public void onNotificationRemoved(StatusBarNotification sbn) {
+ //当移除一条消息的时候回调,sbn是被移除的消息
+ Bundle extras = sbn.getNotification().extras;
+ String title = extras.getString(Notification.EXTRA_TITLE); //通知title
+ String content = extras.getString(Notification.EXTRA_TEXT); //通知内容
+// int smallIconId = extras.getInt(Notification.EXTRA_SMALL_ICON); //通知小图标id
+// Bitmap largeIcon = extras.getParcelable(Notification.EXTRA_LARGE_ICON); //通知的大图标,注意和获取小图标的区别
+ PendingIntent pendingIntent = sbn.getNotification().contentIntent; //获取通知的PendingIntent
+// log.info("{}={}", title, content);
+// log.info("当移除一条消息的时候回调,sbn是被移除的消息");
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/hxy/manager/service/NianHuoCustomerService.java b/app/src/main/java/com/hxy/manager/service/NianHuoCustomerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8070ac12f9f38f2bf2ec21eecbb0bac3e212872
--- /dev/null
+++ b/app/src/main/java/com/hxy/manager/service/NianHuoCustomerService.java
@@ -0,0 +1,48 @@
+package com.hxy.manager.service;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.ejlchina.okhttps.HttpResult;
+import com.ejlchina.okhttps.OkHttps;
+import com.hxy.manager.entity.NianHuoCustomerEntity;
+import com.hxy.manager.util.Tags;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class NianHuoCustomerService {
+ /**
+ * 新增推送到服务器
+ *
+ * @param context
+ * @param nianHuoCustomerEntity
+ * @return
+ */
+ public static HttpResult postToServer(Context context, NianHuoCustomerEntity nianHuoCustomerEntity) {
+
+ Map map= new HashMap();
+ map.put("name",nianHuoCustomerEntity.getName());
+ map.put("address",nianHuoCustomerEntity.getAddress());
+
+ return OkHttps.async("/customer-create")
+ .bind(context) // 绑定(生命周期|Context获取)
+// .tag(Tags.TOKEN) // 自动添加 TOEKN
+ .tag(Tags.LOADING) // 自动显示加载框
+ .addUrlPara(map)
+ .bodyType(OkHttps.JSON)
+ .setOnResponse(res -> {
+// editText4.setText(res.toString());
+ })
+ .setOnException((IOException e) -> {
+ // 这里处理请求异常
+ Log.i("kkk", "异步异常捕获:" + e.getMessage());
+// editText4.setText(e.getMessage());
+ })
+ // 请求参数设置...
+ .get().getResult();
+
+ }
+
+}
diff --git a/app/src/main/java/com/hxy/manager/service/SyncIntentService.java b/app/src/main/java/com/hxy/manager/service/SyncIntentService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8d670e9326ad0cd9a79fb61af72350216f96984
--- /dev/null
+++ b/app/src/main/java/com/hxy/manager/service/SyncIntentService.java
@@ -0,0 +1,49 @@
+package com.hxy.manager.service;
+
+import android.app.IntentService;
+import android.content.Intent;
+
+import androidx.annotation.Nullable;
+
+import com.hxy.manager.activity.goods.GoodsStoreActivity;
+import com.hxy.manager.entity.GoodsEntity;
+import com.hxy.manager.util.Constant;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class SyncIntentService extends IntentService {
+
+ Logger log = LoggerFactory.getLogger(SyncIntentService.class);
+
+
+ public SyncIntentService() {
+ super("子线程名字");
+ }
+
+ @Override
+ protected void onHandleIntent(@Nullable Intent intent) {
+ // 查询本地数据库数据
+ List goodsEntities = GoodsEntityService.listAll(SyncIntentService.this);
+
+ // 发送到服务器
+ GoodsEntityService goodsEntityService = new GoodsEntityService(GoodsStoreActivity.goodsStoreActivity);
+ goodsEntityService.syncData(goodsEntities);
+
+// try {
+// Thread.sleep(10000);
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }
+
+ log.info("向服务器请求数据");
+
+ // Service通过广播刷新UI
+ Intent broadCastIntent = new Intent(Constant.BROADCAST_ACTION);
+ broadCastIntent.putExtra(Constant.MESSAGE, "数据更新完成");
+ sendBroadcast(broadCastIntent);
+
+ }
+}
diff --git a/app/src/main/java/com/hxy/manager/service/SyncService.java b/app/src/main/java/com/hxy/manager/service/SyncService.java
index 1f1e59658af56d4fd5d57b9eb24c61985c859328..a9cbdde381b6b69edf13fa88d4da271e366d35e5 100755
--- a/app/src/main/java/com/hxy/manager/service/SyncService.java
+++ b/app/src/main/java/com/hxy/manager/service/SyncService.java
@@ -1,24 +1,34 @@
package com.hxy.manager.service;
+
+/**
+ * Created by 傲寒宏志 on 2018/1/4.
+ */
+
import android.app.Service;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
+import android.widget.Toast;
+import com.hxy.manager.activity.goods.GoodsStoreActivity;
import com.hxy.manager.entity.GoodsEntity;
import com.hxy.manager.util.Constant;
-import com.hxy.manager.util.StringUtil;
-import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.List;
+/**
+ * Created by 傲寒宏志 on 2018/1/3.
+ */
public class SyncService extends Service {
- final String host = "182.254.227.30";//服务器地址
- final String port = "10086";
- final String version = "1.17.9";
+ Logger log = LoggerFactory.getLogger(SyncService.class);
+
+
//实现一个INBinder接口
public final IBinder myBinder = new LocalBinder();
@@ -34,16 +44,8 @@ public class SyncService extends Service {
* 绑定时执行
*/
public void onCreate() {
+ log.info("SyncService的onCreate初始化");
super.onCreate();
- // Toast.makeText(this,"Service已启动",Toast.LENGTH_SHORT).show();
- //读取shareperf
- SharedPreferences pref = getSharedPreferences("com.hxy.manager_preferences", MODE_PRIVATE);
- Log.i("kkk", "pref" + pref);
- String host2 = pref.getString("ServerUrl", host);
- int port2 = Integer.parseInt(pref.getString("ServerPort", port));
-// 用于提示当前service的接口
-// Toast.makeText(getApplicationContext(), host2+":"+port2, Toast.LENGTH_SHORT).show();
- Log.i("kkk", host2 + port2);
}
/**
@@ -54,42 +56,39 @@ public class SyncService extends Service {
*/
@Override
public IBinder onBind(Intent intent) {
+ log.info("SyncService的onBind初始化");
// Toast.makeText(this,"本地绑定:SyncService",Toast.LENGTH_SHORT).show();
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
+ log.info("SyncService的onUnbind取消本地绑定");
// Toast.makeText(this,"取消本地绑定:SyncService",Toast.LENGTH_SHORT).show();
return false;
}
- public void uploadData() {
- new Thread(new Runnable() {
- @Override
- public void run() {
-
- //查询本地数据库数据
- List goodsEntities = GoodsEntityService.listAll(SyncService.this);
- if (goodsEntities!=null){
- for (GoodsEntity goodsEntity : goodsEntities) {
- if (goodsEntity!=null&& StringUtil.hasText(goodsEntity.getName())){
- Log.i("kkk", goodsEntity.getName());
- }
- }
- }
-
-// 发送到服务器
-
- GoodsEntityService goodsEntityService = new GoodsEntityService(SyncService.this);
- goodsEntityService.syncData(SyncService.this, goodsEntities);
-
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ log.info("SyncService的onStartCommand");
+
+ // 查询本地数据库数据
+ List goodsEntities = GoodsEntityService.listAll(SyncService.this);
+ log.info("数据库查询结束");
+ // 发送到服务器
+ GoodsEntityService goodsEntityService = new GoodsEntityService(GoodsStoreActivity.goodsStoreActivity);
+ goodsEntityService.syncData(goodsEntities);
+
+ log.info("SyncService的onStartCommand同步完后");
+ return super.onStartCommand(intent, flags, startId);
+ }
- Intent intent = new Intent(Constant.BROADCAST_ACTION);
- intent.putExtra(Constant.MESSAGE, "同步完成");
- sendBroadcast(intent);
- }
- }).start();
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ log.info("SyncService服务已经停止");
+ Log.i(Constant.TAG, "SyncService服务已经停止");
+ Toast.makeText(this, "SyncService服务已经停止", Toast.LENGTH_SHORT).show();
}
}
diff --git a/app/src/main/java/com/hxy/manager/service/TodayEntityService.java b/app/src/main/java/com/hxy/manager/service/TodayEntityService.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0fe87d7cf8b4a0977cd2d5c6a3599ac77593067
--- /dev/null
+++ b/app/src/main/java/com/hxy/manager/service/TodayEntityService.java
@@ -0,0 +1,129 @@
+package com.hxy.manager.service;
+
+import android.content.Context;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ejlchina.okhttps.HttpResult;
+import com.ejlchina.okhttps.OkHttps;
+import com.hxy.manager.activity.goods.GoodsStoreActivity;
+import com.hxy.manager.entity.GoodsEntity;
+import com.hxy.manager.entity.TodayPriceEntity;
+import com.hxy.manager.util.StringUtil;
+import com.hxy.manager.util.Tags;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TodayEntityService {
+ /**
+ * 新增推送到服务器
+ *
+ * @param context
+ * @param todayPriceEntity
+ * @return
+ */
+ public static HttpResult postToServer(Context context, TodayPriceEntity todayPriceEntity) {
+
+ Map map= new HashMap();
+ map.put("name",todayPriceEntity.getName());
+ map.put("price",todayPriceEntity.getPrice());
+
+ return OkHttps.async("/fruit-create")
+ .bind(context) // 绑定(生命周期|Context获取)
+// .tag(Tags.TOKEN) // 自动添加 TOEKN
+ .tag(Tags.LOADING) // 自动显示加载框
+ .addUrlPara(map)
+ .bodyType(OkHttps.JSON)
+ .setOnResponse(res -> {
+// editText4.setText(res.toString());
+ })
+ .setOnException((IOException e) -> {
+ // 这里处理请求异常
+ Log.i("kkk", "异步异常捕获:" + e.getMessage());
+// editText4.setText(e.getMessage());
+ })
+ // 请求参数设置...
+ .get().getResult();
+
+ }
+
+ /**
+ * 请求服务器下载数据
+ *
+ * @return
+ */
+ public String requestGetListAll(Context context) {
+// 异步操作,多线程操作
+ Object lock = new Object();
+
+ HttpResult result = OkHttps.async("/goods/list")
+ .bind(context) // 绑定(生命周期|Context获取)
+// .tag(Tags.TOKEN) // 自动添加 TOEKN
+// .tag(Tags.LOADING) // 自动显示加载框
+// .setBodyPara(goodsEntities)
+ .bodyType(OkHttps.JSON)
+ .setOnResponse(res -> {
+ synchronized (lock) {
+ HttpResult.Body body1 = res.getBody().cache();
+ String bodyStr = body1.toString();
+ JSONObject jsonObject = JSONObject.parseObject(bodyStr);
+ String message = jsonObject.getString("message");
+
+ Toast.makeText(GoodsStoreActivity.getCurrentActivity(), message, Toast.LENGTH_SHORT).show();
+ }
+
+ })
+ .setOnException((IOException e) -> {
+ // 这里处理请求异常
+ Log.i("kkk", "异步异常捕获:" + e.getMessage());
+ Toast.makeText(GoodsStoreActivity.getCurrentActivity(), "服务不在线", Toast.LENGTH_SHORT).show();
+ })
+ // 请求参数设置...
+ .get().getResult();
+
+
+ synchronized (lock) {
+ HttpResult.Body body = result.getBody();
+ if (body != null) {
+ return body.cache().toString();
+ }
+ }
+ return new String();
+ }
+
+ /**
+ * 和服务器同步数据
+ *
+ * @return
+ */
+ public void syncData(Context context, List goodsEntities) {
+ if (goodsEntities != null && goodsEntities.size() > 0) {
+// HttpResult httpResult = postAllToServer(goodsEntities);
+ }
+
+ String httpResult1 = requestGetListAll(context);
+ if (StringUtil.hasText(httpResult1)) {
+ JSONObject jsonObject = JSONObject.parseObject(httpResult1);
+ String message = jsonObject.getString("message");
+ String data = jsonObject.getString("data");
+
+ List goodsEntities1 = JSONObject.parseArray(data, GoodsEntity.class);
+ // 查询是否存在
+ if (goodsEntities1 != null) {
+ goodsEntities1.forEach(goodsEntity1 -> {
+// GoodsEntity oneByNumber = getOneByNumber(context, goodsEntity1.getNumber());
+// if (oneByNumber == null) {
+//// 防止id冲突
+// goodsEntity1.setId(null);
+// GoodsMapper.save(context, goodsEntity1);
+// }
+ });
+ }
+ }
+
+ }
+}
diff --git a/app/src/main/java/com/hxy/manager/util/Constant.java b/app/src/main/java/com/hxy/manager/util/Constant.java
index cc84110ff09cc0b4ef5d1b9e18580db4b7063488..9a94f359cf1d73d63522e7378b2162e6fa16c6cf 100644
--- a/app/src/main/java/com/hxy/manager/util/Constant.java
+++ b/app/src/main/java/com/hxy/manager/util/Constant.java
@@ -1,10 +1,13 @@
package com.hxy.manager.util;
public class Constant {
+
public static final String SQLITE_DATABASE = "shop.db";
public static final int RGB_RED = 0xFFFF0000;
public static final String SCAN_CODE = "scanCode";
public static final String BROADCAST_ACTION = "com.gdp2852.demo.service.broadcast";
public static final String MESSAGE = "msg";
+ public static final int STATUS_CODE = 200;
+ public static final String TAG = "kkk";
}
diff --git a/app/src/main/java/com/hxy/manager/util/FileUtil.java b/app/src/main/java/com/hxy/manager/util/FileUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..bec8a11e6b25a6f47206f9e48cea48f2cd7c8a71
--- /dev/null
+++ b/app/src/main/java/com/hxy/manager/util/FileUtil.java
@@ -0,0 +1,33 @@
+package com.hxy.manager.util;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.Build;
+
+import androidx.core.content.FileProvider;
+
+import java.io.File;
+
+public class FileUtil {
+ /**
+ * 根据文件获取Uri
+ *
+ * @param context
+ * @param file
+ * @param packageName
+ * @return
+ */
+ public static Uri getUriForFile(Context context, File file, String packageName) {
+ String FILE_PROVIDER_AUTH = packageName + ".fileprovider";
+ Uri fileUri = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//24 android7
+ fileUri = FileProvider.getUriForFile(context, FILE_PROVIDER_AUTH, file);
+ } else {
+// if (!hasExternalStorage())
+// chmodFile(file);//没有SD卡,需要更改文件权限
+ //file.setReadable(true,false);
+ fileUri = Uri.fromFile(file);
+ }
+ return fileUri;
+ }
+}
diff --git a/app/src/main/java/com/hxy/manager/util/OkHttpsConfig.java b/app/src/main/java/com/hxy/manager/util/OkHttpsConfig.java
index 8c477d52f0ba0d6b3abef0ed9c20c2300bcd6377..389dad53b6af0cfc1a9453224ed24d264146bc47 100644
--- a/app/src/main/java/com/hxy/manager/util/OkHttpsConfig.java
+++ b/app/src/main/java/com/hxy/manager/util/OkHttpsConfig.java
@@ -2,11 +2,8 @@ package com.hxy.manager.util;
import android.app.ProgressDialog;
import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
@@ -19,33 +16,12 @@ import com.ejlchina.okhttps.Config;
import com.ejlchina.okhttps.HTTP;
import com.ejlchina.okhttps.HttpResult;
import com.ejlchina.okhttps.HttpTask;
-import com.ejlchina.okhttps.Mapper;
-import com.ejlchina.okhttps.OnCallback;
import com.hxy.manager.App;
-import com.hxy.manager.activity.IndexActivity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
import java.util.concurrent.atomic.AtomicInteger;
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
public class OkHttpsConfig implements Config {
- Logger log = LoggerFactory.getLogger(OkHttpsConfig.class);
-
-
// 绑定到主线程的 Handler
private Handler mainHandler = new Handler(Looper.getMainLooper());
private ProgressDialog loading = null;
@@ -54,47 +30,7 @@ public class OkHttpsConfig implements Config {
@Override
public void with(HTTP.Builder builder) {
- X509TrustManager myTrustManager = new X509TrustManager() {
-
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
- }
-
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return new X509Certificate[0];
- }
- };
-
- HostnameVerifier myHostnameVerifier = new HostnameVerifier() {
- @Override
- public boolean verify(String hostname, SSLSession session) {
- return true;
- }
- };
-
- SSLContext sslCtx = null;
- try {
- sslCtx = SSLContext.getInstance("TLS");
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- try {
- sslCtx.init(null, new TrustManager[]{myTrustManager}, new SecureRandom());
- } catch (KeyManagementException e) {
- e.printStackTrace();
- }
-
- SSLSocketFactory mySSLSocketFactory = sslCtx.getSocketFactory();
-
- builder.config(b -> {
- b.sslSocketFactory(mySSLSocketFactory, myTrustManager);
- b.hostnameVerifier(myHostnameVerifier);
- }).baseUrl(Urls.BASE_URL) // 配置 BaseURL
+ builder.baseUrl(Urls.BASE_URL) // 配置 BaseURL
// 如果默认请求体是JSON,则开启,否则默认为表单
//.bodyType("json")
@@ -105,11 +41,15 @@ public class OkHttpsConfig implements Config {
// 加载框预处理(在 TOKEN 处理之前)
.addPreprocessor(chain -> {
HttpTask> task = chain.getTask();
- // 根据标签判断是否显示加载框
- if (task.isTagged(Tags.LOADING)) {
- showLoading(context(task));
- }
- chain.proceed();
+ Object bound = task.getBound();
+ mainHandler.post(()->{
+ task.bind(new BoundWrapper(task,bound));
+ // 根据标签判断是否显示加载框
+ if (task.isTagged(Tags.LOADING)) {
+ showLoading(context(task));
+ }
+ chain.proceed();
+ });
})
// 实现生命周期绑定
@@ -128,21 +68,21 @@ public class OkHttpsConfig implements Config {
chain.proceed();
return;
}
- Context ctx = context(task);
- requestTokenAndRefreshIfExpired(ctx, chain.getHttp(),
- (String token) -> {
- if (token != null) {
- // 添加 Token 头信息,名字需要和后端商定
- task.addHeader("Access-Token", token);
- } else if (ctx != null) {
- // 若没有得到 Token, 则跳转登录页面
- ctx.startActivity(new Intent(ctx, IndexActivity.class));
- } else {
- Log.e("OkHttps", "没有 Context 无法跳转登录页面!");
- }
- // 无论如何,这行代码一定要执行到,不然后续接口会一直在排队中
- chain.proceed();
- });
+// Context ctx = context(task);
+// requestTokenAndRefreshIfExpired(ctx, chain.getHttp(),
+// (String token) -> {
+// if (token != null) {
+// // 添加 Token 头信息,名字需要和后端商定
+// task.addHeader("Access-Token", token);
+// } else if (ctx != null) {
+// // 若没有得到 Token, 则跳转登录页面
+// ctx.startActivity(new Intent(ctx, LoginActivity.class));
+// } else {
+// Log.e("OkHttps", "没有 Context 无法跳转登录页面!");
+// }
+// // 无论如何,这行代码一定要执行到,不然后续接口会一直在排队中
+// chain.proceed();
+// });
})
// 错误码统一处理
@@ -153,7 +93,7 @@ public class OkHttpsConfig implements Config {
// 这里演示的是 HTTP 状态码的处理,如果有自定义的 code, 也可以进行深层次的判断
return true; // 继续接口的业务处理
}
- // 向用户展示接口的错误信息
+ // 向用户展示接口的错误信息(视情况是否需要放到主线程执行)
showMsgToUser(task, result.getBody().toString());
return false; // 阻断
})
@@ -162,9 +102,10 @@ public class OkHttpsConfig implements Config {
.completeListener((HttpTask> task, HttpResult.State state) -> {
Object bound = task.getBound();
if (bound instanceof BoundWrapper) {
- ((BoundWrapper) bound).unbind();
+ // 放到主线程执行
+ mainHandler.post(() -> ((BoundWrapper) bound).unbind());
}
- // 网络错误统一处理
+ // 网络错误统一处理(视情况判断是否需要放到主线程上执行)
switch (state) {
case TIMEOUT:
hideLoading();
@@ -176,8 +117,6 @@ public class OkHttpsConfig implements Config {
break;
case EXCEPTION:
hideLoading();
- Log.e("kkk", state.toString());
- log.error("\n====>{}", state);
showMsgToUser(task, "接口请求异常: " + task.getUrl());
break;
}
@@ -189,14 +128,13 @@ public class OkHttpsConfig implements Config {
}
- // 显示加载框
+ // 显示加载框,注意这里的Content不可以是Service,必须是Activity
private void showLoading(Context ctx) {
if (loading == null) {
// 这里就用 ProgressDialog 来演示了,当然可以替换成你喜爱的加载框
loading = new ProgressDialog(ctx);
loading.setMessage("正在加载,请稍等...");
-
}
// 增加加载框显示计数
loadings.incrementAndGet();
@@ -267,70 +205,12 @@ public class OkHttpsConfig implements Config {
Context ctx = context(task);
if (ctx != null) {
// 这里就简单用 Toast 示例一下,有更高级的实现可以替换
- Looper.prepare();
- Toast.makeText(ctx, message, Toast.LENGTH_LONG).show();
- Looper.loop();
+ mainHandler.post(() -> {
+ Toast.makeText(ctx, message, Toast.LENGTH_LONG).show();
+ });
+// Looper.prepare();
+// Toast.makeText(ctx, message, Toast.LENGTH_LONG).show();
+// Looper.loop();
}
}
-
- /**
- * 获取TOKEN,若过期则刷新(代码中的字符串可以替换为常量)
- **/
- private void requestTokenAndRefreshIfExpired(Context ctx, HTTP http,
- OnCallback callback) {
- if (ctx == null) {
- callback.on(null);
- return;
- }
- // 这里演示使用 Preference 存储,也可以使用数据库存储
- SharedPreferences token = ctx.getSharedPreferences("token",
- Context.MODE_PRIVATE);
- long now = System.currentTimeMillis();
- // 刷新令牌
- String refreshToken = token.getString("refreshToken", null);
- // 判断有效期可以提前 60 秒,以防在接下来的网络延迟中过期了
- if (token.getLong("refreshTokenExpiresAt", 0) < now + 60000
- || refreshToken == null) {
- // 刷新令牌已过期,说明长时间未使用,需要重新登录
- callback.on(null);
- return;
- }
- // 访问令牌
- String accessToken = token.getString("accessToken", null);
- if (token.getLong("accessTokenExpiresAt", 0) > now + 60000
- && accessToken != null) {
- // 访问令牌未过期,则回调令牌
- callback.on(accessToken);
- return;
- }
- // 访问令牌已过期,刷新令牌未过期,则调接口刷新当前令牌
- http.async(Urls.TOKEN_REFRESH)
- .skipPreproc() // 跳过所有预处理器
- .addBodyPara("refreshToken", refreshToken)
- .setOnResponse(res -> {
- if (!res.isSuccessful()) {
- callback.on(null);
- return;
- }
- Mapper mapper = res.getBody().toMapper();
- String newRefreshToken = mapper.getString("refreshToken");
- String newAccessToken = mapper.getString("accessToken");
- int refreshTokenExpiresIn = mapper.getInt("refreshTokenExpiresIn");
- int accessTokenExpiresIn = mapper.getInt("accessTokenExpiresIn");
- // 因为发生了请求,当前时间已经变化,所有重新获取时间
- long now2 = System.currentTimeMillis();
- // 保存到 SharedPreferences
- token.edit()
- .putString("refreshToken", newRefreshToken)
- .putString("accessToken", newAccessToken)
- .putLong("refreshTokenExpiresAt", refreshTokenExpiresIn * 1000 + now2)
- .putLong("accessTokenExpiresAt", accessTokenExpiresIn * 1000 + now2)
- .commit();
- // 回调令牌
- callback.on(newAccessToken);
- })
- .setOnException(e -> callback.on(null))
- .post();
- }
-
}
\ No newline at end of file
diff --git a/app/src/main/java/com/hxy/manager/util/StringUtil.java b/app/src/main/java/com/hxy/manager/util/StringUtil.java
index 9edb77736ea2c18219e22a774cbfcac0c92cb2f3..a262926d5fcc909f89e16856c46c1385359ed3e2 100644
--- a/app/src/main/java/com/hxy/manager/util/StringUtil.java
+++ b/app/src/main/java/com/hxy/manager/util/StringUtil.java
@@ -1,12 +1,11 @@
package com.hxy.manager.util;
-import lombok.extern.slf4j.Slf4j;
-import okio.Okio;
-
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
+import okio.Okio;
+
/**
* @author eric
* @description 禁止使用其他的StringUtils,如果这个类里面没有,那么可以将其他的StringUtils的方法复制过来。
diff --git a/app/src/main/java/com/hxy/manager/util/Urls.java b/app/src/main/java/com/hxy/manager/util/Urls.java
index 7c28cea6b2737f423fa89fdc673fbd1584575e21..eb55ed61c98b92b16aa690682188be505db25d32 100644
--- a/app/src/main/java/com/hxy/manager/util/Urls.java
+++ b/app/src/main/java/com/hxy/manager/util/Urls.java
@@ -5,9 +5,12 @@ public class Urls {
/**
* BaseUrl 还可以根据 build.gradle 的配置来取
* 打出不同环境的包,自动使用不同的 BaseUrl,这里便不再示例
+ *
+ * 服务器的配置信息
*/
-// public static final String BASE_URL = "http://192.168.0.107:7070";
- public static final String BASE_URL = "https://easyprint.vip:7070";
+ public static final String BASE_URL = "http://192.168.0.125:7070";
+ // 走nginx
+// public static final String BASE_URL = "https://scan.cupb.top";
/**
* 当 Token 快过期时,调用该接口来刷新 Token
diff --git a/app/src/main/java/com/hxy/manager/zxing/camera/CameraManager.java b/app/src/main/java/com/hxy/manager/zxing/camera/CameraManager.java
index 92c926ee2b188818a357887fcd76e5119ce7ce7b..a78232a2665d58307c3192fab7ad7ce63a107497 100755
--- a/app/src/main/java/com/hxy/manager/zxing/camera/CameraManager.java
+++ b/app/src/main/java/com/hxy/manager/zxing/camera/CameraManager.java
@@ -24,7 +24,6 @@ import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
-
import com.hxy.manager.zxing.camera.open.OpenCameraInterface;
import java.io.IOException;
diff --git a/app/src/main/java/com/hxy/manager/zxing/decode/DecodeHandler.java b/app/src/main/java/com/hxy/manager/zxing/decode/DecodeHandler.java
index 1753d0ea318c1d0d2b96b522c6ebf1709461102f..b528bc27ebc70c5735bddc2e14ac678fe4c007fc 100755
--- a/app/src/main/java/com/hxy/manager/zxing/decode/DecodeHandler.java
+++ b/app/src/main/java/com/hxy/manager/zxing/decode/DecodeHandler.java
@@ -24,9 +24,6 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-
-import com.hxy.manager.R;
-import com.hxy.manager.activity.CaptureActivity;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
@@ -34,6 +31,8 @@ import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
+import com.hxy.manager.R;
+import com.hxy.manager.activity.CaptureActivity;
import java.io.ByteArrayOutputStream;
import java.util.Map;
diff --git a/app/src/main/java/com/hxy/manager/zxing/decode/DecodeThread.java b/app/src/main/java/com/hxy/manager/zxing/decode/DecodeThread.java
index e9af6ce2096f957b0a4e7eecd859a3165a68c426..ccc51e45d20ae6c329cfcbaf9091b36bec62f37e 100755
--- a/app/src/main/java/com/hxy/manager/zxing/decode/DecodeThread.java
+++ b/app/src/main/java/com/hxy/manager/zxing/decode/DecodeThread.java
@@ -15,12 +15,13 @@
*/
package com.hxy.manager.zxing.decode;
+
import android.os.Handler;
import android.os.Looper;
-import com.hxy.manager.activity.CaptureActivity;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType;
+import com.hxy.manager.activity.CaptureActivity;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/app/src/main/java/com/hxy/manager/zxing/encoding/EncodingUtils.java b/app/src/main/java/com/hxy/manager/zxing/encoding/EncodingUtils.java
index d6df95f7eb5acf550b9b2a00d330d6c7aa342e61..7e1edf5741e1facb3689e299136416f5b75b2e33 100755
--- a/app/src/main/java/com/hxy/manager/zxing/encoding/EncodingUtils.java
+++ b/app/src/main/java/com/hxy/manager/zxing/encoding/EncodingUtils.java
@@ -1,15 +1,16 @@
package com.hxy.manager.zxing.encoding;
-
import android.graphics.Bitmap;
import android.graphics.Canvas;
+
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
import java.util.HashMap;
import java.util.Map;
diff --git a/app/src/main/java/com/hxy/manager/zxing/utils/BeepManager.java b/app/src/main/java/com/hxy/manager/zxing/utils/BeepManager.java
index 5dcab229b7da6af3c82c896f83c73e030adc2df6..9e8971038db1b257752be9abdf868f32b36e41ba 100755
--- a/app/src/main/java/com/hxy/manager/zxing/utils/BeepManager.java
+++ b/app/src/main/java/com/hxy/manager/zxing/utils/BeepManager.java
@@ -26,7 +26,6 @@ import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.Log;
-
import com.hxy.manager.R;
import java.io.Closeable;
diff --git a/app/src/main/java/com/hxy/manager/zxing/utils/CaptureActivityHandler.java b/app/src/main/java/com/hxy/manager/zxing/utils/CaptureActivityHandler.java
index 27eb28fc87c2f30e39e72b1772ea5cf3bee24110..91c43cf9a6cbf1cb0e70ad527ca631c19603e7e6 100755
--- a/app/src/main/java/com/hxy/manager/zxing/utils/CaptureActivityHandler.java
+++ b/app/src/main/java/com/hxy/manager/zxing/utils/CaptureActivityHandler.java
@@ -23,12 +23,11 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import com.google.zxing.Result;
import com.hxy.manager.R;
import com.hxy.manager.activity.CaptureActivity;
-import com.hxy.manager.zxing.*;
import com.hxy.manager.zxing.camera.CameraManager;
import com.hxy.manager.zxing.decode.DecodeThread;
-import com.google.zxing.Result;
/**
diff --git a/app/src/main/res/drawable-v24/shape_video_bg.xml b/app/src/main/res/drawable-v24/shape_video_bg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..24220fd727ebf6c9931fda74a738bdcc1894d440
--- /dev/null
+++ b/app/src/main/res/drawable-v24/shape_video_bg.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_shadow.xml b/app/src/main/res/drawable/bg_shadow.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e48db0dc722c1503d19d17a155c16b067bc75ada
--- /dev/null
+++ b/app/src/main/res/drawable/bg_shadow.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher.png b/app/src/main/res/drawable/ic_launcher.png
index 72dc34fc24e7b72afd576c633c78b8b42ed7eea8..1752278b90c72b18a205bc8581ba0c6e988af57a 100644
Binary files a/app/src/main/res/drawable/ic_launcher.png and b/app/src/main/res/drawable/ic_launcher.png differ
diff --git a/app/src/main/res/drawable/ic_launcher2.png b/app/src/main/res/drawable/ic_launcher2.png
new file mode 100644
index 0000000000000000000000000000000000000000..72dc34fc24e7b72afd576c633c78b8b42ed7eea8
Binary files /dev/null and b/app/src/main/res/drawable/ic_launcher2.png differ
diff --git a/app/src/main/res/drawable/layer_list.xml b/app/src/main/res/drawable/layer_list.xml
new file mode 100644
index 0000000000000000000000000000000000000000..518fcd16b0ece50707a6dd2d3a73e14a1ad3b5cd
--- /dev/null
+++ b/app/src/main/res/drawable/layer_list.xml
@@ -0,0 +1,18 @@
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/timer_list_selector.xml b/app/src/main/res/drawable/timer_list_selector.xml
new file mode 100644
index 0000000000000000000000000000000000000000..51726ebaadfdaeb29993e5b8de1661be7063d4b3
--- /dev/null
+++ b/app/src/main/res/drawable/timer_list_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
deleted file mode 100644
index 6a27e916e1278f1b6a18ad586d23bfd216499009..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/activity_main.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/add.xml b/app/src/main/res/layout/add.xml
index 32dbc8607bb8d6c0096a9f3feff1ead9f49dae37..8faab20a9a03d36a6bcd4edd2ee536e346e9ed61 100755
--- a/app/src/main/res/layout/add.xml
+++ b/app/src/main/res/layout/add.xml
@@ -1,290 +1,181 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="match_parent">
-
-
-
-
-
-
-
-
+
+
-
-
-
+ android:inputType="text"
+ android:maxLines="1" />
+
+
+
-
-
-
+
+
+ android:inputType="text"
+ android:maxLines="1" />
+
-
+
+
-
-
-
+ android:inputType="text"
+ android:maxLines="1" />
+
-
-
-
-
-
-
+
+
-
+ android:inputType="text"
+ android:maxLines="1" />
+
-
-
-
-
-
-
-
+
+
+
- android:hint="请输入生产日期"
- android:inputType="textPersonName" />
-
-
-
-
-
-
-
-
-
+
+
+
- android:hint="请输入保质期"
- android:inputType="textPersonName" />
-
-
-
-
-
-
-
-
-
+
+
+ android:inputType="text"
+ android:maxLines="1" />
+
-
-
-
-
-
-
-
+ android:padding="0dp"
+ android:text="保存"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bill.xml b/app/src/main/res/layout/bill.xml
index 4e16def5da221cd7c5ee15b300f848c25fce4eb7..58ee50d227bff8a0b4a13a7d2d0f7cc6b64aead1 100755
--- a/app/src/main/res/layout/bill.xml
+++ b/app/src/main/res/layout/bill.xml
@@ -1,7 +1,7 @@
+
-
+ android:layout_height="5dp"
+ android:background="#ebebeb" />
@@ -29,15 +29,6 @@
android:layout_marginLeft="10dp"
android:background="@drawable/titlebar_menu_selector" />
-
-