[android][sdk] Fix location provider

Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
Andrei Shkrob
2025-08-15 18:27:28 +02:00
committed by Konstantin Pastbin
parent d4863643f7
commit 802f54494a
15 changed files with 51 additions and 25 deletions

View File

@@ -0,0 +1 @@
../../../../google/java/app/organicmaps/location

View File

@@ -1 +0,0 @@
../../../../../google/java/app/organicmaps/sdk/location

View File

@@ -1,4 +1,4 @@
package app.organicmaps.sdk.location; package app.organicmaps.location;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION;
@@ -10,6 +10,7 @@ import android.location.Location;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.RequiresPermission; import androidx.annotation.RequiresPermission;
import app.organicmaps.sdk.location.BaseLocationProvider;
import app.organicmaps.sdk.util.LocationUtils; import app.organicmaps.sdk.util.LocationUtils;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.ApiException;

View File

@@ -1,23 +1,25 @@
package app.organicmaps.sdk.location; package app.organicmaps.location;
import android.content.Context; import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.sdk.location.AndroidNativeProvider;
import app.organicmaps.sdk.location.BaseLocationProvider;
import app.organicmaps.sdk.location.LocationProviderFactory;
import app.organicmaps.sdk.util.Config; import app.organicmaps.sdk.util.Config;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.GoogleApiAvailability;
public class LocationProviderFactory public class LocationProviderFactoryImpl implements LocationProviderFactory
{ {
private static final String TAG = LocationProviderFactory.class.getSimpleName(); private static final String TAG = LocationProviderFactoryImpl.class.getSimpleName();
public static boolean isGoogleLocationAvailable(@NonNull Context context) public boolean isGoogleLocationAvailable(@NonNull Context context)
{ {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS; return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS;
} }
public static BaseLocationProvider getProvider(@NonNull Context context, public BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
@NonNull BaseLocationProvider.Listener listener)
{ {
if (isGoogleLocationAvailable(context) && Config.useGoogleServices()) if (isGoogleLocationAvailable(context) && Config.useGoogleServices())
{ {

View File

@@ -0,0 +1 @@
../../../../google/java/app/organicmaps/location

View File

@@ -1 +0,0 @@
../../../../../google/java/app/organicmaps/sdk/location

View File

@@ -17,6 +17,7 @@ import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import app.organicmaps.background.OsmUploadWork; import app.organicmaps.background.OsmUploadWork;
import app.organicmaps.downloader.DownloaderNotifier; import app.organicmaps.downloader.DownloaderNotifier;
import app.organicmaps.location.LocationProviderFactoryImpl;
import app.organicmaps.location.TrackRecordingService; import app.organicmaps.location.TrackRecordingService;
import app.organicmaps.routing.NavigationService; import app.organicmaps.routing.NavigationService;
import app.organicmaps.sdk.Map; import app.organicmaps.sdk.Map;
@@ -42,6 +43,9 @@ public class MwmApplication extends Application implements Application.ActivityL
@NonNull @NonNull
private static final String TAG = MwmApplication.class.getSimpleName(); private static final String TAG = MwmApplication.class.getSimpleName();
@NonNull
private final LocationProviderFactoryImpl mLocationProviderFactory = new LocationProviderFactoryImpl();
@SuppressWarnings("NotNullFieldNotInitialized") @SuppressWarnings("NotNullFieldNotInitialized")
@NonNull @NonNull
private OrganicMaps mOrganicMaps; private OrganicMaps mOrganicMaps;
@@ -100,6 +104,12 @@ public class MwmApplication extends Application implements Application.ActivityL
return mOrganicMaps; return mOrganicMaps;
} }
@NonNull
public LocationProviderFactoryImpl getLocationProviderFactory()
{
return mLocationProviderFactory;
}
@NonNull @NonNull
public static MwmApplication from(@NonNull Context context) public static MwmApplication from(@NonNull Context context)
{ {
@@ -121,9 +131,9 @@ public class MwmApplication extends Application implements Application.ActivityL
sInstance = this; sInstance = this;
PreferenceManager.setDefaultValues(this, R.xml.prefs_main, false); PreferenceManager.setDefaultValues(this, R.xml.prefs_main, false);
mOrganicMaps = mOrganicMaps = new OrganicMaps(getApplicationContext(), BuildConfig.FLAVOR, BuildConfig.APPLICATION_ID,
new OrganicMaps(getApplicationContext(), BuildConfig.FLAVOR, BuildConfig.APPLICATION_ID, BuildConfig.VERSION_CODE, BuildConfig.VERSION_NAME,
BuildConfig.VERSION_CODE, BuildConfig.VERSION_NAME, BuildConfig.FILE_PROVIDER_AUTHORITY); BuildConfig.FILE_PROVIDER_AUTHORITY, mLocationProviderFactory);
ConnectionState.INSTANCE.initialize(this); ConnectionState.INSTANCE.initialize(this);

View File

@@ -24,7 +24,6 @@ import app.organicmaps.sdk.downloader.MapManager;
import app.organicmaps.sdk.editor.OsmOAuth; import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.editor.data.Language; import app.organicmaps.sdk.editor.data.Language;
import app.organicmaps.sdk.location.LocationHelper; import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.location.LocationProviderFactory;
import app.organicmaps.sdk.routing.RoutingOptions; import app.organicmaps.sdk.routing.RoutingOptions;
import app.organicmaps.sdk.search.SearchRecents; import app.organicmaps.sdk.search.SearchRecents;
import app.organicmaps.sdk.settings.MapLanguageCode; import app.organicmaps.sdk.settings.MapLanguageCode;
@@ -307,7 +306,9 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
if (pref == null) if (pref == null)
return; return;
if (!LocationProviderFactory.isGoogleLocationAvailable(requireActivity().getApplicationContext())) if (!MwmApplication.from(requireContext())
.getLocationProviderFactory()
.isGoogleLocationAvailable(requireActivity().getApplicationContext()))
removePreference(getString(R.string.pref_privacy), pref); removePreference(getString(R.string.pref_privacy), pref);
else else
{ {

View File

@@ -0,0 +1 @@
../../../../google/java/app/organicmaps/location

View File

@@ -1 +0,0 @@
../../../../../google/java/app/organicmaps/sdk/location

View File

@@ -11,6 +11,7 @@ import app.organicmaps.sdk.bookmarks.data.Icon;
import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround; import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround;
import app.organicmaps.sdk.editor.OsmOAuth; import app.organicmaps.sdk.editor.OsmOAuth;
import app.organicmaps.sdk.location.LocationHelper; import app.organicmaps.sdk.location.LocationHelper;
import app.organicmaps.sdk.location.LocationProviderFactory;
import app.organicmaps.sdk.location.SensorHelper; import app.organicmaps.sdk.location.SensorHelper;
import app.organicmaps.sdk.maplayer.isolines.IsolinesManager; import app.organicmaps.sdk.maplayer.isolines.IsolinesManager;
import app.organicmaps.sdk.maplayer.subway.SubwayManager; import app.organicmaps.sdk.maplayer.subway.SubwayManager;
@@ -77,12 +78,12 @@ public final class OrganicMaps implements DefaultLifecycleObserver
} }
public OrganicMaps(@NonNull Context context, @NonNull String flavor, @NonNull String applicationId, int versionCode, public OrganicMaps(@NonNull Context context, @NonNull String flavor, @NonNull String applicationId, int versionCode,
@NonNull String versionName, @NonNull String fileProviderAuthority) @NonNull String versionName, @NonNull String fileProviderAuthority,
@NonNull LocationProviderFactory locationProviderFactory)
{ {
mFlavor = flavor; mFlavor = flavor;
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mPreferences = mContext.getSharedPreferences(context.getString(R.string.pref_file_name), mPreferences = mContext.getSharedPreferences(context.getString(R.string.pref_file_name), Context.MODE_PRIVATE);
Context.MODE_PRIVATE);
// Set configuration directory as early as possible. // Set configuration directory as early as possible.
// Other methods may explicitly use Config, which requires settingsDir to be set. // Other methods may explicitly use Config, which requires settingsDir to be set.
@@ -102,7 +103,7 @@ public final class OrganicMaps implements DefaultLifecycleObserver
Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName()); Icon.loadDefaultIcons(mContext.getResources(), mContext.getPackageName());
mSensorHelper = new SensorHelper(mContext); mSensorHelper = new SensorHelper(mContext);
mLocationHelper = new LocationHelper(mContext, mSensorHelper); mLocationHelper = new LocationHelper(mContext, mSensorHelper, locationProviderFactory);
mIsolinesManager = new IsolinesManager(); mIsolinesManager = new IsolinesManager();
mSubwayManager = new SubwayManager(mContext); mSubwayManager = new SubwayManager(mContext);
} }

View File

@@ -18,7 +18,7 @@ import app.organicmaps.sdk.util.log.Logger;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
class AndroidNativeProvider extends BaseLocationProvider public class AndroidNativeProvider extends BaseLocationProvider
{ {
private static final String TAG = AndroidNativeProvider.class.getSimpleName(); private static final String TAG = AndroidNativeProvider.class.getSimpleName();
@@ -60,7 +60,7 @@ class AndroidNativeProvider extends BaseLocationProvider
@NonNull @NonNull
final private NativeLocationListener mNativeLocationListener = new NativeLocationListener(); final private NativeLocationListener mNativeLocationListener = new NativeLocationListener();
AndroidNativeProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener) public AndroidNativeProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener)
{ {
super(listener); super(listener);
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

View File

@@ -9,9 +9,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.RequiresPermission; import androidx.annotation.RequiresPermission;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
abstract class BaseLocationProvider public abstract class BaseLocationProvider
{ {
interface Listener public interface Listener
{ {
@UiThread @UiThread
void onLocationChanged(@NonNull Location location); void onLocationChanged(@NonNull Location location);

View File

@@ -96,11 +96,11 @@ public class LocationHelper implements BaseLocationProvider.Listener
} }
}; };
public LocationHelper(@NonNull Context context, @NonNull SensorHelper sensorHelper) public LocationHelper(@NonNull Context context, @NonNull SensorHelper sensorHelper, @NonNull LocationProviderFactory locationProviderFactory)
{ {
mContext = context; mContext = context;
mSensorHelper = sensorHelper; mSensorHelper = sensorHelper;
mLocationProvider = LocationProviderFactory.getProvider(mContext, this); mLocationProvider = locationProviderFactory.getProvider(mContext, this);
mHandler = new Handler(); mHandler = new Handler();
} }

View File

@@ -0,0 +1,11 @@
package app.organicmaps.sdk.location;
import android.content.Context;
import androidx.annotation.NonNull;
public interface LocationProviderFactory
{
boolean isGoogleLocationAvailable(@NonNull Context context);
BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener);
}