[android][sdk] Fix dependecies in sdk package

Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
Andrei Shkrob
2025-06-25 23:01:05 +02:00
committed by Konstantin Pastbin
parent 6136abb33a
commit 3920988ef4
37 changed files with 141 additions and 160 deletions

View File

@@ -80,7 +80,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
private final LocationListener mLocationListener = new LocationListener() { private final LocationListener mLocationListener = new LocationListener() {
@Override @Override
public void onLocationUpdated(Location location) public void onLocationUpdated(@NonNull Location location)
{ {
if (mCurrentCountry != null) if (mCurrentCountry != null)
return; return;

View File

@@ -22,7 +22,7 @@ public class MapPlaceholderActivity extends BaseMwmFragmentActivity implements D
super.onSafeCreate(savedInstanceState); super.onSafeCreate(savedInstanceState);
setContentView(R.layout.activity_map_placeholder); setContentView(R.layout.activity_map_placeholder);
mDisplayManager = DisplayManager.from(this); mDisplayManager = MwmApplication.from(this).getDisplayManager();
mDisplayManager.addListener(DisplayType.Device, this); mDisplayManager.addListener(DisplayType.Device, this);
findViewById(R.id.btn_continue).setOnClickListener((unused) -> mDisplayManager.changeDisplay(DisplayType.Device)); findViewById(R.id.btn_continue).setOnClickListener((unused) -> mDisplayManager.changeDisplay(DisplayType.Device));

View File

@@ -569,7 +569,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
mShareLauncher = SharingUtils.RegisterLauncher(this); mShareLauncher = SharingUtils.RegisterLauncher(this);
mDisplayManager = DisplayManager.from(this); mDisplayManager = MwmApplication.from(this).getDisplayManager();
if (mDisplayManager.isCarDisplayUsed()) if (mDisplayManager.isCarDisplayUsed())
{ {
mRemoveDisplayListener = false; mRemoveDisplayListener = false;

View File

@@ -90,7 +90,7 @@ public class SplashActivity extends AppCompatActivity
}); });
mShareLauncher = SharingUtils.RegisterLauncher(this); mShareLauncher = SharingUtils.RegisterLauncher(this);
if (DisplayManager.from(this).isCarDisplayUsed()) if (MwmApplication.from(this).getDisplayManager().isCarDisplayUsed())
{ {
startActivity(new Intent(this, MapPlaceholderActivity.class)); startActivity(new Intent(this, MapPlaceholderActivity.class));
finish(); finish();

View File

@@ -27,6 +27,7 @@ import app.organicmaps.dialog.EditTextDialogFragment;
import app.organicmaps.sdk.bookmarks.data.BookmarkCategory; import app.organicmaps.sdk.bookmarks.data.BookmarkCategory;
import app.organicmaps.sdk.bookmarks.data.BookmarkManager; import app.organicmaps.sdk.bookmarks.data.BookmarkManager;
import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult; import app.organicmaps.sdk.bookmarks.data.BookmarkSharingResult;
import app.organicmaps.sdk.bookmarks.data.DataChangedListener;
import app.organicmaps.sdk.bookmarks.data.KmlFileType; import app.organicmaps.sdk.bookmarks.data.KmlFileType;
import app.organicmaps.sdk.util.StorageUtils; import app.organicmaps.sdk.util.StorageUtils;
import app.organicmaps.sdk.util.concurrency.ThreadPool; import app.organicmaps.sdk.util.concurrency.ThreadPool;

View File

@@ -112,7 +112,7 @@ public final class CarAppSession extends Session implements DefaultLifecycleObse
{ {
Logger.d(TAG); Logger.d(TAG);
mSensorsManager = new CarSensorsManager(getCarContext()); mSensorsManager = new CarSensorsManager(getCarContext());
mDisplayManager = DisplayManager.from(getCarContext()); mDisplayManager = MwmApplication.from(getCarContext()).getDisplayManager();
mDisplayManager.addListener(DisplayType.Car, this); mDisplayManager.addListener(DisplayType.Car, this);
init(); init();
} }

View File

@@ -14,11 +14,11 @@ import androidx.car.app.SurfaceContainer;
import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.Map; import app.organicmaps.sdk.Map;
import app.organicmaps.sdk.MapRenderingListener; import app.organicmaps.sdk.MapRenderingListener;
import app.organicmaps.sdk.display.DisplayManager;
import app.organicmaps.sdk.settings.UnitLocale; import app.organicmaps.sdk.settings.UnitLocale;
import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
@@ -116,7 +116,7 @@ public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallbac
{ {
Logger.d(TAG); Logger.d(TAG);
mMap.onResume(); mMap.onResume();
if (DisplayManager.from(mCarContext).isCarDisplayUsed()) if (MwmApplication.from(mCarContext).getDisplayManager().isCarDisplayUsed())
UiThread.runLater(() -> mMap.updateMyPositionRoutingOffset(0)); UiThread.runLater(() -> mMap.updateMyPositionRoutingOffset(0));
} }

View File

@@ -8,9 +8,9 @@ import androidx.car.app.model.Header;
import androidx.car.app.model.MessageTemplate; import androidx.car.app.model.MessageTemplate;
import androidx.car.app.model.Template; import androidx.car.app.model.Template;
import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.IconCompat;
import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.car.screens.base.BaseScreen; import app.organicmaps.car.screens.base.BaseScreen;
import app.organicmaps.sdk.display.DisplayManager;
import app.organicmaps.sdk.display.DisplayType; import app.organicmaps.sdk.display.DisplayType;
public class MapPlaceholderScreen extends BaseScreen public class MapPlaceholderScreen extends BaseScreen
@@ -33,10 +33,12 @@ public class MapPlaceholderScreen extends BaseScreen
builder.setHeader(headerBuilder.build()); builder.setHeader(headerBuilder.build());
builder.setIcon( builder.setIcon(
new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_phone_android)).build()); new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_phone_android)).build());
builder.addAction(new Action.Builder() builder.addAction(
.setTitle(getCarContext().getString(R.string.car_continue_in_the_car)) new Action.Builder()
.setOnClickListener(() -> DisplayManager.from(getCarContext()).changeDisplay(DisplayType.Car)) .setTitle(getCarContext().getString(R.string.car_continue_in_the_car))
.build()); .setOnClickListener(
() -> MwmApplication.from(getCarContext()).getDisplayManager().changeDisplay(DisplayType.Car))
.build());
return builder.build(); return builder.build();
} }

View File

@@ -9,6 +9,7 @@ import androidx.car.app.CarContext;
import androidx.car.app.Screen; import androidx.car.app.Screen;
import androidx.car.app.ScreenManager; import androidx.car.app.ScreenManager;
import androidx.car.app.notification.CarPendingIntent; import androidx.car.app.notification.CarPendingIntent;
import app.organicmaps.MwmApplication;
import app.organicmaps.api.Const; import app.organicmaps.api.Const;
import app.organicmaps.car.CarAppService; import app.organicmaps.car.CarAppService;
import app.organicmaps.car.SurfaceRenderer; import app.organicmaps.car.SurfaceRenderer;
@@ -106,7 +107,7 @@ public final class IntentUtils
{ {
final ScreenManager screenManager = carContext.getCarService(ScreenManager.class); final ScreenManager screenManager = carContext.getCarService(ScreenManager.class);
final Screen top = screenManager.getTop(); final Screen top = screenManager.getTop();
final DisplayManager displayManager = DisplayManager.from(carContext); final DisplayManager displayManager = MwmApplication.from(carContext).getDisplayManager();
if (!displayManager.isCarDisplayUsed()) if (!displayManager.isCarDisplayUsed())
displayManager.changeDisplay(DisplayType.Car); displayManager.changeDisplay(DisplayType.Car);
if (!(top instanceof NavigationScreen)) if (!(top instanceof NavigationScreen))

View File

@@ -26,7 +26,7 @@ import app.organicmaps.sdk.editor.Editor;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.LocalizedName; import app.organicmaps.sdk.editor.data.LocalizedName;
import app.organicmaps.sdk.editor.data.LocalizedStreet; import app.organicmaps.sdk.editor.data.LocalizedStreet;
import app.organicmaps.sdk.editor.data.TimeFormatUtils; import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;

View File

@@ -15,7 +15,7 @@ import androidx.recyclerview.widget.RecyclerView;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.HoursMinutes; import app.organicmaps.sdk.editor.data.HoursMinutes;
import app.organicmaps.sdk.editor.data.TimeFormatUtils; import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timespan; import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;

View File

@@ -1,9 +1,11 @@
package app.organicmaps.sdk.editor.data; package app.organicmaps.editor.data;
import android.content.res.Resources; import android.content.res.Resources;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
import java.util.Locale; import java.util.Locale;

View File

@@ -82,8 +82,8 @@ public final class OrganicMaps implements DefaultLifecycleObserver
Config.init(mContext); Config.init(mContext);
mLocationHelper = new LocationHelper(mContext);
mSensorHelper = new SensorHelper(mContext); mSensorHelper = new SensorHelper(mContext);
mLocationHelper = new LocationHelper(mContext, mSensorHelper);
mIsolinesManager = new IsolinesManager(mContext); mIsolinesManager = new IsolinesManager(mContext);
mSubwayManager = new SubwayManager(mContext); mSubwayManager = new SubwayManager(mContext);
} }

View File

@@ -11,7 +11,6 @@ import androidx.annotation.MainThread;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread; import androidx.annotation.WorkerThread;
import app.organicmaps.bookmarks.DataChangedListener;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.util.KeyValue; import app.organicmaps.sdk.util.KeyValue;
import app.organicmaps.sdk.util.StorageUtils; import app.organicmaps.sdk.util.StorageUtils;

View File

@@ -1,4 +1,4 @@
package app.organicmaps.bookmarks; package app.organicmaps.sdk.bookmarks.data;
public interface DataChangedListener public interface DataChangedListener
{ {

View File

@@ -1,11 +1,9 @@
package app.organicmaps.sdk.display; package app.organicmaps.sdk.display;
import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.MwmApplication;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import java.util.Objects; import java.util.Objects;
@@ -39,13 +37,6 @@ public class DisplayManager
@Nullable @Nullable
private DisplayHolder mCar; private DisplayHolder mCar;
@NonNull
public static DisplayManager from(@NonNull Context context)
{
final MwmApplication app = (MwmApplication) context.getApplicationContext();
return app.getDisplayManager();
}
public boolean isCarConnected() public boolean isCarConnected()
{ {
return mCar != null; return mCar != null;

View File

@@ -6,8 +6,8 @@ import androidx.annotation.Keep;
import app.organicmaps.downloader.Android7RootCertificateWorkaround; import app.organicmaps.downloader.Android7RootCertificateWorkaround;
import app.organicmaps.sdk.util.Constants; import app.organicmaps.sdk.util.Constants;
import app.organicmaps.sdk.util.StringUtils; import app.organicmaps.sdk.util.StringUtils;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.util.Utils;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;

View File

@@ -1,14 +1,14 @@
package app.organicmaps.sdk.downloader; package app.organicmaps.sdk.downloader;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.util.Utils; import androidx.core.util.Consumer;
class ExpandRetryConfirmationListener implements Runnable class ExpandRetryConfirmationListener implements Runnable
{ {
@Nullable @Nullable
private final Utils.Proc<Boolean> mDialogClickListener; private final Consumer<Boolean> mDialogClickListener;
ExpandRetryConfirmationListener(@Nullable Utils.Proc<Boolean> dialogClickListener) ExpandRetryConfirmationListener(@Nullable Consumer<Boolean> dialogClickListener)
{ {
mDialogClickListener = dialogClickListener; mDialogClickListener = dialogClickListener;
} }
@@ -18,6 +18,6 @@ class ExpandRetryConfirmationListener implements Runnable
{ {
if (mDialogClickListener == null) if (mDialogClickListener == null)
return; return;
mDialogClickListener.invoke(true); mDialogClickListener.accept(true);
} }
} }

View File

@@ -1,7 +1,6 @@
package app.organicmaps.sdk.downloader; package app.organicmaps.sdk.downloader;
import android.app.Activity; import android.app.Activity;
import android.app.Application;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.Keep; import androidx.annotation.Keep;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -9,10 +8,10 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.core.util.Consumer;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.downloader.DownloaderService; import app.organicmaps.downloader.DownloaderService;
import app.organicmaps.sdk.util.ConnectionState; import app.organicmaps.sdk.util.ConnectionState;
import app.organicmaps.util.Utils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
@@ -22,7 +21,6 @@ public final class MapManager
{ {
// Used by JNI. // Used by JNI.
@Keep @Keep
@SuppressWarnings("unused")
public static class StorageCallbackData public static class StorageCallbackData
{ {
public final String countryId; public final String countryId;
@@ -43,12 +41,10 @@ public final class MapManager
{ {
// Called from JNI. // Called from JNI.
@Keep @Keep
@SuppressWarnings("unused")
void onStatusChanged(List<StorageCallbackData> data); void onStatusChanged(List<StorageCallbackData> data);
// Called from JNI. // Called from JNI.
@Keep @Keep
@SuppressWarnings("unused")
void onProgress(String countryId, long localSize, long remoteSize); void onProgress(String countryId, long localSize, long remoteSize);
} }
@@ -76,7 +72,7 @@ public final class MapManager
} }
public static void showError(final Activity activity, final StorageCallbackData errorData, public static void showError(final Activity activity, final StorageCallbackData errorData,
@Nullable final Utils.Proc<Boolean> dialogClickListener) @Nullable final Consumer<Boolean> dialogClickListener)
{ {
if (!nativeIsAutoretryFailed()) if (!nativeIsAutoretryFailed())
return; return;
@@ -85,7 +81,7 @@ public final class MapManager
} }
public static void showErrorDialog(final Activity activity, final StorageCallbackData errorData, public static void showErrorDialog(final Activity activity, final StorageCallbackData errorData,
@Nullable final Utils.Proc<Boolean> dialogClickListener) @Nullable final Consumer<Boolean> dialogClickListener)
{ {
if (sCurrentErrorDialog != null) if (sCurrentErrorDialog != null)
{ {
@@ -101,11 +97,10 @@ public final class MapManager
(dialog, which) -> { (dialog, which) -> {
sCurrentErrorDialog = null; sCurrentErrorDialog = null;
if (dialogClickListener != null) if (dialogClickListener != null)
dialogClickListener.invoke(false); dialogClickListener.accept(false);
}) })
.setPositiveButton(R.string.downloader_retry, .setPositiveButton(R.string.downloader_retry,
(dialog, which) -> { (dialog, which) -> {
Application app = activity.getApplication();
ExpandRetryConfirmationListener listener = ExpandRetryConfirmationListener listener =
new ExpandRetryConfirmationListener(dialogClickListener); new ExpandRetryConfirmationListener(dialogClickListener);
warn3gAndRetry(activity, errorData.countryId, listener); warn3gAndRetry(activity, errorData.countryId, listener);

View File

@@ -7,7 +7,6 @@ import androidx.annotation.Keep;
*/ */
// Called from JNI. // Called from JNI.
@Keep @Keep
@SuppressWarnings("unused")
public final class UpdateInfo public final class UpdateInfo
{ {
public final int filesCount; public final int filesCount;

View File

@@ -24,12 +24,6 @@ public final class OpeningHours
@NonNull @NonNull
public static native Timetable nativeGetComplementTimetable(Timetable[] timetableSet); public static native Timetable nativeGetComplementTimetable(Timetable[] timetableSet);
@NonNull
public static native Timetable[] nativeAddTimetable(Timetable[] timetableSet);
@NonNull
public static native Timetable[] nativeRemoveTimetable(Timetable[] timetableSet, int timetableIndex);
@NonNull @NonNull
public static native Timetable nativeSetIsFullday(Timetable timetable, boolean isFullday); public static native Timetable nativeSetIsFullday(Timetable timetable, boolean isFullday);

View File

@@ -41,6 +41,8 @@ public class LocationHelper implements BaseLocationProvider.Listener
@NonNull @NonNull
private final Context mContext; private final Context mContext;
@NonNull
private final SensorHelper mSensorHelper;
private static final String TAG = LocationState.LOCATION_TAG; private static final String TAG = LocationState.LOCATION_TAG;
@@ -95,9 +97,10 @@ public class LocationHelper implements BaseLocationProvider.Listener
} }
}; };
public LocationHelper(@NonNull Context context) public LocationHelper(@NonNull Context context, @NonNull SensorHelper sensorHelper)
{ {
mContext = context; mContext = context;
mSensorHelper = sensorHelper;
mLocationProvider = LocationProviderFactory.getProvider(mContext, this); mLocationProvider = LocationProviderFactory.getProvider(mContext, this);
mHandler = new Handler(); mHandler = new Handler();
} }
@@ -361,7 +364,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
checkForAgpsUpdates(); checkForAgpsUpdates();
if (LocationUtils.checkFineLocationPermission(mContext)) if (LocationUtils.checkFineLocationPermission(mContext))
MwmApplication.from(mContext).getSensorHelper().start(); mSensorHelper.start();
final long oldInterval = mInterval; final long oldInterval = mInterval;
mInterval = calcLocationUpdatesInterval(); mInterval = calcLocationUpdatesInterval();
@@ -387,7 +390,7 @@ public class LocationHelper implements BaseLocationProvider.Listener
Logger.i(TAG); Logger.i(TAG);
mLocationProvider.stop(); mLocationProvider.stop();
unsubscribeFromGnssStatusUpdates(); unsubscribeFromGnssStatusUpdates();
MwmApplication.from(mContext).getSensorHelper().stop(); mSensorHelper.stop();
mHandler.removeCallbacks(mLocationTimeoutRunnable); mHandler.removeCallbacks(mLocationTimeoutRunnable);
mActive = false; mActive = false;
} }

View File

@@ -9,7 +9,7 @@ import java.lang.annotation.RetentionPolicy;
public final class LocationState public final class LocationState
{ {
public static final String LOCATION_TAG = LocationState.class.getPackage().getName(); public static final String LOCATION_TAG = LocationState.class.getSimpleName();
public interface ModeChangeListener public interface ModeChangeListener
{ {

View File

@@ -8,7 +8,6 @@ import androidx.annotation.IntDef;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import androidx.annotation.Keep; import androidx.annotation.Keep;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.MwmApplication;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@@ -31,7 +30,7 @@ public final class BatteryState
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
// Because it's a sticky intent, you don't need to register a BroadcastReceiver // Because it's a sticky intent, you don't need to register a BroadcastReceiver
// by simply calling registerReceiver passing in null // by simply calling registerReceiver passing in null
Intent batteryStatus = MwmApplication.from(context).registerReceiver(null, filter); Intent batteryStatus = context.getApplicationContext().registerReceiver(null, filter);
if (batteryStatus == null) if (batteryStatus == null)
return new State(0, CHARGING_STATUS_UNKNOWN); return new State(0, CHARGING_STATUS_UNKNOWN);

View File

@@ -2,7 +2,6 @@ package app.organicmaps.sdk.util;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.util.Utils;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.security.KeyStore; import java.security.KeyStore;

View File

@@ -219,8 +219,8 @@ public final class Config
public static String getCurrentUiTheme(@NonNull Context context) public static String getCurrentUiTheme(@NonNull Context context)
{ {
// This is the actual map theme, only set to theme_default/night // This is the actual map theme, only set to theme_default/night
String defaultTheme = MwmApplication.from(context).getString(R.string.theme_default); final String defaultTheme = context.getString(R.string.theme_default);
String res = getString(KEY_MISC_UI_THEME, defaultTheme); final String res = getString(KEY_MISC_UI_THEME, defaultTheme);
if (ThemeUtils.isValidTheme(context, res)) if (ThemeUtils.isValidTheme(context, res))
return res; return res;
@@ -240,8 +240,8 @@ public final class Config
public static String getUiThemeSettings(@NonNull Context context) public static String getUiThemeSettings(@NonNull Context context)
{ {
// This is the default theme *mode*, eg. auto/dark/nav_auto/light. // This is the default theme *mode*, eg. auto/dark/nav_auto/light.
String defaultSetting = MwmApplication.from(context).getString(R.string.theme_nav_auto); final String defaultSetting = context.getString(R.string.theme_nav_auto);
String res = getString(KEY_MISC_UI_THEME_SETTINGS, defaultSetting); final String res = getString(KEY_MISC_UI_THEME_SETTINGS, defaultSetting);
if (ThemeUtils.isValidTheme(context, res) || ThemeUtils.isAutoTheme(context, res) if (ThemeUtils.isValidTheme(context, res) || ThemeUtils.isAutoTheme(context, res)
|| ThemeUtils.isNavAutoTheme(context, res)) || ThemeUtils.isNavAutoTheme(context, res))
return res; return res;

View File

@@ -13,7 +13,6 @@ import androidx.annotation.IntDef;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.util.Utils;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;

View File

@@ -13,7 +13,6 @@ import androidx.core.content.FileProvider;
import androidx.documentfile.provider.DocumentFile; import androidx.documentfile.provider.DocumentFile;
import app.organicmaps.BuildConfig; import app.organicmaps.BuildConfig;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.util.Utils;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@@ -155,14 +154,6 @@ public class StorageUtils
new File(path)); new File(path));
} }
/**
* Copy data from a URI into a local file.
* @param resolver content resolver
* @param from a source URI.
* @param to a destination file
* @return true on success and false if the provider recently crashed.
* @throws IOException - if I/O error occurs.
*/
static private boolean copyFile(InputStream from, OutputStream to) throws IOException static private boolean copyFile(InputStream from, OutputStream to) throws IOException
{ {
if (from == null || to == null) if (from == null || to == null)
@@ -175,6 +166,15 @@ public class StorageUtils
return true; return true;
} }
/**
* Copy data from a URI into a local file.
* @param resolver content resolver
* @param from a source URI.
* @param to a destination file
* @return true on success and false if the provider recently crashed.
* @throws IOException - if I/O error occurs.
*/
public static boolean copyFile(@NonNull ContentResolver resolver, @NonNull Uri from, @NonNull File to) public static boolean copyFile(@NonNull ContentResolver resolver, @NonNull Uri from, @NonNull File to)
throws IOException throws IOException
{ {

View File

@@ -5,7 +5,6 @@ import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.Locale; import java.util.Locale;
@@ -74,11 +73,11 @@ public class StringUtils
if (value == 0) if (value == 0)
value = 1; value = 1;
return formatUsingUsLocale("%1$d %2$s", value, MwmApplication.from(context).getString(R.string.mb)); return formatUsingUsLocale("%1$d %2$s", value, context.getString(R.string.mb));
} }
float value = ((float) size / Constants.GB); float value = ((float) size / Constants.GB);
return formatUsingSystemLocale("%1$.1f %2$s", value, MwmApplication.from(context).getString(R.string.gb)); return formatUsingSystemLocale("%1$.1f %2$s", value, context.getString(R.string.gb));
} }
public static boolean isRtl() public static boolean isRtl()

View File

@@ -134,7 +134,7 @@ public enum ThemeSwitcher
{ {
// Because of the distinct behavior in auto theme, Android Auto employs its own mechanism for theme switching. // Because of the distinct behavior in auto theme, Android Auto employs its own mechanism for theme switching.
// For the Android Auto theme switcher, please consult the app.organicmaps.car.util.ThemeUtils module. // For the Android Auto theme switcher, please consult the app.organicmaps.car.util.ThemeUtils module.
if (DisplayManager.from(mContext).isCarDisplayUsed()) if (MwmApplication.from(mContext).getDisplayManager().isCarDisplayUsed())
return; return;
// If rendering is not active we can mark map style, because all graphics // If rendering is not active we can mark map style, because all graphics
// will be recreated after rendering activation. // will be recreated after rendering activation.

View File

@@ -2,6 +2,10 @@ package app.organicmaps.sdk.util;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build; import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
@@ -14,9 +18,12 @@ import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import app.organicmaps.BuildConfig; import app.organicmaps.BuildConfig;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import java.io.Closeable;
import java.io.IOException;
import java.text.DecimalFormatSymbols; import java.text.DecimalFormatSymbols;
import java.util.Currency; import java.util.Currency;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
@Keep @Keep
public class Utils public class Utils
@@ -262,8 +269,75 @@ public class Utils
return brand; return brand;
return context.getString(nameId); return context.getString(nameId);
} }
catch (Resources.NotFoundException e) catch (Resources.NotFoundException ignored)
{} {}
return brand; return brand;
} }
public static void closeSafely(@NonNull Closeable... closeable)
{
for (Closeable each : closeable)
{
if (each != null)
{
try
{
each.close();
}
catch (IOException e)
{
Logger.e(TAG, "Failed to close '" + each + "'", e);
}
}
}
}
public static <K, V> String mapPrettyPrint(Map<K, V> map)
{
if (map == null)
return "[null]";
if (map.isEmpty())
return "[]";
String joined = "";
for (final K key : map.keySet())
{
final String keyVal = key + "=" + map.get(key);
if (!joined.isEmpty())
joined = TextUtils.join(",", new Object[] {joined, keyVal});
else
joined = keyVal;
}
return "[" + joined + "]";
}
@SuppressWarnings("deprecated")
private static @Nullable ResolveInfo resolveActivity(@NonNull PackageManager pm, @NonNull Intent intent, int flags)
{
return pm.resolveActivity(intent, flags);
}
public static boolean isIntentSupported(@NonNull Context context, @NonNull Intent intent)
{
final PackageManager pm = context.getPackageManager();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
return resolveActivity(pm, intent, 0) != null;
return pm.resolveActivity(intent, PackageManager.ResolveInfoFlags.of(0)) != null;
}
@SuppressWarnings("deprecation")
private static ApplicationInfo getApplicationInfoOld(@NonNull PackageManager manager, @NonNull String packageName,
int flags) throws PackageManager.NameNotFoundException
{
return manager.getApplicationInfo(packageName, flags);
}
public static ApplicationInfo getApplicationInfo(@NonNull PackageManager manager, @NonNull String packageName,
int flags) throws PackageManager.NameNotFoundException
{
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
return getApplicationInfoOld(manager, packageName, flags);
return manager.getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(flags));
}
} }

View File

@@ -176,7 +176,7 @@ public class SearchFragment extends BaseMwmFragment implements SearchListener, C
private final LocationListener mLocationListener = new LocationListener() { private final LocationListener mLocationListener = new LocationListener() {
@Override @Override
public void onLocationUpdated(Location location) public void onLocationUpdated(@NonNull Location location)
{ {
mLastPosition.set(location.getLatitude(), location.getLongitude()); mLastPosition.set(location.getLatitude(), location.getLongitude());

View File

@@ -7,6 +7,7 @@ import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.sdk.util.Utils;
import app.organicmaps.sdk.util.concurrency.UiThread; import app.organicmaps.sdk.util.concurrency.UiThread;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,5 +1,7 @@
package app.organicmaps.util; package app.organicmaps.util;
import static app.organicmaps.sdk.util.Utils.isIntentSupported;
import android.app.Activity; import android.app.Activity;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ClipData; import android.content.ClipData;
@@ -8,7 +10,6 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
@@ -45,10 +46,7 @@ import app.organicmaps.sdk.util.concurrency.UiThread;
import app.organicmaps.sdk.util.log.Logger; import app.organicmaps.sdk.util.log.Logger;
import app.organicmaps.sdk.util.log.LogsManager; import app.organicmaps.sdk.util.log.LogsManager;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import java.io.Closeable;
import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.Map;
@Keep @Keep
public class Utils public class Utils
@@ -130,20 +128,6 @@ public class Utils
showSnackbarAbove(view, viewAbove, message); showSnackbarAbove(view, viewAbove, message);
} }
@SuppressWarnings("deprecated")
private static @Nullable ResolveInfo resolveActivity(@NonNull PackageManager pm, @NonNull Intent intent, int flags)
{
return pm.resolveActivity(intent, flags);
}
public static boolean isIntentSupported(@NonNull Context context, @NonNull Intent intent)
{
final PackageManager pm = context.getPackageManager();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
return resolveActivity(pm, intent, 0) != null;
return pm.resolveActivity(intent, PackageManager.ResolveInfoFlags.of(0)) != null;
}
public static @Nullable Intent makeSystemLocationSettingIntent(@NonNull Context context) public static @Nullable Intent makeSystemLocationSettingIntent(@NonNull Context context)
{ {
Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
@@ -173,27 +157,6 @@ public class Utils
final ClipData clip = ClipData.newPlainText(context.getString(R.string.project_name) + ": " + text, text); final ClipData clip = ClipData.newPlainText(context.getString(R.string.project_name) + ": " + text, text);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
} }
public static <K, V> String mapPrettyPrint(Map<K, V> map)
{
if (map == null)
return "[null]";
if (map.isEmpty())
return "[]";
String joined = "";
for (final K key : map.keySet())
{
final String keyVal = key + "=" + map.get(key);
if (!joined.isEmpty())
joined = TextUtils.join(",", new Object[] {joined, keyVal});
else
joined = keyVal;
}
return "[" + joined + "]";
}
public static Uri buildMailUri(String to, String subject, String body) public static Uri buildMailUri(String to, String subject, String body)
{ {
String uriString = Constants.Url.MAILTO_SCHEME + Uri.encode(to) + Constants.Url.MAIL_SUBJECT + Uri.encode(subject) String uriString = Constants.Url.MAILTO_SCHEME + Uri.encode(to) + Constants.Url.MAIL_SUBJECT + Uri.encode(subject)
@@ -285,24 +248,6 @@ public class Utils
return url.startsWith("http://") || url.startsWith("https://"); return url.startsWith("http://") || url.startsWith("https://");
} }
public static void closeSafely(@NonNull Closeable... closeable)
{
for (Closeable each : closeable)
{
if (each != null)
{
try
{
each.close();
}
catch (IOException e)
{
Logger.e(TAG, "Failed to close '" + each + "'", e);
}
}
}
}
// subject is optional (could be an empty string). // subject is optional (could be an empty string).
/** /**
@@ -421,12 +366,6 @@ public class Utils
return Character.toLowerCase(src.charAt(0)) + src.substring(1); return Character.toLowerCase(src.charAt(0)) + src.substring(1);
} }
public interface Proc<T>
{
void invoke(@NonNull T param);
}
public static String getLocalizedLevel(@NonNull Context context, @Nullable String level) public static String getLocalizedLevel(@NonNull Context context, @Nullable String level)
{ {
if (TextUtils.isEmpty(level)) if (TextUtils.isEmpty(level))
@@ -507,21 +446,6 @@ public class Utils
return Html.fromHtml(htmlDescription, Html.FROM_HTML_MODE_LEGACY); return Html.fromHtml(htmlDescription, Html.FROM_HTML_MODE_LEGACY);
} }
@SuppressWarnings("deprecation")
private static ApplicationInfo getApplicationInfoOld(@NonNull PackageManager manager, @NonNull String packageName,
int flags) throws PackageManager.NameNotFoundException
{
return manager.getApplicationInfo(packageName, flags);
}
public static ApplicationInfo getApplicationInfo(@NonNull PackageManager manager, @NonNull String packageName,
int flags) throws PackageManager.NameNotFoundException
{
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
return getApplicationInfoOld(manager, packageName, flags);
return manager.getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(flags));
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static PackageInfo getPackageInfoOld(@NonNull PackageManager manager, @NonNull String packageName, int flags) private static PackageInfo getPackageInfoOld(@NonNull PackageManager manager, @NonNull String packageName, int flags)
throws PackageManager.NameNotFoundException throws PackageManager.NameNotFoundException

View File

@@ -7,9 +7,9 @@ import android.view.Menu;
import android.view.View; import android.view.View;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import app.organicmaps.MwmApplication;
import app.organicmaps.R; import app.organicmaps.R;
import app.organicmaps.sdk.Framework; import app.organicmaps.sdk.Framework;
import app.organicmaps.sdk.display.DisplayManager;
import app.organicmaps.util.Utils; import app.organicmaps.util.Utils;
import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetBehavior;
import java.util.List; import java.util.List;
@@ -21,7 +21,7 @@ public class PlacePageUtils
parent.post(() -> { parent.post(() -> {
// Because of the post(), this lambda is called after the car.SurfaceRenderer.onStableAreaChanged() and breaks the // Because of the post(), this lambda is called after the car.SurfaceRenderer.onStableAreaChanged() and breaks the
// visibleRect configuration // visibleRect configuration
if (DisplayManager.from(parent.getContext()).isCarDisplayUsed()) if (MwmApplication.from(parent.getContext()).getDisplayManager().isCarDisplayUsed())
return; return;
final int screenWidth = parent.getWidth(); final int screenWidth = parent.getWidth();
if (placePageDistanceToTop >= viewportMinHeight) if (placePageDistanceToTop >= viewportMinHeight)

View File

@@ -1,7 +1,7 @@
package app.organicmaps.widget.placepage.sections; package app.organicmaps.widget.placepage.sections;
import static app.organicmaps.sdk.editor.data.TimeFormatUtils.formatNonBusinessTime; import static app.organicmaps.editor.data.TimeFormatUtils.formatNonBusinessTime;
import static app.organicmaps.sdk.editor.data.TimeFormatUtils.formatWeekdaysRange; import static app.organicmaps.editor.data.TimeFormatUtils.formatWeekdaysRange;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -18,7 +18,6 @@ import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public class PlaceOpeningHoursAdapter extends RecyclerView.Adapter<PlaceOpeningHoursAdapter.ViewHolder> public class PlaceOpeningHoursAdapter extends RecyclerView.Adapter<PlaceOpeningHoursAdapter.ViewHolder>
{ {
private List<WeekScheduleData> mWeekSchedule = Collections.emptyList(); private List<WeekScheduleData> mWeekSchedule = Collections.emptyList();

View File

@@ -17,7 +17,7 @@ import app.organicmaps.R;
import app.organicmaps.sdk.bookmarks.data.MapObject; import app.organicmaps.sdk.bookmarks.data.MapObject;
import app.organicmaps.sdk.bookmarks.data.Metadata; import app.organicmaps.sdk.bookmarks.data.Metadata;
import app.organicmaps.sdk.editor.OpeningHours; import app.organicmaps.sdk.editor.OpeningHours;
import app.organicmaps.sdk.editor.data.TimeFormatUtils; import app.organicmaps.editor.data.TimeFormatUtils;
import app.organicmaps.sdk.editor.data.Timespan; import app.organicmaps.sdk.editor.data.Timespan;
import app.organicmaps.sdk.editor.data.Timetable; import app.organicmaps.sdk.editor.data.Timetable;
import app.organicmaps.sdk.util.UiUtils; import app.organicmaps.sdk.util.UiUtils;