Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import io.homeassistant.companion.android.common.R as commonR
import io.homeassistant.companion.android.common.compose.theme.HATheme
import io.homeassistant.companion.android.sensors.SensorReceiver
import io.homeassistant.companion.android.sensors.SensorWorker
import io.homeassistant.companion.android.util.ChangeLog
import io.homeassistant.companion.android.util.CheckLocationDisabledUseCase
import io.homeassistant.companion.android.util.PLAY_SERVICES_FLAVOR_DOC_URL
import io.homeassistant.companion.android.util.PlayServicesAvailability
import io.homeassistant.companion.android.util.compose.HAApp
Expand Down Expand Up @@ -57,6 +59,12 @@ class LaunchActivity : AppCompatActivity() {
@Inject
internal lateinit var playServicesAvailability: PlayServicesAvailability

@Inject
internal lateinit var checkLocationDisabled: CheckLocationDisabledUseCase

@Inject
internal lateinit var changeLog: ChangeLog

/**
* Represents deep link actions that can be passed to [LaunchActivity] to navigate to specific destinations.
*/
Expand Down Expand Up @@ -151,6 +159,8 @@ class LaunchActivity : AppCompatActivity() {
SensorWorker.start(this)
lifecycleScope.launch {
WebsocketManager.start(this@LaunchActivity)
checkLocationDisabled()
changeLog.showChangeLog(this@LaunchActivity, forceShow = false)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ class SsidFragment : Fragment() {
arrayOf(
getString(commonR.string.manage_ssids_wifi),
),
showAsNotification = false,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package io.homeassistant.companion.android.util

import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import io.homeassistant.companion.android.common.R
import io.homeassistant.companion.android.common.data.servers.ServerManager
import io.homeassistant.companion.android.common.util.DisabledLocationHandler
import io.homeassistant.companion.android.sensors.SensorReceiver
import javax.inject.Inject
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

/**
* Checks whether location is disabled while features that depend on it are active,
* and shows or removes a system notification accordingly.
*
* Features that depend on location include SSID-based home network detection and
* any enabled sensor that requires location permissions.
Comment thread
TimoPtr marked this conversation as resolved.
*/
class CheckLocationDisabledUseCase @Inject constructor(
@ApplicationContext private val context: Context,
private val serverManager: ServerManager,
) {

/**
* Evaluates whether location is required by any active feature and manages
* the location-disabled notification.
*/
suspend operator fun invoke() = withContext(Dispatchers.Default) {
if (DisabledLocationHandler.isLocationEnabled(context)) {
DisabledLocationHandler.removeLocationDisabledWarning(context)
return@withContext
}

val settingsRequiringLocation = mutableListOf<String>()

if (isSsidUsed()) {
settingsRequiringLocation.add(context.getString(R.string.pref_connection_homenetwork))
}

for (manager in SensorReceiver.MANAGERS) {
for (sensor in manager.getAvailableSensors(context)) {
if (!manager.isEnabled(context, sensor)) continue

val permissions = manager.requiredPermissions(context, sensor.id)
val needsLocation =
DisabledLocationHandler.containsLocationPermission(
permissions,
fineLocation = true,
) ||
DisabledLocationHandler.containsLocationPermission(
permissions,
fineLocation = false,
)

if (needsLocation) {
settingsRequiringLocation.add(context.getString(sensor.name))
}
}
}

if (settingsRequiringLocation.isNotEmpty()) {
DisabledLocationHandler.showLocationDisabledNotification(
context,
settingsRequiringLocation.toTypedArray(),
)
} else {
DisabledLocationHandler.removeLocationDisabledWarning(context)
}
}

private suspend fun isSsidUsed(): Boolean =
serverManager.getServer()?.connection?.internalSsids?.isNotEmpty() == true
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package io.homeassistant.companion.android.util.compose

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import androidx.activity.compose.LocalActivity
import androidx.compose.runtime.Composable
import androidx.fragment.app.FragmentActivity
Expand Down Expand Up @@ -150,15 +148,7 @@ private fun openSystemLocationSettings(activity: Activity) {
if (DisabledLocationHandler.isLocationEnabled(activity)) {
return
}
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
}
if (intent.resolveActivity(activity.packageManager) == null) {
intent.action = Settings.ACTION_SETTINGS
}
activity.startActivity(intent)
activity.startActivity(DisabledLocationHandler.locationSettingsIntent(activity))
}

private fun showServerSwitcher(activity: Activity?, onServerSelected: (Int) -> Unit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ import io.homeassistant.companion.android.common.data.keychain.NamedKeyChain
import io.homeassistant.companion.android.common.data.prefs.NightModeTheme
import io.homeassistant.companion.android.common.data.servers.ServerManager
import io.homeassistant.companion.android.common.util.AppVersionProvider
import io.homeassistant.companion.android.common.util.DisabledLocationHandler
import io.homeassistant.companion.android.common.util.FailFast
import io.homeassistant.companion.android.common.util.GestureAction
import io.homeassistant.companion.android.common.util.GestureDirection
Expand Down Expand Up @@ -138,6 +137,7 @@ import io.homeassistant.companion.android.settings.SettingsActivity
import io.homeassistant.companion.android.settings.server.ServerChooserFragment
import io.homeassistant.companion.android.themes.NightModeManager
import io.homeassistant.companion.android.util.ChangeLog
import io.homeassistant.companion.android.util.CheckLocationDisabledUseCase
import io.homeassistant.companion.android.util.DataUriDownloadManager
import io.homeassistant.companion.android.util.LifecycleHandler
import io.homeassistant.companion.android.util.OnSwipeListener
Expand Down Expand Up @@ -263,6 +263,9 @@ class WebViewActivity :
@Inject
lateinit var dataUriDownloadManager: DataUriDownloadManager

@Inject
lateinit var checkLocationDisabled: CheckLocationDisabledUseCase

@Inject
lateinit var dataSourceFactory: DataSource.Factory

Expand Down Expand Up @@ -1354,7 +1357,7 @@ class WebViewActivity :
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}

checkAndWarnForDisabledLocation()
checkLocationDisabled()
changeLog.showChangeLog(this@WebViewActivity, false)
}

Expand All @@ -1378,40 +1381,6 @@ class WebViewActivity :
if (!isFinishing && !isRelaunching) SensorReceiver.updateAllSensors(this)
}

private suspend fun checkAndWarnForDisabledLocation() {
var showLocationDisabledWarning = false
val settingsWithLocationPermissions = mutableListOf<String>()
if (!DisabledLocationHandler.isLocationEnabled(this) && presenter.isSsidUsed()) {
showLocationDisabledWarning = true
settingsWithLocationPermissions.add(getString(commonR.string.pref_connection_homenetwork))
}
for (manager in SensorReceiver.MANAGERS) {
for (basicSensor in manager.getAvailableSensors(this)) {
if (manager.isEnabled(this, basicSensor)) {
val permissions = manager.requiredPermissions(this, basicSensor.id)

val fineLocation = DisabledLocationHandler.containsLocationPermission(permissions, true)
val coarseLocation = DisabledLocationHandler.containsLocationPermission(permissions, false)

if ((fineLocation || coarseLocation)) {
if (!DisabledLocationHandler.isLocationEnabled(this)) showLocationDisabledWarning = true
settingsWithLocationPermissions.add(getString(basicSensor.name))
}
}
}
}

if (showLocationDisabledWarning) {
DisabledLocationHandler.showLocationDisabledWarnDialog(
this@WebViewActivity,
settingsWithLocationPermissions.toTypedArray(),
true,
)
} else {
DisabledLocationHandler.removeLocationDisabledWarning(this@WebViewActivity)
}
}

fun exoPlayHls(json: JsonObject) {
val payload = json["payload"]?.jsonObjectOrNull()
val uri = payload?.getStringOrNull("url")?.toUri() ?: return
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package io.homeassistant.companion.android.webview.insecure

import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -104,15 +102,7 @@ class BlockInsecureFragment : Fragment() {
retry()
return
}
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
}
if (intent.resolveActivity(requireContext().packageManager) == null) {
intent.action = Settings.ACTION_SETTINGS
}
startActivity(intent)
startActivity(DisabledLocationHandler.locationSettingsIntent(requireContext()))
}

private fun retry() {
Expand Down
Loading
Loading