From bf29174a4a13484a14fbd7c4fa26e916dc0fd097 Mon Sep 17 00:00:00 2001 From: Justin Bassett Date: Fri, 31 Jul 2020 07:46:54 -0400 Subject: [PATCH] Minimal Android Flavor (#682) * Initial rip out of most of the Googley stuff. * Lokalise plugin and dependencies removed. They would be more useful if we had a large app with many translations. However, with most of our UI being a PWA the usefulness of it is very limited. * Both apps now build.... Yay * Formatting. * Tests and checks pass. * Make sure Github Actions are up to date. * Fix more unit tests. * ktLint * Use config class for gradle dependencies. --- .github/mock-google-services.json | 28 +++++++- .github/workflows/beta.yml | 9 ++- .github/workflows/pr.yml | 4 +- .github/workflows/release.yml | 8 +++ app/build.gradle.kts | 30 ++++++--- app/src/full/AndroidManifest.xml | 41 ++++++++++++ .../background/LocationBroadcastReceiver.kt | 63 ++---------------- .../android/launch/LaunchPresenterImpl.kt | 35 ++++++++++ .../android/notifications/MessagingService.kt | 6 +- .../notifications/NotificationAction.kt | 0 .../NotificationActionReceiver.kt | 0 .../NotificationContentReceiver.kt | 0 .../NotificationDeleteReceiver.kt | 0 .../android/notifications/ServiceComponent.kt | 0 .../MobileAppIntegrationPresenterImpl.kt | 31 +++++++++ .../android/sensors/AllSensorsUpdaterImpl.kt | 25 ++++++++ .../android/sensors/GeocodeSensorManager.kt | 4 +- app/src/main/AndroidManifest.xml | 29 --------- .../android/HomeAssistantApplication.kt | 8 +-- .../LocationBroadcastReceiverBase.kt | 64 +++++++++++++++++++ .../android/background/ReceiverComponent.kt | 2 +- .../android/launch/LaunchActivity.kt | 15 +---- ...resenterImpl.kt => LaunchPresenterBase.kt} | 31 ++------- .../android/onboarding/OnboardingActivity.kt | 11 ---- .../MobileAppIntegrationFragment.kt | 8 +-- .../MobileAppIntegrationPresenter.kt | 2 +- ...t => MobileAppIntegrationPresenterBase.kt} | 45 ++++++------- ...orsUpdaterImpl.kt => AllSensorsUpdater.kt} | 20 ++---- .../android/settings/SettingsActivity.kt | 11 ---- .../android/util/PermissionManager.kt | 3 +- .../android/webview/WebViewActivity.kt | 17 +---- .../background/LocationBroadcastReceiver.kt | 22 +++++++ .../android/launch/LaunchPresenterImpl.kt | 31 +++++++++ .../MobileAppIntegrationPresenterImpl.kt | 9 +++ .../android/sensors/AllSensorsUpdaterImpl.kt | 19 ++++++ .../android/launch/LaunchPresenterImplSpec.kt | 27 -------- .../MobileAppIntegrationPresenterImplSpec.kt | 36 ++--------- buildSrc/src/main/kotlin/Config.kt | 3 +- 38 files changed, 401 insertions(+), 296 deletions(-) create mode 100644 app/src/full/AndroidManifest.xml rename app/src/{main => full}/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt (77%) create mode 100644 app/src/full/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt rename app/src/{main => full}/java/io/homeassistant/companion/android/notifications/MessagingService.kt (99%) rename app/src/{main => full}/java/io/homeassistant/companion/android/notifications/NotificationAction.kt (100%) rename app/src/{main => full}/java/io/homeassistant/companion/android/notifications/NotificationActionReceiver.kt (100%) rename app/src/{main => full}/java/io/homeassistant/companion/android/notifications/NotificationContentReceiver.kt (100%) rename app/src/{main => full}/java/io/homeassistant/companion/android/notifications/NotificationDeleteReceiver.kt (100%) rename app/src/{main => full}/java/io/homeassistant/companion/android/notifications/ServiceComponent.kt (100%) create mode 100644 app/src/full/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationPresenterImpl.kt create mode 100644 app/src/full/java/io/homeassistant/companion/android/sensors/AllSensorsUpdaterImpl.kt rename app/src/{main => full}/java/io/homeassistant/companion/android/sensors/GeocodeSensorManager.kt (96%) create mode 100644 app/src/main/java/io/homeassistant/companion/android/background/LocationBroadcastReceiverBase.kt rename app/src/main/java/io/homeassistant/companion/android/launch/{LaunchPresenterImpl.kt => LaunchPresenterBase.kt} (54%) rename app/src/main/java/io/homeassistant/companion/android/onboarding/integration/{MobileAppIntegrationPresenterImpl.kt => MobileAppIntegrationPresenterBase.kt} (60%) rename app/src/main/java/io/homeassistant/companion/android/sensors/{AllSensorsUpdaterImpl.kt => AllSensorsUpdater.kt} (71%) create mode 100644 app/src/minimal/java/io/homeassistant/companion/android/background/LocationBroadcastReceiver.kt create mode 100644 app/src/minimal/java/io/homeassistant/companion/android/launch/LaunchPresenterImpl.kt create mode 100644 app/src/minimal/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationPresenterImpl.kt create mode 100644 app/src/minimal/java/io/homeassistant/companion/android/sensors/AllSensorsUpdaterImpl.kt 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