78 lines
2.5 KiB
Java
78 lines
2.5 KiB
Java
package androidx.core.location;
|
|
|
|
import android.location.Location;
|
|
import androidx.annotation.DoNotInline;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RequiresApi;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.Method;
|
|
import java.util.concurrent.TimeUnit;
|
|
public final class LocationCompat {
|
|
private static final String EXTRA_IS_MOCK = "mockLocation";
|
|
@Nullable
|
|
private static Method sSetIsFromMockProviderMethod;
|
|
|
|
@RequiresApi(17)
|
|
public static class Api17Impl {
|
|
private Api17Impl() {
|
|
}
|
|
|
|
@DoNotInline
|
|
public static long getElapsedRealtimeNanos(Location location) {
|
|
return location.getElapsedRealtimeNanos();
|
|
}
|
|
}
|
|
|
|
@RequiresApi(18)
|
|
public static class Api18Impl {
|
|
private Api18Impl() {
|
|
}
|
|
|
|
@DoNotInline
|
|
public static boolean isMock(Location location) {
|
|
return location.isFromMockProvider();
|
|
}
|
|
}
|
|
|
|
private LocationCompat() {
|
|
}
|
|
|
|
public static long getElapsedRealtimeMillis(@NonNull Location location) {
|
|
return TimeUnit.NANOSECONDS.toMillis(Api17Impl.getElapsedRealtimeNanos(location));
|
|
}
|
|
|
|
public static long getElapsedRealtimeNanos(@NonNull Location location) {
|
|
return Api17Impl.getElapsedRealtimeNanos(location);
|
|
}
|
|
|
|
private static Method getSetIsFromMockProviderMethod() throws NoSuchMethodException {
|
|
if (sSetIsFromMockProviderMethod == null) {
|
|
Method declaredMethod = Location.class.getDeclaredMethod("setIsFromMockProvider", Boolean.TYPE);
|
|
sSetIsFromMockProviderMethod = declaredMethod;
|
|
declaredMethod.setAccessible(true);
|
|
}
|
|
return sSetIsFromMockProviderMethod;
|
|
}
|
|
|
|
public static boolean isMock(@NonNull Location location) {
|
|
return Api18Impl.isMock(location);
|
|
}
|
|
|
|
public static void setMock(@NonNull Location location, boolean z2) {
|
|
try {
|
|
getSetIsFromMockProviderMethod().invoke(location, Boolean.valueOf(z2));
|
|
} catch (NoSuchMethodException e) {
|
|
NoSuchMethodError noSuchMethodError = new NoSuchMethodError();
|
|
noSuchMethodError.initCause(e);
|
|
throw noSuchMethodError;
|
|
} catch (IllegalAccessException e2) {
|
|
IllegalAccessError illegalAccessError = new IllegalAccessError();
|
|
illegalAccessError.initCause(e2);
|
|
throw illegalAccessError;
|
|
} catch (InvocationTargetException e3) {
|
|
throw new RuntimeException(e3);
|
|
}
|
|
}
|
|
}
|