diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9ce4fef..ee6df36 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,6 +30,16 @@
android:usesCleartextTraffic="true"
android:theme="@style/Theme.FaceCollect">
+
+
+
+
+
+
+
(), ViewTreeObserver.OnGlo
private val mainViewModel by viewModels()
private var currentUserId: String? = null
+ private var lastFaceTrackId = -1
override fun inflateViewBinding() = ActivityMainBinding.inflate(layoutInflater)
@@ -102,7 +103,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
super.initialize()
mainViewModel.getUserFaceCache(pageNo = pageNo)
FaceEngineUtils.activeEngine()
- setupArcCamera()
+
binding.btnCollectFace.setOnClickListener {
requestSinglePermissionResult(Manifest.permission.CAMERA) { granted ->
if (granted.not()) {
@@ -121,7 +122,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
binding.tvFaceTip.visible()
binding.layoutState.gone()
- resumeCamera()
+// resumeCamera()
startFaceTask()
}
@@ -173,6 +174,31 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
it.put("content", faceData)
}
tcpClient?.send(jsonObject)
+
+ // TODO: 保存采集的人脸数据,暂时生成id,实际id在结算终端生成并发送到各台设备
+ saveFaceInfo(faceData)
+ }
+
+ private fun saveFaceInfo(faceData: String) {
+ Thread {
+ try {
+ val tempId = "${System.currentTimeMillis()}-123456789"
+ val faceEntity = FaceEntity(
+ tempId,
+ null,
+ Base64.decode(faceData)
+ ).also {
+ it.userType = "2"
+ }
+ FaceDatabase.getInstance(this).faceDao().insert(faceEntity)
+ recognizeViewModel.refreshFaceList();
+ runOnUiThread {
+ toast("你的人脸信息已采集")
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }.start()
}
private var tcpClient: TcpClient? = null
@@ -199,6 +225,22 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
super.onSendFailed(json, e)
toast("发送失败${e?.message}")
}
+
+ override fun onMessage(json: JSONObject?) {
+ super.onMessage(json)
+
+ val type = json?.getInt("type")
+ // 根据服务端消息类型处理删除新增临时用户人脸数据---------------------
+ when (type) {
+ LanServer.TYPE_ADD_FACE_DATA -> {
+ //采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据
+ }
+ LanServer.TYPE_CLEAR_FACE_DATA -> {
+ clearFaceData()
+ }
+ else-> {}
+ }
+ }
})
tcpClient?.start();
@@ -219,6 +261,11 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
// private var imageBitmap: Bitmap? = null
private fun collectFace() {
+ //toast("currentUserId=$currentUserId")
+ if (currentUserId != null) {
+ toast("您已采集过人脸信息")
+ return
+ }
currentUserId = null
userFaceInfo = null
recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY)
@@ -248,10 +295,10 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
private fun getFaceData(block: (String) -> Unit) {
runBlocking {
job = executor.startIntervalTask(5) {
- if (currentUserId != null && currentUserId!!.isNotBlank()) {
- toast("您已采集过人脸信息")
- return@startIntervalTask
- }
+// if (currentUserId != null && currentUserId!!.isNotBlank()) {
+// toast("您已采集过人脸信息")
+// return@startIntervalTask
+// }
if (userFaceInfo == null) {
return@startIntervalTask
}
@@ -353,13 +400,13 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
TAG,
"recognizeUserId observe compareResult = ${compareResult.trackId}, userId = ${compareResult.faceEntity.userName}"
)
- val lastFaceTrackId = compareResult.trackId
+ lastFaceTrackId = compareResult.trackId
val faceEntity = compareResult.faceEntity
currentUserId = faceEntity.userName
-// if (!currentUserId.isNullOrBlank()) {
-//// toast("您已采集过人脸信息")
-// return@Observer
-// }
+ if (!currentUserId.isNullOrBlank()) {
+ toast("您已采集过人脸信息")
+ return@Observer
+ }
// //未识别到,拍摄照片
})
@@ -663,29 +710,19 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
binding.dualCameraFaceRectView.drawRealtimeFaceInfo(rgbDrawInfoList)
}
-// val listIsEmpty = facePreviewInfoList.isEmpty()
-// val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0].trackId else null
-// Log.d(TAG,"listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId")
-// if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) {
-// if (lastFaceTrackId != -1 && currentUserId != null) {
-// mealPickupMode = SPUtil.getInstance().get(GlobalKey.KEY_PICKUP_MODE, 0) ?: 0
-// Timber.tag(com.sw.dualscreen.presentation.MainScreenPresentation.Companion.TAG).i("$lastFaceTrackId 用户离开")
-// lastFaceTrackId = -1
-// Timber.tag(com.sw.dualscreen.presentation.MainScreenPresentation.Companion.TAG)
-// .d("postUserData userNutritionData是否null: ${userNutrition == null}, currentFood是否null: ${currentFood == null},currentUserId是否null:${currentUserId == null}")
-// if (userNutrition == null || currentFood == null || currentUserId == null) {
-// return
-// }
-// postUserData()
-// if (mealPickupMode == 1 || isKeepFaceState) {
-// step2FaceRecognizing(currentFood!!)
-// isKeepFaceState = false
-// } else {
-// activity.isAnalyzing = false
-// step1FoodRecognizing()
-// }
-// }
-// }
+ val listIsEmpty = facePreviewInfoList.isEmpty()
+ val listFirstTrackId = if (listIsEmpty.not()) facePreviewInfoList[0].trackId else null
+ Log.d(
+ TAG,
+ "listIsEmpty=$listIsEmpty,lastFaceTrackId=$lastFaceTrackId,listFirstTrackId=$listFirstTrackId"
+ )
+ if (listIsEmpty || (lastFaceTrackId != listFirstTrackId)) {
+ if (lastFaceTrackId != -1 && currentUserId != null) {
+ Log.d(TAG, "$lastFaceTrackId 用户离开")
+ lastFaceTrackId = -1
+ currentUserId = null
+ }
+ }
}
fun switchCamera() {
@@ -757,14 +794,10 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
private val intervalExecutor by lazy { IntervalExecutor() }
private var faceTaskJob: Job? = null
- // private val initialDelay = 5 * 60 * 1000L
-// private val dealyMillis = 10 * 60 * 1000L
- private val initialDelay = 60 * 1000L
- private val dealyMillis = 30 * 1000L
private var taskPageNo = 1
fun startFaceTask() {
faceTaskJob =
- intervalExecutor.startIntervalTaskWithInitialDelay(initialDelay, dealyMillis) {
+ intervalExecutor.startIntervalTaskWithInitialDelay(60 * 1000L, 30 * 1000L) {
val timestamp = SpTool.getLastFaceTimestamp()
if (timestamp == 0L) {
return@startIntervalTaskWithInitialDelay
@@ -774,7 +807,6 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
timestamp = timestamp,
onAllQueryFinished = {
taskPageNo = 1
- SpTool.setLastFaceTimestamp(System.currentTimeMillis())
},
onPageQueryFinished = { list ->
runOnUiThread {
@@ -822,4 +854,34 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo
}.start()
}
+// private var dinnerTypeJob: Job? = null
+// fun startDinnerTypeTask() {
+// dinnerTypeJob =
+// intervalExecutor.startIntervalTaskWithInitialDelay(10 * 60 * 1000L, 15 * 60 * 1000L) {
+// mainViewModel.getDinnerType {
+//
+// }
+// }
+// }
+
+ private fun clearFaceData() {
+ Thread {
+ val faceDao = FaceDatabase.getInstance(this).faceDao()
+ faceDao.deleteTempUserFaceData()
+ recognizeViewModel.refreshFaceList();
+ }.start()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ setupArcCamera()
+
+ resumeCamera()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ pauseCamera()
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/face/collect/base/GlobalData.kt b/app/src/main/java/com/sw/face/collect/base/GlobalData.kt
index cb82117..7934562 100644
--- a/app/src/main/java/com/sw/face/collect/base/GlobalData.kt
+++ b/app/src/main/java/com/sw/face/collect/base/GlobalData.kt
@@ -15,7 +15,7 @@ object GlobalData {
/**
* 具体业务baseurl
*/
- var appBaseUrl: String = ""
+ var appBaseUrl: String = "https://dev.yixiong-tech.com:8081"
/**
* 横排数量
diff --git a/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt b/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt
index 20626d9..ab21ba9 100644
--- a/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt
+++ b/app/src/main/java/com/sw/face/collect/model/UserFaceModel.kt
@@ -20,7 +20,7 @@ data class UserFaceModel(
// @SerializedName("userId")
val userId: String? = "",
val faceFeatureStr: String? = "",
-
+ val faceUpdateTimestamp: Long?=null,
val faceDeleted: Boolean? = false
)
// : Parcelable
@@ -40,4 +40,14 @@ data class FaceData(
val current: Int,
val pages: Int,
val records: List? = null
+)
+
+data class DinnerType(
+ val id: String? = "",
+ //餐次
+ val dinnerType: String? = "",
+ //餐次收费模式(0称重,1固定,2不收费)
+ val chargeType: Int = 0,
+ //固定收费(元) 仅charge_type = 1 时
+ val fixedAmount: Double?=null
)
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/face/collect/network/ApiClient.kt b/app/src/main/java/com/sw/face/collect/network/ApiClient.kt
index 39704cf..1c6e34e 100644
--- a/app/src/main/java/com/sw/face/collect/network/ApiClient.kt
+++ b/app/src/main/java/com/sw/face/collect/network/ApiClient.kt
@@ -1,8 +1,8 @@
-package com.sw.dualscreen.network
+package com.sw.face.collect.network
import android.util.Log
import com.sw.face.collect.network.api.ApiService
-import com.sw.dualscreen.network.interceptor.RequestInterceptor
+import com.sw.face.collect.network.interceptor.RequestInterceptor
import com.sw.face.collect.MyApp
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
@@ -11,7 +11,8 @@ import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
object ApiClient {
- private const val BASE_URL = "http://device.shuziweidao.com:8889/"
+// private const val BASE_URL = "http://device.shuziweidao.com:8889/"
+ private const val BASE_URL = "https://dev.yixiong-tech.com:8081"
//private const val TIME_OUT = 30L // 超时时间(秒)
//todo 临时测试改为5秒
diff --git a/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt b/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt
index 5051533..7a3a82a 100644
--- a/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt
+++ b/app/src/main/java/com/sw/face/collect/network/api/ApiService.kt
@@ -2,6 +2,7 @@ package com.sw.face.collect.network.api
import com.sw.face.collect.base.GlobalData
import com.sw.face.collect.model.ApiResponse
+import com.sw.face.collect.model.DinnerType
import com.sw.face.collect.model.UserFaceModel
import okhttp3.MultipartBody
import okhttp3.RequestBody
@@ -33,4 +34,12 @@ interface ApiService {
@Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/common/app/faceFeature/increment/list",
@Body param: Map
): ApiResponse?>
+
+ /**
+ * 获取当前餐点类型
+ */
+ @GET
+ suspend fun getDinnerType(
+ @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/common/app/getRegionRule",
+ ): ApiResponse
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt b/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt
index f915d87..365f479 100644
--- a/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt
+++ b/app/src/main/java/com/sw/face/collect/network/interceptor/RequestInterceptor.kt
@@ -1,9 +1,8 @@
-package com.sw.dualscreen.network.interceptor
+package com.sw.face.collect.network.interceptor
import android.text.TextUtils
-import com.sw.dualscreen.GlobalData
-import com.sw.dualscreen.GlobalKey
import com.sw.dualscreen.utils.SPUtil
+import com.sw.face.collect.base.GlobalData
import com.sw.plate.App
import okhttp3.Interceptor
import okhttp3.Request
@@ -30,12 +29,12 @@ class RequestInterceptor : Interceptor {
return chain.proceed(newRequest)
}
- private fun getToken(originRequest: Request): String {
- val tokenParam = originRequest.header("X-Access-Token")
- if (!TextUtils.isEmpty(tokenParam)) return tokenParam!!
- // 从本地获取token的逻辑
- val spUtil = SPUtil.getInstance(context = App.getContext())
- return spUtil.get(GlobalKey.KEY_TOKEN, "") as String
-// return "eyJhbGciOiJIUzUxMiJ9.eyJpZCI6MTQ2LCJ1c2VyTmFtZSI6IjEzNjgxNDQ4ODU2IiwibmFtZSI6IuW-kOejiiIsInBhc3N3b3JkIjoiOTllOTQ1ZmVjZmZjNWIzNDI4MmUwNDRlODYyMzdjM2UxZjU5OWY5OCIsInNhbHQiOiI0NmEzMzUzYWU4OTA0MDYxYjMzODU5ZWNlYTBlMGE2NyIsInBob25lIjoiMTM2ODE0NDg4NTYiLCJzdGF0dXMiOjEsInVzZXJUeXBlIjoyLCJjcmVhdGVVc2VyTm8iOiIxNDEiLCJjcmVhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJ1cGRhdGVVc2VyTm8iOiIxNDEiLCJ1cGRhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJpc0RlbCI6ZmFsc2UsImVhSWQiOjk5LCJlYUlkTGlzdCI6Ijk5IiwiaXNTaG9wTWFuYWdlciI6dHJ1ZSwidXNlck5vIjoiMWY5Nzk5ZWMtODlkYi00MWYyLTk1YTEtY2UzNTA3Y2QyMTU2In0.f7wImPgBOYMV0AqRchnXGPkUWZN9dFJ9gLPsaB8uNldd21IfXLjJl8y-FiWVuVUvlwUvGpgqGDFR1JKj5H7amw"
- }
+// private fun getToken(originRequest: Request): String {
+// val tokenParam = originRequest.header("X-Access-Token")
+// if (!TextUtils.isEmpty(tokenParam)) return tokenParam!!
+// // 从本地获取token的逻辑
+// val spUtil = SPUtil.getInstance(context = App.getContext())
+// return spUtil.get(GlobalKey.KEY_TOKEN, "") as String
+//// return "eyJhbGciOiJIUzUxMiJ9.eyJpZCI6MTQ2LCJ1c2VyTmFtZSI6IjEzNjgxNDQ4ODU2IiwibmFtZSI6IuW-kOejiiIsInBhc3N3b3JkIjoiOTllOTQ1ZmVjZmZjNWIzNDI4MmUwNDRlODYyMzdjM2UxZjU5OWY5OCIsInNhbHQiOiI0NmEzMzUzYWU4OTA0MDYxYjMzODU5ZWNlYTBlMGE2NyIsInBob25lIjoiMTM2ODE0NDg4NTYiLCJzdGF0dXMiOjEsInVzZXJUeXBlIjoyLCJjcmVhdGVVc2VyTm8iOiIxNDEiLCJjcmVhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJ1cGRhdGVVc2VyTm8iOiIxNDEiLCJ1cGRhdGVUaW1lIjoxNjI2OTQzNDE2MDAwLCJpc0RlbCI6ZmFsc2UsImVhSWQiOjk5LCJlYUlkTGlzdCI6Ijk5IiwiaXNTaG9wTWFuYWdlciI6dHJ1ZSwidXNlck5vIjoiMWY5Nzk5ZWMtODlkYi00MWYyLTk1YTEtY2UzNTA3Y2QyMTU2In0.f7wImPgBOYMV0AqRchnXGPkUWZN9dFJ9gLPsaB8uNldd21IfXLjJl8y-FiWVuVUvlwUvGpgqGDFR1JKj5H7amw"
+// }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/face/collect/receiver/BootReceiver.kt b/app/src/main/java/com/sw/face/collect/receiver/BootReceiver.kt
new file mode 100644
index 0000000..996427b
--- /dev/null
+++ b/app/src/main/java/com/sw/face/collect/receiver/BootReceiver.kt
@@ -0,0 +1,19 @@
+package com.sw.face.collect.receiver
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+import com.sw.face.collect.MainActivity
+
+class BootReceiver : BroadcastReceiver() {
+
+ override fun onReceive(context: Context, intent: Intent) {
+ if (Intent.ACTION_BOOT_COMPLETED == intent.action) {
+ Log.d("BootReceiver","设备启动完成,开始执行自启动逻辑")
+ val intent = Intent(context, MainActivity::class.java)
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ context.startActivity(intent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt b/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt
index 3cbb40c..e31bd0d 100644
--- a/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt
+++ b/app/src/main/java/com/sw/face/collect/repository/RemoteRepository.kt
@@ -2,6 +2,7 @@ package com.sw.face.collect.repository
import com.sw.dualscreen.repository.BaseRepository
import com.sw.face.collect.model.ApiResponse
+import com.sw.face.collect.model.DinnerType
import com.sw.face.collect.model.UserFaceModel
import com.sw.face.collect.network.api.ApiService
@@ -28,7 +29,7 @@ class RemoteRepository constructor(
)
}
}
- /**
+ /**
* 获取人脸数据
*/
suspend fun getFaceIncrementList(
@@ -47,4 +48,13 @@ class RemoteRepository constructor(
}
}
+ /**
+ * 获取当前餐点类型
+ */
+ suspend fun getDinnerType(): ApiResponse {
+ return safeApiCall {
+ apiService.getDinnerType()
+ }
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sw/face/collect/socket/LanServer.java b/app/src/main/java/com/sw/face/collect/socket/LanServer.java
index 8d57e1e..453eee4 100644
--- a/app/src/main/java/com/sw/face/collect/socket/LanServer.java
+++ b/app/src/main/java/com/sw/face/collect/socket/LanServer.java
@@ -1,7 +1,8 @@
package com.sw.face.collect.socket;
public class LanServer {
-
+ public static final int TYPE_ADD_FACE_DATA = 1;
+ public static final int TYPE_CLEAR_FACE_DATA = 2;
private static volatile LanCommunicationManager instance;
public static LanCommunicationManager getInstance() {
@@ -18,4 +19,17 @@ public class LanServer {
}
return instance;
}
+
+ void a() {
+ //HashMap data = new HashMap<>();
+ //data.put("type", LanServer.TYPE_ADD_FACE_DATA);
+ //data.put("faceId", tempUserId);//收到采集信息,每次生成新的ID
+ //data.put("faceFeature", faceFeatureString);
+ //lanServer.broadcast(new JSONObject(data));
+//
+ //HashMap data = new HashMap<>();
+ //data.put("type", LanServer.TYPE_CLEAR_FACE_DATA);
+ //lanServer.broadcast(new JSONObject(data));
+ }
+
}
diff --git a/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt b/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt
index 9ba51a5..1127e43 100644
--- a/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt
+++ b/app/src/main/java/com/sw/face/collect/viewmodel/MainViewModel.kt
@@ -2,10 +2,11 @@ package com.sw.face.collect.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.sw.dualscreen.network.ApiClient
+import com.sw.face.collect.network.ApiClient
import com.sw.dualscreen.utils.SPUtil
import com.sw.face.collect.base.GlobalKey
import com.sw.face.collect.model.ApiResponse
+import com.sw.face.collect.model.DinnerType
import com.sw.face.collect.model.UserFaceModel
import com.sw.face.collect.repository.RemoteRepository
import com.sw.face.collect.utils.SpTool
@@ -25,6 +26,8 @@ class MainViewModel() : ViewModel() {
private val faceApi: FaceApi = FaceApi()
protected val repository = RemoteRepository(ApiClient.apiService)
+ private var lastFaceTimestamp = 0L
+
protected open fun parseResponse(response: ApiResponse<*>): Boolean {
val code = response.code
if (code == "00000" || code == "200" || code == "0") {
@@ -43,14 +46,15 @@ class MainViewModel() : ViewModel() {
var currentPageNo = pageNo
// Timber.tag(TAG).d("getUserFaceCache index = $currentPageNo")
viewModelScope.launch {
+ //获取全量数据时,时间戳改为0
+ SpTool.setLastFaceTimestamp(0)
val response = repository.getUserFaceCache(currentPageNo)
if (parseResponse(response)) {
// 获取成功一次后缓存状态
SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true)
withContext(Dispatchers.Default) {
val list: List = response.data ?: emptyList()
- if (list.isEmpty()) {
- SpTool.setLastFaceTimestamp(System.currentTimeMillis())
+ if (pageNo == 1 && list.isEmpty()) {
ToastUtils.showToast("查询人脸数据为空")
return@withContext
}
@@ -59,11 +63,17 @@ class MainViewModel() : ViewModel() {
}
faceApi.updateFaceData(currentPageNo, faceEntity)
if (list.size >= pageSize) {
+ lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L
currentPageNo++
getUserFaceCache(currentPageNo)
- } else {
- SpTool.setLastFaceTimestamp(System.currentTimeMillis())
+ return@withContext
}
+ //查询完成所有数据,保存时间戳
+ if (list.isNotEmpty()) {
+ //非空最后一条数据的是时间戳,空使用上次list最后一条时间戳
+ lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L
+ }
+ SpTool.setLastFaceTimestamp(lastFaceTimestamp)
}
}
}
@@ -76,7 +86,7 @@ class MainViewModel() : ViewModel() {
pageNo: Int = 1,
pageSize: Int = PAGE_SIZE,
timestamp: Long,
- onAllQueryFinished:()->Unit,
+ onAllQueryFinished: () -> Unit,
onPageQueryFinished: (List) -> Unit
) {
viewModelScope.launch {
@@ -89,7 +99,11 @@ class MainViewModel() : ViewModel() {
withContext(Dispatchers.Default) {
val list: List = response.data ?: emptyList()
onPageQueryFinished(list)
+ if (pageNo == 1 && list.isEmpty()) {
+ return@withContext
+ }
if (list.size >= pageSize) {
+ lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L
getFaceIncrementList(
pageNo = pageNo + 1,
pageSize = pageSize,
@@ -97,8 +111,30 @@ class MainViewModel() : ViewModel() {
onAllQueryFinished = onAllQueryFinished,
onPageQueryFinished = onPageQueryFinished
)
- } else {
- onAllQueryFinished()
+ return@withContext
+ }
+ //查询完成所有数据,保存时间戳
+ if (list.isNotEmpty()) {
+ //非空最后一条数据的是时间戳,空使用上次list最后一条时间戳
+ lastFaceTimestamp = list.last().faceUpdateTimestamp ?: 0L
+ }
+ SpTool.setLastFaceTimestamp(lastFaceTimestamp)
+ onAllQueryFinished()
+ }
+ }
+ }
+ }
+
+ /**
+ * 获取当前餐点类型
+ */
+ fun getDinnerType(block: (DinnerType) -> Unit) {
+ viewModelScope.launch {
+ val response = repository.getDinnerType()
+ if (parseResponse(response)) {
+ withContext(Dispatchers.Default) {
+ response.data?.let {
+ block(it)
}
}
}
diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java
index 4b3a682..bd6fec5 100644
--- a/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java
+++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/facedb/dao/FaceDao.java
@@ -88,4 +88,10 @@ public interface FaceDao {
@Query("UPDATE sqlite_sequence SET seq = 0 WHERE name ='face'")
void resetId();
+
+ /**
+ * @return 删除临时用户人脸
+ */
+ @Query("DELETE from face WHERE user_type = '2'")
+ int deleteTempUserFaceData();
}