Create stores to manage shared preferences
This commit is contained in:
parent
66a8a7a660
commit
fa56b43a83
|
@ -0,0 +1,20 @@
|
||||||
|
package org.unifiedpush.distributor.nextpush
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import org.unifiedpush.distributor.nextpush.account.AccountStore
|
||||||
|
|
||||||
|
class AppStore(context: Context) : Store(context) {
|
||||||
|
val account = AccountStore(context)
|
||||||
|
|
||||||
|
var deviceId: String?
|
||||||
|
get() = sharedPreferences
|
||||||
|
.getString(PREF_DEVICE_ID, null)
|
||||||
|
set(value) = sharedPreferences
|
||||||
|
.edit()
|
||||||
|
.putOrRemove(PREF_DEVICE_ID, value)
|
||||||
|
.apply()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val PREF_DEVICE_ID = "deviceId"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package org.unifiedpush.distributor.nextpush
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
|
||||||
|
open class Store(context: Context) {
|
||||||
|
val sharedPreferences: SharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put value in sharedpref or remove if null.
|
||||||
|
*/
|
||||||
|
fun SharedPreferences.Editor.putOrRemove(key: String, value: String?): SharedPreferences.Editor {
|
||||||
|
value?.let {
|
||||||
|
this.putString(key, value)
|
||||||
|
} ?: run {
|
||||||
|
this.remove(key)
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
internal const val PREF_NAME = "NextPush"
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,54 +2,20 @@ package org.unifiedpush.distributor.nextpush.account
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import org.unifiedpush.distributor.nextpush.AppStore
|
||||||
import org.unifiedpush.distributor.nextpush.utils.TAG
|
import org.unifiedpush.distributor.nextpush.utils.TAG
|
||||||
|
|
||||||
internal const val PREF_NAME = "NextPush"
|
internal const val PREF_NAME = "NextPush"
|
||||||
private const val PREF_DEVICE_ID = "deviceId"
|
|
||||||
private const val PREF_ACCOUNT_TYPE = "account::type"
|
|
||||||
|
|
||||||
enum class AccountType {
|
|
||||||
SSO,
|
|
||||||
Direct;
|
|
||||||
fun toInt(): Int {
|
|
||||||
return this.ordinal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Int.toAccountType(): AccountType {
|
|
||||||
return AccountType.entries.getOrNull(this) ?: AccountType.SSO
|
|
||||||
}
|
|
||||||
|
|
||||||
object AccountFactory {
|
object AccountFactory {
|
||||||
private var account: Account<out Any>? = null
|
private var account: Account<out Any>? = null
|
||||||
|
|
||||||
var Context.accountType: AccountType
|
|
||||||
get() = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.getInt(PREF_ACCOUNT_TYPE, 0).toAccountType()
|
|
||||||
private set(value) = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().putInt(PREF_ACCOUNT_TYPE, value.toInt())
|
|
||||||
.apply()
|
|
||||||
|
|
||||||
var Context.npDeviceId: String?
|
|
||||||
get() = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.getString(PREF_DEVICE_ID, null)
|
|
||||||
set(value) {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit()
|
|
||||||
.apply {
|
|
||||||
value?.let {
|
|
||||||
putString(PREF_DEVICE_ID, it)
|
|
||||||
} ?: run {
|
|
||||||
remove(PREF_DEVICE_ID)
|
|
||||||
}
|
|
||||||
}.apply()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getAccount(context: Context, connected: Boolean = true): Account<out Any>? {
|
fun getAccount(context: Context, connected: Boolean = true): Account<out Any>? {
|
||||||
return account
|
return account
|
||||||
?: run {
|
?: run {
|
||||||
Log.d(TAG, "New account, type=${context.accountType}")
|
val accountType = AccountStore(context).accountType
|
||||||
when (context.accountType) {
|
Log.d(TAG, "New account, type=$accountType")
|
||||||
|
when (accountType) {
|
||||||
AccountType.SSO -> SSOAccount(context)
|
AccountType.SSO -> SSOAccount(context)
|
||||||
AccountType.Direct -> DirectAccount(context)
|
AccountType.Direct -> DirectAccount(context)
|
||||||
}.takeIf { !connected || it.connected }.also {
|
}.takeIf { !connected || it.connected }.also {
|
||||||
|
@ -60,18 +26,18 @@ object AccountFactory {
|
||||||
|
|
||||||
fun logout(context: Context) {
|
fun logout(context: Context) {
|
||||||
getAccount(context)?.logout(context)
|
getAccount(context)?.logout(context)
|
||||||
context.npDeviceId = null
|
AppStore(context).deviceId = null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.setTypeSSO() {
|
fun Context.setTypeSSO() {
|
||||||
account = null
|
account = null
|
||||||
accountType = AccountType.SSO
|
AccountStore(this).accountType = AccountType.SSO
|
||||||
DirectAccount.setCredentials(this, null, null, null)
|
DirectAccount.setCredentials(this, null, null, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.setTypeDirect(url: String, username: String, password: String) {
|
fun Context.setTypeDirect(url: String, username: String, password: String) {
|
||||||
account = null
|
account = null
|
||||||
accountType = AccountType.Direct
|
AccountStore(this).accountType = AccountType.Direct
|
||||||
DirectAccount.setCredentials(this, url, username, password)
|
DirectAccount.setCredentials(this, url, username, password)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.unifiedpush.distributor.nextpush.account
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import org.unifiedpush.distributor.nextpush.Store
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manager SharedPreferences for Account related values
|
||||||
|
*/
|
||||||
|
open class AccountStore(context: Context) : Store(context) {
|
||||||
|
var accountType: AccountType
|
||||||
|
get() = sharedPreferences
|
||||||
|
.getInt(PREF_ACCOUNT_TYPE, 0).toAccountType()
|
||||||
|
set(value) = sharedPreferences
|
||||||
|
.edit().putInt(PREF_ACCOUNT_TYPE, value.toInt())
|
||||||
|
.apply()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val PREF_ACCOUNT_TYPE = "account::type"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package org.unifiedpush.distributor.nextpush.account
|
||||||
|
|
||||||
|
enum class AccountType {
|
||||||
|
SSO,
|
||||||
|
Direct;
|
||||||
|
|
||||||
|
fun toInt(): Int {
|
||||||
|
return this.ordinal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Int.toAccountType(): AccountType {
|
||||||
|
return AccountType.entries.getOrNull(this) ?: AccountType.SSO
|
||||||
|
}
|
|
@ -11,26 +11,22 @@ import org.unifiedpush.distributor.nextpush.api.provider.ApiProvider.Companion.m
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
private const val PREF_CONNECTED = "direct_account::connected"
|
|
||||||
private const val PREF_URL = "direct_account::url"
|
|
||||||
private const val PREF_USERNAME = "direct_account::username"
|
|
||||||
private const val PREF_PASSWORD = "direct_account::password"
|
|
||||||
|
|
||||||
class DirectAccount(context: Context) : Account<OkHttpClient> {
|
class DirectAccount(context: Context) : Account<OkHttpClient> {
|
||||||
|
|
||||||
override val name: String? = context.username
|
/** [DirectAccountStore] */
|
||||||
override val url: String? = context.url
|
private val daStore = DirectAccountStore(context)
|
||||||
override var connected = context.connected
|
override val name: String? = daStore.username
|
||||||
|
override val url: String? = daStore.url
|
||||||
private fun setConnected(context: Context, value: Boolean) {
|
override var connected = daStore.connected
|
||||||
connected = value
|
set(value) {
|
||||||
context.connected = value
|
daStore.connected = value
|
||||||
|
field = value
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun connect(activity: Activity) {
|
override fun connect(activity: Activity) {
|
||||||
setConnected(activity, false)
|
connected = false
|
||||||
val client = getClient(activity) ?: return retActivity(activity)
|
val client = getClient(activity) ?: return retActivity(activity)
|
||||||
val url = activity.url ?: return retActivity(activity)
|
val url = daStore.url ?: return retActivity(activity)
|
||||||
|
|
||||||
val request = try {
|
val request = try {
|
||||||
Request.Builder()
|
Request.Builder()
|
||||||
|
@ -51,7 +47,7 @@ class DirectAccount(context: Context) : Account<OkHttpClient> {
|
||||||
|
|
||||||
override fun onResponse(call: Call, response: Response) {
|
override fun onResponse(call: Call, response: Response) {
|
||||||
Log.d(TAG, "Status: ${response.code}")
|
Log.d(TAG, "Status: ${response.code}")
|
||||||
setConnected(activity, response.code == 200)
|
connected = response.code == 200
|
||||||
response.close()
|
response.close()
|
||||||
retActivity(activity)
|
retActivity(activity)
|
||||||
}
|
}
|
||||||
|
@ -69,8 +65,8 @@ class DirectAccount(context: Context) : Account<OkHttpClient> {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClient(context: Context): OkHttpClient? {
|
override fun getClient(context: Context): OkHttpClient? {
|
||||||
val username = context.username ?: return null
|
val username = daStore.username ?: return null
|
||||||
val password = context.password ?: return null
|
val password = daStore.password ?: return null
|
||||||
return OkHttpClient.Builder()
|
return OkHttpClient.Builder()
|
||||||
.connectTimeout(30, TimeUnit.SECONDS)
|
.connectTimeout(30, TimeUnit.SECONDS)
|
||||||
.authenticator(DirectAuth(username, password))
|
.authenticator(DirectAuth(username, password))
|
||||||
|
@ -79,7 +75,7 @@ class DirectAccount(context: Context) : Account<OkHttpClient> {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun logout(context: Context) {
|
override fun logout(context: Context) {
|
||||||
setConnected(context, false)
|
connected = false
|
||||||
setCredentials(context, null, null, null)
|
setCredentials(context, null, null, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,56 +108,11 @@ class DirectAccount(context: Context) : Account<OkHttpClient> {
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private var Context.url: String?
|
|
||||||
get() = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.getString(PREF_URL, null)
|
|
||||||
set(value) = value?.let {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().putString(PREF_URL, it)
|
|
||||||
.apply()
|
|
||||||
} ?: run {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().remove(PREF_URL)
|
|
||||||
.apply()
|
|
||||||
}
|
|
||||||
|
|
||||||
private var Context.username: String?
|
|
||||||
get() = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.getString(PREF_USERNAME, null)
|
|
||||||
set(value) = value?.let {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().putString(PREF_USERNAME, it)
|
|
||||||
.apply()
|
|
||||||
} ?: run {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().remove(PREF_USERNAME)
|
|
||||||
.apply()
|
|
||||||
}
|
|
||||||
|
|
||||||
private var Context.password: String?
|
|
||||||
get() = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.getString(PREF_PASSWORD, null)
|
|
||||||
set(value) = value?.let {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().putString(PREF_PASSWORD, it)
|
|
||||||
.apply()
|
|
||||||
} ?: run {
|
|
||||||
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().remove(PREF_PASSWORD)
|
|
||||||
.apply()
|
|
||||||
}
|
|
||||||
|
|
||||||
private var Context.connected: Boolean
|
|
||||||
get() = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.getBoolean(PREF_CONNECTED, false)
|
|
||||||
set(value) = this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
|
||||||
.edit().putBoolean(PREF_CONNECTED, value)
|
|
||||||
.apply()
|
|
||||||
|
|
||||||
fun setCredentials(context: Context, url: String?, username: String?, password: String?) {
|
fun setCredentials(context: Context, url: String?, username: String?, password: String?) {
|
||||||
context.url = url
|
val daStore = DirectAccountStore(context)
|
||||||
context.username = username
|
daStore.url = url
|
||||||
context.password = password
|
daStore.username = username
|
||||||
|
daStore.password = password
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package org.unifiedpush.distributor.nextpush.account
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import org.unifiedpush.distributor.nextpush.Store
|
||||||
|
|
||||||
|
class DirectAccountStore(context: Context) : Store(context) {
|
||||||
|
var url: String?
|
||||||
|
get() = sharedPreferences
|
||||||
|
.getString(PREF_URL, null)
|
||||||
|
set(value) = sharedPreferences
|
||||||
|
.edit().putOrRemove(PREF_URL, value).apply()
|
||||||
|
|
||||||
|
var username: String?
|
||||||
|
get() = sharedPreferences
|
||||||
|
.getString(PREF_USERNAME, null)
|
||||||
|
set(value) = sharedPreferences
|
||||||
|
.edit().putOrRemove(PREF_USERNAME, value).apply()
|
||||||
|
|
||||||
|
var password: String?
|
||||||
|
get() = sharedPreferences
|
||||||
|
.getString(PREF_PASSWORD, null)
|
||||||
|
set(value) = sharedPreferences
|
||||||
|
.edit().putOrRemove(PREF_PASSWORD, value).apply()
|
||||||
|
|
||||||
|
var connected: Boolean
|
||||||
|
get() = sharedPreferences
|
||||||
|
.getBoolean(PREF_CONNECTED, false)
|
||||||
|
set(value) = sharedPreferences
|
||||||
|
.edit().putBoolean(PREF_CONNECTED, value)
|
||||||
|
.apply()
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val PREF_CONNECTED = "direct_account::connected"
|
||||||
|
private const val PREF_URL = "direct_account::url"
|
||||||
|
private const val PREF_USERNAME = "direct_account::username"
|
||||||
|
private const val PREF_PASSWORD = "direct_account::password"
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,9 +10,8 @@ import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.sse.EventSource
|
import okhttp3.sse.EventSource
|
||||||
import okhttp3.sse.EventSources
|
import okhttp3.sse.EventSources
|
||||||
import org.unifiedpush.distributor.nextpush.account.AccountFactory.accountType
|
import org.unifiedpush.distributor.nextpush.AppStore
|
||||||
import org.unifiedpush.distributor.nextpush.account.AccountFactory.getAccount
|
import org.unifiedpush.distributor.nextpush.account.AccountFactory.getAccount
|
||||||
import org.unifiedpush.distributor.nextpush.account.AccountFactory.npDeviceId
|
|
||||||
import org.unifiedpush.distributor.nextpush.account.AccountType
|
import org.unifiedpush.distributor.nextpush.account.AccountType
|
||||||
import org.unifiedpush.distributor.nextpush.api.provider.* // ktlint-disable no-wildcard-imports
|
import org.unifiedpush.distributor.nextpush.api.provider.* // ktlint-disable no-wildcard-imports
|
||||||
import org.unifiedpush.distributor.nextpush.api.provider.ApiProvider.Companion.mApiEndpoint
|
import org.unifiedpush.distributor.nextpush.api.provider.ApiProvider.Companion.mApiEndpoint
|
||||||
|
@ -23,21 +22,21 @@ import java.util.concurrent.atomic.AtomicReference
|
||||||
|
|
||||||
class Api(context: Context) {
|
class Api(context: Context) {
|
||||||
|
|
||||||
private val TAG = Api::class.java.simpleName
|
|
||||||
private val context = context.applicationContext
|
private val context = context.applicationContext
|
||||||
|
private val store = AppStore(context)
|
||||||
|
|
||||||
private val baseUrl: String
|
private val baseUrl: String
|
||||||
get() = getAccount(context)?.url ?: "http://0.0.0.0/"
|
get() = getAccount(context)?.url ?: "http://0.0.0.0/"
|
||||||
|
|
||||||
private fun withApiProvider(block: (ApiProvider, then: () -> Unit) -> Unit) {
|
private fun withApiProvider(block: (ApiProvider, then: () -> Unit) -> Unit) {
|
||||||
when (context.accountType) {
|
when (store.account.accountType) {
|
||||||
AccountType.SSO -> ApiSSOFactory(context)
|
AccountType.SSO -> ApiSSOFactory(context)
|
||||||
AccountType.Direct -> ApiDirectFactory(context)
|
AccountType.Direct -> ApiDirectFactory(context)
|
||||||
}.getProviderAndExecute(block)
|
}.getProviderAndExecute(block)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun tryWithDeviceId(block: (String) -> Unit) {
|
private fun tryWithDeviceId(block: (String) -> Unit) {
|
||||||
context.npDeviceId?.let {
|
store.deviceId?.let {
|
||||||
block(it)
|
block(it)
|
||||||
}
|
}
|
||||||
?: run {
|
?: run {
|
||||||
|
@ -52,7 +51,7 @@ class Api(context: Context) {
|
||||||
?.subscribe(object : DisposableObserver<ApiResponse>() {
|
?.subscribe(object : DisposableObserver<ApiResponse>() {
|
||||||
override fun onNext(response: ApiResponse) {
|
override fun onNext(response: ApiResponse) {
|
||||||
response.deviceId.let {
|
response.deviceId.let {
|
||||||
context.npDeviceId = it
|
store.deviceId = it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +63,7 @@ class Api(context: Context) {
|
||||||
|
|
||||||
override fun onComplete() {
|
override fun onComplete() {
|
||||||
// Sync once it is registered
|
// Sync once it is registered
|
||||||
context.npDeviceId?.let {
|
store.deviceId?.let {
|
||||||
block(it)
|
block(it)
|
||||||
}
|
}
|
||||||
Log.d(TAG, "mApi register: onComplete")
|
Log.d(TAG, "mApi register: onComplete")
|
||||||
|
@ -132,7 +131,7 @@ class Api(context: Context) {
|
||||||
then()
|
then()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
context.npDeviceId = null
|
store.deviceId = null
|
||||||
}
|
}
|
||||||
} catch (e: NoProviderException) {
|
} catch (e: NoProviderException) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
|
@ -216,6 +215,7 @@ class Api(context: Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
private const val TAG = "Api"
|
||||||
private val syncSource: AtomicReference<EventSource?> = AtomicReference(null)
|
private val syncSource: AtomicReference<EventSource?> = AtomicReference(null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue