mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-21 13:53:37 +00:00
[android][sdk] Fix location provider
Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
committed by
Konstantin Pastbin
parent
d4863643f7
commit
802f54494a
1
android/app/src/fdroid/java/app/organicmaps/location
Symbolic link
1
android/app/src/fdroid/java/app/organicmaps/location
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../google/java/app/organicmaps/location
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../google/java/app/organicmaps/sdk/location
|
|
||||||
@@ -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;
|
||||||
@@ -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())
|
||||||
{
|
{
|
||||||
1
android/app/src/huawei/java/app/organicmaps/location
Symbolic link
1
android/app/src/huawei/java/app/organicmaps/location
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../google/java/app/organicmaps/location
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../google/java/app/organicmaps/sdk/location
|
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
1
android/app/src/web/java/app/organicmaps/location
Symbolic link
1
android/app/src/web/java/app/organicmaps/location
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../google/java/app/organicmaps/location
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../google/java/app/organicmaps/sdk/location
|
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user