diff --git a/.github/mock-google-services.json b/.github/mock-google-services.json
index b6f9f58c9..78c8a0803 100644
--- a/.github/mock-google-services.json
+++ b/.github/mock-google-services.json
@@ -31,7 +31,33 @@
"current_key": "current_key"
}
]
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "mobilesdk_app_id",
+ "android_client_info": {
+ "package_name": "io.homeassistant.companion.android.minimal"
+ }
+ },
+ "api_key": [
+ {
+ "current_key": "current_key"
+ }
+ ]
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "mobilesdk_app_id",
+ "android_client_info": {
+ "package_name": "io.homeassistant.companion.android.minimal.debug"
+ }
+ },
+ "api_key": [
+ {
+ "current_key": "current_key"
+ }
+ ]
}
],
"configuration_version": "1"
-}
\ No newline at end of file
+}
diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml
index 3268ce5cd..746e92710 100644
--- a/.github/workflows/beta.yml
+++ b/.github/workflows/beta.yml
@@ -83,14 +83,19 @@ jobs:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
KEYSTORE_ALIAS_PASSWORD: ${{ secrets.KEYSTORE_ALIAS_PASSWORD }}
- run: ./gradlew appDistributionUploadRelease
+ run: ./gradlew appDistributionUploadFullRelease
- name: Deploy to Playstore Beta
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
KEYSTORE_ALIAS_PASSWORD: ${{ secrets.KEYSTORE_ALIAS_PASSWORD }}
- run: ./gradlew publishReleaseBundle
+ run: ./gradlew publishFullReleaseBundle
+
+ - name: Archive Release Build
+ uses: kittaakos/upload-artifact-as-is@v0
+ with:
+ path: ./app/build/outputs/apk/*/release/*-release.apk
release_draft:
name: Update Release Draft
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index 1d96b5ab0..771bd0cac 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -40,6 +40,6 @@ jobs:
run: ./gradlew assembleDebug
- name: Archive Debug Build
- uses: actions/upload-artifact@v2
+ uses: kittaakos/upload-artifact-as-is@v0
with:
- path: ./app/build/outputs/apk/debug/app-debug.apk
+ path: ./app/build/outputs/apk/*/debug/*-debug.apk
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 4ae51c650..115fdff2a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -97,3 +97,11 @@ jobs:
KEYSTORE_ALIAS: ${{ secrets.KEYSTORE_ALIAS }}
KEYSTORE_ALIAS_PASSWORD: ${{ secrets.KEYSTORE_ALIAS_PASSWORD }}
run: ./gradlew promoteArtifact --from-track beta --promote-track production
+
+ - name: Upload files to a GitHub release page
+ uses: svenstaro/upload-release-action@2.0.0
+ with:
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
+ file: ./app/build/outputs/apk/*/release/*-release.apk
+ file_glob: true
+ tag: ${{ github.ref }}
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index f2cd6bdfe..fda8e123d 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -72,6 +72,17 @@ android {
signingConfig = signingConfigs.getByName("release")
}
}
+ flavorDimensions("version")
+ productFlavors {
+ create("minimal") {
+ applicationIdSuffix = ".minimal"
+ versionNameSuffix = "-minimal"
+ }
+ create("full") {
+ applicationIdSuffix = ""
+ versionNameSuffix = "-full"
+ }
+ }
testOptions {
unitTests.apply { isReturnDefaultValues = true }
@@ -118,18 +129,17 @@ dependencies {
implementation(Config.Dependency.AndroidX.roomKtx)
kapt(Config.Dependency.AndroidX.roomCompiler)
- implementation(Config.Dependency.Misc.threeTenAbp) {
- exclude(group = "org.threeten")
- }
-
- implementation(Config.Dependency.Misc.lokalize)
implementation(Config.Dependency.Misc.jackson)
+ implementation(Config.Dependency.Square.okhttp)
- implementation(Config.Dependency.Play.location)
- implementation(Config.Dependency.Firebase.core)
- implementation(Config.Dependency.Firebase.iid)
- implementation(Config.Dependency.Firebase.messaging)
- implementation(Config.Dependency.Firebase.crashlytics)
+// "fullImplementation"(Config.Dependency.Misc.lokalize)
+
+ "fullImplementation"(Config.Dependency.Play.location)
+ "fullImplementation"(Config.Dependency.Firebase.core)
+ "fullImplementation"(Config.Dependency.Firebase.iid)
+ "fullImplementation"(Config.Dependency.Firebase.messaging)
+ "fullImplementation"(Config.Dependency.Firebase.crashlytics)
+ "fullImplementation"(Config.Dependency.Kotlin.coroutinesPlayServices)
implementation(Config.Dependency.AndroidX.workManager)
implementation(Config.Dependency.AndroidX.biometric)
diff --git a/app/src/full/AndroidManifest.xml b/app/src/full/AndroidManifest.xml
new file mode 100644
index 000000000..39ddabace
--- /dev/null
+++ b/app/src/full/AndroidManifest.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt b/app/src/full/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt
similarity index 77%
rename from app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt
rename to app/src/full/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt
index 82af4ee17..379f6da81 100644
--- a/app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt
+++ b/app/src/full/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt
@@ -1,7 +1,6 @@
package io.homeassistant.companion.android.background
import android.app.PendingIntent
-import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.location.Location
@@ -14,64 +13,14 @@ import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
-import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
-import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import io.homeassistant.companion.android.domain.integration.UpdateLocation
import io.homeassistant.companion.android.util.PermissionManager
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
-class LocationBroadcastReceiver : BroadcastReceiver() {
+class LocationBroadcastReceiver : LocationBroadcastReceiverBase() {
- companion object {
- const val MINIMUM_ACCURACY = 200
-
- const val ACTION_REQUEST_LOCATION_UPDATES =
- "io.homeassistant.companion.android.background.REQUEST_UPDATES"
- const val ACTION_REQUEST_ACCURATE_LOCATION_UPDATE =
- "io.homeassistant.companion.android.background.REQUEST_ACCURATE_UPDATE"
- const val ACTION_PROCESS_LOCATION =
- "io.homeassistant.companion.android.background.PROCESS_UPDATES"
- const val ACTION_PROCESS_GEO =
- "io.homeassistant.companion.android.background.PROCESS_GEOFENCE"
-
- private const val TAG = "LocBroadcastReceiver"
- }
-
- @Inject
- lateinit var integrationUseCase: IntegrationUseCase
-
- private val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())
-
- override fun onReceive(context: Context, intent: Intent) {
- ensureInjected(context)
-
- when (intent.action) {
- Intent.ACTION_BOOT_COMPLETED,
- ACTION_REQUEST_LOCATION_UPDATES -> setupLocationTracking(context)
- ACTION_PROCESS_LOCATION -> handleLocationUpdate(intent)
- ACTION_PROCESS_GEO -> handleGeoUpdate(context, intent)
- ACTION_REQUEST_ACCURATE_LOCATION_UPDATE -> requestSingleAccurateLocation(context)
- else -> Log.w(TAG, "Unknown intent action: ${intent.action}!")
- }
- }
-
- private fun ensureInjected(context: Context) {
- if (context.applicationContext is GraphComponentAccessor) {
- DaggerReceiverComponent.builder()
- .appComponent((context.applicationContext as GraphComponentAccessor).appComponent)
- .build()
- .inject(this)
- } else {
- throw Exception("Application Context passed is not of our application!")
- }
- }
-
- private fun setupLocationTracking(context: Context) {
+ override fun setupLocationTracking(context: Context) {
if (!PermissionManager.checkLocationPermission(context)) {
Log.w(TAG, "Not starting location reporting because of permissions.")
return
@@ -140,7 +89,7 @@ class LocationBroadcastReceiver : BroadcastReceiver() {
}
}
- private fun handleLocationUpdate(intent: Intent) {
+ override fun handleLocationUpdate(intent: Intent) {
Log.d(TAG, "Received location update.")
LocationResult.extractResult(intent)?.lastLocation?.let {
if (it.accuracy > MINIMUM_ACCURACY) {
@@ -151,7 +100,7 @@ class LocationBroadcastReceiver : BroadcastReceiver() {
}
}
- private fun handleGeoUpdate(context: Context, intent: Intent) {
+ override fun handleGeoUpdate(context: Context, intent: Intent) {
Log.d(TAG, "Received geofence update.")
val geofencingEvent = GeofencingEvent.fromIntent(intent)
if (geofencingEvent.hasError()) {
@@ -197,7 +146,7 @@ class LocationBroadcastReceiver : BroadcastReceiver() {
}
private fun getLocationUpdateIntent(context: Context, isGeofence: Boolean): PendingIntent {
- val intent = Intent(context, LocationBroadcastReceiver::class.java)
+ val intent = Intent(context, LocationBroadcastReceiverBase::class.java)
intent.action = if (isGeofence) ACTION_PROCESS_GEO else ACTION_PROCESS_LOCATION
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
@@ -233,7 +182,7 @@ class LocationBroadcastReceiver : BroadcastReceiver() {
return geofencingRequestBuilder.build()
}
- private fun requestSingleAccurateLocation(context: Context) {
+ override fun requestSingleAccurateLocation(context: Context) {
if (!PermissionManager.checkLocationPermission(context)) {
Log.w(TAG, "Not getting single accurate location because of permissions.")
return
diff --git a/app/src/full/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt b/app/src/full/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt
new file mode 100644
index 000000000..7d424ce7e
--- /dev/null
+++ b/app/src/full/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt
@@ -0,0 +1,35 @@
+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 javax.inject.Inject
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.tasks.await
+
+class LaunchPresenterImpl @Inject constructor(
+ view: LaunchView,
+ authenticationUseCase: AuthenticationUseCase,
+ integrationUseCase: IntegrationUseCase
+) : 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(),
+ pushToken = FirebaseInstanceId.getInstance().instanceId.await().token
+ )
+ } catch (e: Exception) {
+ Log.e(TAG, "Issue updating Registration", e)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/io/homeassistant/companion/android/notifications/MessagingService.kt b/app/src/full/java/io/homeassistant/companion/android/notifications/MessagingService.kt
similarity index 99%
rename from app/src/main/java/io/homeassistant/companion/android/notifications/MessagingService.kt
rename to app/src/full/java/io/homeassistant/companion/android/notifications/MessagingService.kt
index dc7f1ebf4..d9892b391 100644
--- a/app/src/main/java/io/homeassistant/companion/android/notifications/MessagingService.kt
+++ b/app/src/full/java/io/homeassistant/companion/android/notifications/MessagingService.kt
@@ -18,7 +18,7 @@ import androidx.core.text.HtmlCompat
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import io.homeassistant.companion.android.R
-import io.homeassistant.companion.android.background.LocationBroadcastReceiver
+import io.homeassistant.companion.android.background.LocationBroadcastReceiverBase
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.authentication.AuthenticationUseCase
import io.homeassistant.companion.android.domain.authentication.SessionState
@@ -106,8 +106,8 @@ class MessagingService : FirebaseMessagingService() {
}
private fun requestAccurateLocationUpdate() {
- val intent = Intent(this, LocationBroadcastReceiver::class.java)
- intent.action = LocationBroadcastReceiver.ACTION_REQUEST_ACCURATE_LOCATION_UPDATE
+ val intent = Intent(this, LocationBroadcastReceiverBase::class.java)
+ intent.action = LocationBroadcastReceiverBase.ACTION_REQUEST_ACCURATE_LOCATION_UPDATE
sendBroadcast(intent)
}
diff --git a/app/src/main/java/io/homeassistant/companion/android/notifications/NotificationAction.kt b/app/src/full/java/io/homeassistant/companion/android/notifications/NotificationAction.kt
similarity index 100%
rename from app/src/main/java/io/homeassistant/companion/android/notifications/NotificationAction.kt
rename to app/src/full/java/io/homeassistant/companion/android/notifications/NotificationAction.kt
diff --git a/app/src/main/java/io/homeassistant/companion/android/notifications/NotificationActionReceiver.kt b/app/src/full/java/io/homeassistant/companion/android/notifications/NotificationActionReceiver.kt
similarity index 100%
rename from app/src/main/java/io/homeassistant/companion/android/notifications/NotificationActionReceiver.kt
rename to app/src/full/java/io/homeassistant/companion/android/notifications/NotificationActionReceiver.kt
diff --git a/app/src/main/java/io/homeassistant/companion/android/notifications/NotificationContentReceiver.kt b/app/src/full/java/io/homeassistant/companion/android/notifications/NotificationContentReceiver.kt
similarity index 100%
rename from app/src/main/java/io/homeassistant/companion/android/notifications/NotificationContentReceiver.kt
rename to app/src/full/java/io/homeassistant/companion/android/notifications/NotificationContentReceiver.kt
diff --git a/app/src/main/java/io/homeassistant/companion/android/notifications/NotificationDeleteReceiver.kt b/app/src/full/java/io/homeassistant/companion/android/notifications/NotificationDeleteReceiver.kt
similarity index 100%
rename from app/src/main/java/io/homeassistant/companion/android/notifications/NotificationDeleteReceiver.kt
rename to app/src/full/java/io/homeassistant/companion/android/notifications/NotificationDeleteReceiver.kt
diff --git a/app/src/main/java/io/homeassistant/companion/android/notifications/ServiceComponent.kt b/app/src/full/java/io/homeassistant/companion/android/notifications/ServiceComponent.kt
similarity index 100%
rename from app/src/main/java/io/homeassistant/companion/android/notifications/ServiceComponent.kt
rename to app/src/full/java/io/homeassistant/companion/android/notifications/ServiceComponent.kt
diff --git a/app/src/full/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationPresenterImpl.kt b/app/src/full/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationPresenterImpl.kt
new file mode 100644
index 000000000..957bddad4
--- /dev/null
+++ b/app/src/full/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationPresenterImpl.kt
@@ -0,0 +1,31 @@
+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 javax.inject.Inject
+import kotlinx.coroutines.tasks.await
+
+class MobileAppIntegrationPresenterImpl @Inject constructor(
+ view: MobileAppIntegrationView,
+ integrationUseCase: IntegrationUseCase
+) : MobileAppIntegrationPresenterBase(
+ view, integrationUseCase
+) {
+ override suspend fun createRegistration(simple: Boolean): DeviceRegistration {
+ val registration = super.createRegistration(simple)
+
+ if (!simple) {
+ try {
+ val instanceId = FirebaseInstanceId.getInstance().instanceId.await()
+ registration.pushToken = instanceId.token
+ } catch (e: Exception) {
+ Log.e(TAG, "Unable to get firebase token.", e)
+ throw e
+ }
+ }
+
+ return registration
+ }
+}
diff --git a/app/src/full/java/io/homeassistant/companion/android/sensors/AllSensorsUpdaterImpl.kt b/app/src/full/java/io/homeassistant/companion/android/sensors/AllSensorsUpdaterImpl.kt
new file mode 100644
index 000000000..6dd246331
--- /dev/null
+++ b/app/src/full/java/io/homeassistant/companion/android/sensors/AllSensorsUpdaterImpl.kt
@@ -0,0 +1,25 @@
+package io.homeassistant.companion.android.sensors
+
+import android.content.Context
+import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
+import io.homeassistant.companion.android.util.PermissionManager
+
+class AllSensorsUpdaterImpl(
+ integrationUseCase: IntegrationUseCase,
+ appContext: Context
+) :
+ AllSensorsUpdater(integrationUseCase, appContext) {
+
+ override suspend fun getManagers(): List {
+ val sensorManagers = mutableListOf(
+ BatterySensorManager(),
+ NetworkSensorManager()
+ )
+
+ if (integrationUseCase.isBackgroundTrackingEnabled() && PermissionManager.checkLocationPermission(appContext)) {
+ sensorManagers.add(GeocodeSensorManager())
+ }
+
+ return sensorManagers
+ }
+}
diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt b/app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt
similarity index 96%
rename from app/src/main/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt
rename to app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt
index 3768c9867..7fc2f9def 100644
--- a/app/src/main/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt
+++ b/app/src/full/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt
@@ -5,7 +5,7 @@ import android.location.Geocoder
import android.util.Log
import com.google.android.gms.location.LocationServices
import com.google.android.gms.tasks.Tasks
-import io.homeassistant.companion.android.background.LocationBroadcastReceiver
+import io.homeassistant.companion.android.background.LocationBroadcastReceiverBase
import io.homeassistant.companion.android.domain.integration.Sensor
import io.homeassistant.companion.android.domain.integration.SensorRegistration
import io.homeassistant.companion.android.util.PermissionManager
@@ -47,7 +47,7 @@ class GeocodeSensorManager : SensorManager {
try {
val locApi = LocationServices.getFusedLocationProviderClient(context)
Tasks.await(locApi.lastLocation)?.let {
- if (it.accuracy > LocationBroadcastReceiver.MINIMUM_ACCURACY)
+ if (it.accuracy > LocationBroadcastReceiverBase.MINIMUM_ACCURACY)
return null
Geocoder(context)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3b8719d54..c3a668453 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -71,21 +71,6 @@
-
-
-
-
-
-
@@ -111,20 +96,6 @@
android:name=".settings.SettingsActivity"
android:parentActivityName=".webview.WebViewActivity" />
-
-
-
-
-
-
-
-
diff --git a/app/src/main/java/io/homeassistant/companion/android/HomeAssistantApplication.kt b/app/src/main/java/io/homeassistant/companion/android/HomeAssistantApplication.kt
index 62f6c8843..213570da6 100644
--- a/app/src/main/java/io/homeassistant/companion/android/HomeAssistantApplication.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/HomeAssistantApplication.kt
@@ -3,24 +3,18 @@ package io.homeassistant.companion.android
import android.app.Application
import android.content.Intent
import android.content.IntentFilter
-import com.jakewharton.threetenabp.AndroidThreeTen
-import com.lokalise.sdk.Lokalise
import io.homeassistant.companion.android.common.dagger.AppComponent
import io.homeassistant.companion.android.common.dagger.Graph
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.sensors.ChargingBroadcastReceiver
-class HomeAssistantApplication : Application(), GraphComponentAccessor {
+open class HomeAssistantApplication : Application(), GraphComponentAccessor {
lateinit var graph: Graph
override fun onCreate() {
super.onCreate()
- Lokalise.init(this, "16ff9dee3da7a3cba0d998a4e58fa99e92ba089d", "145814835dd655bc5ab0d0.36753359")
- Lokalise.updateTranslations()
-
- AndroidThreeTen.init(this)
graph = Graph(this, 0)
// This will cause the sensor to be updated every time the OS broadcasts that a cable was plugged/unplugged.
diff --git a/app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiverBase.kt b/app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiverBase.kt
new file mode 100644
index 000000000..75042b28d
--- /dev/null
+++ b/app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiverBase.kt
@@ -0,0 +1,64 @@
+package io.homeassistant.companion.android.background
+
+import android.content.BroadcastReceiver
+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.domain.integration.IntegrationUseCase
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+
+abstract class LocationBroadcastReceiverBase : BroadcastReceiver() {
+
+ companion object {
+ const val MINIMUM_ACCURACY = 200
+
+ const val ACTION_REQUEST_LOCATION_UPDATES =
+ "io.homeassistant.companion.android.background.REQUEST_UPDATES"
+ const val ACTION_REQUEST_ACCURATE_LOCATION_UPDATE =
+ "io.homeassistant.companion.android.background.REQUEST_ACCURATE_UPDATE"
+ const val ACTION_PROCESS_LOCATION =
+ "io.homeassistant.companion.android.background.PROCESS_UPDATES"
+ const val ACTION_PROCESS_GEO =
+ "io.homeassistant.companion.android.background.PROCESS_GEOFENCE"
+
+ internal const val TAG = "LocBroadcastReceiver"
+ }
+
+ @Inject
+ lateinit var integrationUseCase: IntegrationUseCase
+
+ internal val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())
+
+ override fun onReceive(context: Context, intent: Intent) {
+ ensureInjected(context)
+
+ when (intent.action) {
+ Intent.ACTION_BOOT_COMPLETED,
+ ACTION_REQUEST_LOCATION_UPDATES -> setupLocationTracking(context)
+ ACTION_PROCESS_LOCATION -> handleLocationUpdate(intent)
+ ACTION_PROCESS_GEO -> handleGeoUpdate(context, intent)
+ ACTION_REQUEST_ACCURATE_LOCATION_UPDATE -> requestSingleAccurateLocation(context)
+ else -> Log.w(TAG, "Unknown intent action: ${intent.action}!")
+ }
+ }
+
+ private fun ensureInjected(context: Context) {
+ if (context.applicationContext is GraphComponentAccessor) {
+ DaggerReceiverComponent.builder()
+ .appComponent((context.applicationContext as GraphComponentAccessor).appComponent)
+ .build()
+ .inject(this)
+ } else {
+ throw Exception("Application Context passed is not of our application!")
+ }
+ }
+
+ internal abstract fun setupLocationTracking(context: Context)
+ internal abstract fun handleLocationUpdate(intent: Intent)
+ internal abstract fun handleGeoUpdate(context: Context, intent: Intent)
+ internal abstract fun requestSingleAccurateLocation(context: Context)
+}
diff --git a/app/src/main/java/io/homeassistant/companion/android/background/ReceiverComponent.kt b/app/src/main/java/io/homeassistant/companion/android/background/ReceiverComponent.kt
index 70b3feb6d..e72a8b47e 100644
--- a/app/src/main/java/io/homeassistant/companion/android/background/ReceiverComponent.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/background/ReceiverComponent.kt
@@ -6,5 +6,5 @@ import io.homeassistant.companion.android.common.dagger.AppComponent
@Component(dependencies = [AppComponent::class])
interface ReceiverComponent {
- fun inject(receiver: LocationBroadcastReceiver)
+ fun inject(receiver: LocationBroadcastReceiverBase)
}
diff --git a/app/src/main/java/io/homeassistant/companion/android/launch/LaunchActivity.kt b/app/src/main/java/io/homeassistant/companion/android/launch/LaunchActivity.kt
index b39315815..c12543f29 100644
--- a/app/src/main/java/io/homeassistant/companion/android/launch/LaunchActivity.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/launch/LaunchActivity.kt
@@ -1,11 +1,7 @@
package io.homeassistant.companion.android.launch
-import android.content.Context
import android.os.Bundle
-import android.view.MenuInflater
import androidx.appcompat.app.AppCompatActivity
-import com.lokalise.sdk.LokaliseContextWrapper
-import com.lokalise.sdk.menu_inflater.LokaliseMenuInflater
import io.homeassistant.companion.android.DaggerPresenterComponent
import io.homeassistant.companion.android.PresenterModule
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
@@ -15,7 +11,8 @@ import javax.inject.Inject
class LaunchActivity : AppCompatActivity(), LaunchView {
- @Inject lateinit var presenter: LaunchPresenter
+ @Inject
+ lateinit var presenter: LaunchPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -48,12 +45,4 @@ class LaunchActivity : AppCompatActivity(), LaunchView {
presenter.onFinish()
super.onDestroy()
}
-
- override fun attachBaseContext(newBase: Context) {
- super.attachBaseContext(LokaliseContextWrapper.wrap(newBase))
- }
-
- override fun getMenuInflater(): MenuInflater {
- return LokaliseMenuInflater(this)
- }
}
diff --git a/app/src/main/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt b/app/src/main/java/io/homeassistant/companion/android/launch/LaunchPresenterBase.kt
similarity index 54%
rename from app/src/main/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt
rename to app/src/main/java/io/homeassistant/companion/android/launch/LaunchPresenterBase.kt
index 7af103692..90d145fee 100644
--- a/app/src/main/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/launch/LaunchPresenterBase.kt
@@ -1,31 +1,25 @@
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.authentication.SessionState
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
-import java.lang.Exception
-import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
-class LaunchPresenterImpl @Inject constructor(
+abstract class LaunchPresenterBase(
private val view: LaunchView,
private val authenticationUseCase: AuthenticationUseCase,
- private val integrationUseCase: IntegrationUseCase
+ internal val integrationUseCase: IntegrationUseCase
) : LaunchPresenter {
companion object {
const val TAG = "LaunchPresenter"
}
- private val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())
+ internal val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main + Job())
override fun onViewReady() {
mainScope.launch {
@@ -50,22 +44,5 @@ class LaunchPresenterImpl @Inject constructor(
}
// TODO: This should probably go in settings?
- private fun resyncRegistration() {
- FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
- mainScope.launch {
- try {
- integrationUseCase.updateRegistration(
- "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})",
- null,
- Build.MANUFACTURER ?: "UNKNOWN",
- Build.MODEL ?: "UNKNOWN",
- Build.VERSION.SDK_INT.toString(),
- pushToken = it.token
- )
- } catch (e: Exception) {
- Log.e(TAG, "Issue updating Registration", e)
- }
- }
- }
- }
+ internal abstract fun resyncRegistration()
}
diff --git a/app/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingActivity.kt b/app/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingActivity.kt
index 9337ccae1..5e5f06643 100644
--- a/app/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingActivity.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/onboarding/OnboardingActivity.kt
@@ -3,10 +3,7 @@ package io.homeassistant.companion.android.onboarding
import android.content.Context
import android.content.Intent
import android.os.Bundle
-import android.view.MenuInflater
import androidx.appcompat.app.AppCompatActivity
-import com.lokalise.sdk.LokaliseContextWrapper
-import com.lokalise.sdk.menu_inflater.LokaliseMenuInflater
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.onboarding.authentication.AuthenticationFragment
import io.homeassistant.companion.android.onboarding.authentication.AuthenticationListener
@@ -104,14 +101,6 @@ class OnboardingActivity : AppCompatActivity(), DiscoveryListener, ManualSetupLi
startWebView()
}
- override fun attachBaseContext(newBase: Context) {
- super.attachBaseContext(LokaliseContextWrapper.wrap(newBase))
- }
-
- override fun getMenuInflater(): MenuInflater {
- return LokaliseMenuInflater(this)
- }
-
private fun startWebView() {
startActivity(WebViewActivity.newInstance(this))
finish()
diff --git a/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt b/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt
index 681febbfd..a305fb337 100644
--- a/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt
@@ -67,7 +67,7 @@ class MobileAppIntegrationFragment : Fragment(), MobileAppIntegrationView {
return inflater.inflate(R.layout.fragment_mobile_app_integration, container, false).apply {
viewFlipper = this.findViewById(R.id.view_flipper)
findViewById