Skip to content

Commit fd67cac

Browse files
committed
Fix lint warning: check permission before using location API
1 parent de3874e commit fd67cac

File tree

6 files changed

+83
-5
lines changed

6 files changed

+83
-5
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package im.vector.app.core.utils
9+
10+
import android.content.Context
11+
import android.content.pm.PackageManager
12+
import androidx.core.app.ActivityCompat
13+
import javax.inject.Inject
14+
15+
class PermissionChecker @Inject constructor(
16+
private val applicationContext: Context,
17+
) {
18+
fun checkPermission(vararg permissions: String): Boolean {
19+
return permissions.any { permission ->
20+
ActivityCompat.checkSelfPermission(applicationContext, permission) != PackageManager.PERMISSION_GRANTED
21+
}
22+
}
23+
}

vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package im.vector.app.features.location
99

10+
import android.Manifest
1011
import android.graphics.drawable.Drawable
1112
import com.airbnb.mvrx.MavericksViewModelFactory
1213
import dagger.assisted.Assisted
@@ -15,6 +16,7 @@ import dagger.assisted.AssistedInject
1516
import im.vector.app.core.di.MavericksAssistedViewModelFactory
1617
import im.vector.app.core.di.hiltMavericksViewModelFactory
1718
import im.vector.app.core.platform.VectorViewModel
19+
import im.vector.app.core.utils.PermissionChecker
1820
import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider
1921
import im.vector.app.features.location.domain.usecase.CompareLocationsUseCase
2022
import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
@@ -48,6 +50,7 @@ class LocationSharingViewModel @AssistedInject constructor(
4850
private val session: Session,
4951
private val compareLocationsUseCase: CompareLocationsUseCase,
5052
private val vectorPreferences: VectorPreferences,
53+
private val permissionChecker: PermissionChecker,
5154
) : VectorViewModel<LocationSharingViewState, LocationSharingAction, LocationSharingViewEvents>(initialState), LocationTracker.Callback {
5255

5356
private val room = session.getRoom(initialState.roomId)!!
@@ -88,7 +91,15 @@ class LocationSharingViewModel @AssistedInject constructor(
8891
locationTracker.locations
8992
.onEach(::onLocationUpdate)
9093
.launchIn(viewModelScope)
91-
locationTracker.start()
94+
if (permissionChecker.checkPermission(
95+
Manifest.permission.ACCESS_COARSE_LOCATION,
96+
Manifest.permission.ACCESS_FINE_LOCATION,
97+
)
98+
) {
99+
locationTracker.start()
100+
} else {
101+
Timber.w("Not allowed to use location api.")
102+
}
92103
}
93104

94105
private fun setUserItem() {

vector/src/main/java/im/vector/app/features/location/LocationTracker.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.core.content.getSystemService
1717
import androidx.core.location.LocationListenerCompat
1818
import im.vector.app.core.di.ActiveSessionHolder
1919
import im.vector.app.core.resources.BuildMeta
20+
import im.vector.app.core.utils.PermissionChecker
2021
import im.vector.app.features.session.coroutineScope
2122
import kotlinx.coroutines.flow.MutableSharedFlow
2223
import kotlinx.coroutines.flow.asSharedFlow
@@ -37,6 +38,7 @@ class LocationTracker @Inject constructor(
3738
context: Context,
3839
private val activeSessionHolder: ActiveSessionHolder,
3940
private val buildMeta: BuildMeta,
41+
private val permissionChecker: PermissionChecker,
4042
) : LocationListenerCompat {
4143

4244
private val locationManager = context.getSystemService<LocationManager>()
@@ -173,7 +175,15 @@ class LocationTracker @Inject constructor(
173175
fun removeCallback(callback: Callback) {
174176
callbacks.remove(callback)
175177
if (callbacks.size == 0) {
176-
stop()
178+
if (permissionChecker.checkPermission(
179+
Manifest.permission.ACCESS_COARSE_LOCATION,
180+
Manifest.permission.ACCESS_FINE_LOCATION,
181+
)
182+
) {
183+
stop()
184+
} else {
185+
Timber.w("Not allowed to use location api.")
186+
}
177187
}
178188
}
179189

vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationMapViewModel.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
package im.vector.app.features.location.live.map
99

10+
import android.Manifest
1011
import com.airbnb.mvrx.MavericksViewModelFactory
1112
import dagger.assisted.Assisted
1213
import dagger.assisted.AssistedFactory
1314
import dagger.assisted.AssistedInject
1415
import im.vector.app.core.di.MavericksAssistedViewModelFactory
1516
import im.vector.app.core.di.hiltMavericksViewModelFactory
1617
import im.vector.app.core.platform.VectorViewModel
18+
import im.vector.app.core.utils.PermissionChecker
1719
import im.vector.app.features.location.LocationData
1820
import im.vector.app.features.location.LocationTracker
1921
import im.vector.app.features.location.live.StopLiveLocationShareUseCase
@@ -23,6 +25,7 @@ import kotlinx.coroutines.flow.onEach
2325
import kotlinx.coroutines.launch
2426
import org.matrix.android.sdk.api.session.Session
2527
import org.matrix.android.sdk.api.session.room.location.UpdateLiveLocationShareResult
28+
import timber.log.Timber
2629

2730
class LiveLocationMapViewModel @AssistedInject constructor(
2831
@Assisted private val initialState: LiveLocationMapViewState,
@@ -31,6 +34,7 @@ class LiveLocationMapViewModel @AssistedInject constructor(
3134
private val locationSharingServiceConnection: LocationSharingServiceConnection,
3235
private val stopLiveLocationShareUseCase: StopLiveLocationShareUseCase,
3336
private val locationTracker: LocationTracker,
37+
private val permissionChecker: PermissionChecker,
3438
) :
3539
VectorViewModel<LiveLocationMapViewState, LiveLocationMapAction, LiveLocationMapViewEvents>(initialState),
3640
LocationSharingServiceConnection.Callback,
@@ -123,7 +127,15 @@ class LiveLocationMapViewModel @AssistedInject constructor(
123127
copy(isLoadingUserLocation = true)
124128
}
125129
viewModelScope.launch(session.coroutineDispatchers.main) {
126-
locationTracker.start()
130+
if (permissionChecker.checkPermission(
131+
Manifest.permission.ACCESS_COARSE_LOCATION,
132+
Manifest.permission.ACCESS_FINE_LOCATION,
133+
)
134+
) {
135+
locationTracker.start()
136+
} else {
137+
Timber.w("Not allowed to use location api.")
138+
}
127139
locationTracker.requestLastKnownLocation()
128140
}
129141
}

vector/src/main/java/im/vector/app/features/location/live/tracking/LocationSharingAndroidService.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import dagger.hilt.android.AndroidEntryPoint
1818
import im.vector.app.core.di.ActiveSessionHolder
1919
import im.vector.app.core.extensions.startForegroundCompat
2020
import im.vector.app.core.services.VectorAndroidService
21+
import im.vector.app.core.utils.PermissionChecker
2122
import im.vector.app.features.location.LocationData
2223
import im.vector.app.features.location.LocationTracker
2324
import im.vector.app.features.location.live.GetLiveLocationShareSummaryUseCase
@@ -55,6 +56,7 @@ class LocationSharingAndroidService : VectorAndroidService(), LocationTracker.Ca
5556
@Inject lateinit var activeSessionHolder: ActiveSessionHolder
5657
@Inject lateinit var getLiveLocationShareSummaryUseCase: GetLiveLocationShareSummaryUseCase
5758
@Inject lateinit var checkIfEventIsRedactedUseCase: CheckIfEventIsRedactedUseCase
59+
@Inject lateinit var permissionChecker: PermissionChecker
5860

5961
private var binder: LocationSharingAndroidServiceBinder? = null
6062

@@ -77,7 +79,15 @@ class LocationSharingAndroidService : VectorAndroidService(), LocationTracker.Ca
7779
private fun initLocationTracking() {
7880
// Start tracking location
7981
locationTracker.addCallback(this)
80-
locationTracker.start()
82+
if (permissionChecker.checkPermission(
83+
Manifest.permission.ACCESS_COARSE_LOCATION,
84+
Manifest.permission.ACCESS_FINE_LOCATION,
85+
)
86+
) {
87+
locationTracker.start()
88+
} else {
89+
Timber.w("Not allowed to use location api.")
90+
}
8191

8292
launchWithActiveSession { session ->
8393
val job = locationTracker.locations

vector/src/main/java/im/vector/app/features/location/preview/LocationPreviewViewModel.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
package im.vector.app.features.location.preview
99

10+
import android.Manifest
1011
import com.airbnb.mvrx.MavericksViewModelFactory
1112
import dagger.assisted.Assisted
1213
import dagger.assisted.AssistedFactory
1314
import dagger.assisted.AssistedInject
1415
import im.vector.app.core.di.MavericksAssistedViewModelFactory
1516
import im.vector.app.core.di.hiltMavericksViewModelFactory
1617
import im.vector.app.core.platform.VectorViewModel
18+
import im.vector.app.core.utils.PermissionChecker
1719
import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider
1820
import im.vector.app.features.location.LocationData
1921
import im.vector.app.features.location.LocationTracker
@@ -23,12 +25,14 @@ import kotlinx.coroutines.launch
2325
import org.matrix.android.sdk.api.session.Session
2426
import org.matrix.android.sdk.api.util.MatrixItem
2527
import org.matrix.android.sdk.api.util.toMatrixItem
28+
import timber.log.Timber
2629

2730
class LocationPreviewViewModel @AssistedInject constructor(
2831
@Assisted private val initialState: LocationPreviewViewState,
2932
private val session: Session,
3033
private val locationPinProvider: LocationPinProvider,
3134
private val locationTracker: LocationTracker,
35+
private val permissionChecker: PermissionChecker,
3236
) : VectorViewModel<LocationPreviewViewState, LocationPreviewAction, LocationPreviewViewEvents>(initialState), LocationTracker.Callback {
3337

3438
@AssistedFactory
@@ -89,7 +93,15 @@ class LocationPreviewViewModel @AssistedInject constructor(
8993
copy(isLoadingUserLocation = true)
9094
}
9195
viewModelScope.launch(session.coroutineDispatchers.main) {
92-
locationTracker.start()
96+
if (permissionChecker.checkPermission(
97+
Manifest.permission.ACCESS_COARSE_LOCATION,
98+
Manifest.permission.ACCESS_FINE_LOCATION,
99+
)
100+
) {
101+
locationTracker.start()
102+
} else {
103+
Timber.w("Not allowed to use location api.")
104+
}
93105
locationTracker.requestLastKnownLocation()
94106
}
95107
}

0 commit comments

Comments
 (0)