diff --git a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/Api.kt b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/Api.kt index b09865c..296ffbb 100644 --- a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/Api.kt +++ b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/Api.kt @@ -19,39 +19,28 @@ import org.unifiedpush.distributor.nextpush.api.provider.ApiProvider.Companion.m import org.unifiedpush.distributor.nextpush.api.response.ApiResponse import java.util.concurrent.TimeUnit -object Api { +class Api(val context: Context) { private val TAG = Api::class.java.simpleName - private var provider: ApiProviderFactory? = null - private var source: EventSource? = null - private val Context.baseUrl: String - get() = getAccount(this)?.url ?: "http://0.0.0.0/" + private val baseUrl: String + get() = getAccount(context)?.url ?: "http://0.0.0.0/" - private fun Context.withApiProvider(block: (ApiProvider) -> Unit) { - ( - provider ?: run { - Log.d(TAG, "Setting SSOProvider") - when (accountType) { - AccountType.SSO -> ApiSSOFactory(this) - AccountType.Direct -> ApiDirectFactory(this) - }.apply { - provider = this - } - } - ).getProviderAndExecute(block) + private fun withApiProvider(block: (ApiProvider) -> Unit) { + when (context.accountType) { + AccountType.SSO -> ApiSSOFactory(context) + AccountType.Direct -> ApiDirectFactory(context) + }.getProviderAndExecute(block) } fun apiDestroy() { Log.d(TAG, "Destroying API") - provider?.destroyProvider() - provider = null - source?.cancel() - source = null + syncSource?.cancel() + syncSource = null } - fun Context.apiSync() { - deviceId?.let { + fun apiSync() { + context.deviceId?.let { syncDevice(it) } ?: run { @@ -70,7 +59,7 @@ object Api { override fun onNext(response: ApiResponse) { response.deviceId.let { - deviceId = it + context.deviceId = it } } @@ -80,7 +69,7 @@ object Api { override fun onComplete() { // Sync once it is registered - deviceId?.let { + context.deviceId?.let { syncDevice(it) } Log.d(TAG, "mApi register: onComplete") @@ -93,7 +82,7 @@ object Api { } } - private fun Context.syncDevice(deviceId: String) { + private fun syncDevice(deviceId: String) { val client = OkHttpClient.Builder() .readTimeout(0, TimeUnit.SECONDS) .retryOnConnectionFailure(false) @@ -104,12 +93,12 @@ object Api { .get() .build() - source = EventSources.createFactory(client).newEventSource(request, SSEListener(this)) + syncSource = EventSources.createFactory(client).newEventSource(request, SSEListener(context)) Log.d(TAG, "cSync done.") } - fun Context.apiDeleteDevice(block: () -> Unit = {}) { - val deviceId = deviceId ?: return + fun apiDeleteDevice(block: () -> Unit = {}) { + val deviceId = context.deviceId ?: return try { withApiProvider { apiProvider -> apiProvider.deleteDevice(deviceId) @@ -136,19 +125,19 @@ object Api { block() } }) - this.deviceId = null + context.deviceId = null } } catch (e: NoProviderException) { e.printStackTrace() } } - fun Context.apiCreateApp( + fun apiCreateApp( appName: String, block: (String?) -> Unit ) { // The unity of connector token must already be checked here - val parameters = deviceId?.let { + val parameters = context.deviceId?.let { mutableMapOf( "deviceId" to it, "appName" to appName @@ -188,7 +177,7 @@ object Api { } } - fun Context.apiDeleteApp(nextpushToken: String, block: () -> Unit) { + fun apiDeleteApp(nextpushToken: String, block: () -> Unit) { try { withApiProvider { apiProvider -> apiProvider.deleteApp(nextpushToken) @@ -220,4 +209,8 @@ object Api { e.printStackTrace() } } + + companion object { + private var syncSource: EventSource? = null + } } diff --git a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiDirectFactory.kt b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiDirectFactory.kt index 9e0b6eb..3d16c6d 100644 --- a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiDirectFactory.kt +++ b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiDirectFactory.kt @@ -1,19 +1,15 @@ package org.unifiedpush.distributor.nextpush.api.provider import android.content.Context -import android.util.Log import okhttp3.* // ktlint-disable no-wildcard-imports import org.unifiedpush.distributor.nextpush.account.Account.getAccount import org.unifiedpush.distributor.nextpush.api.provider.ApiProvider.Companion.mApiEndpoint -import org.unifiedpush.distributor.nextpush.utils.TAG import retrofit2.Retrofit import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.gson.GsonConverterFactory class ApiDirectFactory(val context: Context) : ApiProviderFactory { - private var apiProvider: ApiProvider? = null - override fun getProviderAndExecute(block: (ApiProvider) -> Unit) { val account = getAccount(context) ?: run { throw NoProviderException("No account found") @@ -24,22 +20,13 @@ class ApiDirectFactory(val context: Context) : ApiProviderFactory { val client = account.getAccount(context) as OkHttpClient? ?: run { throw NoProviderException("No client found") } - apiProvider?.let(block) - ?: run { - Log.d(TAG, "Creating new provider") - Retrofit.Builder() - .client(client) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .baseUrl("$url$mApiEndpoint").build() - .create(ApiProvider::class.java).let { - apiProvider = it - block(it) - } + Retrofit.Builder() + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .baseUrl("$url$mApiEndpoint").build() + .create(ApiProvider::class.java).let { + block(it) } } - - override fun destroyProvider() { - // Nothing - } } diff --git a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiProviderFactory.kt b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiProviderFactory.kt index 2bad7fd..f0439cb 100644 --- a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiProviderFactory.kt +++ b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiProviderFactory.kt @@ -3,5 +3,4 @@ package org.unifiedpush.distributor.nextpush.api.provider class NoProviderException(message: String) : Exception(message) interface ApiProviderFactory { fun getProviderAndExecute(block: (ApiProvider) -> Unit) - fun destroyProvider() } diff --git a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiSSOFactory.kt b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiSSOFactory.kt index 96cc117..3ecc808 100644 --- a/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiSSOFactory.kt +++ b/app/src/main/java/org/unifiedpush/distributor/nextpush/api/provider/ApiSSOFactory.kt @@ -6,52 +6,40 @@ import com.google.gson.GsonBuilder import com.nextcloud.android.sso.api.NextcloudAPI import com.nextcloud.android.sso.model.SingleSignOnAccount import org.unifiedpush.distributor.nextpush.account.Account.getAccount -import org.unifiedpush.distributor.nextpush.utils.TAG import retrofit2.NextcloudRetrofitApiBuilder class ApiSSOFactory(val context: Context) : ApiProviderFactory { private val TAG = ApiSSOFactory::class.java.simpleName - private var apiProvider: ApiProvider? = null - private var nextcloudAPI: NextcloudAPI? = null override fun getProviderAndExecute(block: (ApiProvider) -> Unit) { + var nextcloudAPI: NextcloudAPI? = null val account = getAccount(context) ?: run { throw NoProviderException("No account found") } val client = account.getAccount(context) as SingleSignOnAccount? ?: run { throw NoProviderException("No client found") } - apiProvider?.let(block) - ?: run { - Log.d(TAG, "Creating new provider") - val ssoApiCallback = object : NextcloudAPI.ApiConnectedListener { - override fun onConnected() { - Log.d(TAG, "Api connected.") - nextcloudAPI?.let { nextcloudAPI -> - NextcloudRetrofitApiBuilder(nextcloudAPI, ApiProvider.mApiEndpoint) - .create(ApiProvider::class.java).let { - apiProvider = it - block(it) - } + val ssoApiCallback = object : NextcloudAPI.ApiConnectedListener { + override fun onConnected() { + Log.d(TAG, "Api connected.") + nextcloudAPI?.let { nextcloudAPI -> + NextcloudRetrofitApiBuilder(nextcloudAPI, ApiProvider.mApiEndpoint) + .create(ApiProvider::class.java).let { + block(it) } - } - - override fun onError(ex: Exception) { - Log.d(TAG, "Cannot connect to API: ex = [$ex]") - } } - nextcloudAPI = NextcloudAPI( - context, - client, - GsonBuilder().create(), - ssoApiCallback - ) } - } - override fun destroyProvider() { - nextcloudAPI?.stop() - nextcloudAPI = null + override fun onError(ex: Exception) { + Log.d(TAG, "Cannot connect to API: ex = [$ex]") + } + } + nextcloudAPI = NextcloudAPI( + context, + client, + GsonBuilder().create(), + ssoApiCallback + ) } } diff --git a/app/src/main/java/org/unifiedpush/distributor/nextpush/distributor/Distributor.kt b/app/src/main/java/org/unifiedpush/distributor/nextpush/distributor/Distributor.kt index db34fd5..6a11169 100644 --- a/app/src/main/java/org/unifiedpush/distributor/nextpush/distributor/Distributor.kt +++ b/app/src/main/java/org/unifiedpush/distributor/nextpush/distributor/Distributor.kt @@ -4,9 +4,7 @@ import android.content.Context import android.content.Intent import android.util.Log import org.unifiedpush.distributor.nextpush.account.Account.getAccount -import org.unifiedpush.distributor.nextpush.api.Api.apiCreateApp -import org.unifiedpush.distributor.nextpush.api.Api.apiDeleteApp -import org.unifiedpush.distributor.nextpush.api.Api.apiDeleteDevice +import org.unifiedpush.distributor.nextpush.api.Api import org.unifiedpush.distributor.nextpush.api.provider.ApiProvider.Companion.mApiEndpoint import org.unifiedpush.distributor.nextpush.utils.TAG @@ -115,11 +113,11 @@ object Distributor { sendUnregistered(context, it) db.unregisterApp(it) } - context.apiDeleteDevice(block) + Api(context).apiDeleteDevice(block) } fun createApp(context: Context, appName: String, connectorToken: String, block: () -> Unit) { - context.apiCreateApp(appName) { nextpushToken -> + Api(context).apiCreateApp(appName) { nextpushToken -> nextpushToken?.let { getDb(context).registerApp(appName, connectorToken, it) } @@ -133,7 +131,7 @@ object Distributor { db.getAppToken( connectorToken )?.let { nextpushToken -> - context.apiDeleteApp(nextpushToken) { + Api(context).apiDeleteApp(nextpushToken) { db.unregisterApp(connectorToken) block() } diff --git a/app/src/main/java/org/unifiedpush/distributor/nextpush/services/StartService.kt b/app/src/main/java/org/unifiedpush/distributor/nextpush/services/StartService.kt index ea72e5b..1daa47d 100644 --- a/app/src/main/java/org/unifiedpush/distributor/nextpush/services/StartService.kt +++ b/app/src/main/java/org/unifiedpush/distributor/nextpush/services/StartService.kt @@ -8,8 +8,7 @@ import android.os.IBinder import android.os.PowerManager import android.util.Log import org.unifiedpush.distributor.nextpush.account.Account.getAccount -import org.unifiedpush.distributor.nextpush.api.Api.apiDestroy -import org.unifiedpush.distributor.nextpush.api.Api.apiSync +import org.unifiedpush.distributor.nextpush.api.Api import org.unifiedpush.distributor.nextpush.api.SSEListener.Companion.lastEventDate import org.unifiedpush.distributor.nextpush.utils.NOTIFICATION_ID_FOREGROUND import org.unifiedpush.distributor.nextpush.utils.NotificationUtils.createForegroundNotification @@ -18,6 +17,7 @@ import org.unifiedpush.distributor.nextpush.utils.TAG class StartService : Service() { private val networkCallback = RestartNetworkCallback(this) + private var api: Api? = null override fun onBind(intent: Intent?): IBinder? { return null @@ -41,7 +41,7 @@ class StartService : Service() { override fun onDestroy() { Log.d(TAG, "Destroying Service") - apiDestroy() + api?.apiDestroy() wakeLock?.let { while (it.isHeld) { it.release() @@ -69,8 +69,9 @@ class StartService : Service() { acquire(10000L /*10 secs*/) } } - - apiSync() + api = Api(this).also { + it.apiSync() + } } companion object StartServiceCompanion {