Skip to content
Open
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 @@ -53,8 +53,11 @@ public void resetLocation() {
try {
locManager = (android.location.LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);

if (isLocationPermissionGranted() && locManager != null) {
if (locManager != null && isFineLocationPermissionGranted()) {
gpsLastKnownLocation = locManager.getLastKnownLocation(android.location.LocationManager.GPS_PROVIDER);
}

if (locManager != null && isLocationPermissionGranted()) {
ntwLastKnownLocation = locManager.getLastKnownLocation(android.location.LocationManager.NETWORK_PROVIDER);
}

Expand Down Expand Up @@ -175,4 +178,9 @@ private boolean isLocationPermissionGranted() {
&& (getContext().checkCallingOrSelfPermission(ACCESS_COARSE_LOCATION) == PERMISSION_GRANTED
|| getContext().checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) == PERMISSION_GRANTED);
}

private boolean isFineLocationPermissionGranted() {
return getContext() != null
&& getContext().checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) == PERMISSION_GRANTED;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ private UserParameters.ConnectionType connectionTypeFromCapabilities() {
LogUtil.warning(TAG, "Active network reports no NetworkCapabilities; treating connection as OFFLINE.");
return UserParameters.ConnectionType.OFFLINE;
}
if (!capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
// An internet-capable network the system has not validated (captive portal, no
// upstream connectivity yet) cannot reach the bid server either.
if (!capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|| !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
return UserParameters.ConnectionType.OFFLINE;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,15 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;

import org.junit.Before;
import org.junit.Test;
Expand Down Expand Up @@ -83,4 +88,22 @@ public void isBetterLocationTest() {
when(currentLocation.getAccuracy()).thenReturn((float) 0);
assertTrue(locationImpl.isBetterLocation(location, currentLocation));
}
}

@Test
public void withCoarsePermissionOnly_UsesNetworkProviderOnly() {
Context mockContext = mock(Context.class);
LocationManager mockLocationManager = mock(LocationManager.class);
Location mockNetworkLocation = mock(Location.class);

when(mockContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mockLocationManager);
when(mockContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)).thenReturn(PackageManager.PERMISSION_DENIED);
when(mockContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)).thenReturn(PackageManager.PERMISSION_GRANTED);
when(mockLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)).thenReturn(mockNetworkLocation);

LastKnownLocationInfoManager manager = new LastKnownLocationInfoManager(mockContext);

assertTrue(manager.isLocationAvailable());
verify(mockLocationManager, never()).getLastKnownLocation(LocationManager.GPS_PROVIDER);
verify(mockLocationManager).getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,16 @@ public void whenNetworkStatePermissionIsMissing_reportsOffline() {
assertEquals(UserParameters.ConnectionType.OFFLINE, networkConnectionManager.getConnectionType());
}

/** An active, internet-capable default network with the permission granted. */
@Test
@Config(sdk = 29)
public void whenNetworkIsNotValidated_reportsOffline() {
NetworkCapabilities capabilities = grantedNetworkWithCapabilities();
when(capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)).thenReturn(false);

assertEquals(UserParameters.ConnectionType.OFFLINE, networkConnectionManager.getConnectionType());
}

/** An active, validated, internet-capable default network with the permission granted. */
private NetworkCapabilities grantedNetworkWithCapabilities() {
Network network = mock(Network.class);
NetworkCapabilities capabilities = mock(NetworkCapabilities.class);
Expand All @@ -139,6 +148,7 @@ private NetworkCapabilities grantedNetworkWithCapabilities() {
when(connectivityManager.getActiveNetwork()).thenReturn(network);
when(connectivityManager.getNetworkCapabilities(network)).thenReturn(capabilities);
when(capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)).thenReturn(true);
when(capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)).thenReturn(true);

return capabilities;
}
Expand Down
Loading