diff --git a/android/app/src/fdroid/java/app/organicmaps/location b/android/app/src/fdroid/java/app/organicmaps/location new file mode 120000 index 000000000..c3bacf635 --- /dev/null +++ b/android/app/src/fdroid/java/app/organicmaps/location @@ -0,0 +1 @@ +../../../../google/java/app/organicmaps/location \ No newline at end of file diff --git a/android/app/src/fdroid/java/app/organicmaps/sdk/location b/android/app/src/fdroid/java/app/organicmaps/sdk/location deleted file mode 120000 index f41d2255b..000000000 --- a/android/app/src/fdroid/java/app/organicmaps/sdk/location +++ /dev/null @@ -1 +0,0 @@ -../../../../../google/java/app/organicmaps/sdk/location \ No newline at end of file diff --git a/android/app/src/google/java/app/organicmaps/sdk/location/GoogleFusedLocationProvider.java b/android/app/src/google/java/app/organicmaps/location/GoogleFusedLocationProvider.java similarity index 98% rename from android/app/src/google/java/app/organicmaps/sdk/location/GoogleFusedLocationProvider.java rename to android/app/src/google/java/app/organicmaps/location/GoogleFusedLocationProvider.java index 22182ceb8..fdcf24964 100644 --- a/android/app/src/google/java/app/organicmaps/sdk/location/GoogleFusedLocationProvider.java +++ b/android/app/src/google/java/app/organicmaps/location/GoogleFusedLocationProvider.java @@ -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_FINE_LOCATION; @@ -10,6 +10,7 @@ import android.location.Location; import android.os.Looper; import androidx.annotation.NonNull; import androidx.annotation.RequiresPermission; +import app.organicmaps.sdk.location.BaseLocationProvider; import app.organicmaps.sdk.util.LocationUtils; import app.organicmaps.sdk.util.log.Logger; import com.google.android.gms.common.api.ApiException; diff --git a/android/app/src/google/java/app/organicmaps/sdk/location/LocationProviderFactory.java b/android/app/src/google/java/app/organicmaps/location/LocationProviderFactoryImpl.java similarity index 56% rename from android/app/src/google/java/app/organicmaps/sdk/location/LocationProviderFactory.java rename to android/app/src/google/java/app/organicmaps/location/LocationProviderFactoryImpl.java index eea7c1207..f5afff6dd 100644 --- a/android/app/src/google/java/app/organicmaps/sdk/location/LocationProviderFactory.java +++ b/android/app/src/google/java/app/organicmaps/location/LocationProviderFactoryImpl.java @@ -1,23 +1,25 @@ -package app.organicmaps.sdk.location; +package app.organicmaps.location; import android.content.Context; 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.log.Logger; import com.google.android.gms.common.ConnectionResult; 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; } - public static BaseLocationProvider getProvider(@NonNull Context context, - @NonNull BaseLocationProvider.Listener listener) + public BaseLocationProvider getProvider(@NonNull Context context, @NonNull BaseLocationProvider.Listener listener) { if (isGoogleLocationAvailable(context) && Config.useGoogleServices()) { diff --git a/android/app/src/huawei/java/app/organicmaps/location b/android/app/src/huawei/java/app/organicmaps/location new file mode 120000 index 000000000..c3bacf635 --- /dev/null +++ b/android/app/src/huawei/java/app/organicmaps/location @@ -0,0 +1 @@ +../../../../google/java/app/organicmaps/location \ No newline at end of file diff --git a/android/app/src/huawei/java/app/organicmaps/sdk/location b/android/app/src/huawei/java/app/organicmaps/sdk/location deleted file mode 120000 index f41d2255b..000000000 --- a/android/app/src/huawei/java/app/organicmaps/sdk/location +++ /dev/null @@ -1 +0,0 @@ -../../../../../google/java/app/organicmaps/sdk/location \ No newline at end of file diff --git a/android/app/src/main/java/app/organicmaps/MwmApplication.java b/android/app/src/main/java/app/organicmaps/MwmApplication.java index 8b94a74e4..5104468dc 100644 --- a/android/app/src/main/java/app/organicmaps/MwmApplication.java +++ b/android/app/src/main/java/app/organicmaps/MwmApplication.java @@ -17,6 +17,7 @@ import androidx.lifecycle.ProcessLifecycleOwner; import androidx.preference.PreferenceManager; import app.organicmaps.background.OsmUploadWork; import app.organicmaps.downloader.DownloaderNotifier; +import app.organicmaps.location.LocationProviderFactoryImpl; import app.organicmaps.location.TrackRecordingService; import app.organicmaps.routing.NavigationService; import app.organicmaps.sdk.Map; @@ -42,6 +43,9 @@ public class MwmApplication extends Application implements Application.ActivityL @NonNull private static final String TAG = MwmApplication.class.getSimpleName(); + @NonNull + private final LocationProviderFactoryImpl mLocationProviderFactory = new LocationProviderFactoryImpl(); + @SuppressWarnings("NotNullFieldNotInitialized") @NonNull private OrganicMaps mOrganicMaps; @@ -100,6 +104,12 @@ public class MwmApplication extends Application implements Application.ActivityL return mOrganicMaps; } + @NonNull + public LocationProviderFactoryImpl getLocationProviderFactory() + { + return mLocationProviderFactory; + } + @NonNull public static MwmApplication from(@NonNull Context context) { @@ -121,9 +131,9 @@ public class MwmApplication extends Application implements Application.ActivityL sInstance = this; PreferenceManager.setDefaultValues(this, R.xml.prefs_main, false); - mOrganicMaps = - new OrganicMaps(getApplicationContext(), BuildConfig.FLAVOR, BuildConfig.APPLICATION_ID, - BuildConfig.VERSION_CODE, BuildConfig.VERSION_NAME, BuildConfig.FILE_PROVIDER_AUTHORITY); + mOrganicMaps = new OrganicMaps(getApplicationContext(), BuildConfig.FLAVOR, BuildConfig.APPLICATION_ID, + BuildConfig.VERSION_CODE, BuildConfig.VERSION_NAME, + BuildConfig.FILE_PROVIDER_AUTHORITY, mLocationProviderFactory); ConnectionState.INSTANCE.initialize(this); diff --git a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java index d63401bea..9fd2b0a67 100644 --- a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java @@ -24,7 +24,6 @@ import app.organicmaps.sdk.downloader.MapManager; import app.organicmaps.sdk.editor.OsmOAuth; import app.organicmaps.sdk.editor.data.Language; import app.organicmaps.sdk.location.LocationHelper; -import app.organicmaps.sdk.location.LocationProviderFactory; import app.organicmaps.sdk.routing.RoutingOptions; import app.organicmaps.sdk.search.SearchRecents; import app.organicmaps.sdk.settings.MapLanguageCode; @@ -307,7 +306,9 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La if (pref == null) return; - if (!LocationProviderFactory.isGoogleLocationAvailable(requireActivity().getApplicationContext())) + if (!MwmApplication.from(requireContext()) + .getLocationProviderFactory() + .isGoogleLocationAvailable(requireActivity().getApplicationContext())) removePreference(getString(R.string.pref_privacy), pref); else { diff --git a/android/app/src/web/java/app/organicmaps/location b/android/app/src/web/java/app/organicmaps/location new file mode 120000 index 000000000..c3bacf635 --- /dev/null +++ b/android/app/src/web/java/app/organicmaps/location @@ -0,0 +1 @@ +../../../../google/java/app/organicmaps/location \ No newline at end of file diff --git a/android/app/src/web/java/app/organicmaps/sdk/location b/android/app/src/web/java/app/organicmaps/sdk/location deleted file mode 120000 index f41d2255b..000000000 --- a/android/app/src/web/java/app/organicmaps/sdk/location +++ /dev/null @@ -1 +0,0 @@ -../../../../../google/java/app/organicmaps/sdk/location \ No newline at end of file diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/OrganicMaps.java b/android/sdk/src/main/java/app/organicmaps/sdk/OrganicMaps.java index dfa0cbc36..094625442 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/OrganicMaps.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/OrganicMaps.java @@ -11,6 +11,7 @@ import app.organicmaps.sdk.bookmarks.data.Icon; import app.organicmaps.sdk.downloader.Android7RootCertificateWorkaround; import app.organicmaps.sdk.editor.OsmOAuth; import app.organicmaps.sdk.location.LocationHelper; +import app.organicmaps.sdk.location.LocationProviderFactory; import app.organicmaps.sdk.location.SensorHelper; import app.organicmaps.sdk.maplayer.isolines.IsolinesManager; 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, - @NonNull String versionName, @NonNull String fileProviderAuthority) + @NonNull String versionName, @NonNull String fileProviderAuthority, + @NonNull LocationProviderFactory locationProviderFactory) { mFlavor = flavor; mContext = context.getApplicationContext(); - mPreferences = mContext.getSharedPreferences(context.getString(R.string.pref_file_name), - Context.MODE_PRIVATE); + mPreferences = mContext.getSharedPreferences(context.getString(R.string.pref_file_name), Context.MODE_PRIVATE); // Set configuration directory as early as possible. // 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()); mSensorHelper = new SensorHelper(mContext); - mLocationHelper = new LocationHelper(mContext, mSensorHelper); + mLocationHelper = new LocationHelper(mContext, mSensorHelper, locationProviderFactory); mIsolinesManager = new IsolinesManager(); mSubwayManager = new SubwayManager(mContext); } diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/location/AndroidNativeProvider.java b/android/sdk/src/main/java/app/organicmaps/sdk/location/AndroidNativeProvider.java index de938d03d..516cb0683 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/location/AndroidNativeProvider.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/location/AndroidNativeProvider.java @@ -18,7 +18,7 @@ import app.organicmaps.sdk.util.log.Logger; import java.util.HashSet; import java.util.Set; -class AndroidNativeProvider extends BaseLocationProvider +public class AndroidNativeProvider extends BaseLocationProvider { private static final String TAG = AndroidNativeProvider.class.getSimpleName(); @@ -60,7 +60,7 @@ class AndroidNativeProvider extends BaseLocationProvider @NonNull 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); mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/location/BaseLocationProvider.java b/android/sdk/src/main/java/app/organicmaps/sdk/location/BaseLocationProvider.java index 1a7ce73ed..fe0772b0f 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/location/BaseLocationProvider.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/location/BaseLocationProvider.java @@ -9,9 +9,9 @@ import androidx.annotation.NonNull; import androidx.annotation.RequiresPermission; import androidx.annotation.UiThread; -abstract class BaseLocationProvider +public abstract class BaseLocationProvider { - interface Listener + public interface Listener { @UiThread void onLocationChanged(@NonNull Location location); diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationHelper.java b/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationHelper.java index 4e384ba8d..ac47b448e 100644 --- a/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationHelper.java +++ b/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationHelper.java @@ -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; mSensorHelper = sensorHelper; - mLocationProvider = LocationProviderFactory.getProvider(mContext, this); + mLocationProvider = locationProviderFactory.getProvider(mContext, this); mHandler = new Handler(); } diff --git a/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationProviderFactory.java b/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationProviderFactory.java new file mode 100644 index 000000000..04968b562 --- /dev/null +++ b/android/sdk/src/main/java/app/organicmaps/sdk/location/LocationProviderFactory.java @@ -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); +}