Fix concurrent (un)registration

Using registerQueue and delQueue, lists of connectorTokens
This commit is contained in:
S1m 2021-11-24 00:04:57 +01:00
parent 77f7901024
commit 85ed92357f
2 changed files with 39 additions and 11 deletions

View File

@ -22,6 +22,9 @@ import java.util.concurrent.TimeUnit
private const val TAG = "ApiUtils"
val createQueue = emptyList<String>().toMutableList()
val delQueue = emptyList<String>().toMutableList()
class ApiUtils {
private lateinit var mApi: ProviderApi
private lateinit var nextcloudAPI: NextcloudAPI
@ -187,6 +190,11 @@ class ApiUtils {
override fun onNext(response: ApiResponse) {
if (response.success) {
Log.d(TAG, "App successfully created.")
/**
* Ignore printed error for SQLiteContstraintException.
* It is printed and not thrown by SQLiteDatabase.java
* So we can't catch it
*/
db.registerApp(appName, connectorToken, response.token)
} else {
Log.d(TAG, "An error occurred while creating the application.")
@ -194,24 +202,27 @@ class ApiUtils {
}
override fun onError(e: Throwable) {
createQueue.remove(connectorToken)
e.printStackTrace()
}
override fun onComplete() {
createQueue.remove(connectorToken)
callback()
}
})
}
fun deleteApp(context: Context, appToken: String, callback: ()->Unit) {
fun deleteApp(context: Context, connectorToken: String, callback: ()->Unit) {
cApi(context) {
cDeleteApp(appToken) {
cDeleteApp(context, connectorToken) {
callback()
}
}
}
private fun cDeleteApp(appToken: String, callback: ()->Unit) {
private fun cDeleteApp(context: Context, connectorToken: String, callback: ()->Unit) {
val appToken = getDb(context).getAppToken(connectorToken)
mApi.deleteApp(appToken)
?.subscribeOn(Schedulers.newThread())
?.observeOn(Schedulers.newThread())
@ -229,10 +240,12 @@ class ApiUtils {
}
override fun onError(e: Throwable) {
delQueue.remove(connectorToken)
e.printStackTrace()
}
override fun onComplete() {
delQueue.remove(connectorToken)
callback()
}
})

View File

@ -6,6 +6,8 @@ import android.content.Intent
import android.util.Log
import org.unifiedpush.distributor.nextpush.distributor.*
import org.unifiedpush.distributor.nextpush.api.ApiUtils
import org.unifiedpush.distributor.nextpush.api.createQueue
import org.unifiedpush.distributor.nextpush.api.delQueue
/**
* THIS SERVICE IS USED BY OTHER APPS TO REGISTER
@ -25,8 +27,17 @@ class RegisterBroadcastReceiver : BroadcastReceiver() {
Log.w(TAG,"Trying to register an app without packageName")
return
}
ApiUtils().createApp(context!!.applicationContext, application, connectorToken) {
sendEndpoint(context.applicationContext, connectorToken)
if (connectorToken !in createQueue) {
createQueue.add(connectorToken)
ApiUtils().createApp(
context!!.applicationContext,
application,
connectorToken
) {
sendEndpoint(context.applicationContext, connectorToken)
}
} else {
Log.d(TAG, "Already registering $connectorToken")
}
}
ACTION_UNREGISTER ->{
@ -36,12 +47,16 @@ class RegisterBroadcastReceiver : BroadcastReceiver() {
if (application.isBlank()) {
return
}
sendUnregistered(context!!.applicationContext, connectorToken)
val db = getDb(context.applicationContext)
val appToken = db.getAppToken(connectorToken)
db.unregisterApp(connectorToken)
ApiUtils().deleteApp(context.applicationContext, appToken) {
Log.d(TAG,"Unregistration is finished")
if (connectorToken !in delQueue) {
delQueue.add(connectorToken)
sendUnregistered(context!!.applicationContext, connectorToken)
ApiUtils().deleteApp(context.applicationContext, connectorToken) {
val db = getDb(context.applicationContext)
db.unregisterApp(connectorToken)
Log.d(TAG, "Unregistration is finished")
}
} else {
Log.d(TAG, "Already deleting $connectorToken")
}
}
}