Architecture Simplification (#917)

* Common compiling....
So I guess I have that going for me...

* It's very broken...

* App builds and tests pass....

* Remove other now extra files.
This commit is contained in:
Justin Bassett 2020-09-11 15:39:30 -04:00 committed by GitHub
parent e5baf1e64c
commit 6e13b16214
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
129 changed files with 342 additions and 1380 deletions

View File

@ -115,7 +115,6 @@ play {
dependencies {
implementation(project(":common"))
implementation(project(":domain"))
implementation(Config.Dependency.Misc.blurView)
implementation(Config.Dependency.Misc.iconDialog)

View File

@ -1,35 +1,33 @@
package io.homeassistant.companion.android.launch
import android.os.Build
import android.util.Log
import com.google.firebase.iid.FirebaseInstanceId
import io.homeassistant.companion.android.BuildConfig
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import java.lang.Exception
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await
class LaunchPresenterImpl @Inject constructor(
view: LaunchView,
authenticationUseCase: AuthenticationUseCase,
integrationUseCase: IntegrationUseCase
authenticationUseCase: AuthenticationRepository,
integrationUseCase: IntegrationRepository
) : LaunchPresenterBase(view, authenticationUseCase, integrationUseCase) {
override fun resyncRegistration() {
mainScope.launch {
try {
integrationUseCase.updateRegistration(
mainScope.launch {
try {
integrationUseCase.updateRegistration(
DeviceRegistration(
"${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})",
null,
Build.MANUFACTURER ?: "UNKNOWN",
Build.MODEL ?: "UNKNOWN",
Build.VERSION.SDK_INT.toString(),
pushToken = FirebaseInstanceId.getInstance().instanceId.await().token
FirebaseInstanceId.getInstance().instanceId.await().token
)
} catch (e: Exception) {
Log.e(TAG, "Issue updating Registration", e)
}
)
} catch (e: Exception) {
Log.e(TAG, "Issue updating Registration", e)
}
}
}
}

View File

@ -21,10 +21,11 @@ import com.google.firebase.messaging.RemoteMessage
import com.vdurmont.emoji.EmojiParser
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.authentication.SessionState
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.authentication.SessionState
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.homeassistant.companion.android.sensors.LocationSensorManager
import io.homeassistant.companion.android.util.UrlHandler
import io.homeassistant.companion.android.util.cancel
@ -61,13 +62,13 @@ class MessagingService : FirebaseMessagingService() {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
@Inject
lateinit var urlUseCase: UrlUseCase
lateinit var urlUseCase: UrlRepository
@Inject
lateinit var authenticationUseCase: AuthenticationUseCase
lateinit var authenticationUseCase: AuthenticationRepository
private val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())
@ -274,8 +275,9 @@ class MessagingService : FirebaseMessagingService() {
.setSmallIcon(R.drawable.ic_stat_ic_notification)
.setStyle(
NotificationCompat.BigTextStyle()
.setSummaryText(prepareText(group.substring(GROUP_PREFIX.length))
)
.setSummaryText(
prepareText(group.substring(GROUP_PREFIX.length))
)
)
.setGroup(group)
.setGroupSummary(true)
@ -468,23 +470,25 @@ class MessagingService : FirebaseMessagingService() {
}
}
private suspend fun getImageBitmap(url: URL?, requiresAuth: Boolean = false): Bitmap? = withContext(
Dispatchers.IO) {
if (url == null)
return@withContext null
private suspend fun getImageBitmap(url: URL?, requiresAuth: Boolean = false): Bitmap? =
withContext(
Dispatchers.IO
) {
if (url == null)
return@withContext null
var image: Bitmap? = null
try {
val uc = url.openConnection()
if (requiresAuth) {
uc.setRequestProperty("Authorization", authenticationUseCase.buildBearerToken())
var image: Bitmap? = null
try {
val uc = url.openConnection()
if (requiresAuth) {
uc.setRequestProperty("Authorization", authenticationUseCase.buildBearerToken())
}
image = BitmapFactory.decodeStream(uc.getInputStream())
} catch (e: Exception) {
Log.e(TAG, "Couldn't download image for notification", e)
}
image = BitmapFactory.decodeStream(uc.getInputStream())
} catch (e: Exception) {
Log.e(TAG, "Couldn't download image for notification", e)
return@withContext image
}
return@withContext image
}
private fun handleActions(
builder: NotificationCompat.Builder,
@ -623,7 +627,9 @@ class MessagingService : FirebaseMessagingService() {
}
try {
integrationUseCase.updateRegistration(
pushToken = token
DeviceRegistration(
pushToken = token
)
)
} catch (e: Exception) {
// TODO: Store for update later

View File

@ -9,7 +9,7 @@ import android.widget.Toast
import androidx.core.app.NotificationManagerCompat
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.util.NotificationActionContentHandler
import io.homeassistant.companion.android.util.cancel
import javax.inject.Inject
@ -32,7 +32,7 @@ class NotificationActionReceiver : BroadcastReceiver() {
private val ioScope: CoroutineScope = CoroutineScope(Dispatchers.IO + Job())
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
override fun onReceive(context: Context, intent: Intent) {
DaggerServiceComponent.builder()

View File

@ -2,14 +2,14 @@ package io.homeassistant.companion.android.onboarding.integration
import android.util.Log
import com.google.firebase.iid.FirebaseInstanceId
import io.homeassistant.companion.android.domain.integration.DeviceRegistration
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
import kotlinx.coroutines.tasks.await
class MobileAppIntegrationPresenterImpl @Inject constructor(
view: MobileAppIntegrationView,
integrationUseCase: IntegrationUseCase
integrationUseCase: IntegrationRepository
) : MobileAppIntegrationPresenterBase(
view, integrationUseCase
) {

View File

@ -12,7 +12,7 @@ import com.google.android.gms.location.ActivityRecognitionResult
import com.google.android.gms.location.DetectedActivity
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
class ActivitySensorManager : BroadcastReceiver(), SensorManager {
@ -33,7 +33,7 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
override fun onReceive(context: Context, intent: Intent) {
ensureInjected(context)

View File

@ -19,10 +19,10 @@ import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.integration.UpdateLocation
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.database.sensor.Attribute
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.UpdateLocation
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -65,7 +65,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private val ioScope: CoroutineScope = CoroutineScope(Dispatchers.IO)

View File

@ -10,7 +10,6 @@ import io.homeassistant.companion.android.onboarding.manual.ManualSetupFragment
import io.homeassistant.companion.android.sensors.SensorsSettingsFragment
import io.homeassistant.companion.android.settings.SettingsActivity
import io.homeassistant.companion.android.settings.SettingsFragment
import io.homeassistant.companion.android.settings.shortcuts.ShortcutsFragment
import io.homeassistant.companion.android.settings.ssid.SsidDialogFragment
import io.homeassistant.companion.android.webview.WebViewActivity
@ -31,8 +30,6 @@ interface PresenterComponent {
fun inject(fragment: SettingsFragment)
fun inject(fragment: ShortcutsFragment)
fun inject(activity: WebViewActivity)
fun inject(dialog: SsidDialogFragment)

View File

@ -21,9 +21,6 @@ import io.homeassistant.companion.android.onboarding.manual.ManualSetupView
import io.homeassistant.companion.android.settings.SettingsPresenter
import io.homeassistant.companion.android.settings.SettingsPresenterImpl
import io.homeassistant.companion.android.settings.SettingsView
import io.homeassistant.companion.android.settings.shortcuts.ShortcutsPresenter
import io.homeassistant.companion.android.settings.shortcuts.ShortcutsPresenterImpl
import io.homeassistant.companion.android.settings.shortcuts.ShortcutsView
import io.homeassistant.companion.android.webview.WebView
import io.homeassistant.companion.android.webview.WebViewPresenter
import io.homeassistant.companion.android.webview.WebViewPresenterImpl
@ -37,7 +34,6 @@ class PresenterModule {
private lateinit var manualSetupView: ManualSetupView
private lateinit var mobileAppIntegrationView: MobileAppIntegrationView
private lateinit var settingsView: SettingsView
private lateinit var shortcutsView: ShortcutsView
private lateinit var webView: WebView
constructor(launchView: LaunchView) {
@ -64,10 +60,6 @@ class PresenterModule {
this.settingsView = settingsView
}
constructor(shortcutsView: ShortcutsView) {
this.shortcutsView = shortcutsView
}
constructor(webView: WebView) {
this.webView = webView
}
@ -90,9 +82,6 @@ class PresenterModule {
@Provides
fun provideSettingsView() = settingsView
@Provides
fun provideShortcutsView() = shortcutsView
@Provides
fun provideWebView() = webView
@ -117,9 +106,6 @@ class PresenterModule {
@Binds
fun bindSettingsPresenter(presenter: SettingsPresenterImpl): SettingsPresenter
@Binds
fun bindShortcutsPresenter(presenter: ShortcutsPresenterImpl): ShortcutsPresenter
@Binds
fun bindWebViewPresenterImpl(presenter: WebViewPresenterImpl): WebViewPresenter
}

View File

@ -2,7 +2,7 @@ package io.homeassistant.companion.android.database.sensor
import androidx.room.Embedded
import androidx.room.Relation
import io.homeassistant.companion.android.domain.integration.SensorRegistration
import io.homeassistant.companion.android.common.data.integration.SensorRegistration
data class SensorWithAttributes(
@Embedded

View File

@ -1,8 +1,8 @@
package io.homeassistant.companion.android.launch
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.authentication.SessionState
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.authentication.SessionState
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -11,8 +11,8 @@ import kotlinx.coroutines.launch
abstract class LaunchPresenterBase(
private val view: LaunchView,
private val authenticationUseCase: AuthenticationUseCase,
internal val integrationUseCase: IntegrationUseCase
private val authenticationUseCase: AuthenticationRepository,
internal val integrationUseCase: IntegrationRepository
) : LaunchPresenter {
companion object {

View File

@ -15,7 +15,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
import kotlinx.android.synthetic.main.fragment_nfc_edit.*
import kotlinx.coroutines.CoroutineScope
@ -36,7 +36,7 @@ class NfcEditFragment : Fragment() {
private lateinit var viewModel: NfcViewModel
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
override fun onCreateView(
inflater: LayoutInflater,

View File

@ -9,7 +9,7 @@ import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.util.UrlHandler
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@ -25,7 +25,7 @@ class TagReaderActivity : AppCompatActivity() {
private val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@ -3,7 +3,7 @@ package io.homeassistant.companion.android.onboarding.authentication
import android.net.Uri
import android.util.Log
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -13,7 +13,7 @@ import kotlinx.coroutines.launch
class AuthenticationPresenterImpl @Inject constructor(
private val view: AuthenticationView,
private val authenticationUseCase: AuthenticationUseCase
private val authenticationUseCase: AuthenticationRepository
) : AuthenticationPresenter {
companion object {

View File

@ -1,6 +1,6 @@
package io.homeassistant.companion.android.onboarding.discovery
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.url.UrlRepository
import java.net.URL
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@ -11,7 +11,7 @@ import kotlinx.coroutines.launch
class DiscoveryPresenterImpl @Inject constructor(
val view: DiscoveryView,
val urlUseCase: UrlUseCase
val urlUseCase: UrlRepository
) : DiscoveryPresenter {
private val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())

View File

@ -3,8 +3,8 @@ package io.homeassistant.companion.android.onboarding.integration
import android.os.Build
import android.util.Log
import io.homeassistant.companion.android.BuildConfig
import io.homeassistant.companion.android.domain.integration.DeviceRegistration
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@ -13,7 +13,7 @@ import kotlinx.coroutines.launch
open class MobileAppIntegrationPresenterBase constructor(
private val view: MobileAppIntegrationView,
private val integrationUseCase: IntegrationUseCase
private val integrationUseCase: IntegrationRepository
) : MobileAppIntegrationPresenter {
companion object {

View File

@ -1,8 +1,8 @@
package io.homeassistant.companion.android.onboarding.manual
import android.util.Log
import io.homeassistant.companion.android.domain.MalformedHttpUrlException
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.MalformedHttpUrlException
import io.homeassistant.companion.android.common.data.url.UrlRepository
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -12,7 +12,7 @@ import kotlinx.coroutines.launch
class ManualSetupPresenterImpl @Inject constructor(
private val view: ManualSetupView,
private val urlUseCase: UrlUseCase
private val urlUseCase: UrlRepository
) : ManualSetupPresenter {
companion object {

View File

@ -3,7 +3,6 @@ package io.homeassistant.companion.android.sensors
import android.content.pm.PackageManager
import android.os.Bundle
import android.os.Handler
import androidx.core.os.postDelayed
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat

View File

@ -6,9 +6,9 @@ import android.content.Context
import android.content.Intent
import android.util.Log
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.integration.SensorRegistration
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.SensorRegistration
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -47,7 +47,7 @@ class SensorReceiver : BroadcastReceiver() {
private val ioScope: CoroutineScope = CoroutineScope(Dispatchers.IO + Job())
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private val chargingActions = listOf(
Intent.ACTION_BATTERY_LOW,
@ -104,7 +104,7 @@ class SensorReceiver : BroadcastReceiver() {
suspend fun updateSensors(
context: Context,
integrationUseCase: IntegrationUseCase
integrationUseCase: IntegrationRepository
) {
val sensorDao = AppDatabase.getInstance(context).sensorDao()
val enabledRegistrations = mutableListOf<SensorRegistration<Any>>()

View File

@ -17,7 +17,7 @@ import androidx.work.WorkManager
import androidx.work.WorkerParameters
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
@ -48,7 +48,7 @@ class SensorWorker(
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private val notificationManager = appContext.getSystemService(NOTIFICATION_SERVICE) as NotificationManager

View File

@ -7,14 +7,14 @@ import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import javax.inject.Inject
class SensorsSettingsFragment : PreferenceFragmentCompat() {
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private val handler = Handler()
private val refresh = object : Runnable {

View File

@ -21,7 +21,6 @@ import io.homeassistant.companion.android.authenticator.Authenticator
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.nfc.NfcSetupActivity
import io.homeassistant.companion.android.sensors.SensorsSettingsFragment
import io.homeassistant.companion.android.settings.shortcuts.ShortcutsFragment
import io.homeassistant.companion.android.settings.ssid.SsidDialogFragment
import io.homeassistant.companion.android.settings.ssid.SsidPreference
import javax.inject.Inject
@ -88,15 +87,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
isValid
}
val onClickShortcuts = Preference.OnPreferenceClickListener {
parentFragmentManager
.beginTransaction()
.replace(R.id.content, ShortcutsFragment.newInstance())
.addToBackStack(getString(R.string.shortcuts))
.commit()
true
}
findPreference<Preference>("nfc_tags")?.let {
it.isVisible = presenter.nfcEnabled()
it.onPreferenceClickListener = Preference.OnPreferenceClickListener {
@ -120,14 +110,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SettingsView {
findPreference<SwitchPreference>("app_lock")?.onPreferenceChangeListener =
onChangeBiometricValidator
val shortcuts = findPreference<Preference>("shortcuts")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && presenter.getPanels().isNotEmpty()) {
shortcuts?.onPreferenceClickListener =
onClickShortcuts
} else {
shortcuts?.isVisible = false
}
findPreference<Preference>("sensors")?.setOnPreferenceClickListener {
parentFragmentManager
.beginTransaction()

View File

@ -1,14 +1,12 @@
package io.homeassistant.companion.android.settings
import androidx.preference.PreferenceDataStore
import io.homeassistant.companion.android.domain.integration.Panel
interface SettingsPresenter {
fun getPreferenceDataStore(): PreferenceDataStore
fun onCreate()
fun onFinish()
fun nfcEnabled(): Boolean
fun getPanels(): Array<Panel>
fun isLockEnabled(): Boolean
fun sessionTimeOut(): Int

View File

@ -2,10 +2,10 @@ package io.homeassistant.companion.android.settings
import android.util.Log
import androidx.preference.PreferenceDataStore
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.Panel
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.homeassistant.companion.android.themes.ThemesManager
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@ -17,9 +17,9 @@ import kotlinx.coroutines.runBlocking
class SettingsPresenterImpl @Inject constructor(
private val settingsView: SettingsView,
private val urlUseCase: UrlUseCase,
private val integrationUseCase: IntegrationUseCase,
private val authenticationUseCase: AuthenticationUseCase,
private val urlUseCase: UrlRepository,
private val integrationUseCase: IntegrationRepository,
private val authenticationUseCase: AuthenticationRepository,
private val themesManager: ThemesManager
) : SettingsPresenter, PreferenceDataStore() {
@ -76,7 +76,7 @@ class SettingsPresenterImpl @Inject constructor(
}
"registration_name" -> {
try {
integrationUseCase.updateRegistration(deviceName = value!!)
integrationUseCase.updateRegistration(DeviceRegistration(deviceName = value!!))
} catch (e: Exception) {
Log.e(TAG, "Issue updating registration with new device name", e)
}
@ -149,18 +149,6 @@ class SettingsPresenterImpl @Inject constructor(
}
}
override fun getPanels(): Array<Panel> {
return runBlocking {
var panels = arrayOf<Panel>()
try {
panels = integrationUseCase.getPanels()
} catch (e: Exception) {
Log.e(TAG, "Issue getting panels.", e)
}
panels
}
}
override fun isLockEnabled(): Boolean {
return runBlocking {
authenticationUseCase.isLockEnabled()

View File

@ -1,126 +0,0 @@
package io.homeassistant.companion.android.settings.shortcuts
import android.app.PendingIntent
import android.content.Intent
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.drawable.Icon
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import io.homeassistant.companion.android.DaggerPresenterComponent
import io.homeassistant.companion.android.PresenterModule
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.Panel
import io.homeassistant.companion.android.webview.WebViewActivity
import javax.inject.Inject
@RequiresApi(Build.VERSION_CODES.O)
class ShortcutsFragment : Fragment(), ShortcutsView {
companion object {
fun newInstance(): ShortcutsFragment {
return ShortcutsFragment()
}
}
@Inject
lateinit var presenter: ShortcutsPresenter
private lateinit var recyclerViewAdapter: ShortcutsRecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerPresenterComponent
.builder()
.appComponent((activity?.application as GraphComponentAccessor).appComponent)
.presenterModule(PresenterModule(this))
.build()
.inject(this)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val panels = presenter.getPanels().filter { panel ->
!panel.title.isNullOrEmpty() && panel.title !== "lovelace" && panel.title !== "profile"
}.sortedBy { panel -> panel.title }.map { panel ->
panel.title_localized = when (panel.title) {
"calendar" -> requireContext().getString(R.string.calendar)
"config" -> requireContext().getString(R.string.config)
"developer_tools" -> requireContext().getString(R.string.developer_tools)
"history" -> requireContext().getString(R.string.history)
"logbook" -> requireContext().getString(R.string.logbook)
"mailbox" -> requireContext().getString(R.string.mailbox)
"map" -> requireContext().getString(R.string.map)
"profile" -> requireContext().getString(R.string.profile)
"shopping_list" -> requireContext().getString(R.string.shopping_list)
"states" -> requireContext().getString(R.string.states)
else -> panel.title
}
panel
}
recyclerViewAdapter =
ShortcutsRecyclerViewAdapter(panels.toList(), requireContext()) { onCreateShortcut(it) }
return inflater.inflate(R.layout.fragment_shortcuts, container, false).apply {
findViewById<RecyclerView>(R.id.recycler_view_shortcuts)?.apply {
adapter = recyclerViewAdapter
}
}
}
private fun onCreateShortcut(panel: Panel) {
val shortcutManager =
requireContext().getSystemService(ShortcutManager::class.java)
if (shortcutManager!!.isRequestPinShortcutSupported) {
val pinShortcutInfo =
ShortcutInfo.Builder(
context,
panel.title
)
.setShortLabel(panel.title_localized!!)
.setLongLabel(panel.title_localized!!)
.setIcon(
Icon.createWithResource(
context,
R.drawable.app_icon
)
)
.setIntent(
WebViewActivity.newInstance(
requireContext(),
panel.url_path
).apply {
this.action = Intent.ACTION_VIEW
}
)
.build()
val pinnedShortcutCallbackIntent =
shortcutManager.createShortcutResultIntent(
pinShortcutInfo
)
val successCallback =
PendingIntent.getBroadcast(
context,
0,
pinnedShortcutCallbackIntent,
0
)
shortcutManager.requestPinShortcut(
pinShortcutInfo,
successCallback.intentSender
)
}
}
}

View File

@ -1,7 +0,0 @@
package io.homeassistant.companion.android.settings.shortcuts
import io.homeassistant.companion.android.domain.integration.Panel
interface ShortcutsPresenter {
fun getPanels(): Array<Panel>
}

View File

@ -1,28 +0,0 @@
package io.homeassistant.companion.android.settings.shortcuts
import android.util.Log
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.Panel
import javax.inject.Inject
import kotlinx.coroutines.runBlocking
class ShortcutsPresenterImpl @Inject constructor(
private val integrationUseCase: IntegrationUseCase
) : ShortcutsPresenter {
companion object {
private const val TAG = "ShortcutsPresenter"
}
override fun getPanels(): Array<Panel> {
return runBlocking {
var panels = arrayOf<Panel>()
try {
panels = integrationUseCase.getPanels()
} catch (e: Exception) {
Log.e(TAG, "Issue getting panels.", e)
}
panels
}
}
}

View File

@ -1,44 +0,0 @@
package io.homeassistant.companion.android.settings.shortcuts
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import io.homeassistant.companion.android.databinding.ItemShortcutBinding
import io.homeassistant.companion.android.domain.integration.Panel
class ShortcutsRecyclerViewAdapter(
private val panels: List<Panel>,
val context: Context,
private val onCreateShortcut: (Panel) -> Unit
) :
RecyclerView.Adapter<ShortcutsRecyclerViewAdapter.ShortcutBindingViewHolder>() {
override fun getItemCount(): Int {
return panels.size
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ShortcutBindingViewHolder {
val binding =
ItemShortcutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ShortcutBindingViewHolder(binding) { onCreateShortcut(panels[it]) }
}
override fun onBindViewHolder(holder: ShortcutBindingViewHolder, position: Int) {
val panel = panels[position]
val binding = ItemShortcutBinding.bind(holder.itemView)
binding.panelText.text = panel.title_localized
}
class ShortcutBindingViewHolder(
binding: ItemShortcutBinding,
private val clickListener: (Int) -> Unit
) : RecyclerView.ViewHolder(binding.root) {
init {
binding.actionAdd.setOnClickListener { clickListener(adapterPosition) }
}
}
}

View File

@ -1,3 +0,0 @@
package io.homeassistant.companion.android.settings.shortcuts
interface ShortcutsView

View File

@ -7,12 +7,12 @@ import android.webkit.WebSettings
import androidx.appcompat.app.AppCompatDelegate
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
import io.homeassistant.companion.android.domain.themes.ThemesUseCase
import io.homeassistant.companion.android.common.data.themes.ThemesRepository
import javax.inject.Inject
import kotlinx.coroutines.runBlocking
class ThemesManager @Inject constructor(
private val themesUseCase: ThemesUseCase
private val themesUseCase: ThemesRepository
) {
fun getCurrentTheme(): String {

View File

@ -5,12 +5,9 @@ import android.app.PictureInPictureParams
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.content.res.Configuration
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.Icon
import android.net.Uri
import android.net.http.SslError
import android.os.Build
@ -344,7 +341,6 @@ class WebViewActivity : AppCompatActivity(), io.homeassistant.companion.android.
.getString("event") == "connected"
if (isConnected) {
alertDialog?.cancel()
setupPanelShortcuts()
}
}
"config/get" -> {
@ -843,30 +839,4 @@ class WebViewActivity : AppCompatActivity(), io.homeassistant.companion.android.
}
}, CONNECTION_DELAY)
}
private fun setupPanelShortcuts() {
if (Build.VERSION.SDK_INT >= 25) {
val panels = presenter.getPanels()
val shortcutManager = getSystemService(ShortcutManager::class.java)
shortcutManager!!.dynamicShortcuts = panels
.filter { panel -> !panel.title.isNullOrEmpty() && panel.component_name.contains("lovelace") }
.take(5)
.map { panel ->
ShortcutInfo.Builder(
this,
panel.component_name
)
.setShortLabel(panel.title!!)
.setLongLabel(panel.title!!)
.setIcon(Icon.createWithResource(this, R.drawable.app_icon))
.setIntent(
newInstance(this, panel.url_path).apply {
this.action = Intent.ACTION_VIEW
}
)
.build()
}
}
}
}

View File

@ -1,7 +1,5 @@
package io.homeassistant.companion.android.webview
import io.homeassistant.companion.android.domain.integration.Panel
interface WebViewPresenter {
fun onViewReady(path: String?)
@ -10,8 +8,6 @@ interface WebViewPresenter {
fun onRevokeExternalAuth(callback: String)
fun getPanels(): Array<Panel>
fun clearKnownUrls()
fun isFullScreen(): Boolean

View File

@ -3,11 +3,10 @@ package io.homeassistant.companion.android.webview
import android.graphics.Color
import android.net.Uri
import android.util.Log
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.authentication.SessionState
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.Panel
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.authentication.SessionState
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.homeassistant.companion.android.util.UrlHandler
import java.net.URL
import java.util.regex.Matcher
@ -22,9 +21,9 @@ import kotlinx.coroutines.runBlocking
class WebViewPresenterImpl @Inject constructor(
private val view: WebView,
private val urlUseCase: UrlUseCase,
private val authenticationUseCase: AuthenticationUseCase,
private val integrationUseCase: IntegrationUseCase
private val urlUseCase: UrlRepository,
private val authenticationUseCase: AuthenticationRepository,
private val integrationUseCase: IntegrationRepository
) : WebViewPresenter {
companion object {
@ -105,18 +104,6 @@ class WebViewPresenterImpl @Inject constructor(
}
}
override fun getPanels(): Array<Panel> {
return runBlocking {
var panels = arrayOf<Panel>()
try {
panels = integrationUseCase.getPanels()
} catch (e: Exception) {
Log.e(TAG, "Issue getting panels.", e)
}
panels
}
}
override fun clearKnownUrls() {
mainScope.launch {
urlUseCase.saveUrl("", true)

View File

@ -19,10 +19,10 @@ import com.maltaisn.icondialog.pack.IconPackLoader
import com.maltaisn.iconpack.mdi.createMaterialDesignIconPack
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.database.widget.ButtonWidgetDao
import io.homeassistant.companion.android.database.widget.ButtonWidgetEntity
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import java.util.regex.Pattern
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@ -46,7 +46,7 @@ class ButtonWidget : AppWidgetProvider() {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
lateinit var buttonWidgetDao: ButtonWidgetDao

View File

@ -27,9 +27,9 @@ import com.maltaisn.icondialog.pack.IconPackLoader
import com.maltaisn.iconpack.mdi.createMaterialDesignIconPack
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.Entity
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.Service
import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.integration.Service
import javax.inject.Inject
import kotlinx.android.synthetic.main.widget_button_configure.*
import kotlinx.coroutines.CoroutineScope
@ -45,7 +45,7 @@ class ButtonWidgetConfigureActivity : AppCompatActivity(), IconDialog.Callback {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private val ioScope: CoroutineScope = CoroutineScope(Dispatchers.IO)

View File

@ -11,10 +11,10 @@ import android.util.TypedValue
import android.widget.RemoteViews
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.database.widget.StaticWidgetDao
import io.homeassistant.companion.android.database.widget.StaticWidgetEntity
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -39,7 +39,7 @@ class StaticWidget : AppWidgetProvider() {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private lateinit var staticWidgetDao: StaticWidgetDao

View File

@ -16,8 +16,8 @@ import android.widget.MultiAutoCompleteTextView.CommaTokenizer
import android.widget.Toast
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.Entity
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
import kotlinx.android.synthetic.main.widget_static_configure.*
import kotlinx.coroutines.CoroutineScope
@ -31,7 +31,7 @@ class StaticWidgetConfigureActivity : Activity() {
private val TAG: String = "StaticWidgetConfigAct"
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private var entities = LinkedHashMap<String, Entity<Any>>()

View File

@ -8,8 +8,8 @@ import android.view.ViewGroup
import android.widget.AutoCompleteTextView
import android.widget.MultiAutoCompleteTextView.CommaTokenizer
import androidx.recyclerview.widget.RecyclerView
import io.homeassistant.companion.android.domain.integration.Entity
import io.homeassistant.companion.android.domain.integration.Service
import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.common.data.integration.Service
import java.lang.Exception
import kotlinx.android.synthetic.main.widget_button_configure_dynamic_field.view.*

View File

@ -10,10 +10,10 @@ import android.util.Log
import android.widget.RemoteViews
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.database.widget.TemplateWidgetDao
import io.homeassistant.companion.android.database.widget.TemplateWidgetEntity
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.widgets.DaggerProviderComponent
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@ -33,7 +33,7 @@ class TemplateWidget : AppWidgetProvider() {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private lateinit var templateWidgetDao: TemplateWidgetDao
@ -118,7 +118,7 @@ class TemplateWidget : AppWidgetProvider() {
if (widget != null) {
var renderedTemplate = "Loading"
try {
renderedTemplate = integrationUseCase.renderTemplate(widget.template)
renderedTemplate = integrationUseCase.renderTemplate(widget.template, mapOf())
} catch (e: Exception) {
Log.e(TAG, "Unable to render template: ${widget.template}", e)
}

View File

@ -8,7 +8,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.doAfterTextChanged
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.widgets.DaggerProviderComponent
import javax.inject.Inject
import kotlinx.android.synthetic.main.widget_template_configure.*
@ -24,7 +24,7 @@ class TemplateWidgetConfigureActivity : AppCompatActivity() {
}
@Inject
lateinit var integrationUseCase: IntegrationUseCase
lateinit var integrationUseCase: IntegrationRepository
private val ioScope: CoroutineScope = CoroutineScope(Dispatchers.IO)
@ -70,7 +70,7 @@ class TemplateWidgetConfigureActivity : AppCompatActivity() {
var templateText: String?
var enabled: Boolean
try {
templateText = integrationUseCase.renderTemplate(editableText.toString())
templateText = integrationUseCase.renderTemplate(editableText.toString(), mapOf())
enabled = true
} catch (e: Exception) {
templateText = "Error in template"

View File

@ -1,27 +1,25 @@
package io.homeassistant.companion.android.launch
import android.os.Build
import android.util.Log
import io.homeassistant.companion.android.BuildConfig
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
import kotlinx.coroutines.launch
class LaunchPresenterImpl @Inject constructor(
view: LaunchView,
authenticationUseCase: AuthenticationUseCase,
integrationUseCase: IntegrationUseCase
authenticationUseCase: AuthenticationRepository,
integrationUseCase: IntegrationRepository
) : LaunchPresenterBase(view, authenticationUseCase, integrationUseCase) {
override fun resyncRegistration() {
mainScope.launch {
try {
integrationUseCase.updateRegistration(
"${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})",
null,
Build.MANUFACTURER ?: "UNKNOWN",
Build.MODEL ?: "UNKNOWN",
Build.VERSION.SDK_INT.toString()
DeviceRegistration(
"${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
)
)
} catch (e: Exception) {
Log.e(TAG, "Issue updating Registration", e)

View File

@ -1,9 +1,9 @@
package io.homeassistant.companion.android.onboarding.integration
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import javax.inject.Inject
class MobileAppIntegrationPresenterImpl @Inject constructor(
view: MobileAppIntegrationView,
integrationUseCase: IntegrationUseCase
integrationUseCase: IntegrationRepository
) : MobileAppIntegrationPresenterBase(view, integrationUseCase)

View File

@ -1,8 +1,8 @@
package io.homeassistant.companion.android.launch
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.authentication.SessionState
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.authentication.SessionState
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.mockk.coEvery
import io.mockk.mockk
import io.mockk.verify
@ -23,8 +23,8 @@ object LaunchPresenterImplSpec : Spek({
}
describe("launch presenter") {
val authenticationUseCase by memoized { mockk<AuthenticationUseCase>() }
val integrationUseCase by memoized { mockk<IntegrationUseCase>() }
val authenticationUseCase by memoized { mockk<AuthenticationRepository>() }
val integrationUseCase by memoized { mockk<IntegrationRepository>() }
val view by memoized { mockk<LaunchView>(relaxUnitFun = true) }
val presenter by memoized { LaunchPresenterImpl(view, authenticationUseCase, integrationUseCase) }

View File

@ -1,7 +1,7 @@
package io.homeassistant.companion.android.onboarding.authentication
import android.net.Uri
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.mockk.Called
import io.mockk.coEvery
import io.mockk.coVerify
@ -28,7 +28,7 @@ object AuthenticationPresenterImplSpec : Spek({
}
describe("authentication presenter") {
val authenticationUseCase by memoized { mockk<AuthenticationUseCase>(relaxUnitFun = true) }
val authenticationUseCase by memoized { mockk<AuthenticationRepository>(relaxUnitFun = true) }
val view by memoized { mockk<AuthenticationView>(relaxUnitFun = true) }
val presenter by memoized { AuthenticationPresenterImpl(view, authenticationUseCase) }

View File

@ -2,8 +2,8 @@ package io.homeassistant.companion.android.onboarding.integration
import android.os.Build
import io.homeassistant.companion.android.BuildConfig
import io.homeassistant.companion.android.domain.integration.DeviceRegistration
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.coVerifyAll
@ -27,7 +27,7 @@ object MobileAppIntegrationPresenterImplSpec : Spek({
}
describe("presenter") {
val integrationUseCase by memoized { mockk<IntegrationUseCase>(relaxUnitFun = true) }
val integrationUseCase by memoized { mockk<IntegrationRepository>(relaxUnitFun = true) }
val view by memoized { mockk<MobileAppIntegrationView>(relaxUnitFun = true) }
val presenter by memoized { MobileAppIntegrationPresenterBase(view, integrationUseCase) }

View File

@ -1,7 +1,7 @@
package io.homeassistant.companion.android.onboarding.manual
import io.homeassistant.companion.android.domain.MalformedHttpUrlException
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.MalformedHttpUrlException
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.mockk.coEvery
import io.mockk.coVerifyAll
import io.mockk.just
@ -25,7 +25,7 @@ object ManualSetupPresenterImplSpec : Spek({
}
describe("presenter") {
val urlUseCase by memoized { mockk<UrlUseCase>(relaxUnitFun = true) }
val urlUseCase by memoized { mockk<UrlRepository>(relaxUnitFun = true) }
val view by memoized { mockk<ManualSetupView>(relaxUnitFun = true) }
val presenter by memoized { ManualSetupPresenterImpl(view, urlUseCase) }

View File

@ -1,10 +1,10 @@
package io.homeassistant.companion.android.webview
import android.net.Uri
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.themes.ThemesUseCase
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.themes.ThemesRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.mockk.coEvery
import io.mockk.every
import io.mockk.just
@ -31,10 +31,10 @@ object WebViewPresenterImplSpec : Spek({
}
describe("presenter") {
val urlUseCase by memoized { mockk<UrlUseCase>(relaxUnitFun = true) }
val authenticationUseCase by memoized { mockk<AuthenticationUseCase>(relaxUnitFun = true) }
val integrationUseCase by memoized { mockk<IntegrationUseCase>(relaxUnitFun = true) }
val themesUseCase by memoized { mockk<ThemesUseCase>(relaxUnitFun = true) }
val urlUseCase by memoized { mockk<UrlRepository>(relaxUnitFun = true) }
val authenticationUseCase by memoized { mockk<AuthenticationRepository>(relaxUnitFun = true) }
val integrationUseCase by memoized { mockk<IntegrationRepository>(relaxUnitFun = true) }
val themesUseCase by memoized { mockk<ThemesRepository>(relaxUnitFun = true) }
val view by memoized { mockk<WebView>(relaxUnitFun = true) }
val presenter by memoized { WebViewPresenterImpl(view, urlUseCase, authenticationUseCase, integrationUseCase) }
@ -58,7 +58,7 @@ object WebViewPresenterImplSpec : Spek({
describe("on get external auth on success") {
beforeEachTest {
coEvery { authenticationUseCase.retrieveExternalAuthentication() } returns "{\"access_token\":\"ABCDEFGH\",\"expires_in\":1800}"
coEvery { authenticationUseCase.retrieveExternalAuthentication(false) } returns "{\"access_token\":\"ABCDEFGH\",\"expires_in\":1800}"
presenter.onGetExternalAuth("externalAuthSetToken", false)
}
@ -69,7 +69,7 @@ object WebViewPresenterImplSpec : Spek({
describe("on get external auth on error") {
beforeEachTest {
coEvery { authenticationUseCase.retrieveExternalAuthentication() } throws Exception()
coEvery { authenticationUseCase.retrieveExternalAuthentication(false) } throws Exception()
presenter.onGetExternalAuth("externalAuthSetToken", false)
}

View File

@ -23,7 +23,6 @@ allprojects {
repositories {
google()
jcenter()
maven(url = Config.Repository.lokalize)
}
apply(plugin = "org.jlleitschuh.gradle.ktlint")

View File

@ -13,9 +13,6 @@ android {
}
dependencies {
implementation(project(":domain"))
implementation(project(":data"))
implementation(Config.Dependency.Kotlin.core)
implementation(Config.Dependency.Kotlin.coroutines)
@ -23,4 +20,14 @@ dependencies {
kapt(Config.Dependency.Google.daggerCompiler)
implementation(Config.Dependency.Square.retrofit)
implementation(Config.Dependency.Square.retrofitJacksonConverter)
implementation(Config.Dependency.Square.okhttp)
implementation(Config.Dependency.Square.okhttpInterceptor)
implementation(Config.Dependency.Misc.jackson)
testImplementation(Config.Dependency.Square.okhttpMockServer)
testImplementation(Config.Dependency.Testing.spek2Jvm)
testRuntimeOnly(Config.Dependency.Testing.spek2JUnit)
testImplementation(Config.Dependency.Testing.assertJ)
testImplementation(Config.Dependency.Testing.mockk)
}

View File

@ -1,7 +1,7 @@
package io.homeassistant.companion.android.common
import android.content.SharedPreferences
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.common.data.LocalStorage
class LocalStorageImpl(private val sharedPreferences: SharedPreferences) : LocalStorage {

View File

@ -1,19 +1,19 @@
package io.homeassistant.companion.android.common.dagger
import dagger.Component
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.themes.ThemesUseCase
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.themes.ThemesRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
@Component(dependencies = [DomainComponent::class])
@Component(modules = [DataModule::class])
interface AppComponent {
fun urlUseCase(): UrlUseCase
fun urlUseCase(): UrlRepository
fun authenticationUseCase(): AuthenticationUseCase
fun authenticationUseCase(): AuthenticationRepository
fun integrationUseCase(): IntegrationUseCase
fun integrationUseCase(): IntegrationRepository
fun themesUseCase(): ThemesUseCase
fun themesUseCase(): ThemesRepository
}

View File

@ -1,10 +1,10 @@
package io.homeassistant.companion.android.common.dagger
import dagger.Component
import io.homeassistant.companion.android.domain.authentication.AuthenticationRepository
import io.homeassistant.companion.android.domain.integration.IntegrationRepository
import io.homeassistant.companion.android.domain.themes.ThemesRepository
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.themes.ThemesRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
@Component(modules = [DataModule::class])
interface DataComponent {

View File

@ -4,19 +4,19 @@ import android.os.Build
import dagger.Binds
import dagger.Module
import dagger.Provides
import io.homeassistant.companion.android.data.HomeAssistantRetrofit
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.data.authentication.AuthenticationRepositoryImpl
import io.homeassistant.companion.android.data.authentication.AuthenticationService
import io.homeassistant.companion.android.data.integration.IntegrationRepositoryImpl
import io.homeassistant.companion.android.data.integration.IntegrationService
import io.homeassistant.companion.android.data.themes.ThemesRepositoryImpl
import io.homeassistant.companion.android.data.url.UrlRepositoryImpl
import io.homeassistant.companion.android.data.wifi.WifiHelper
import io.homeassistant.companion.android.domain.authentication.AuthenticationRepository
import io.homeassistant.companion.android.domain.integration.IntegrationRepository
import io.homeassistant.companion.android.domain.themes.ThemesRepository
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.HomeAssistantRetrofit
import io.homeassistant.companion.android.common.data.LocalStorage
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.authentication.impl.AuthenticationRepositoryImpl
import io.homeassistant.companion.android.common.data.authentication.impl.AuthenticationService
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.integration.impl.IntegrationRepositoryImpl
import io.homeassistant.companion.android.common.data.integration.impl.IntegrationService
import io.homeassistant.companion.android.common.data.themes.ThemesRepository
import io.homeassistant.companion.android.common.data.themes.ThemesRepositoryImpl
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.homeassistant.companion.android.common.data.url.UrlRepositoryImpl
import io.homeassistant.companion.android.common.data.wifi.WifiHelper
import javax.inject.Named
@Module(includes = [DataModule.Declaration::class])

View File

@ -1,19 +0,0 @@
package io.homeassistant.companion.android.common.dagger
import dagger.Component
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.themes.ThemesUseCase
import io.homeassistant.companion.android.domain.url.UrlUseCase
@Component(dependencies = [DataComponent::class], modules = [DomainModule::class])
interface DomainComponent {
fun urlUseCase(): UrlUseCase
fun authenticationUseCase(): AuthenticationUseCase
fun integrationUseCase(): IntegrationUseCase
fun themesUseCase(): ThemesUseCase
}

View File

@ -1,28 +0,0 @@
package io.homeassistant.companion.android.common.dagger
import dagger.Binds
import dagger.Module
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCaseImpl
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.IntegrationUseCaseImpl
import io.homeassistant.companion.android.domain.themes.ThemesUseCase
import io.homeassistant.companion.android.domain.themes.ThemesUseCaseImpl
import io.homeassistant.companion.android.domain.url.UrlUseCase
import io.homeassistant.companion.android.domain.url.UrlUseCaseImpl
@Module
interface DomainModule {
@Binds
fun bindUrlUseCase(useCaseImpl: UrlUseCaseImpl): UrlUseCase
@Binds
fun bindAuthenticationUseCase(useCaseImpl: AuthenticationUseCaseImpl): AuthenticationUseCase
@Binds
fun bindIntegrationUseCase(useCaseImpl: IntegrationUseCaseImpl): IntegrationUseCase
@Binds
fun bindThemesUseCase(useCaseImpl: ThemesUseCaseImpl): ThemesUseCase
}

View File

@ -1,7 +0,0 @@
package io.homeassistant.companion.android.common.dagger
import javax.inject.Scope
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class DomainScope

View File

@ -6,7 +6,7 @@ import android.content.Context
import android.net.wifi.WifiManager
import android.provider.Settings
import io.homeassistant.companion.android.common.LocalStorageImpl
import io.homeassistant.companion.android.common.wifi.WifiHelperImpl
import io.homeassistant.companion.android.common.data.wifi.WifiHelperImpl
class Graph(
private val application: Application,
@ -14,8 +14,6 @@ class Graph(
) {
lateinit var appComponent: AppComponent
private lateinit var dataComponent: DataComponent
private lateinit var domainComponent: DomainComponent
init {
buildComponent()
@ -23,8 +21,7 @@ class Graph(
@SuppressLint("HardwareIds")
private fun buildComponent() {
dataComponent = DaggerDataComponent
.builder()
appComponent = DaggerAppComponent.builder()
.dataModule(
DataModule(
LocalStorageImpl(
@ -52,18 +49,12 @@ class Graph(
)
),
WifiHelperImpl(application.getSystemService(Context.WIFI_SERVICE) as WifiManager),
Settings.Secure.getString(application.contentResolver, Settings.Secure.ANDROID_ID)
Settings.Secure.getString(
application.contentResolver,
Settings.Secure.ANDROID_ID
)
)
)
.build()
domainComponent = DaggerDomainComponent
.builder()
.dataComponent(dataComponent)
.build()
appComponent = DaggerAppComponent.builder()
.domainComponent(domainComponent)
.build()
}
}

View File

@ -1,10 +1,10 @@
package io.homeassistant.companion.android.data
package io.homeassistant.companion.android.common.data
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.PropertyNamingStrategy
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import kotlinx.coroutines.runBlocking

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data
package io.homeassistant.companion.android.common.data
interface LocalStorage {

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain
package io.homeassistant.companion.android.common.data
import java.net.MalformedURLException

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.authentication
package io.homeassistant.companion.android.common.data.authentication
import java.net.URL

View File

@ -0,0 +1,3 @@
package io.homeassistant.companion.android.common.data.authentication
class AuthorizationException : Exception()

View File

@ -0,0 +1,6 @@
package io.homeassistant.companion.android.common.data.authentication
enum class SessionState {
ANONYMOUS,
CONNECTED,
}

View File

@ -1,15 +1,15 @@
package io.homeassistant.companion.android.data.authentication
package io.homeassistant.companion.android.common.data.authentication.impl
import com.fasterxml.jackson.databind.ObjectMapper
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.domain.authentication.AuthenticationRepository
import io.homeassistant.companion.android.domain.authentication.SessionState
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.LocalStorage
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.authentication.AuthorizationException
import io.homeassistant.companion.android.common.data.authentication.SessionState
import io.homeassistant.companion.android.common.data.url.UrlRepository
import java.net.URL
import javax.inject.Inject
import javax.inject.Named
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.threeten.bp.Instant
class AuthenticationRepositoryImpl @Inject constructor(
private val authenticationService: AuthenticationService,
@ -35,7 +35,7 @@ class AuthenticationRepositoryImpl @Inject constructor(
saveSession(
Session(
it.accessToken,
Instant.now().epochSecond + it.expiresIn,
System.currentTimeMillis() / 1000 + it.expiresIn,
it.refreshToken!!,
it.tokenType
)
@ -116,7 +116,7 @@ class AuthenticationRepositoryImpl @Inject constructor(
val refreshedToken = it.body() ?: throw AuthorizationException()
val refreshSession = Session(
refreshedToken.accessToken,
Instant.now().epochSecond + refreshedToken.expiresIn,
System.currentTimeMillis() / 1000 + refreshedToken.expiresIn,
session.refreshToken,
refreshedToken.tokenType
)

View File

@ -1,5 +1,6 @@
package io.homeassistant.companion.android.data.authentication
package io.homeassistant.companion.android.common.data.authentication.impl
import io.homeassistant.companion.android.common.data.authentication.impl.entities.Token
import retrofit2.Response
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded

View File

@ -1,6 +1,4 @@
package io.homeassistant.companion.android.data.authentication
import org.threeten.bp.Instant
package io.homeassistant.companion.android.common.data.authentication.impl
data class Session(
val accessToken: String,
@ -11,5 +9,5 @@ data class Session(
fun isExpired() = expiresIn() < 0
fun expiresIn() = expiresTimestamp - Instant.now().epochSecond
fun expiresIn() = expiresTimestamp - System.currentTimeMillis() / 1000
}

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.authentication
package io.homeassistant.companion.android.common.data.authentication.impl.entities
import com.fasterxml.jackson.annotation.JsonProperty

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class DeviceRegistration(
val appVersion: String? = null,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
import java.util.Calendar

View File

@ -0,0 +1,3 @@
package io.homeassistant.companion.android.common.data.integration
class IntegrationException : Exception()

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
interface IntegrationRepository {

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class Panel(
val component_name: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class SensorRegistration<T>(
val uniqueId: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class Service(
val domain: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class ServiceData(
val description: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class ServiceFields(
val description: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class UpdateLocation(
val locationName: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.integration
package io.homeassistant.companion.android.common.data.integration
data class ZoneAttributes(
val hidden: Boolean,

View File

@ -1,25 +1,26 @@
package io.homeassistant.companion.android.data.integration
package io.homeassistant.companion.android.common.data.integration.impl
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.data.integration.entities.EntityResponse
import io.homeassistant.companion.android.data.integration.entities.FireEventRequest
import io.homeassistant.companion.android.data.integration.entities.GetConfigResponse
import io.homeassistant.companion.android.data.integration.entities.IntegrationRequest
import io.homeassistant.companion.android.data.integration.entities.RegisterDeviceRequest
import io.homeassistant.companion.android.data.integration.entities.SensorRequest
import io.homeassistant.companion.android.data.integration.entities.ServiceCallRequest
import io.homeassistant.companion.android.data.integration.entities.Template
import io.homeassistant.companion.android.data.integration.entities.UpdateLocationRequest
import io.homeassistant.companion.android.domain.authentication.AuthenticationRepository
import io.homeassistant.companion.android.domain.integration.DeviceRegistration
import io.homeassistant.companion.android.domain.integration.Entity
import io.homeassistant.companion.android.domain.integration.IntegrationRepository
import io.homeassistant.companion.android.domain.integration.Panel
import io.homeassistant.companion.android.domain.integration.SensorRegistration
import io.homeassistant.companion.android.domain.integration.Service
import io.homeassistant.companion.android.domain.integration.UpdateLocation
import io.homeassistant.companion.android.domain.integration.ZoneAttributes
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.LocalStorage
import io.homeassistant.companion.android.common.data.authentication.AuthenticationRepository
import io.homeassistant.companion.android.common.data.integration.DeviceRegistration
import io.homeassistant.companion.android.common.data.integration.Entity
import io.homeassistant.companion.android.common.data.integration.IntegrationException
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.common.data.integration.Panel
import io.homeassistant.companion.android.common.data.integration.SensorRegistration
import io.homeassistant.companion.android.common.data.integration.Service
import io.homeassistant.companion.android.common.data.integration.UpdateLocation
import io.homeassistant.companion.android.common.data.integration.ZoneAttributes
import io.homeassistant.companion.android.common.data.integration.impl.entities.EntityResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.FireEventRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.GetConfigResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.IntegrationRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.RegisterDeviceRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.SensorRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.ServiceCallRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.Template
import io.homeassistant.companion.android.common.data.integration.impl.entities.UpdateLocationRequest
import io.homeassistant.companion.android.common.data.url.UrlRepository
import javax.inject.Inject
import javax.inject.Named
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull

View File

@ -1,14 +1,14 @@
package io.homeassistant.companion.android.data.integration
package io.homeassistant.companion.android.common.data.integration.impl
import io.homeassistant.companion.android.data.integration.entities.DiscoveryInfoResponse
import io.homeassistant.companion.android.data.integration.entities.DomainResponse
import io.homeassistant.companion.android.data.integration.entities.EntityResponse
import io.homeassistant.companion.android.data.integration.entities.GetConfigResponse
import io.homeassistant.companion.android.data.integration.entities.IntegrationRequest
import io.homeassistant.companion.android.data.integration.entities.RegisterDeviceRequest
import io.homeassistant.companion.android.data.integration.entities.RegisterDeviceResponse
import io.homeassistant.companion.android.domain.integration.Panel
import io.homeassistant.companion.android.domain.integration.ZoneAttributes
import io.homeassistant.companion.android.common.data.integration.Panel
import io.homeassistant.companion.android.common.data.integration.ZoneAttributes
import io.homeassistant.companion.android.common.data.integration.impl.entities.DiscoveryInfoResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.DomainResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.EntityResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.GetConfigResponse
import io.homeassistant.companion.android.common.data.integration.impl.entities.IntegrationRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.RegisterDeviceRequest
import io.homeassistant.companion.android.common.data.integration.impl.entities.RegisterDeviceResponse
import okhttp3.HttpUrl
import okhttp3.ResponseBody
import retrofit2.Response

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class DiscoveryInfoResponse(
val baseUrl: String,

View File

@ -0,0 +1,8 @@
package io.homeassistant.companion.android.common.data.integration.impl.entities
import io.homeassistant.companion.android.common.data.integration.ServiceData
data class DomainResponse(
val domain: String,
val services: Map<String, ServiceData>
)

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
import java.util.Calendar

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class FireEventRequest(
val eventType: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class GetConfigResponse(
val latitude: Double,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
import com.fasterxml.jackson.annotation.JsonInclude

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
import com.fasterxml.jackson.annotation.JsonInclude

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class RegisterDeviceResponse(
var cloudhookUrl: String?,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
import com.fasterxml.jackson.annotation.JsonInclude

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class ServiceCallRequest(
val domain: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class Template(
val template: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.data.integration.entities
package io.homeassistant.companion.android.common.data.integration.impl.entities
data class UpdateLocationRequest(
val locationName: String,

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.themes
package io.homeassistant.companion.android.common.data.themes
interface ThemesRepository {
suspend fun getCurrentTheme(): String?

View File

@ -1,7 +1,6 @@
package io.homeassistant.companion.android.data.themes
package io.homeassistant.companion.android.common.data.themes
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.domain.themes.ThemesRepository
import io.homeassistant.companion.android.common.data.LocalStorage
import javax.inject.Inject
import javax.inject.Named

View File

@ -1,4 +1,4 @@
package io.homeassistant.companion.android.domain.url
package io.homeassistant.companion.android.common.data.url
import java.net.URL

View File

@ -1,9 +1,8 @@
package io.homeassistant.companion.android.data.url
package io.homeassistant.companion.android.common.data.url
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.data.wifi.WifiHelper
import io.homeassistant.companion.android.domain.MalformedHttpUrlException
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.LocalStorage
import io.homeassistant.companion.android.common.data.MalformedHttpUrlException
import io.homeassistant.companion.android.common.data.wifi.WifiHelper
import java.net.URL
import javax.inject.Inject
import javax.inject.Named

View File

@ -0,0 +1,5 @@
package io.homeassistant.companion.android.common.data.wifi
interface WifiHelper {
fun getWifiSsid(): String
}

View File

@ -1,9 +1,9 @@
package io.homeassistant.companion.android.common.wifi
package io.homeassistant.companion.android.common.data.wifi
import android.net.wifi.WifiManager
import io.homeassistant.companion.android.data.wifi.WifiHelper
import javax.inject.Inject
class WifiHelperImpl constructor(
class WifiHelperImpl @Inject constructor(
private val wifiManager: WifiManager
) : WifiHelper {
override fun getWifiSsid(): String {

View File

@ -1,6 +1,6 @@
package io.homeassistant.companion.android.data
package io.homeassistant.companion.android.common.data
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.url.UrlRepository
import java.io.IOException
import java.net.URL
import okhttp3.mockwebserver.MockResponse
@ -54,7 +54,7 @@ class HomeAssistantMockService<T>(private val c: Class<T>) {
fun takeRequest() = mockServer.takeRequest()
private fun getJsonFromFile(file: String): String {
val inputStreamResponse = this.javaClass.classLoader.getResourceAsStream(file)!!
val inputStreamResponse = this.javaClass.classLoader?.getResourceAsStream(file)!!
val size: Int
return try {
size = inputStreamResponse.available()

View File

@ -1,15 +1,15 @@
package io.homeassistant.companion.android.data.authentication
package io.homeassistant.companion.android.common.data.authentication.impl
import io.homeassistant.companion.android.data.LocalStorage
import io.homeassistant.companion.android.domain.authentication.SessionState
import io.homeassistant.companion.android.domain.url.UrlRepository
import io.homeassistant.companion.android.common.data.LocalStorage
import io.homeassistant.companion.android.common.data.authentication.AuthorizationException
import io.homeassistant.companion.android.common.data.authentication.SessionState
import io.homeassistant.companion.android.common.data.url.UrlRepository
import io.mockk.Called
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.coVerifyAll
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.verify
import java.net.URL
import kotlinx.coroutines.runBlocking
@ -17,15 +17,9 @@ import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.catchThrowable
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
import org.threeten.bp.Instant
object AuthenticationRepositoryImplSpec : Spek({
beforeEachTest {
mockkStatic(Instant::class)
every { Instant.now() } returns Instant.parse("2019-01-16T01:52:00.000Z")
}
describe("a repository") {
val localStorage by memoized { mockk<LocalStorage>(relaxUnitFun = true) }
val authenticationService by memoized { mockk<AuthenticationService>(relaxUnitFun = true) }
@ -183,7 +177,7 @@ object AuthenticationRepositoryImplSpec : Spek({
beforeEachTest {
coEvery { localStorage.getString("url") } returns "https://demo.home-assistant.io/"
coEvery { localStorage.getString("access_token") } returns "ABCDEFGH"
coEvery { localStorage.getLong("expires_date") } returns Instant.now().epochSecond - 1800
coEvery { localStorage.getLong("expires_date") } returns 1599276837 - 1800
coEvery { localStorage.getString("refresh_token") } returns "IJKLMNOPQRST"
coEvery { localStorage.getString("token_type") } returns "Bearer"
coEvery {

Some files were not shown because too many files have changed in this diff Show More